ESP8266接入阿里云物联网平台-远程监测室温 (基于Wemos D1 WIFI开发板)
一、阿里云物联网平台设置
注册阿里云账号,进入阿里云物联网平台。
在设备管理->产品->创建产品,设置参见下图,然后保存,创建产品。
接下来添加设备,我们名称设置为“H-TEMP”,备注名称“室内温度”,点击确认,完成设备添加。
此时点击左侧导航栏“产品”,在我们创建的产品“物联网测试02-室温检测”,点击查看。
我们给他添加一个显示温度的功能定义,选择“功能定义”标签,点击“编辑草稿”。
可以点击“添加标准功能”,选择一些预设的功能,我们这里选择“添加自定义功能”。参数参考如下:
点击确认,添加完成一个标识符为“RoomTemp”显示温度(属性)的功能,点击底部的“发布上线”,完成设置。
此时我们点击左侧栏“设备”,查看我们创建好的“H-TEMP”,点击查看,在跳出的页面中,选择“物模型数据”标签。
在“运行状态”中已经显示了一个“室温显示”的模块,此时阿里云物联网平台设置已经完成,接下来对开发板端进行代码编程。
二、硬件端配置
首先对Arduino IDE进行正确配置,参见【WEMOS D1 WIFI开发基础资料】文档。
1,硬件连接
Wemos D1 WIFI板 DHT11温湿度传感器 5V <------> + GND <------> - D7 <------> OUT
2,代码实现
在输入代码之前需要安装一些会调用到的库。在IDE“项目”->“加载库”->“管理库”,打开“库管理器”。
搜索以下三个库文件,安装。
安装“DHT sensor library”库文件,点击”Install all”。
代码如下:
- #include <ESP8266WiFi.h>
- /* 依赖 PubSubClient 2.4.0 */
- #include <PubSubClient.h>
- /* 依赖 ArduinoJson 5.13.4 */
- #include <ArduinoJson.h>
- #include <AliyunIoTSDK.h>
- #include <DHT.h> //DHT温湿度传感器库
- #define SENSOR_PIN 13
- DHT dht13(13, 11);
- Int TEMP;
- /* 连接您的WIFI SSID和密码 */
- #define WIFI_SSID "bangong2"
- #define WIFI_PASSWD "lejuxingyuanli"
- /* 设备的三元组信息*/
- #define PRODUCT_KEY "a1yrZSZyptv" //替换自己的PRODUCT_KEY
- #define DEVICE_NAME "H-TEMP" //替换自己的DEVICE_NAME
- #define DEVICE_SECRET "M8tUELIjli6KSK8vHyrdCNETexkFc3yd"//替换自己的DEVICE_SECRET
- #define REGION_ID "cn-shanghai"
- /* 线上环境域名和端口号,不需要改 */
- #define MQTT_SERVER PRODUCT_KEY ".iot-as-mqtt." REGION_ID ".aliyuncs.com"
- #define MQTT_PORT 1883
- #define MQTT_USRNAME DEVICE_NAME "&" PRODUCT_KEY
- /* MQTT设置 */
- #define CLIENT_ID "123456|securemode=3,signmethod=hmacsha1|"
- #define MQTT_PASSWD "B675E589C5912CECB536A5DFE071BEB34C1AB117"
- #define ALINK_BODY_FORMAT "{"id":"123","version":"1.0","method":"thing.event.property.post","params":%s}"
- #define ALINK_TOPIC_PROP_POST "/sys/" PRODUCT_KEY "/" DEVICE_NAME "/thing/event/property/post"
- unsigned long lastMs = 0;
- WiFiClient espClient;
- PubSubClient client(espClient);
- void callback(char *topic, byte *payload, unsigned int length)
- {
- Serial.print("Message arrived [");
- Serial.print(topic);
- Serial.print("] ");
- payload[length] = '\0';
- Serial.println((char *)payload);
- }
- void wifiInit()
- {
- WiFi.mode(WIFI_STA);
- WiFi.begin(WIFI_SSID, WIFI_PASSWD);
- while (WiFi.status() != WL_CONNECTED)
- {
- delay(1000);
- Serial.println("WiFi not Connect");
- }
- Serial.println("Connected to AP");
- Serial.println("IP address: ");
- Serial.println(WiFi.localIP());
- Serial.print("espClient [");
- client.setServer(MQTT_SERVER, MQTT_PORT); /* 连接WiFi之后,连接MQTT服务器 */
- client.setCallback(callback);
- }
- void mqttCheckConnect()
- {
- while (!client.connected())
- {
- Serial.println("Connecting to MQTT Server ...");
- if (client.connect(CLIENT_ID, MQTT_USRNAME, MQTT_PASSWD))
- {
- Serial.println("MQTT Connected!");
- }
- else
- {
- Serial.print("MQTT Connect err:");
- Serial.println(client.state());
- delay(5000);
- }
- }
- }
- /* 绑定设备,标识符“RoomTemp” */
- void mqttIntervalPost()
- {
- char param[500];
- char jsonBuf[1023];
- TEMP = dht13.readTemperature();
- sprintf(param, "{"RoomTemp":%d}", dht13.readTemperature());
- sprintf(jsonBuf, ALINK_BODY_FORMAT, param);
- Serial.println(jsonBuf);
- boolean d = client.publish(ALINK_TOPIC_PROP_POST, jsonBuf);
- Serial.print("publish:0 失败;1成功");
- Serial.println(d);
- }
- void setup()
- {
- pinMode(SENSOR_PIN, INPUT);
- /* initialize serial for debugging */
- Serial.begin(115200);
- Serial.println("Demo Start");
- wifiInit();
- dht13.begin();
- }
- // the loop function runs over and over again forever
- void loop()
- {
- mqttCheckConnect();
- /* 上报 */
- mqttIntervalPost();
- client.loop();
- Serial.print(dht13.readTemperature());
- delay(5000);
- }
复制代码
①关于其中设备三元信息,可以在阿里云物联网平台,点击左侧导航栏“设备”,在设备“H-TEMP”右侧点击“查看”。
在出现的信息页面中,点击上部的“查看”,得到设备三元信息。
将信息修改进代码中:
- /* 设备的三元组信息*/
- #define PRODUCT_KEY "a1yrZSZyptv" //替换自己的PRODUCT_KEY
- #define DEVICE_NAME "H-TEMP" //替换自己的DEVICE_NAME
- #define DEVICE_SECRET "M8tUELIjli6KSK8vHyrdCNETexkFc3yd"//替换自己的DEVICE_SECRET
- #define REGION_ID "cn-shanghai"
复制代码
②关于其中MQTT设置,获取CLIENT_ID和MQTT_PASSWD,首先下载MQTT签名工具。 百度网盘下载链接:https://pan.baidu.com/s/1BQdTe_WCnFm0nG0A9VEBow 提取码:6erm 解压后得到如下文件,打开“sign.html”文件,得到签名页面。
productKey:设备所属产品Key。可在控制台设备详情页查看; deviceName:设备名称。可在控制台设备详情页查看; deviceSecret:设备密钥。可在控制台设备详情页查看; 以上三项是设备三元信息,获取方式见①中说明。 timestamp:(可不填)时间戳; clientId:设备的ID信息,可取任意值,长度在64字符以内。建议使用设备的MAC地址或SN码。这里我们演示用先默认设123456; method:选择签名算法类型,我们默认选择hmacsha1。 然后点击“Generate”,生成密码。
代码中“Client ID”的填写格式为:“clientId|securemode=3,signmethod=hmacsha1|” 上面我们“clientId”设为了123456,securemode为安全模式,TCP直连模式设置为securemode=3,TLS直连为securemode=2,signmethod为算法模型支持hmacmd5和hmacsha1,我们在签名工具中选择了hmacsha1。 所以这里“Client ID”完整格式为:“123456|securemode=3,signmethod=hmacsha1|”,代码如下:
- /* MQTT设置 */
- #define CLIENT_ID "123456|securemode=3,signmethod=hmacsha1|"
- #define MQTT_PASSWD "DD037ABB82B5E9A47B1E60E256DC0E0AFA57D71E"
复制代码
③修改PubSubClient.h库文件参数; 在路径C:\Users\admin\Documents\Arduino\libraries\PubSubClient\src文件夹中找到“PubSubClient.h”文件,用Notepad++软件打开。修改如下两处值分别为1024、60。
阿里云对客户端的链接参数有一些限制,所以需要修改 PubSubClient 以上的连接参数,否则无法使用。
3,运行效果
在阿里云物联网平台设备列表中,点击对应设备栏右侧查看,选择“物模型数据”标签,在“运行状态”标签中可以实时查看温度数据。
|