Получить вес с автомобильных весов Тензо-М, через ее приложение Авеон, через json

1. UnashevRM 11.12.21 20:17 Сейчас в теме
Добрый день.

Есть автомобильные весы фирмы ТензоМ, которые подключаются через приложение Авеон.
Далее, отправляя запрос {"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Запрос);
Показать





В браузере на команду «http://localhost:9379/?{"TargetID:1"}» происходит тоже самое и браузер висит, крутя колесико.

Я пробовал через программу Postman отправлять запросы - та же фигня, Авеон получает запрос, посылает ответ, но в ответ ничего не приходит.
Через Fiddler - нюхальщик портов - тоже тишина.


ОДИН раз, на команду в браузере «http://localhost:9379/?{"TargetID:1"}» пришел ответ - больше я не смог повторить это.

Куда копать?

Во вложении, файл с программой АВеон, которая при включении, в тестовом режиме на запросы отправляет строку с 0 весом.

П.С. Разрабы ТензоМ, в частности программы Авеон, работают на паскале, программиста 1С уволили, поддержки 1Ски у них нет.
Попросил чтобы они скинули примеры подключения к весам через 1С - отвечают, что у них все работает, мы же не будем за вас код писать на всех других языках.
Прикрепленные файлы:
VA_Avion.zip
ВнешняяОбработкаПолучитьВесС_ГрузовыхВесов.epf
Найденные решения
18. user1326147 12.12.21 16:11 Сейчас в теме
&НаКлиенте
Процедура Команда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 = Ответ.ПолучитьТелоКакПоток();
    Исключение
        Ответ = "Ответ сервера: " + ОписаниеОшибки();
    КонецПопытки;

   КонецПроцедуры
Показать


text.txt
{"TargetID":1,"DinWeight":0,"DinStabil":1,"OverloadDin":0,"ErrorDin":0,"FixStat":0}

HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос,"D:\tt1\text.txt");
Выдает строку, в место объекта.
Остальные ответы
Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
2. vkholodnov 7 11.12.21 23:32 Сейчас в теме
Добрый вечер. А запросите у них по возможности код Паскаля. Если же нет то будем так разбираться
3. UnashevRM 11.12.21 23:50 Сейчас в теме
Добрый.

Да вот он.. Это отрывок, во вложении весь файл.

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С
Прикрепленные файлы:
Таймер.txt
ImitatorStatic.zip
4. user1326147 12.12.21 03:30 Сейчас в теме
Запустил твою прогу AV_Avion, она разговаривает разными словами.
Так получилось, запрашивал с другого компа.

 curl -i -X POST -H 'Content-Type: application/json' -d '{"TargetID": "1","Cmd":"1"}' http://192.168.88.228:9379

{"TargetID":1,"DinWeight":0,"DinStabil":1,"OverloadDin":0,"ErrorDin":0,"FixStat":0}



curl -i -X POST -H 'Content-Type: application/json' -d '{"TargetID":"3","Cmd":"4"}' http://192.168.88.228:9379
{"TargetID":3,"Cmd":4,"ElKl":" 444866"}


curl -i -X POST -H 'Content-Type: application/json' -d '{"TargetID":"3","Cmd":"2"}' http://192.168.88.228:9379
{"TargetID":3,"Cmd":2,"ZeroADC":"1000.00000"}
5. UnashevRM 12.12.21 07:19 Сейчас в теме
(4) А в 1Ске получилось принять эти ответы?

В мониторе у него только вот такое пишет:

Сервер 9379 работает...
Сервер 9379 работает...
Сервер 9379 работает...
Сервер 9379 работает...
Отправлен ответ : {"TargetID":1,"DinWeight":0,"DinStabil":1,"OverloadDin":0,"ErrorDin":0,"FixStat":0}
Получен запрос веса ...{"TargetID":1}
Отправлен ответ : {"TargetID":1,"DinWeight":0,"DinStabil":1,"OverloadDin":0,"ErrorDin":0,"FixStat":0}
Получен запрос веса ...{"TargetID":1}
Отправлен ответ : {"TargetID":1,"DinWeight":0,"DinStabil":1,"OverloadDin":0,"ErrorDin":0,"FixStat":0}
6. UnashevRM 12.12.21 07:29 Сейчас в теме
Вот еще фал с описанием команд, может я что неправильно понял.

Пароль для настройки ПО Авеон - 0416

Основной интерфейс

Для работы по основному интерфейсу используется сетевой TCP (по умолчанию используется порт 9378). Работа по данному интерфейсу подразумевает передачу
• Событий весов
• Результатов проезда ТС по весам.

Вспомогательный интерфейс

Для работы по основному интерфейсу используется сетевой TCP порт 9379. Для работы необходимо формировать запросы:
Запрос веса - Отправляемый JSON-запрос должен содержать одну пару: «TargetID» имеющую значение 1
Отправка команды - отправляемый JSON-запрос должен содержать две пары: «TargetID» имеющую значение 2, и пару команды «Cmd»
Прикрепленные файлы:
Обмен данными с весами по TCP_IP.doc
7. vkholodnov 7 12.12.21 09:25 Сейчас в теме
А у Вас скорее всего 1С серверная. И сервер отдельно от клиента стоит.
9. UnashevRM 12.12.21 09:49 Сейчас в теме
(7) Да, конечно. Ответ приходит на сервер, а не на клиента? Запрос то с клиента отправляется..
12. UnashevRM 12.12.21 10:06 Сейчас в теме
(7) Попробовал, на самом сервере запускаю, тоже самое.
8. vkholodnov 7 12.12.21 09:40 Сейчас в теме
Давайте мы с Вами немного изменим код и проанализируем ошибку.

