Получить данные по UDP
Коллеги, здравствуйте!
Не могу разобраться, как получить данные по 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)
});
Я так понимаю, что данные мне будут валиться "как попало", и мне самому надо будет разбирать в ответ на что они пришли, но сейчас не приходит ничего, хотя данные идут, дампы посмотрел, мои команды уходят, ответ с содержимым возвращается. Что-то я не настроил в иридии.
Customer support service by UserEcho
Если сервер запустить 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 пакет.
Спасибо!
Добрый день.
Если лампочка умеет в ответ добавлять свой идентификатор, то разобрать ответ не составит труда. Если нет, то для внешнего устройства пакеты от обеих лампочек будут неразличимы.