设备上报状态到阿里云成功之后,还要接受来至云端下发的命令,如APP。在ESP8266接受到数据之后可将数据先进行解析,再通过自定义协议与STM32进行串口通讯,也可以将接收到的数据中的信息直接传输到UART,在这里,我用的是使用大量回调函数的ESP8266_NONOS_SDK-3.0 SDK包,在实时性上表现明显不佳,所以在无特殊要求情况下建议采用将数据传输到UART再进行解析。ESP8266 RTOS SDK 采用任务调度方式,在表现上应优于无操作系统的,建议采用RTOS SDK包。
阿里云上具有可视化开发APP,可在线构建生成apk文件,位置:开发服务->IoT Studio,具体如何操作自行查看阿里云官方文档:https://help.aliyun.com/document_detail/110476.html?spm=a2c4g.11174283.6.821.10111668sUo8Lj
下载的SDK包中有示例工程,在目录examples下,其次网上大神也给出了代码示例和文章,
关于ESP8266的工程示例:https://github.com/AngelLiang/ESP8266-Demos ----来自知乎阏男秀
https://blog.csdn.net/xh870189248/article/details/81146532 ----来自CSDN半颗心脏
关于UART和SmartConfig配网,建议先将ESP8266的工程示例先编译下载,根据打印信息可快速了解和看懂代码,为修改做铺垫。
关于UART串口接受数据:
ESP8266具有两个UART,其中UART1的RX引脚被Flash-SPI复用,故一般仅用于打印系统日志。
1.UART0在SDK中用于输出调试信息,在使用之前应先将打印信息使能关闭。在 debug.h 中屏蔽 #define MQTT_DEBUG_ON
2.在app目录下将 -ldriver 注释掉,其次在 app/user/ 目录下添加工程示例的uart.c。( 原sdk的uart使用的是链接动态库在使用uart接口,当然也可以通过修改重新生成lib来修改uart的功能,但明显很不方便。)
3.ESP8266_NONOS_SDK-3.0使用的是定时器回调函数的方式,ESP8266仅开放一个定时器,所以需要注意的是user_init()函数在初始化uart时候,便设置了定时器的定时任务,进入uart接收数据函数uart_test_rx。
在之后的MTQQ的初始化中调用MQTT_Connect重置了定时器任务修改成mqtt_timer,所以可在串口初始化时屏蔽接受数据任务,新定时器任务mqtt_timer中加入串口接收数据的任务。
在uart_test_rx中不难看出uart的TX调用的是tx_buff_enq(char* pdata, uint16 data_len),完成从串口回传任务。这里可根据功能进行修改。
关于SmartConfig配网:
移植说明:
wifi源码:`user/user_wifi.c`+`include/user_wifi.h`
smartconfig源码:`user/user_smartconfig.c`+`include/user_smartconfig.h`
wifi配置:`wifi_config.h`
只需要拷贝以上文件即可简单移植到新工程,之后参考此调用即可。
void ICACHE_FLASH_ATTR
user_init(void) {
//uart_init(BIT_RATE_115200, BIT_RATE_115200);
wifi_set_opmode(STATION_MODE); // set wifi mode
/* 与 smartconfig_connect() 二选一
* wifi_connect() 在这里调用正常
*/
//wifi_connect(wifi_connect_cb);
/* 在这里调用不正常,无法用手机配网 */
//smartconfig_connect(wifi_connect_cb);
system_init_done_cb(init_done_cb_init);
}
在接口函数中 void smartconfig_connect(WifiCallback cb); 先进行smartconfig,如果没有配网信息则自动连接上次的wifi。在工程中使用此函数。
void ICACHE_FLASH_ATTR
init_done_cb_init(void) {
//print_chip_info();
/*
* smartconfig_connect 只能在 init_done_cb_init 调用才正常
* 先进行smartconfig,没有配网信息则自动连接上次的wifi
*/
smartconfig_connect(wifi_connect_cb);
/* OR */
//wifi_connect(wifi_connect_cb);
}
SmartConfig的示例工程烧写成功后出现
SDK ver: 2.0.0(656edbf) compiled @ Jul 19 2016 17:58:40
phy ver: 1055, pp ver: 10.2
SC version: V2.5.4
[INFO] smartconfig start!
mode : sta(5c:cf:7f:f7:99:6f)
add if0
wifi_smartconfig_timer_cb
[INFO] smartconfig stop!
wifi ssid:WIFI_SSID
wifi pass:123456789
[INFO] WiFi_LED_STATUS_TIMER_ENABLE
wifi connect fail!
scandone
state: 0 -> 2 (b0)
state: 2 -> 3 (0)
state: 3 -> 5 (10)
add 0
aid 1
cnt
wifi connect fail!
connected with WIFI_SSID, channel 11
dhcp client start...
wifi connect fail!
ip:192.168.191.2,mask:255.255.255.0,gw:192.168.191.1
wifi connect success!
pm open,type:2 0
配网APP源码:https://github.com/EspressifApp/EsptouchForAndroid
配网APK:https://github.com/EspressifApp/EspRelease/tree/master/EspTouch
ESP8266配网方式为组网模式,在打印信息出现 wifi_smartconfig_timer_cb 时手机app端输入WIFI密码和选择组网模式进行配网。
ESP8266为2.4G模组,不支持5G WIF联网。
阿里云IoT Studio中自生成的app无法正常配网。熟悉java可在阿里云下载源码配合Esptouch源码进行修改。
-----------今天也是充满希望的一天~