@TOC
**В этой статье используется среда:
Управляющий: W800-KIT (Плата разработки)
Совместимость: W800 W801 AIR101
Условия разработки: CDK
SDK: W801/W800 А SDK (tls Ку) **
==Моя домашняя страница сообщества вопросыов и ответов==
==Мой CSDN Статьи==
==Написать перед: ==
Я не собираюсь изменять официальные документы, Я вызову их напрямую api, Потому что официальные лица используют много обратной связи и очередей сообщений, Кольцо застегнуто, Слишком много времени уходит на изменение оплаты, В этом нет большой необходимости.
^^^^Функции программы: Использовать панель WIFI Сервер, подключенный к компьютеру (UDP Соглашение, Имитация с помощью помощника отладки сети) , Передача данных.
^^^^Начиная с этой статьи, Начать загрузку wifi Использование. Перед тем, как написать, Разработка W80X Вот он официальный SDK, Одна функция, одна функция, Правда. . . .
^^^^Этот раздел предназначен в основном для официального UDP Соединённые идеи программирования, Это одна функция, одна функция, Очень тяжело. Надеемся, что ваши богатые руки будут тронуты чиновниками, Помогите сосредоточиться, Хвала, Выберите коллекцию.
==Внимание== : Здесь написано немного, Если новичку будет трудно понять, Посмотреть самостоятельно несколько раз. Программирование будет включено в главу III.
^^^^Открытьwm_connect_net_demo. c
Документация, demo Чжун wifi Функция подключения в этом файле.
Как показано на рисунке выше, demo_connect_net
Параметры входа функции wifi Имя и пароль.
Подними каштан:
demo_connect_net ("yyds", "1234567890") ;
//Внимание, Должна быть задержка, Проблемы с подключением. . . . .
tls_os_time_delay (2000) ;
^^^После выполнения панель разработки автоматически подключается wifi Вот так, В этот момент печатается:
Успешно подключился к маршрутизатору, Видимый маршрутизатор для панели разработки IP: 192. 168. 1. 74
.
^^^^Открытьwm_udp_demo. c
Документация, udp_demp Функция подключения в этом файле. socket_udp_demo () '
Параметры функции представлены отдельноМодель (Индивидуальное и мультивещание) , ПортАIP. Эта статья подключена к серверу компьютера, Поэтому конфигурация выглядит следующим образом:
socket_udp_demo (1, 10086, "192. 168. 1. 87") ;
Вышеупомянутое==IP==Это мой компьютер==IP==, Порт - это мой собственный порт, Изменения могут быть внесены в соответствии с фактическими обстоятельствами. Далее мы подробно рассмотрим ход выполнения функции.
^^^^socket_udp_demo () '
Первая половина функции связана с инициализацией, Рассмотрим структуру ниже: demo_udp
Структура выглядит следующим образом, Можно видеть, что структура содержит переменные, связанные с соединением, *sock_rx
А*sock_tx
, Это индикатор для последующего получения и отправки, Это означает, что последующие передачи могут быть отправлены непосредственно с помощью структуры.
/**
* @typedef struct demo_udp
*/
typedef struct demo_udp
{
tls_os_queue_t *udp_q;
struct ip_mreq mreq;
char *sock_rx;
char *sock_tx;
int cast_mode;
bool socket_ok;
int socket_num;
int port;
u32 ip_addr;
u32 rcv_data_len;
int snd_skt_no;
int snd_data_len;
} ST_Demo_Udp;
^^^^Функция распределяет память между входом и выходом, ==Если данные передаются и принимаются с большой длиной, это требует особого внимания==.
^^^^Далее рассмотрим две задачи, Вниманиеdemo_udp
Структура передаёт эти две задачи.
^^^^Первый - это настройка и отправка, Второй - получение данных.
2. 1, Сначала войтиdemo_udp_task () '
Функция: (Функцияudp
Это последняя функция, & Предыдущийdemo_udp
Эквивалентность)
^^^^Определить правильность подключения к сети.
if (ethif- status) /*connected to ap and get IP*/
{
tls_os_queue_send (udp- udp_q, (void *) DEMO_MSG_SOCKET_CREATE, 0) ;
}
else
{
struct tls_param_ip ip_param;
tls_param_get (TLS_PARAM_ID_IP, &ip_param, TRUE) ;
ip_param. dhcp_enable = TRUE;
tls_param_set (TLS_PARAM_ID_IP, &ip_param, TRUE) ;
tls_wifi_set_oneshot_flag (1) ; /*Enable oneshot configuration*/
printf ("\nwait one shot. . . . . . \n") ;
}
^^^^Просмотреть текущее состояние соединения.
tls_netif_add_status_event (udp_net_status_changed_event) ;
^^^^Прямой доступudp_net_status_changed_event () '
Функция, Официально используется одинdemo_udp
Для отправки сообщений необходимо выполнить行АФункция状态, Аudp
Эквивалентность.
static void udp_net_status_changed_event (u8 status )
{
switch (status)
{
case NETIF_WIFI_JOIN_FAILED:
tls_os_queue_send (demo_udp- udp_q, (void *) DEMO_MSG_WJOIN_FAILD, 0) ;
break;
case NETIF_WIFI_JOIN_SUCCESS:
tls_os_queue_send (demo_udp- udp_q, (void *) DEMO_MSG_WJOIN_SUCCESS, 0) ;
break;
case NETIF_IP_NET_UP:
tls_os_queue_send (demo_udp- udp_q, (void *) DEMO_MSG_SOCKET_CREATE, 0) ;
break;
default:
break;
}
}
^^^^退出udp_net_status_changed_event () '
Функция继续查看demo_udp_task () '
Функция. Один个死循环, 接收udp
А消息, 这里А switch ЧжунАmsg来自于前文提到Аupd
或demo_udp
(两者Эквивалентность) .
for (; ; )
{
tls_os_queue_receive (udp- udp_q, (void **) &msg, 0, 0) ;
printf ("\n udp msg =%d\n", msg) ;
switch ( (u32) msg)
{
case DEMO_MSG_WJOIN_SUCCESS:
break;
case DEMO_MSG_SOCKET_CREATE:
create_udp_socket_demo () ;
break;
case DEMO_MSG_WJOIN_FAILD:
if (udp- socket_num 0)
{
udp- socket_num = 0;
udp- socket_ok = FALSE;
}
break;
case DEMO_MSG_SOCKET_RECEIVE_DATA:
break;
case DEMO_MSG_UART_RECEIVE_DATA:
if (-1 == udp- snd_data_len)
{
len = DEMO_UDP_BUF_SIZE;
}
else if (udp- snd_data_len ! = 0)
{
len = (udp- snd_data_len DEMO_UDP_BUF_SIZE) ?
DEMO_UDP_BUF_SIZE : udp- snd_data_len;
}
else
{
break;
}
memset (udp- sock_tx, 'u', len) ;
if (DEMO_UDP_BROADCAST == udp- cast_mode)
{
pin. sin_addr. s_addr = htonl (0xffffffffUL) ; //IPADDR_BROADCAST
}
else if (DEMO_UDP_MUTICAST == udp- cast_mode)
{
MEMCPY ( (char *) & (pin. sin_addr. s_addr) , (char *) MCASTIP, 4) ;
}
else
{
pin. sin_addr. s_addr = udp- ip_addr;
}
pin. sin_port = htons (udp- port) ;
ret = sendto (udp- socket_num, udp- sock_tx, len, 0, (struct sockaddr *) &pin, sizeof (struct sockaddr) ) ;
// printf ("ret = %d\n", ret) ;
if (ret 0)
{
printf ("send err\n") ;
break;
}
else
{
if (udp- snd_data_len ! = -1)
{
udp- snd_data_len -= ret;
}
}
if (udp- socket_ok && udp- snd_data_len ! = 0)
{
tls_os_time_delay (8) ;
tls_os_queue_send (udp- udp_q, (void *) DEMO_MSG_UART_RECEIVE_DATA, 0) ;
}
break;
case DEMO_MSG_SOCKET_ERR:
tls_os_time_delay (200) ;
printf ("\nsocket err\n") ;
create_udp_socket_demo ( ) ;
break;
default:
break;
}
}
^^^^РасчесыватьОдин下 switch АОсуществление顺序: 首先Осуществлениеcreate_udp_socket_demo () '
, СозданиеПодключение, 这个Функция不А再看Вот так, 会自动Создание成功. 然后, 就可以进入发送Процедуры. demo Чжун单独写Вот такОдин个发送Функция:
int udp_send_data_demo (int len)
{
printf ("\nlen=%d\n", len) ;
if (NULL == demo_udp)
{
return WM_FAILED;
}
if (! demo_udp- socket_ok)
{
printf ("skt not created\n") ;
return WM_FAILED;
}
demo_udp- snd_data_len = len;
tls_os_queue_send (demo_udp- udp_q, (void *) DEMO_MSG_UART_RECEIVE_DATA, 0) ;
return WM_SUCCESS;
}
该Функция只规定Вот так传输А长度, А未对Содержание进行赋值, tls_os_queue_send () '
Функция发送消息DEMO_MSG_UART_RECEIVE_DATA
参数给 demo_udp_task () '
代码А for 循环, tls_os_queue_receive ()
Функция接收消息队列А值, А switch Осуществление. Вcase DEMO_MSG_UART_RECEIVE_DATA:
Это настоящий код, Отправлено следующее:
memset (udp- sock_tx, 'u', len) ;
Код апелляции состоит в том, чтобы заполнить весь отправленный контент'u', Изменить непосредственно здесь udp- sock_tx Содержание, Можно пройти socket Отправить данные. Но при фактической отправке значения здесь больше не присваиваются. . . . .
2. 2, Посмотрим дальшеdemo_udp_recv_task () '
Функция, Эта функция ничего не говорит, Полученные данные автоматически помещаются udp- sock_rx
Чжун.
ret = recvfrom (udp- socket_num, udp- sock_rx, DEMO_UDP_BUF_SIZE,
0, (struct sockaddr *) &pin, &addrlen) ;
^^^^В этом разделе будет развернут собственный проект, Читать и отправлять данные.
3. 1, Изменить код отправки и получения
^^^^ ==Необходимо изменить: == , В wm_udp_demo. c Найтиdemo_udp_task () '
Функция, А case DEMO_MSG_UART_RECEIVE_DATA:
ЧжунА memset Снимите щит:
Этот код должен быть заблокирован
//memset (udp- sock_tx, 'u', len) ;
//Следующий код можно не добавлять, В основном распечатка отправленных данных
//Добавить в case DEMO_MSG_UART_RECEIVE_DATA: А break До.
//add by zxx start
printf ("send_led: %d data: \n", len) ;
for (int ii = 0; ii len; ii--)
{
printf ("%x ", udp- sock_tx[ii]) ;
}printf ("\n") ;
//add by zxx end
break;
^^^^ ==Не обязательно изменять: == , В wm_udp_demo. c Найтиdemo_udp_recv_task () '
Функция, Добавить код печати.
if (ret 0)
{
printf ("rcv from %s : port : %d len = %d rev_data: \n", inet_ntoa (pin. sin_addr) , htons (pin. sin_port) , ret) ;
//add by zxx start
for (int ii = 0; ii ret; ii++)
{
printf ("%d ", udp- sock_rx[ii]) ;
}printf ("\n") ;
//add by zxx end
}
3. 2, Пакетные данные
^^^^Вwm_udp_demp. c
Файл==Наконец==Добавить код:
//add by zxx start
void udp_send_data_self (u8 *data, int data_len)
{
//А data Все содержимое скопировано demo_udp- sock_tx Чжун
memcpy (demo_udp- sock_tx, data, data_len) ;
udp_send_data_demo (data_len) ;
}
//add by zxx end
3. 3, Внешнее заявление
^^^^Вwm_demp_console. h
Файл==Наконец==Добавить код:
//add by zxx start
extern void udp_send_data_self (u8 *data, int data_len) ;
//add by zxx end
#endif /*__WM_DEMO_CMD_H__*/
3. 4, Главная функция
^^^^В==Твое задание==Напишите следующий код:
void your_task ()
{
u8 test_data[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
demo_connect_net ("yyds", "1234567890") ;
//Обязательно
tls_os_time_delay (2000) ;
socket_udp_demo (1, 10086, "192. 168. 1. 87") ;
while (1)
{
//Отправить данные
udp_send_data_self (test_data, 10) ;
tls_os_time_delay (5000) ;
}
}
1, Сервер моделирования
^^^^Открыть помощник отладки сети, Следующая конфигурация, IPНастройка в соответствии со своими реалиями.
2, Скачать программу на доску разработки
^^^^После окончания периода задержки, Обмен данными между досками разработки и серверами.
^^^^Плата разработки
^^^^Сервер.
Как изменить номер порта?
socket_udp_demo (1, 10086, "192. 168. 1. 87") ; Эта фраза не отображается, По крайней мере, не экспортировать sky not created А tls_wl_mem_reinit: c000000; Но изменили ip А потом одна ошибка, Не удалось получить тест, Ошибка теста
ip & Порт не изменяется, И нет
Старайтесь изо всех сил, Все еще не удается
Там же socket_udp_demo (1, 10086, 192. 1. 87. 1. 114) Вместо & lt; & lt; моновещания & gt; & gt; читать & lt; & lt; вещания & gt; & gt Ошибок не будет Но при загрузке на доску разработчиков данные передаются неограниченно Пожалуйста, сообщите решение