0
Beantwoord

Получить данные по UDP

Виктор 7 jaar geleden in Tips and Tricks bijgewerkt door Vladimir Ovchinnikov (expert) 6 jaar geleden 15

Коллеги, здравствуйте! 

Не могу разобраться, как получить данные по UDP? До этого работал через SendEx по HTTP, там все нормально приходило в ответ на команду.

Теперь создал команду в панельном приложении, натянул её на айтем (решил использовать-таки нативный функционал, отойти немного от скриптов), по UDP ушел запрос, лампочка включилась, все ок.

Теперь надо отправить команду о состоянии лампочки - создал команду, натянул, отправил, в скрипте прописал слушатели:


   var driver = IR.GetDevice("DirectJUK");
   IR.Log("driver is:" + driver)

   IR.AddListener(IR.EVENT_RECEIVE_TEXT, driver, function(text)
   {
      IR.Log("EVENT_RECEIVE_TEXT is:" + text)
   });

   IR.AddListener(IR.EVENT_RECEIVE_DATA, driver, function(data)
   {
      IR.Log("EVENT_RECEIVE_DATA is:" + data)
   });

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



GOED, IK BEN TEVREDEN
Satisfaction mark by Виктор 6 jaar geleden

Если сервер запустить UDP - данные приходят. Кликаю команду, вижу на сервер пришло сообщение.

Может кто знает, как красиво настроить, чтобы было точно понятно, что в ответ на что пришло? Как средствами иридия организовать обработку команд по UDP?

Саппорт подсказал, что надо в поле LocalPort указать порт, куда приходят данные от UTP устройства. 
Остается вопрос, можно ли без плясок обработать получение в ответ на команду? То есть не скопом, а как в HTTP? Там я прописывал команду отправки и тут же описывал обработку получения данных от этой команды.

Ожидает ответа пользователя

Здравствуйте!


Данные от Custom драйверов можно получить только с помощью слушателей IR.EVENT_RECEIVE_TEXT и IR.EVENT_RECEIVE_DATA, которые вы как раз и использовали в вашем скрипте. Также можно использовать метод SendEx, который умеет также принимать ответ от оборудования, т.е. имеет свой встроенный слушатель. Но в любом случае, при работе с данными драйверами, без скриптов не обойтись.

Добрый день! Я в документации читал, что по SendEx работает только с HTTP, можно пример как оформляется команда через SendEx для UTP? Там ведь нет ни GET ни POST

Таким образом работает, на этой команде, пожалуйста, покажите пример с SendEx

JUK.Send ( [Commds[k],0x0D] )

Я не просто так прошу, я пробую варианты, пока ничего не получается

Здравствуйте!


Да, метод SendEx был расчитан на работу только с HTTP.   К сожалению, c UDP данный метод работать не будет. Поэтому для вас остается только использовать слушатели по событиям IR.EVENT_RECEIVE_TEXT и IR.EVENT_RECEIVE_DATA, которые мы вам уже советовали.

Здравствуйте!

А как организовать принадлежность этих полученных данных тому или иному запросу? Подскажите, пожалуйста, не могу придумать ничего стоящего(

Доброго дня,

Принадлежность определяется протоколом. Если в протоколе озаботились именно "ответом", то существует порядковый идентификатор ответа или кусок запроса. Так что разбор UDP пакета определяется мыслями разработчиков протокола...

Здравствуйте!

Я отправляю через Send запрос указанного выше вида. Никаких идентификаторов не прикладываю. Получаю  ответ вида "то-то и то-то включено" Я вижу только части данных, есть еще какие-то служебные данные, которые я могу отправить, например, при запросе? И выделить при получении?

может можно добавить какой-то заголовок, потом отдельно посмотреть что в ответе...

Виктор, любые данные, содержащиеся в пакете, определяются устройством, которое их посылает. Если оно умеет вшивать какой-то номер пакета/идентификатор запроса, то вы их получаете. Но как правило, этого нет. Какая разница что вы спрашивали, если в ответ приходят довольно четкие данные? Послали Вы запрос о состоянии лампочки - слушайте ответ, в котором будет содержаться идентификатор этой лампы. Причем учитывайте, что UDP не гарантирует доставку, а значит ответа может и не быть...

Как быть если есть разница, что опрашиваем? Есть 2 лапочки, у которых надо узнать состояние, спросили у первого, тот не ответил, спросили у второго, и тут ответил первый, пришли данные, а узнать от кого уже не получится. (порт для лампочек один и тот же, так как лапочки шлюи данные только на этот порт, такой вот косяк в прошивке). 


Было бы очень не плохо, если бы была возможность из какого адреса пришел UDP пакет.

Спасибо!

Добрый день.

Если лампочка умеет в ответ добавлять свой идентификатор, то разобрать ответ не составит труда. Если нет, то для внешнего устройства пакеты от обеих лампочек будут неразличимы.