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