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,需要先了解套接字使用流程
在这里插入图片描述

二、使用实例

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",然后返回给网络助手。

网络助手界面如下:
在这里插入图片描述
模块调试串口信息如下:
在这里插入图片描述

四、结语

1.总结:

本节完,实际操作过程中需要注意的地方有如下几点:

(1) 注意电脑连接模块后会得到一个IP地址,可以通过在cmd控制台中输入ipconfig
在这里插入图片描述
本文得到电脑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。

2.获取资料

如您在使用过程中有任何问题,请加QQ群进一步交流。

QQ交流群:906015840 (备注:物联网项目交流)

公众号:物联网客栈,扫码关注,回复w600即可。
在这里插入图片描述
一叶孤沙出品:一沙一世界,一叶一菩提

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

物联网客栈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值