OneNET平台
中国移动的IOT平台,使用免费,学生学习的不错选择,进入OneNET平台先创建一个项目。
随后在项目中创建产品,接入协议选择MQTT,节点类型根据产品的类型选择。
在产品中添加具体的设备
MQTT设备接入
参数 | 参数说明 | 是否必须 |
clientid | 设备名称 | 是 |
username | 平台分配的产品ID | 是 |
password | 填写经过 key 计算的 token | 是 |
使esp8266连接OneNET平台
NTPClient.h头文件是网络时钟头文件,可以从网络时钟服务器获取当前时间,具体使用如下
#include <NTPClient.h> #include <WiFiUdp.h> WiFiUDP ntpUDP; NTPClient timeClient(ntpUDP, "ntp1.aliyun.com",60*60*8, 30*60*1000);//和服务器建立连接获取时间 timeClient.update();//获取现在的时间 timeClient.getEpochTime();//获取现在的unix时间戳
PubSubClient.h订阅和发布MQTT消息,API文档
#include <PubSubClient.h> const char* mqtt_server = "218.201.45.7"; // MQTT服务器 const char* client_id = "SensorClock1";// 设备名称 const char* client_name = "xxxxxx";// 产品ID const char* client_token = "xxxxx";//TOKEN const char* TOPIC_post_reply = "$sys/xxxxx/SensorClock1/thing/property/post/reply";// 订阅信息主题 int postId=0; WiFiClient espClient;// 定义wifiClient实例 PubSubClient client(espClient); // 定义PubSubClient的实例 long lastMsg = 0;// 记录上一次发送信息的时长 //mqtt连接 void mqttConnect() { while (!client.connected()) { Serial.print("尝试进行MQTT连接..."); // 尝试连接 if (client.connect(client_id,client_name,client_token)) { Serial.println("连接成功"); // 连接成功时订阅主题 client.subscribe(TOPIC_post_reply); } else { Serial.print("failed, rc="); Serial.print(client.state()); Serial.println("五秒后重试"); //等待五秒 delay(5000); } } } //订阅消息callback void callback(char* topic, byte* payload, unsigned int length) { Serial.print("Message arrived ["); Serial.print(topic); // 打印主题信息 Serial.print("] "); for (int i = 0; i < length; i++) { Serial.print((char)payload[i]); // 打印主题内容 } Serial.println(); } //封装Json(待改进) String postStringJson(const char* name,const char* value){ String payloadJson="{\"id\": \""; payloadJson+=postId++; payloadJson+="\",\"version\": \"1.0\",\"params\": {\""; payloadJson+=name; payloadJson+="\": {\"value\": \""; payloadJson+=value; payloadJson+="\",\"time\": \""; payloadJson+=timeClient.getEpochTime();//获得unix时间戳 payloadJson+="\"}}}"; //Serial.println(payloadJson); return payloadJson; } void setup() { Serial.begin(9600); delay(10); pinMode(LED_BUILTIN, OUTPUT); wifiConnect(); client.setServer(mqtt_server, 1883); //设定MQTT服务器与使用的端口,1883是默认的MQTT端口 client.setCallback(callback); //设定回调方式,当ESP8266收到订阅消息时会调用此方法 mqttConnect(); mqttTicker.attach(1,mqttConnect); } void loop() { client.loop(); timeClient.update();//获取时间 long now = millis(); if (now - lastMsg > 5000) {//五秒发布一次 lastMsg = now; client.publish("$sys/xxxxx/SensorClock1/thing/property/post", postStringJson("name","hello").c_str()); } }