一、ESP8266
物联网,万物互联。这里涉及到的最基本的东西就是如何将所有的物联网设备连接在一起。最简单、最广泛使用的就是互联网。
ESP8266 WIFI串口通信模块应该是使用最广泛的一种WIFI模块之一了。为什么呢?
因为ESP8266模块是一款高性能的WIFI串口模块,可以不用知道太多WIFI相关知识就可以很好的上手。说白了,只是个WIFI转串口的设备,你只要知道串口怎么编程使用,就可以了,实现了所谓的透明传输。
🔒AT指令
在使用USB转TTL模块与电脑连接之后,就可以使用串口调试助手进行WIFI模块的调试了。首先有一点,AT指令不区分大小写,均以回车、换行结尾。下面介绍常用的AT指令:
常用AT指令
指令名 | 响应 | 含义 |
AT | OK | 测试指令 |
AT+CWMODE=<mode> | OK | 设置应用模式(需重启生效) |
AT+CWMODE? | +CWMODE:<mode> | 获得当前应用模式 |
AT+CWLAP | +CWLAP:<ecn>,<ssid>,<rssi> | 返回目前的AP列表 |
AT+CWJAP=<ssid>,<pwd> | OK | 加入某一AP |
AT+CWJAP? | +CWJAP:<ssid> | 返回当前加入的AP |
AT+CWQAP | OK | 退出当前加入的AP |
AT+CIPSTART=<type>,<addr>,<port> | OK | 建立TCP/UDP连接 |
AT+CIPMUX=<mode> | OK | 是否启用多连接 |
AT+CIPSEND=<param> | OK | 发送数据 |
AT+CIPMODE=<mode> | OK | 是否进入透传模式 |
💢需要补充几点:
1、ESP8266的应用模式:ESP266支撑单AP模式、单STA模式和混合模式。简单的来说就是:
- AP:可以将ESP8266作为热点,可以让其他的设备连接上它;
- STA:可以连接上当前环境下的WIFI热点。
2、什么是透传模式?
透传就是指不需要关心wifi协议是如何实现的。所需要做的就是A通过串口发数据,B通过串口收数据,整个过程中A串口和B串口就像是用导线直接连接起来了一样。则对于开发人员来看,就是完全透明的。
更简单地理解就是:
如果不开启透传模式,我们怎么发送数据呢?在每次发送数据前都必须先发送指令AT+CIPSEND=<param> 例如:
AT+CIPSEND=4
OK
> //在 > 后面输入要上传的数据
但是一旦开启了透传模式,我们就不需要在每次发送数据前都发送指令AT+CIPSEND=<param>了,只需要发送一次AT+CIPSEND,之后发送的所有内容全部当成是数据了!
但是这也存在一个问题,要是我后来又想发送命令了,但是却也当成是数据发送过去了。这可怎么办?
这就要退出透传模式了。怎么退出,发送数据"+++"就可以了。注意:此时“+++”后面,不接“发送新行”!
二、ESP8266WIFI模块网络调试过程
我们在第一使用ESP8266WIFI时,需先使用电脑模拟的服务器进行调试,以防模块有问题,我们后期看不到效果,
三、WIFI模块的使用
ESP8266的一般使用顺序
这里的“一般”指的是:ESP8266连接当前环境的热点,与服务器建立TCP连接,传输数据。
- AT+CWMODE=1:设置工作模式(STA模式)
- AT+RST:模块重启(生效工作模式)
- AT+CWJAP="111","11111111":连接当前环境的WIFI热点(热点名,密码)
- AT+CIPMUX=0:设置单路连接模式
- AT+CIPSTART="TCP","xxx.xxx.xxx.xxx",xxxx:建立TCP连接
- AT+CIPMODE=1:开启透传模式
- AT+CIPSEND:透传模式下,传输数据
- +++:退出透传模式
记录下我自己用串口助手的命令集合
AT+CWMODE=1 配置STA模式
AT+RST 复位
AT+CWJAP="TAB","99999999" 设置WIFI名称和密码
AT+CIFSR 获取本地IP
AT+CIPSTART=“TCP”,“192.168.2.214”,8080 本地的服务器-测试用
AT+CIPMODE=1 透传使能
AT+CIPSEND 开始透传--发送指令
AT+CIPSNTPCFG=1,8 设置时间地域
AT+CIPSNTPTIME? 获取本地时间
AT+MQTTSUB? 检查MQTT
AT+CIPSTART="TCP","www.beijing-time.org",80 连接北京时间服务器
AT+CIPSTART="TCP","api.seniverse.com",80 连接心知天气服务器
AT+CIPCLOSE 断开服务器
AT+GMR 查看版本信息,返回 OK ,为8位版本号
AT+CWQAP 断开当前WIFI
AT+CWLAP 扫描附近WIFI
AT+CIPMUX=0 单连接
GET https://api.seniverse.com/v3/weather/now.json?key=SO1ol8qoiz-CQAWZs&location=nanning&language=zh-Hans&unit=c 心知天气API
💰由于我的板子的串口2连接的ESP8266,所以还需要配置串口2 原理可以看我之前的文章
通过串口2发送指令集时,封装好函数
//指令发送 u8 ESP8266_Sned(char *buf,char *ack,u16 time) { u8 count=5; retransmit: USART2_Send(buf);//发送数据 // printf("%s",buf); delay_ms(500); while(time--) { if(flage2) { if(strstr(str,ack)!=NULL) { printf("%s",str); flage2=0; len2=0; memset(str,0,sizeof(str)); return 1; } flage2=0; len2=0; memset(str,0,sizeof(str)); } } if(count--) { goto retransmit; } return 0; }
str数组是外部定义,用来存放WIFI发送过来的数据,串口进行接收
主函数进行调用,发送指令到WIFI,回复的消息放到数组里,并通过串口1打印到PC端查看
注意,在用之前的代码时,需更改下,这里的发送判断不能用中断,我改成了传输完成判断,就可以用了
//USART1外设发送一个字符串 void USART2_Send(char *arr) { // TC // 0:传送未完成 // 1:传送已完成 while(*arr!='\0') { while(!USART_GetFlagStatus(USART2, USART_FLAG_TC));//传输数据寄存器空标志 USART_SendData(USART2,*arr); arr++; } }
四、连接阿里云
购买的ESP8266一般没带MQTT固件,所以无法通过MQTT指令与云平台通信,需要烧录固件。
MQTT固件可以在安信可科技进行下载。下载器可以使用乐鑫官方的下载器。
工具 | 乐鑫科技
阿里云的的云端设备创建可以看下网上的教程,这边就不一一演示了,因为更新的比较快
1.阿里云的配置指令
先获取你创建的设备的三元组,这个很重要,对待会得哈希算法解析进行填写
用到这个软件进行三元组的解析
下面的连接参数的输出就是我们待会需要发到WIFI的
2、连接指令
AT+RST
AT+CIPSNTPCFG=1,8,"ntp1.alliyun.com"//访问外网
AT+CWJAP="yyyy","14725836"
// MQTT用户信息配置
AT+MQTTUSERCFG=0,1,"NULL","ABCD&a17TK0MuTY9","0E4F4E0C5B95A2850EE6BBCE3D51649ABA7A3E135BFD51DE0009D79709717557",0,0,""
// MQTT 客户端配置
AT+MQTTCLIENTID=0,"led-plus|securemode=3\,signmethod=hmacsha256|"
//连接到MQTT Broker
AT+MQTTCONN=0,"a17TK0MuTY9.iot-as-mqtt.cn-shanghai.aliyuncs.com",1883,1
// 订阅主题
AT+MQTTSUB=0,"/sys/a17TK0MuTY9/ABCD/thing/service/property/set",1
订阅主题和发布订阅的参数在你设备那里查看
3、用单片机进行发送
订阅主题
连接指令通过串口打印数据来进行调试,,不要盲目的去连接,看不到返回来的数据,这样会加大你得调试难度和时间,AT的指令部分是相同的,有几条是MQTT连接阿里云的,需要三元组解析哈希算法来获取那些数据。
发布
所谓的发布,就是单片机发送指令到云端,来更新设备的状态,
我已经写好格式了,直接复制,改发布的参数和设备指令就行
AT+MQTTPUB=0,\"/sys/a18bsMGJszA/RSET/thing/event/property/post\",\"{\\\"params\\\":{\\\"powerstate\\\":1\\}}\",0,0\r\n
里面的必须要用反斜杠进行转义,比如双引号和斜杠,不然WIFI识别不到
powerstate:这个是你控制位的名称,我们处理数据时都会用这个来判断