|
stm32f207+ethernet+xml, Как передавать XML запросы |
|
|
|
Jun 22 2012, 04:56
|

Местный
  
Группа: Участник
Сообщений: 340
Регистрация: 25-10-05
Из: Пермь, Россия
Пользователь №: 10 091

|
Цитата(Kalyan @ Jun 22 2012, 02:21)  Подскажите пожалуйста где про это можно прочитать (не про сам протокол XML, а как генерировать их микроконтроллером и отправлять по ethernet) Боюсь, что Вам следует-таки начать со знакомства с XML. Потому что это не протокол вовсе, а язык. Из упомянутого Вами протоколами являются IP, TCP и HTTP. Чтобы ликвидировать кашу в голове, надо разобраться с основными понятиями. Затем выбрать протокол, посредством которого будет осуществляться обмен документами на языке XML (если к этому моменту не передумаете использовать XML). И вот когда протокол будет выбран, дойдет очередь и до вопроса, как по этому протоколу передавать и принимать данные... А пока, без конкретной постановки задачи, вряд ли что-то конкретное можно порекомендовать. Начните вот с этого: http://ru.wikipedia.org/wiki/XMLhttp://ru.wikipedia.org/wiki/Ethernethttp://ru.wikipedia.org/wiki/IPhttp://ru.wikipedia.org/wiki/TCPhttp://ru.wikipedia.org/wiki/HTTP
--------------------
Всего наилучшего, Alex Mogilnikov
|
|
|
|
|
Jun 22 2012, 06:47
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(Kalyan @ Jun 22 2012, 10:18)  Но вот как XML запросы отправлять для меня не понятно. Что есть "XML запрос"? Единственное, что мне приходит в голову - это AJAX. Скрипт в браузере использует объект XMLHttpRequest, который запрашивает с веб-сервера динамические данные в формате XML. Веб-сервер, сидящий в вашем МК, должен сгенерировать эти данные и предоставить их браузеру в виде XML-файла (с соответствующим HTTP-заголовком). Вот, собственно, и всё. Я правильно понял вашу задачу?
|
|
|
|
|
Jun 22 2012, 07:11
|

Ally
     
Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050

|
Цитата(scifi @ Jun 22 2012, 09:47)  Что есть "XML запрос"? Единственное, что мне приходит в голову - это AJAX. Скрипт в браузере использует объект XMLHttpRequest, который запрашивает с веб-сервера динамические данные в формате XML. Веб-сервер, сидящий в вашем МК, должен сгенерировать эти данные и предоставить их браузеру в виде XML-файла (с соответствующим HTTP-заголовком). Вот, собственно, и всё. Я правильно понял вашу задачу? Видимо проблема и есть в правильном формировании HTTP заголовка, ибо сам текст XML запроса можно подсмотреть в браузере через инструменты разработчика. А вот как передать куки, какое кодирование, какая таблица символов, аутентификация и т.д. с учетом ограниченности embedded web сервера. Вот это надо будет отлаживать конкретно.
|
|
|
|
|
Jun 22 2012, 15:42
|
Частый гость
 
Группа: Свой
Сообщений: 108
Регистрация: 4-11-10
Пользователь №: 60 656

