Форум » » Можно обойтись без Telnet'a? Чистый http api, GET, POST? » Ответить

Можно обойтись без Telnet'a? Чистый http api, GET, POST?

dougthehead: Подскажите коллеги, а куда копать, чтобы подружить crestron с оборудованием, не поддерживающим telnet? Надо: 1) Отправить крестрону GET или POST запрос формата http://[ip_address_of_crestron]:[port]/?[some_key1]=[some_value1]&[some_key2]=[some_value2] 2) Получить от него осознанное действие. Например, включить свет. Прошу подсказать, возможен ли такой функционал и где почитать. Спасибо.

Ответов - 41, стр: 1 2 3 All

AndreySh: gosha Спасибо! Уже смотрел, но вопрос у меня в другом: Как весь запрос (пример ниже) закинуть через контроллер? Сворачивание в одну строчку - не помогает POST /RPC2 HTTP/1.0 User-Agent: Frontier/5.1.2 (WinNT) Host: betty.userland.com Content-Type: text/xml Content-length: 181 <?xml version="1.0"?> <methodCall> <methodName>examples.getStateName</methodName> <params> <param> <value><i4>41</i4></value> </param> </params> </methodCall>

Вячеслав: Это не пример команды в чистом виде это описание её обязательных или не очень параметров (хотя описание ближе к истинной команде, чем то что можно ввести в строку браузера, который добавит к ней еще всякой служебной инфы). Лучший способ подсмотреть Wireshark-ом пример одной из команд с рабочего варианта коммуникации. При этом символы \r\r смотреть в hex варианте (для Crestron \r\n интерпретируется иначе чем в WireShark. В Crestron \r\n заменить на \n) Скопировав целиком рабочую команду из Wireshark засовываем её в Simpl+ модуль Crestron (можно выкинуть аккуратно!! всякую чушь типа имени браузера, User-Agent и т.п.) Обрабатывайте эту команду как строковую переменную, меняя необходимые значения параметров и отправляйте через TCP_CLIENT на MCU. При этом неизменяемые части типа "POST /RPC2/..."и " HTTP/1.0\n" используете как строковые константы и лепите из них нужную полную строку команды через + заканчивая каждый параметр \n добавив в конце +"\n\n"; Можно видимо как тут советуют использовать внешний TCP client, но придется разбивать строки на части не длиннее 255 символов. Я всегда использовал внутренний в SIMPL+ TCP_CLIENT, чтоб не заморачиваться с длиной команды (а она получится достаточно длинная). Боюсь даже предположить, что это можно реализовать на Serial i/o только не используя SIMPL+.(почему смотри ниже) С большой долей вероятности, придется позаботится еще о расчете параметра Content-Length:xx\n Ведь он (длина команды) будет меняться динамически в зависимости от параметров команды. Если это поле использовать как константу всегда одинаковое (т.е. не пересчитывать длину или не использовать параметр вовсе) то сервер может и не принять такую команду вернув ошибку. Либо описывать все команды как константы (заменив лишь \r на \n) на все возможные варианты (перехватив только самые нужные). Но это не наш метод ).

Игорь K.: Ответ тут должен быть таким: можно, в соответствии с протоколами и синтаксисом.


AndreySh: Вячеслав, Спасибо, за столь развернутый ответ, попробую написать модуль. По всей видимости у меня не были соблюдены "\n\" , в довесок команда больше 255 символов

Вячеслав: Только говоря про \n я не имел ввиду параметры xml, я имел ввиду параметры POST запроса для http. Разметку xml по факту в перехваченном пакете. Отправляйте из приложения на ПК по возможности и ловите wireshark с фильтром ip.addr==IP_адрес_MCU Скопировать ПКМ на пакете Copy->as Printable Text. Но непечатные символы 0d 0a (тоже в wireshark .. или \r\n тоже в Crestron \n) придется добавить в строку Crestron как \x0d\x0a или \n Вам нужно все начиная с фразы POST и заканчивая .... (\n\n) если блок xml попадает в эти рамки. Иногда данные могут подставляться к конце пакета, уже за символами \n\n Длину (Content-length:) определяет видимо блок xml начиная от <? и заканчивая последней > включая непечатные символы (\x0d\x0a это два символа даже если вы их запишите как \n) Длину подставляемую после "Content-length: " легко посчитать применив штатные функции SIMPL+ LEN() и ITOA() Пример: command_length$=ITOA(len("<?......>")); В качестве значения для параметра "Host: " подставляйте IP адрес MCU.

