Форум » » Можно обойтись без 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

Игорь K.: Такой вариант связи возможен. Из проткола HTTP для передачи команды нужно испольтзовать GET. Именно так прекрасно управляются плееры DUNE, XMBC, AppleTV, видеокамеры и другие устройства BOSCH NG тд. Внешне это выглядит так, как буд-то Crestron отправляет запрос вместо браузера, обратно идет XML или HTML код, который можно разобрать.

dougthehead: Нет, мне надо в обратную сторону. Крестрону отправить GET и вызвать заложенный алгоритм действий.

Игорь K.: Нет проблем, Сrestron поймет любой запрос по UDP/TCP IP, в чистом виде, без GET И вообще ничего из HTTP не нужно.


dougthehead: Вот как раз только HTTP и нужно. Возможности отправлять RAW TCP/IP нет.

Игорь K.: Отправляйте, анализируйте и запускайте внутренние алгоритмы. Нет проблем. Процессор Crestron это не Web-сервер, смотрите на него как на узел в сети с портом 80, как в вашем случае. Из строки поиска браузера команды отправлять собираетесь?

dougthehead: Игорь K. пишет: Из строки поиска браузера команды отправлять собираетесь? Нет, ajax. Спасибо за ответы. Так где почитать можно про http api Crestron'a? Все, что я нашел - это как с помощью Крестрона управлять чем-то. Наоборот - только telnet. HTTP API это секретная документация?

gosha: Нет,HTTP API, как такового, нет. Если сильно надо - сделайте сами под конкретную вашу задачу. Только это, во-первых, адова работа, особенно для второй серии процессоров, во-вторых, не очень понятны источник происхождения такого вопроса и конечная цель...

dougthehead: Источник происхождения вопроса - надо связать Crestron и специальный аппаратный сервер. Сервер имеет HTTP API, но Telnet'ом работать не может (закрыт). Crestron, как мы сейчас выяснили, не имеет HTTP API. Тогда вопрос снимается. Не имеет так не имеет. Будем работать через RS-232. Оно есть у обоих. Спасибо.

p.vladi: Так если есть RS232, почему вообще осбуждались костыли???

Игорь K.: p.vladi, разведка, а может просто Маркет ресерч.

Igor: dougthehead пишет: Странно, что Крестрон такие очевидные вещи не поддерживает. Да, Crestron вообще отстой. Так и написано в пресс-релизе Хвайчонг Дзайбинь Хоум Контроль Ко.

gosha: Так у вас еще и непонимание разницы между клиентом и сервером. Вам на Крестроне нужен клиент. Что несколько снижает температуру ада...

yanovik: Чтобы не плодить темы, имеется рекордер Epiphan. Не могу сформулировать команду старт записи, подозреваю что дело в синтаксисе команды. Инструкция гласит 3. To start recording: wget --http-user=admin --http-passwd=pass123 http://192.30.23.45/admin/set_params.cgi?rec_enabled=on Я же посылаю в TX TCP\IP сокета на порт 80 команду вида GET /admin/set_params.cgi?http-user=admin&http-passwd=1234&rec_enabled=on HTTP/1.0\nHost: 192.168.0.4\n\n Но рекордер все равно ругается на авторизацию. Как изменить команду?

marin_n: А если использовать authorization:basic ? Помнится, я использовала это для спутникового ресивера dreambox.

yanovik: Отвечу сам на свой вопрос GET /admin/set_params.cgi?rec_enabled=on HTTP/1.0\nHost: 192.168.0.4\nAuthorization: Basic YWRtaW46MTIzNA==\n\n GET /admin/set_params.cgi?rec_enabled="" HTTP/1.0\nHost: 192.168.0.4\nAuthorization: Basic YWRtaW46MTIzNA==\n\n Авторизация для admin:1234. Почему-то Epiphan предлагает примеры HTTP запросов для WGET. Установил wget и послал рекомендованный запрос, посмотрел wireshark'ом какой запрос GET формируется. Собственно сам запрос больше, но я выкинул из него лишнее типа User agent и тд

Владимир: Друзья помогите. на cp2e есть реле которое замыкает провод на 2 секунды, так вот требуется активировать это реле через get или telnet. не подскажете как это сделать?

yanovik: Подскажите, пытаюсь послать POST, дебаггер ругается "CANNOT TRANSMIT PACKET [blablabla] Packet is too large" надо как-то разбить его? ------ Отправлять по частям. После \n\n будет ответ.

aes: dougthehead пишет: dougthehead пишет: Спасибо за ответы. Так где почитать можно про http api Crestron'a? Все, что я нашел - это как с помощью Крестрона управлять чем-то. Наоборот - только telnet. HTTP API это секретная документация? Протокол HTTP описан в стандартах RFC и находится в свободном доступе. Реализовать примитивный сервер, который примет запрос GET, дело максимум часа работы. В простейшем случае реализация GET-запроса - это открытие TCP-сервера, прием пары строк текста до первой пустой строки, отправка пары строк текста в ответ, закрытие сервера, открытие сервера и все заново. В случае POST чуть сложнее, но тем не менее все равно примитивно. P.S. Для меня тоже странно, что в библиотеке нет готового модуля : )

AndreySh: Добрый день, коллеги, а можно, более подробно про команды POST? Задача: Управление Сервером Cisco MCU с CP3. MCU понимает команды xml-RPC, т.е. нужно посылать команды POST HTTP на http:ipaddr/RPC2. Если я правильно понимаю, то в первую очередь создаем клиент TCP\IP по 80 порту, Далее посылаем текстовые команды, ...только вот в каком формате так и не разобрался. Исходник команды выглядит примерно так: POST /RPC2 HTTP/1.1 <methodCall> <methodName>conference.status</methodName> <params> <param> <value> <struct> <member> <name>authenticationUser</name> <value> <string>admin</string> </value> </member> <member> <name>authenticationPassword</name> <value> <string>password</string> </value> </member> <member> <name>conferenceName</name> <value> <string>9555</string> </value> </member> </struct> </value> </param> </params> </methodCall> НО что бы не посылал, ответ один: 201 operation failed. пробовал тот же код через тестовые программы напрямую кидать - все получается, а через крестрон - никак. подскажите, пожалуйста, куда копать?

gosha: Тыц

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 и следите за посылками от панели. В настройках клиента укажите адрес панели. Должен же он быть где-то обозначен, хотя бы один раз.

Alexandr: на контроллере был запущен web сервер, после отключения его всё заработало.



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