Есть автомобильные весы фирмы ТензоМ, которые подключаются через приложение Авеон.
Далее, отправляя запрос {"TargetID:1"} на адрес localhost с портом 9379, в ответ получает строку json с весом.
Во внешней обработке я сделал 8 кнопок на получение веса, один из них код такой ( на кнопки 2, 6,7 реагирует монитор порта Авеона)
Соединение = Новый HTTPСоединение("localhost",9379,,,,4);
Заголовки = Новый Соответствие;
Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
Запрос = Новый HTTPЗапрос("/", Заголовки);
Запрос.УстановитьТелоИзСтроки("{""TargetID"":1}");
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
Соединение зависает, отваливается по таймауту.
В Авеоне, есть монитор порта, по нему видно, что запрос на получение веса приходи, более того, программа якобы посылает ответ.
Но в 1Ску ничего не приходит.
Еще вариант:
ЗапросТаргетИД = "{""TargetID"":1}";
//АдресАвеона = "192.168.223.122";
АдресАвеона = "localhost";
//АдресАвеона = "127.0.0.1";
Порт = 9379;
Задержка = 10;
ЗапросHTTP = ""; //или "/"
HTTPСоединение = Новый HTTPСоединение(АдресАвеона,Порт,,,,Задержка);
ЗаголовокЗапросаHTTP = Новый Соответствие();
ЗаголовокЗапросаHTTP.Вставить("Content-Type", "application/json; charset=utf-8");
ЗаголовокЗапросаHTTP.Вставить(ЗапросТаргетИД, 1);
HTTPЗапрос = Новый HTTPЗапрос(ЗапросHTTP,ЗаголовокЗапросаHTTP);
Ответ = HTTPСоединение.Получить(HTTPЗапрос);
Я пробовал через программу Postman отправлять запросы - та же фигня, Авеон получает запрос, посылает ответ, но в ответ ничего не приходит.
Через Fiddler - нюхальщик портов - тоже тишина.
Во вложении, файл с программой АВеон, которая при включении, в тестовом режиме на запросы отправляет строку с 0 весом.
П.С. Разрабы ТензоМ, в частности программы Авеон, работают на паскале, программиста 1С уволили, поддержки 1Ски у них нет.
Попросил чтобы они скинули примеры подключения к весам через 1С - отвечают, что у них все работает, мы же не будем за вас код писать на всех других языках.
if MyClient.Connected then
begin
try
SendObj:=TJSONObject.Create;
SendObj.AddPair(TJSONPair.Create('TargetID',TJSONNumber.Create(1)));
SendStr:=SendObj.ToString;
MyClient.IOHandler.WriteLn(SendStr,enUTF8);
finally
FreeAndNil(SendObj);
end;
RecStr:=MyClient.IOHandler.ReadLn(enUTF8);
Показать
Все просто, как и в 1С, но у меня ответа нет (
и так же прислали "Имитатор статики", прога, которая сама запрашивает вес у Авеона.
В мониторе Авеона видно, что после запуска этой программы есть запросы и ответы.
Но это есть и у 1Ски, но ответы не доходят.
П.С. Странно, что такая огромная контора, которая занимает передовые места в РФ, пишет свои проги на паскале. Я еще на первом курсе в 98 с ним завязал.
Ну и странно, что не могут себе позволить содержать программиста 1С
Вот еще фал с описанием команд, может я что неправильно понял.
Пароль для настройки ПО Авеон - 0416
Основной интерфейс
Для работы по основному интерфейсу используется сетевой TCP (по умолчанию используется порт 9378). Работа по данному интерфейсу подразумевает передачу
• Событий весов
• Результатов проезда ТС по весам.
Вспомогательный интерфейс
Для работы по основному интерфейсу используется сетевой TCP порт 9379. Для работы необходимо формировать запросы:
Запрос веса - Отправляемый JSON-запрос должен содержать одну пару: «TargetID» имеющую значение 1
Отправка команды - отправляемый JSON-запрос должен содержать две пары: «TargetID» имеющую значение 2, и пару команды «Cmd»
Процедура Кнопка2Нажатие(Элемент)
HTTPСоединение = Новый HTTPСоединение(АдресАвеона,Порт,,,,Задержка);
ЗаголовокЗапросаHTTP = Новый Соответствие();
ЗаголовокЗапросаHTTP.Вставить("Content-Type", "application/json; charset=utf-8");
HTTPЗапрос = Новый HTTPЗапрос(ЗапросHTTP_Слэш, ЗаголовокЗапросаHTTP);
HTTPЗапрос.УстановитьТелоИзСтроки(ЗапросТаргетИД);
Попытка
Ответ = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
Исключение
Сообщить( "Ответ сервера: " + ОписаниеОшибки());
КонецПопытки;
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());
Данные = ПрочитатьJSON(ЧтениеJSON, Ложь);
КонецПроцедуры
Показать
{ВнешняяОбработка.ВнешняяОбработкаПолучитьВесС_ГрузовыхВесов.Форма.Форма.Форма(149)}: Значение не является значением объектного типа (ПолучитьТелоКакСтроку)
ЧтениеJSON.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());
Ответ сервера: {ВнешняяОбработка.ВнешняяОбработкаПолучитьВесС_ГрузовыхВесов.Форма.Форма.Форма(143)}: Ошибка при вызове метода контекста (ОтправитьДляОбработки): Ошибка работы с Интернет: Превышено время ожидания
Ответ сервера: {ВнешняяОбработка.ВнешняяОбработкаПолучитьВесС_ГрузовыхВесов.Форма.Форма.Форма(161)}: Ошибка при вызове метода контекста (ОтправитьДляОбработки): Ошибка работы с Интернет: Превышено время ожидания
При этом в мониторе Авеона:
Сервер 9379 работает...
Сервер 9379 работает...
Получен запрос веса ...{"TargetID":1}
Отправлен ответ : {"TargetID":1,"DinWeight":0,"DinStabil":1,"OverloadDin":0,"ErrorDin":0,"FixStat":0}
Сервер 9379 работает...
Сервер 9379 работает...
Млин Вот я косой. Далее, отправляя запрос {"TargetID:1"} на адрес localhost с портом 9379, в ответ получает строку json с весом. Не обратил внимение... Нужно {"TargetID":1}
HTTPСоединение = Новый HTTPСоединение(АдресАвеона,9379,,,,Задержка);
АдресАвеона = {"TargetID":1}
Так что тут правильно все.. Да и сам Авеон говорит, что "Получен запрос веса ...{"TargetID":1}"
А для 1Ски разве отдельные порты?
Разраб прислал обработку, которая эмулирует программу получающую зарпосы от Авеона - во вложении она, она принимает по этому же порту.
(15) У меня отключен "брэндмаузер", но на всякий случай, создал правило для портов 9378, 9379 которое, разрешает все действия с данными портами - ничего не поменялось.
&НаКлиенте
Процедура Команда1(Команда)
АдресАвеона = "192.168.88.228";
ТекстЗапроса="{""TargetID"":""1""}";
Порт = 9379;
Задержка = 10;
HTTPСоединение = Новый HTTPСоединение(АдресАвеона,Порт,,,,Задержка);
ЗаголовокЗапросаHTTP = Новый Соответствие();
ЗаголовокЗапросаHTTP.Вставить("Content-Type", "application/json");
HTTPЗапрос = Новый HTTPЗапрос("192.168.88.228", ЗаголовокЗапросаHTTP);
HTTPЗапрос.УстановитьТелоИзСтроки("order="+ТекстЗапроса, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать); //УстановитьТелоИзСтроки(ТекстЗапроса);
Попытка
HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос,"D:\tt1\text.txt");
//ПотокОтветаJSON = Ответ.ПолучитьТелоКакПоток();
Исключение
Ответ = "Ответ сервера: " + ОписаниеОшибки();
КонецПопытки;
КонецПроцедуры
Показать
Да, этот вариант работает, записывает в файл строку с запросом. СПАСИБО!
Вот так у меня рабтает:
Процедура Кнопка10Нажатие(Элемент)
HTTPСоединение = Новый HTTPСоединение("localhost",9379,,,,1);
ЗаголовокЗапросаHTTP = Новый Соответствие();
ЗаголовокЗапросаHTTP.Вставить("Content-Type", "application/json");
HTTPЗапрос = Новый HTTPЗапрос("localhost", ЗаголовокЗапросаHTTP);
HTTPЗапрос.УстановитьТелоИзСтроки("order="+"{""TargetID"":1}", КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
Попытка
HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос,"C:\TMP\text.txt");
Исключение
Ответ = "Ответ сервера: " + ОписаниеОшибки();
КонецПопытки;
КонецПроцедуры
Показать
Из косяков...
1. Соединение отрубается только по задержке, т.е. если поставить 10 сек, будет висеть 10 сек, если поставить 0 - зависнет. Выбрал минимум 1 сек.
2. Ответ = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос); почему то не отрабатывает...
3. Теперь придется записывать ответ в файл, далее его тут же читать и затем выводить на форму. Не красиво как то..
(19) Судя по тому, что работает только с файлом, весы отдают потоком. Т.е. постоянно отдают вес с какой-то периодичностью. Т.к. нет кода ответа, 1С-ка отваливается по таймауту.