WIFI模塊開發教程之W600網絡篇1:AP模式下TCP Client通信

前言

本文研究如何在AP模式下進行TCP Client通信,所謂AP模式是說模塊起來一個softAP熱點,可以供其他WIFI設備連接,當其他設備連接成功後,另WIFI模塊作爲客戶端,局域網中其他設備作爲服務端進行TCP數據通信。

一、理論基礎

本節要處理的有兩個問題,其一是如何利用RT_Thread起來一個softAP,其二是如何使用Socket套接字編程搞定TCP Client程序編寫。

1.模塊開啓SoftAP

模塊需要起來一個名字爲sand,密碼爲12345678的熱點,RT_Thread中只需要調用wlan.mgnt.h中的函數即可。

rt_wlan_set_mode(RT_WLAN_DEVICE_AP_NAME, RT_WLAN_AP);
rt_wlan_start_ap("sand", "12345678");

2.Socket套接字實現TCP Client

爲了編寫一個可用的TCP Client demo,需要先了解套接字使用流程

WIFI模塊開發教程之W600網絡篇1:AP模式下TCP Client通信

二、使用實例

1.程序

#include <rtthread.h>
#include <rtdevice.h>
#include <sys/socket.h> //使用BSD socket需要包含此頭文件

#define TCP_SERVER_ADDR "192.168.169.2" //電腦連接熱點後得到的IP地址
#define TCP_SERVER_PORT 8089

static void tcp_client_thread_entry(void *args)
{
    int ret = 0;
    int fd = -1;
    struct sockaddr_in server_addr;
    struct  timeval t;
    fd_set readfds;

    char buf[512] = { 0x00 };
    int len = 0;

reconnect:
    fd = socket(AF_INET, SOCK_STREAM, 0);
    if (-1 == fd)
    {
        rt_kprintf("create socket error!!!\r\n");
        goto exit;
    }
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(TCP_SERVER_PORT);
    server_addr.sin_addr.s_addr = inet_addr( TCP_SERVER_ADDR );
    rt_memset(&server_addr.sin_zero, 0x00, sizeof(server_addr.sin_zero));

    ret = connect(fd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr ));
    if (0 == ret)
    {
        rt_kprintf("connect success\r\n");
    }else
    {
        rt_kprintf("connect error!!!\r\n");
        goto try_reconnect;
    }

    t.tv_sec = 2;
    t.tv_usec = 0;

    while (1)
    {
        FD_ZERO(&readfds);
        FD_SET(fd, &readfds);

        ret = select(fd + 1, &readfds, 0, 0, &t);
        if (-1 == ret)
        {
            rt_kprintf("select() error!\r\n");
            goto try_reconnect;
        }
        // else if(0 == ret)
        // {
        //     rt_kprintf("select() timeout!\r\n");
        // }
        else if(ret > 0)
        {
            if (FD_ISSET(fd, &readfds));
            {
                len = recv(fd, buf, sizeof(buf), 0);
                if (len > 0)
                {
                    buf[len] = 0x00;
                    rt_kprintf("receive data:%s\r\n", buf);
                }else
                {
                    rt_kprintf("receive data from tcp server error!\r\n");
                    goto try_reconnect;
                }
                if (-1 != fd)
                {
                    rt_sprintf(buf, "%s\r\n", buf);
                    ret = send(fd, buf, strlen(buf), 0);
                    if (ret < 0)
                    {
                        rt_kprintf("send error, closee socket");
                        goto try_reconnect;
                    }
                }
            }
        }
    }
try_reconnect:
    if (-1 != fd)
    {
        closesocket(fd);
    }
    rt_thread_sleep(1);
    goto reconnect;

exit:
    if (-1 != fd)
    {
        closesocket(fd);
    }
    rt_kprintf("thread tcp_client exit!\r\n");
}

int main(void)
{
    rt_err_t ret = RT_EOK;
    char str[] = "hello world!\r\n";

    // create ap
    rt_wlan_set_mode(RT_WLAN_DEVICE_AP_NAME, RT_WLAN_AP);
    rt_wlan_start_ap("sand", "12345678");

    //create client
    rt_thread_t uart_thread = rt_thread_create("tcp_client", tcp_client_thread_entry, RT_NULL, 4*1024, 25, 10);
    if (uart_thread != NULL)
    {
        rt_thread_startup(uart_thread);
    }else
    {
        ret = RT_ERROR;
        rt_kprintf("create tcp client error!!!");
    }

exit:
    return ret;
}

三、下載運行

在ENV控制檯,輸入scons命令,在build/Bin目錄下生成rtthread_1M.FLS,
燒錄運行後,電腦連接模塊起來的熱點,然後打開電腦網絡調試助手,開啓一個TCP Server,端口爲8089,設備連接到TCP Server後,通過網絡助手發送hello world,模塊收到數據後,會加上"\r\n",然後返回給網絡助手。

網絡助手界面如下:

WIFI模塊開發教程之W600網絡篇1:AP模式下TCP Client通信

模塊調試串口信息如下:

WIFI模塊開發教程之W600網絡篇1:AP模式下TCP Client通信

四、結語

本節完,實際操作過程中需要注意的地方有如下幾點:

(1) 注意電腦連接模塊後會得到一個IP地址,可以通過在cmd控制檯中輸入ipconfig

WIFI模塊開發教程之W600網絡篇1:AP模式下TCP Client通信

本文得到電腦IP爲:192.168.169.2,因此電腦連接模塊熱點後,打開網絡助手,需要設置TCP Server地址爲192.168.169.2, Port端口可以自行定義,本文使用8089。

(2) 電腦剛連接模塊熱點後,由於TCP Server尚未開啓,因此會打印connect error錯誤提示,每隔1秒回嘗試重連一次。

(3) 關於文中連接的TCP Server地址更好的處理方式是電腦連接模塊熱點後,然後手動輸入IP地址和端口,因爲IP地址是DNS服務器分配的,是動態的,本文中電腦連接到模塊熱點,得到的IP地址是192.168.169.2。

(3)資料獲取

如您在使用過程中有任何問題,請加QQ羣進一步交流

QQ交流羣:906015840 (備註:物聯網項目交流)

獲取源碼:關注下方公衆號,回覆w600即可

一葉孤沙出品:一沙一世界,一葉一菩提

WIFI模塊開發教程之W600網絡篇1:AP模式下TCP Client通信

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章