AndreySh: Вячеслав Еще раз огромное спасибо! Вообщем, кусок simpl+, который заработал (вдруг кому понадобится): Push Call_to_Name1 { BodyLine1 = "\n\n"; BodyLineCMD1 = "<methodCall><methodName>participant.add</methodName><params><param><value><struct>"; BodyLineCMD2 = "<member><name>authenticationUser</name><value><string>admin</string></value></member><member><name>authenticationPassword</name><value><string>password</string></value></member>"; BodyLineCMD3 = "<member><name>conferenceName</name><value><string>666</string></value></member><member><name>participantName</name><value><string>andrei.movi</string></value></member>"; BodyLineCMD4 = "<member><name>address</name><value><string>shatov.movi</string></value></member></struct></value></param></params></methodCall>"; Body = BodyLineCMD1 +BodyLineCMD2 + BodyLineCMD3 +BodyLineCMD4 + BodyLine1; Header1 = "POST /RPC2 HTTP/1.1\n"; Header2 = "Connection: keep-alive\n"; MAKESTRING (Header3, "Content-Length: %d\n", LEN (Body)); MAKESTRING (Header4, "HOST: %s\n", MCU_IPAddr); Header5 = "Content-Type: text/html\n"; Header6 = "Accept-Encoding:\nUser-Agent:\nAuthorization:\n\n"; MCU_BODY_OUT = Header1+Header2+Header3+Header4+Header5+Header6+BodyLineCMD1; MCU_BODY_OUT = BodyLineCMD2; MCU_BODY_OUT = BodyLineCMD3; MCU_Body_OUT = BodyLineCMD4+BodyLine1; } Как видно, вывожу по строчкам весь код через внешний TCP\IP client, если коллеги подскажет, как использовать внутренний /*TCP_CLIENT tcpclient80 [20000]; - буду очень благодарен, сам как-то не осилил.

Ale4ko: AndreySh обратите внимания на Header6 = "Accept-Encoding:\nUser-Agent:\nAuthorization:\n\n"; это не верный формат запроса.

AndreySh: Ale4ko А что Вас смущает? 1. Если не заполнены поля с данными, то это "прихоть" MCU. хоть и с пустыми значениями, но строки Accept-Encoding: Authorization должны присутствовать, без них http запрос не обрабатывается и ответ с ошибкой 201 (operation failed) 2. Или же что команда записана в одну строку?

gosha: Я бы все-таки убрал Connection: keep-alive, поменял Content-Type на text/xml, и посмотрел .pcap запроса, который дает 201

AndreySh: gosha Позже попробую проверить, сейчас уже такой возможности нет.

gosha: AndreySh , два вопроса: 1. Речь о Codian? 2. Раз уж CP3, почему бы не делать все средствами S#? Решение упростится и ускорится в разы.

AndreySh: gosha? 1. Да, Codian! (Cisco MCU 4515) 2. пытался, но, к сожалению, знаний не хватает :(

Ale4ko: AndreySh пишет: 1. Если не заполнены поля с данными, то это "прихоть" MCU. хоть и с пустыми значениями, но строки Accept-Encoding: Authorization должны присутствовать, без них http запрос не обрабатывается и ответ с ошибкой 201 (operation failed) странно, я был уверен что такой запрос может выдать ошибку. не знаю как на счет Authorization скорее всего должно быть заполнини значениями authenticationUser и authenticationPassword из BodyLineCMD2 , а Accept-Encoding и User-Agent желательно заполнить значениями. Гоша прав 'Content-Type: text/xml' будет правильно. я бы выбрал вариант: Header5 = "Content-Type text/xml; charset=utf-8\n"; Header6 = "Accept-Encoding: identity\nUser-Agent: AndreySh\nAuthorization: Basic YWRtaW46cGFzc3dvcmQ=\n\n"; еше более подробно описано тут и тут

Вячеслав: Без претензий на правильность, но тем не менее рабочий вариант встроенного TCP client: integer MCU_connected; Integer_Function connect() { return(SocketConnectClient (tcpclient80, MCU_IPAddr, 80, 0)); } Function disconnect() { SocketDisconnectClient (tcpclient80); } Function to_MCU(string data) { signed_integer iStatus,i; if (MCU_Connected=0){connect();} i=0; while(i<90) { if (MCU_Connected=1) { iStatus = SocketSend(tcpclient80,data); if (iStatus < 0)Print("Error Sending to MCU: %d\n", iStatus); if (iStatus=-5){connect();delay(200);}else {i=100;} }else {delay(20);i=i+1;} } } SOCKETCONNECT tcpclient80 { MCU_Connected = 1; } SOCKETDISCONNECT tcpclient80 { MCU_Connected = 0; }

Courag1k: Добрый день! Подскажите, через программу postman отправляю по адресу: http://10.10.10.99/mnc/secure_api.php Команду: {"p_targetId":0,"p_cmd":"getProductListSaved","p_userName":"admin","p_password":"admin"} Wireshark видит как: POST /mnc/secure_api.php HTTP/1.1 Content-Type: application/json User-Agent: PostmanRuntime/7.22.0 Accept: */* Cache-Control: no-cache Postman-Token: 2b7ab1ae-93bb-49fd-975a-ab90603527c2 Host: 10.10.10.99 Accept-Encoding: gzip, deflate, br Content-Length: 88 Connection: keep-alive {"p_targetId":0,"p_cmd":"getProductListSaved","p_userName":"admin","p_password":"admin"} Команда выполнена, ответ SUCCESS Через Crestron засылаю такого типа команду: POST /mnc/secure_api.php?{"p_targetId":0,"p_cmd":"getProductListSaved","p_userName":"admin","p_password":"admin"} HTTP/1.0\nHost: 10.10.10.99\nContent-Type: text/json\n\n\n Выдает Failed, "p_msg":"invalid command" Это контроллер MUxlab. Может в строке где синтаксис не верный, подскажите

