
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`进一步讨论。
发表评论
最新留言
不错!
[***.144.177.141]2025年05月22日 18时54分14秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
linux系统监控与硬盘分区/格式化/文件系统管理
2025-04-10
Linux系统调用分析
2025-04-10
linux缓存nscd
2025-04-10
linux软件包的一般安装方法
2025-04-10
linux软件包:RPM包、源码包、yum在线
2025-04-10
Linux进程地址管理之mm_struct
2025-04-10
Linux部署Elasticsearch(一):下载和部署Elasticsearch
2025-04-10
Linux(3):Linux命令-文件管理
2025-04-10
Linux:CentOS安装Docker Compose
2025-04-10
Linux:安装Redis
2025-04-10
ListBox 循环删除当前项
2025-04-10
Listview 利用Datapager进行分页
2025-04-10
listview数据刷新后自动滑到底部
2025-04-10
liunx-FTP服务器_无需整理
2025-04-11
Liunx挂载nfts盘数据方法
2025-04-11
LiveGBS user/save 逻辑缺陷漏洞复现(CNVD-2023-72138)
2025-04-11
live和on的区别
2025-04-11
li下的ul----多级列表
2025-04-11
LLM;超越记忆《第 2 部分 》
2025-04-11
LLVM 简介-ChatGPT4o作答
2025-04-11