💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
* 导师**视频**讲解:[**去听课**](https://www.bilibili.com/video/BV1k34y1D7Vz/) >[success] **技术支持说明:** >**1**.一般以自主学习为主 > **2**.可到官方问答社区中提问:[**去提问**](https://bbs.csdn.net/forums/zigbee) > **3**.工程师**会尽快**解答社区问题,但他们是一线开发,【**难以保证**】解答时效,解答辛苦,感谢理解! <br/> ## **重要配置** **WiFi配置** 打开本节课配套的工程,配套工程所在目录为:《ZigBee3.0开发止指南》配套资源(**附加部分**)/课外篇:进阶选修/ZigBee2Wifi\_ESP8266,接着打开zb\_common.h 文件,内有WiFi名称与密码定义,如图所示。 ![](https://img.kancloud.cn/b1/51/b1510fbb5ac9ac501ca9bddaf53d117c_1035x908.png =500x) ### 读者需要把此处的WiFi名称与密码修改为家里WiFi名称与密码,以便开发套件能够接入到家里的WiFi路由器。 <br/> ## **源代码讲解** ESP8266我们采用AT指令的方式进行驱动;关键程序在 zb_port.c 中;zb_port.c 中有一个定时器: ``` void zb_port_on_timer(uint16_t ms) { #if ZG_BUILD_COORDINATOR_TYPE zb_port_on_coordinator_timer(); #elif ZG_BUILD_RTRONLY_TYPE #else #endif } ``` 这个定时器每隔1秒会运行一次,可以看到我们针对协调器做了处理:调用 zb_port_on_coordinator_timer() : ``` void zb_port_on_coordinator_timer(void) { static uint8_t cnt = 0; if (++cnt < 6) return; cnt = 3; static uint8_t connWifi = 0; static uint8_t connTcp = 0; char buf[50] = { 0 }; switch(espstep) { /* AT test */ case 0: zbmsg_->send("AT\r\n", 4); HalLcdWriteString("step-1", 3); break; /* Setting */ case 1: zbmsg_->send("AT+CWMODE_DEF=1\r\n", 17); HalLcdWriteString("step-2", 3); break; /* Connect WiFi */ case 2: if (connWifi == 0) { sprintf(buf, "AT+CWJAP_DEF=\"%s\",\"%s\"\r\n", WIFI_NAME, WIFI_PASSWD); connWifi = 1; HalLcdWriteString("step-3", 3); zbmsg_->send((uint8_t*)buf, strlen(buf)); } break; /* Config Mode */ case 3: HalLcdWriteString("step-4", 3); zbmsg_->send("AT+CIPMUX=0\r\n", 13); break; /* Connect to TCP server */ case 4: #define TCP_SERVER "AT+CIPSTART=\"TCP\",\"1.15.27.206\",12300\r\n" if (connTcp == 0) { connTcp = 1; HalLcdWriteString("step-5", 3); zbmsg_->send((uint8_t *)TCP_SERVER, strlen(TCP_SERVER)); } break; /* Send message to TCP server */ case 5: #define TCP_MESSAGE "Hello World!" sprintf(buf, "AT+CIPSEND=%d\r\n", strlen(TCP_MESSAGE)); zbmsg_->send((uint8_t*)buf, strlen(buf)); break; case 6: zbmsg_->send((uint8_t*)TCP_MESSAGE, strlen(TCP_MESSAGE)); break; /* Error */ case 7: connTcp = 0; espstep = 3; break; default: break; } } ``` 这里其实是在驱动ESP8266去连接WiFi,连接成功后会打开TCP向服务器发送数据;我们通过串口向 ESP8266 发送AT指令后,需要等待模块的响应(串口接收)来告诉我们AT指令是否执行成功: ``` void zb_port_on_coordinator_uart(const uint8_t *data, uint8_t len) { switch(espstep) { case 0: if (strstr((char *)data, "OK") != NULL) { espstep++; HalLcdWriteString("ok-1", 4); } else if (strstr((char *)data, "WIFI CONNECTED") != NULL) { espstep = 3; HalLcdWriteString("ok-wifi", 4); } break; case 1: if (strstr((char *)data, "OK") != NULL) { espstep++; HalLcdWriteString("ok-2", 4); } break; case 2: if (strstr((char *)data, "IP") != NULL || strstr((char *)data, "OK") != NULL) { espstep++; HalLcdWriteString("ok-3", 4); } break; case 3: if (strstr((char *)data, "OK") != NULL) { espstep++; HalLcdWriteString("ok-4", 4); } break; case 4: if (strstr((char *)data, "OK") != NULL) { espstep++; HalLcdWriteString("ok-5", 4); } break; case 5: if (strstr((char *)data, ">") != NULL) { espstep++; HalLcdWriteString("ok-6", 4); } break; case 6: if (strstr((char *)data, "CLOSED") != NULL) { espstep++; HalLcdWriteString("err-1", 4); } break; default: break; } } ``` 很显然,我们发送一个AT指令,如果收到ESP8266的回应,并且是正常的,才会进行下一个AT指令的发送,从而实现异步的方式。 <br/> ## **程序测试** (1)通过PuTTY登录到远程服务器,并输入如下命令运行 tcpserver服务: ~~~ ./tcpserver ~~~ tcpserver服务启动成功,如图所示。 ![](https://img.kancloud.cn/8b/84/8b84c60f4584072441a43e5fa9c7f8f8_826x520.png =500x) ### (3)如果使用Mini板测试,则: * 把ESP8266 WiFi模块插入到ZigBee MiNi板中,如图所示。 ![](https://img.kancloud.cn/2f/70/2f70759aeaab588cb57b267e9aba6fa8_1270x834.png =300x) * 把 0.96 OLED显示屏插入到ZigBee MiNi板中,如图所示。 ![](https://img.kancloud.cn/85/23/85230be6093e36d6c76abe9543b41e3a_2526x2067.png =250x) ### (4)如果使用标准板测试,在插入ESP8266 WiFi模块和 0.96 OLED显示屏后,还需要按如图所示配置拨码开关,即第1、2、3和4位拨到右边,第5、6、8、9和10位拨到左边,其中的第7位无需配置,如图所示。 ![](https://img.kancloud.cn/5d/ea/5dea000a46ff9d0ae19d3676ad123c73_1279x1706.png =200x) ### (5)选择Coordinator角色编译配套的实验代码,并下载到开发板中。 >[danger] 注意 (1)在使用仿真器烧录程序的同时,需要使用Micro USB线给开发板供电。 (2)在使用CC2530使用AT指令驱动WiFi模块时,建议把仿真器拔掉,以免引起未知问题。 <br/> (6)可以看到显示屏上面提示AT指令执行的过程,如图所示。 ![](https://img.kancloud.cn/e8/0d/e80decc3859ec12748a0a3905ac93a40_359x703.png =300x) <br/> 并且服务器上也收到了消息,如图所示。 ![](https://img.kancloud.cn/5c/c6/5cc6d8f5d76380e4375ad502e3019dd4_827x522.png =500x)