Вячеслав: 1.Начнем с того, что блок json (тот что в фигурных скобках) должен быть в самом конце пакета, за пределами \n\n Ведь в WireShark же так и есть 2.Скорее всего нужно еще и токен получить сначала как то и его тоже отправлять 3.100% нужно считать длину блока json и помещать её в поле Content-Length Дальше посмотрим )

Alexandr: Коллеги, хочу повторить вопрос, заданный в начале этой темы. Есть устройство (кнопочная панель), которая по нажатию на кнопки генерит простые HTTP запросы (GET, к примеру) по указанному адресу. Нужно как то обрабатывать эти запросы, сходу не смог их получить на контроллере ( TCP/IP сервер с портом 80). В Как получить эти запросы в контроллере?

Admin: Примените TCP/IP Server в SIMPL. Подозреваю, у вас кнопка Sure Button.

Alexandr: Admin пишет: Примените TCP/IP Server в SIMPL так сходу и не получилось :( в настройка сервера указывать адрес панели?

Admin: В случае, если "панель" не может быть сконфигурирована так, чтобы знать IP процессора, схема Клиент-сервер неприменима. Нет разницы, где клиент и сервер, можно использовать то, что понятно и работает. Установите связь, например через TCP/IP Client и следите за посылками от панели. В настройках клиента укажите адрес панели. Должен же он быть где-то обозначен, хотя бы один раз.



полная версия страницы