AT指令
\hspace{2em} 本文需要注意的一点就是,AT固件的版本问题,这里作者用的是 1471这个固件,点击链接即可下载。假设读者已经烧录完毕固件以及正确连接ESP8266的电路引脚,接下来首先保证ESP8266连上网络,这里可以用最简单的STA连接方式。将路由器或者手机热点修改固定名称与密码,发送AT命令连接热点,用于连接网络。连接网络后,先实现天气时钟的功能,这里我用的是高德地图的API获取天气信息,其他的天气网站要显示全部信息,可能需要充值,高德地图完全免费,只是有每日额度调用次数限制而已,对于学习和DIY完全够用。
AT//验证ESP8266是否正常
ATE0//关闭回显
AT+CWMODE=1//设置为STA模式
AT+CWJAP="ESP","88888888"在这里设置路由器名称和密码
AT+CIPSNTPCFG=1,8,"ntp1.aliyun.com"//阿里云网络时间地域
AT+CIPSNTPTIME?//获取当前网络时间,如果出现1970,多刷新几次
AT+CIPSTART="TCP","restapi.amap.com",80//高德地图API
AT+CIPMODE=1//开启透传
AT+CIPSEND//开启数据传输
GET https://restapi.amap.com/v3/weather/weatherInfo?city=350206&key=8d90d41d36310d4b11030dda711b66e1//获取天气信息
//这里需要注意的是修改city的编码,不同的城市编码不同,读者可自行查询城市编码
//这里的Key是作者的设备,读者自行创建设备将key替换即可
+++//退出数据传输,注意不加回车换行
AT+CIPCLOSE//断开TCP连接
如果读者实验成功,就可以获得如下信息:
因为高德地图下发的数据是UTF-8编码格式的,有些GBK格式的串口助手获取天气信息可能会乱码,这里各位读者可以使用一个网页版的 串口助手,支持UTF-8编码格式。
接下来我们实现连接新版onenet,并上报数据,这里选用的是数据流协议。假设读者已经完成了,onenet设备的创建。需要提前准备以下信息:
产品ID:3ojU7e6EF8
设备名:device
token:version=2018-10-31&res=products%2F3ojU7e6EF8%2Fdevices%2Fdevice&et=1840786535&method=md5&sign=Kg3eJUQNy2CFJr3Pt9a4NA%3D%3D
产品ID和设备名修改为读者自己创建设备对应的即可,token值需要下载 token工具,使用方法也非常的简单,只需要按如下图设置即可:(时间戳可以在网页上搜索时间戳计算工具即可)
防止读者敲错字母,这里给出res的设置 products/产品ID/devices/设备名
接下来,就可以创建物联网协议,进行数据的上报:
AT+MQTTUSERCFG=0,1,"device","3ojU7e6EF8","version=2018-10-31&res=products%2F3ojU7e6EF8%2Fdevices%2Fdevice&et=1840786535&method=md5&sign=Kg3eJUQNy2CFJr3Pt9a4NA%3D%3D",0,0,""
//配置MQTT参数
AT+MQTTCONN=0,"mqtts.heclouds.com",1883,1//连接onenet云
AT+MQTTSUB=0,"$sys/3ojU7e6EF8/device/cmd/request/+",0//订阅命令下发
AT+MQTTPUB=0,"$sys/3ojU7e6EF8/device/dp/post/json","{\"id\":123\,\"dp\":{\"DHT11_T\":[{\"v\":30.2}]\,\"DHT11_H\":[{\"v\":60.0}]\,\"light\":[{\"v\":3000}]}}",0,0
//上报数据,这里以温度、湿度、光照强度为例
AT+MQTTCONN?//如果上报失败,可以查询MQTT连接的状态
//回复+MQTTCONN:0,6,1,"mqtts.heclouds.com","1883","",1 表示设备在线且订阅成功,可以上报数据
如果读者实验成功,上报数据结果如图所示:
STM32部分代码
\hspace{2em} 很多应用场合下,主要是以MCU控制ESP8266,有不少读者在串口助手中可以实现上报数据,但是在使用MCU控制时,总是会失败。这可能是转义字符没有写正确导致的,这里给出上报数据的STM32代码例子:
void ESP8266_onenet_RXTX(void)
{
char pub[256]={0};
char air_buf[256]={0};
const char air_value[][4] = {
{0xE4, 0xBC, 0x98, '\0'}, // "优"
{0xE8, 0x89, 0xAF, '\0'}, // "良"
{0xE5, 0xB7, 0xAE, '\0'} // "差"
};
HAL_Delay(1000);
if(Send_Cmd((uint8_t *)"AT+MQTTCONN?\r\n", 14 , "0,6") == 0)
{
data_flag = 1;
HAL_Delay(1000);
sprintf(pub,"AT+MQTTPUB=0,\"$sys/%s/%s/dp/post/json\",\"{\\\"id\\\":123\\,\\\"dp\\\":{\\\"DHT11_T\\\":[{\\\"v\\\":%d.%d}]\\, \
\\\"DHT11_H\\\":[{\\\"v\\\":%d.%d}]\\,\\\"light\\\":[{\\\"v\\\":%d}]}}\",0,0\r\n", \
pro_ID,dev_name,DHT11_T/10,DHT11_T%10,DHT11_H/10,DHT11_H%10,light);
while(Send_Cmd((uint8_t *)pub, strlen(pub), "+MQTTSUBRECV")!=0)
{
//printf("pub:%s,%d\r\n",pub,strlen(pub));
//HAL_Delay(1000);
break;
}
HAL_Delay(1000);
sprintf(air_buf,"AT+MQTTPUB=0,\"$sys/%s/%s/dp/post/json\",\"{\\\"id\\\":123\\,\\\"dp\\\":{\\\"temperature\\\":[{\\\"v\\\":\\\"%s\\\"}]\\, \
\\\"humidity\\\":[{\\\"v\\\":\\\"%s\\\"}]\\,\\\"weather\\\":[{\\\"v\\\":\\\"%s\\\"}]\\,\\\"air\\\":[{\\\"v\\\":\\\"%s\\\"}]}}\",0,0\r\n", \
pro_ID,dev_name,temperature,humidity,weather,air_value[degree]);
while(Send_Cmd((uint8_t *)air_buf, strlen(air_buf), "MQTTSUBRECV")!=0)
{
//printf("air_buf:%s,%d\r\n",air_buf,strlen(air_buf));
//HAL_Delay(1000);
break;
}
}
else
{
data_flag = 0;
}
}
最终可以实现的效果如下: