W801/W800-wifi-socket Разработка (Один) -UDP

Опубликовано в 2022-04-18 19: 28: 15

@TOC

**В этой статье используется среда:
Управляющий: W800-KIT (Плата разработки)
Совместимость: W800 W801 AIR101
Условия разработки: CDK
SDK: W801/W800 А SDK (tls Ку) **

==Моя домашняя страница сообщества вопросыов и ответов==
==Мой CSDN Статьи==
==Написать перед: ==
Я не собираюсь изменять официальные документы, Я вызову их напрямую api, Потому что официальные лица используют много обратной связи и очередей сообщений, Кольцо застегнуто, Слишком много времени уходит на изменение оплаты, В этом нет большой необходимости.

Один, Обзор проекта

^^^^Функции программы: Использовать панель WIFI Сервер, подключенный к компьютеру (UDP Соглашение, Имитация с помощью помощника отладки сети) , Передача данных.

^^^^Начиная с этой статьи, Начать загрузку wifi Использование. Перед тем, как написать, Разработка W80X Вот он официальный SDK, Одна функция, одна функция, Правда. . . .

Два, socket-udp Официально SDK Расчесывать.

^^^^Этот раздел предназначен в основном для официального UDP Соединённые идеи программирования, Это одна функция, одна функция, Очень тяжело. Надеемся, что ваши богатые руки будут тронуты чиновниками, Помогите сосредоточиться, Хвала, Выберите коллекцию.
==Внимание== : Здесь написано немного, Если новичку будет трудно понять, Посмотреть самостоятельно несколько раз. Программирование будет включено в главу III.

1, Маршрутизатор подключения

^^^^Открыть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.

2, Подключение UDP

^^^^Открыть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来自于前文提到Аupddemo_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, Скачать программу на доску разработки
^^^^После окончания периода задержки, Обмен данными между досками разработки и серверами.
^^^^Плата разработки
Вставить описание изображения

^^^^Сервер.
Вставить описание изображения

5 Комментарий

Опубликовано
вопросыы