WIFI模块开发教程之W600网络篇3:STA模式下TCP Client通信
发布日期:2021-05-15 00:02:29 浏览次数:17 分类:精选文章

本文共 4665 字,大约阅读时间需要 15 分钟。

STA模式下TCP客户端通信开发实例

前言

本文旨在探讨如何在STA模式下实现TCP客户端通信。STA模式下,模块直接连接AP(手机热点或路由器),进入局域网,作为客户端与其他设备进行通信。


理论基础

本节主要解决一个关键问题:如何利用RT_Thread连接已知的AP,并确保TCP客户端程序在连接成功后与局域网中的服务器进行通信。


1. 模块连接AP

  • 路由器信息:路由器名称为HUAWEI-6ZCHWJ,密码为123456789a:
  • 代码示例
    rt_wlan_set_mode(RT_WLAN_DEVICE_AP_NAME, RT_WLAN_AP);rt_wlan_start_ap("sand", "12345678");

2. Socket套接字实现TCP客户端

  • 套接字使用流程

  • 创建套接字。
  • 连接目标服务器。
  • 接收并发送数据。
  • 代码示例

    #include 
    #include
    #define TCP_SERVER_ADDR "192.168.1.13"#define TCP_SERVER_PORT 8089static rt_sem_t wait_sem = NULL;static void wifi_connect_callback(int event, struct rt_wlan_buff *buff, void *parameter) { rt_kprintf("%s\n", __FUNCTION__); rt_sem_release(wait_sem);}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}; do { 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(struct sockaddr_in)); 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 label_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 label_try_reconnect; } if (ret > 0) { if (FD_ISSET(fd, &readfds)) { len = recv(fd, buf, sizeof(buf), 0); if (len > 0) { rt_kprintf("receive data:%s\r\n", buf); } else { rt_kprintf("receive data from tcp server error!\r\n"); goto label_try_reconnect; } if (-1 != fd) { ret = send(fd, buf, strlen(buf), 0); if (ret < 0) { rt_kprintf("send error, close socket"); goto label_try_reconnect; } } } } } } while (1);

label_try_reconnect:if (-1 != fd) {closesocket(fd);}rt_thread_mdelay(1000);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";

// 创建信号量  wait_sem = rt_sem_create("sem_conn", 0, RT_IPC_FLAG_FIFO);  // 启用自动重连  rt_wlan_config_autoreconnect(RT_TRUE);  // 注册事件回调  ret = rt_wlan_register_event_handler(RT_WLAN_EVT_STA_CONNECTED, wifi_connect_callback, RT_NULL);  if (0 != ret) {      rt_kprintf("register event handler error!\r\n");  }  ret = rt_wlan_register_event_handler(RT_WLAN_EVT_STA_DISCONNECTED, wifi_disconnect_callback, RT_NULL);  if (0 != ret) {      rt_kprintf("register event handler error!\r\n");  }  ret = rt_wlan_register_event_handler(RT_WLAN_EVT_STA_CONNECTED_FAIL, wifi_connect_fail_callback, RT_NULL);  if (0 != ret) {      rt_kprintf("register event handler error!\r\n");  }  // 设置STA模式并连接AP  rt_wlan_set_mode(RT_WLAN_DEVICE_STA_NAME, RT_WLAN_STATION);  rt_wlan_connect("HUAWEI-6ZCHWJ", "123456789a");  rt_kprintf("start to connect ap ...\n");  // 等待连接成功  ret = rt_sem_take(wait_sem, RT_WAITING_FOREVER);  if (0 != ret) {      rt_kprintf("wait_sem error!\r\n");  }  rt_kprintf("connect to ap success!\r\n");  // 创建并启动TCP客户端线程  rt_thread_t client_thread = rt_thread_create("tcp_client", tcp_client_thread_entry, RT_NULL, 4*1024, 25, 10);  if (client_thread != NULL) {      rt_thread_startup(client_thread);  } else {      ret = RT_ERROR;      rt_kprintf("create tcp client error!!!");      goto exit;  }

exit:rt_sem_delete(wait_sem);return ret;}

---## 使用实例### 1. 程序配置- **文件路径**:`applications/5-sta_tcp_client/main.c`- **依赖项**:添加相关头文件和库文件。---## 下载与运行1. 在ENV控制台中输入`$ scons`,编译项目。2. 生成文件`build/Bin/rtthread_1M.FLS`。3. 烧录到模块中。4. 模块上线后,打开网络助手,设置TCP服务器地址和端口(如`192.168.1.13`和`8089`)。5. 模块连接后,通过网络助手发送数据,模块会返回接收到的数据。---## 注意事项1. **延时管理**:`rt_thread_mdelay(1000)`用于防止死锁,单位为毫秒。2. **网络状态**:通过事件回调函数实时更新网络状态,确保通信稳定。3. **资源释放**:在`int main(void)`结束时,释放所有资源,避免内存泄漏。---## 结语通过以上步骤,可以在STA模式下成功实现TCP客户端通信。开发过程中需注意网络状态管理和资源释放,确保模块稳定运行。如有问题,可在QQ交流群`906015840`进一步讨论。
上一篇:WIFI模块开发教程之W600网络篇6:Airkiss配网
下一篇:WIFI模块开发教程之W600网络篇2:AP模式下TCP Server通信

发表评论

最新留言

不错!
[***.144.177.141]2025年05月22日 18时54分14秒