|
Для создания клиента буду пользоваться Netconn API functions со стека LwIp. Допустим что на одной плате я запусти HTTP сервер тот что с примера с сайта CTM. А на второй плате я запущу свой HTTP клиент. Вот как послать своим клиентом самый простой запрос к серверу. Возникает ряд вопросов: как работать с ip адресами? Пусть у сервера будет 192.168.0.10 а у клиента 192.168.0.9. Нашел функцию для его определения: netconn_getaddr(conn, &local_ip_address, &port, 1); Правильно ли я понял: эта функция должна найти адрес другого локального устройства (если флаг 1)? То есть адрес моего сервера ( 192.168.0.10). А если устройств в сети будет больше чем одно, тогда как? Но при использовании netconn_getaddr(conn, &local_ip_address, &port, 1) local_ip_address равняется нулю, но ошибка не возвращается. Теперь на счет запроса. На стороне сервера есть вот такая проверка запросов: Код /* Is this an HTTP GET command? (only check the first 5 chars, since there are other formats for GET, and we're keeping it very simple )*/ if ((buflen >=5) && (strncmp(buf, "GET /", 5) == 0)) { /* Check if request to get ST.gif */ if (strncmp((char const *)buf,"GET /STM32F2x7_files/ST.gif",27)==0) {...} /* Check if request to get stm32.jpeg */ else if (strncmp((char const *)buf,"GET /STM32F2x7_files/stm32.jpeg",31)==0) {...} else if (strncmp((char const *)buf,"GET /STM32F2x7_files/logo.jpg", 29) == 0) {...} else if(strncmp(buf, "GET /STM32F2x7TASKS.html", 24) == 0) {...} Корректно ли будет отправка такого запроса: Код char request[]="GET /STM32F2x7TASKS.html"; Мне вот хотя бы увидеть что клиент передает а сервер это воспринимает и отвечает. В итоге пробовал это сделать вот так: Код struct netconn *conn, *newconn; err_t err; struct ip_addr local_ip_address = {0xc0a8000a}; //подствил адрес сервера так как его адрес не читался функцией netconn_getaddr char request[]="GET /STM32F2x7TASKS.html"; /* Create a new TCP connection handle */ conn = netconn_new(NETCONN_TCP); if (conn!= NULL) { // err = netconn_getaddr(conn, &local_ip_address, &port, 1); /* Bind to port 80 (HTTP) with default IP address */ err = netconn_bind(conn, &local_ip_address, HTTP_PORT); if (err == ERR_OK) { err=netconn_write(conn, &request, 24, NETCONN_NOCOPY); /* Close the connection (server closes in HTTP) */ netconn_close(conn); } } netconn_bind проходит успешно. никакой ошибки не возвращается. А вот netconn_write возвращает ошибку (-8 - нет соединения). В чем я ошибаюсь?
|
|
|
|
|
Jun 22 2012, 20:11
|

Ally
     
Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050

|
Цитата(Kalyan @ Jun 22 2012, 18:42)  netconn_bind проходит успешно. никакой ошибки не возвращается. А вот netconn_write возвращает ошибку (-8 - нет соединения). В чем я ошибаюсь? Ну вы даете, похоже действительно вам трудно  netconn_bind - это еще не создание подключения. Дальше для сервера должно следовать netconn_listen (т.е. начинаем слушать свой порт), а в случае клиента netconn_connect (т.е. подключаемся к порту другого сервера) http://lwip.wikia.com/wiki/Netconn_bindАдрес сервера вы не узнаете никакими командами в стеке TCP/IP. Его надо забивать либо в ручную, либо использовать клиент протокола DHCP, а сервер должен иметь серверную часть DHCP. Есть еще конечно такие протоколы как DNS,RIP, SNMP.. для таких дел, но... Да, и по lwIP меня не спрашивайте, в нем не спец, просто посмотрел первый попавшийся хелп.
|
|
|
|
|
Jun 22 2012, 20:52
|
Частый гость
 
Группа: Участник
Сообщений: 169
Регистрация: 31-08-05
Из: New York
Пользователь №: 8 118

|
Может, имеет смысл сначала потренироваться на создании клиента на PC? Там это будет удобнее, а разница - только в наменованиях методов установления соединения и передачи. А сервер у Вас где - на PC или тоже на микроконтроллере?
--------------------
ASB
|
|
|
|
|
Jun 24 2012, 13:18
|
Частый гость
 
Группа: Свой
Сообщений: 108
Регистрация: 4-11-10
Пользователь №: 60 656

|
Цитата Ну вы даете, похоже действительно вам трудно wink.gif Да трудно, иначе б и не спрашивал :-) Помогите понять правильную последовательностть устанеовления связей, подклюсения портов, отправления запросов и тд. На сколько я понял должно быть так (для киента): 1. conn = netconn_new(NETCONN_TCP); /* Create a new TCP connection handle */ 2. err = netconn_bind(conn, &local_ip_address, HTTP_PORT); /* Bind to port 80 (HTTP) with default IP address */ 3. netconn_connect(.....) / 4. netconn_write(conn, &request, 24, NETCONN_NOCOPY); // и отправили HTTP запрос После этого закрываем netconn_close(conn); /* Close the connection (server closes in HTTP) */ Правильно или нет? А как тогда еще принимать ответы от сервера? После отправления запроса netconn_write() перейти на прослушивание порта netconn_listen ()?
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|