[物联网]esp8266使用MQTT协议连接OneNET平台

最后更新于 2021-03-09 4613 次阅读


OneNET平台

中国移动的IOT平台,使用免费,学生学习的不错选择,进入OneNET平台先创建一个项目

创建项目

随后在项目中创建产品,接入协议选择MQTT,节点类型根据产品的类型选择。

在产品中添加具体的设备

添加产品

MQTT设备接入

参数参数说明是否必须
clientid设备名称
username平台分配的产品ID
password填写经过 key 计算的 token

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