Процедура Кнопка2Нажатие(Элемент)
	HTTPСоединение = Новый HTTPСоединение(АдресАвеона,Порт,,,,Задержка);
	ЗаголовокЗапросаHTTP = Новый Соответствие();
	ЗаголовокЗапросаHTTP.Вставить("Content-Type", "application/json; charset=utf-8");
	
	HTTPЗапрос = Новый HTTPЗапрос(ЗапросHTTP_Слэш, ЗаголовокЗапросаHTTP);
	HTTPЗапрос.УстановитьТелоИзСтроки(ЗапросТаргетИД);
	Попытка
		Ответ = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
	Исключение
		Сообщить( "Ответ сервера: " + ОписаниеОшибки());
	КонецПопытки;

	ЧтениеJSON = Новый ЧтениеJSON;
	ЧтениеJSON.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());
	Данные = ПрочитатьJSON(ЧтениеJSON, Ложь);
КонецПроцедуры
Показать


Тут идет через попытку и если ошибка, то будет ее описание.
10. UnashevRM 12.12.21 09:57 Сейчас в теме
(8)
Процедура Кнопка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)}: Ошибка при вызове метода контекста (ОтправитьДляОбработки): Ошибка работы с Интернет: Превышено время ожидания
11. vkholodnov 7 12.12.21 10:01 Сейчас в теме
(10)
Сообщить( "Ответ сервера: " + ОписаниеОшибки());


Процедура Кнопка2Нажатие(Элемент)
	HTTPСоединение = Новый HTTPСоединение(АдресАвеона,Порт,,,,Задержка);
	ЗаголовокЗапросаHTTP = Новый Соответствие();
	ЗаголовокЗапросаHTTP.Вставить("Content-Type", "application/json; charset=utf-8");
	
	HTTPЗапрос = Новый HTTPЗапрос(ЗапросHTTP_Слэш, ЗаголовокЗапросаHTTP);
	HTTPЗапрос.УстановитьТелоИзСтроки(ЗапросТаргетИД);
	Попытка
		Ответ = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
		ЧтениеJSON = Новый ЧтениеJSON;
		ЧтениеJSON.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());
		Данные = ПрочитатьJSON(ЧтениеJSON, Ложь);
	Исключение
		Сообщить( "Ответ сервера: " + ОписаниеОшибки());
	КонецПопытки;
КонецПроцедуры

Показать


Переписал. Что щас выдает?
13. UnashevRM 12.12.21 10:08 Сейчас в теме
(11)

Ответ сервера: {ВнешняяОбработка.ВнешняяОбработкаПолучитьВесС_ГрузовыхВесов.Форма.Форма.Форма(161)}: Ошибка при вызове метода контекста (ОтправитьДляОбработки): Ошибка работы с Интернет: Превышено время ожидания

При этом в мониторе Авеона:

Сервер 9379 работает...
Сервер 9379 работает...
Получен запрос веса ...{"TargetID":1}
Отправлен ответ : {"TargetID":1,"DinWeight":0,"DinStabil":1,"OverloadDin":0,"ErrorDin":0,"FixStat":0}
Сервер 9379 работает...
Сервер 9379 работает...
14. vkholodnov 7 12.12.21 10:09 Сейчас в теме
Млин Вот я косой. Далее, отправляя запрос {"TargetID:1"} на адрес localhost с портом 9379, в ответ получает строку json с весом. Не обратил внимение... Нужно {"TargetID":1}
16. UnashevRM 12.12.21 10:22 Сейчас в теме
(14) у меня это выведено в отдельное поле..

HTTPСоединение = Новый HTTPСоединение(АдресАвеона,9379,,,,Задержка);
АдресАвеона = {"TargetID":1}

Так что тут правильно все.. Да и сам Авеон говорит, что "Получен запрос веса ...{"TargetID":1}"



А для 1Ски разве отдельные порты?
Разраб прислал обработку, которая эмулирует программу получающую зарпосы от Авеона - во вложении она, она принимает по этому же порту.
Прикрепленные файлы:
ImitatorStatic.exe
Andreyyy; +1 Ответить
15. vkholodnov 7 12.12.21 10:11 Сейчас в теме
И кстати а открыт ли порт 9379 на получение данных?
17. UnashevRM 12.12.21 10:27 Сейчас в теме
(15) У меня отключен "брэндмаузер", но на всякий случай, создал правило для портов 9378, 9379 которое, разрешает все действия с данными портами - ничего не поменялось.
18. user1326147 12.12.21 16:11 Сейчас в теме
&НаКлиенте
Процедура Команда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 = Ответ.ПолучитьТелоКакПоток();
    Исключение
        Ответ = "Ответ сервера: " + ОписаниеОшибки();
    КонецПопытки;

   КонецПроцедуры
Показать


text.txt
{"TargetID":1,"DinWeight":0,"DinStabil":1,"OverloadDin":0,"ErrorDin":0,"FixStat":0}

HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос,"D:\tt1\text.txt");
Выдает строку, в место объекта.
19. UnashevRM 12.12.21 18:37 Сейчас в теме
(18)
&НаКлиенте
Процедура Команда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. Теперь придется записывать ответ в файл, далее его тут же читать и затем выводить на форму. Не красиво как то..

Буду дальше копать..
20. papami 55 13.12.21 08:56 Сейчас в теме
(19) Судя по тому, что работает только с файлом, весы отдают потоком. Т.е. постоянно отдают вес с какой-то периодичностью. Т.к. нет кода ответа, 1С-ка отваливается по таймауту.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот