ESP8266实现天气时钟+上报数据至新版onenet数据流协议(AT指令)

ESP8266实现天气时钟+上报数据至新版onenet数据流协议

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连接

如果读者实验成功,就可以获得如下信息:
图2

图1 获取网络时间和天气信息

因为高德地图下发的数据是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工具,使用方法也非常的简单,只需要按如下图设置即可:(时间戳可以在网页上搜索时间戳计算工具即可)
图1

图2 获取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 表示设备在线且订阅成功,可以上报数据

如果读者实验成功,上报数据结果如图所示:图3

图3 数据流协议上报成功界面

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;
		}
		
	
}

最终可以实现的效果如下:
图2

图4 STM32天气时钟小项目上传数据至onenet
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值