玩轉OneNET物聯網平臺之MQTT服務② —— 遠程控制LED

1.理論基礎

    參考博主線上博文:

  • 玩轉PubSubClient MQTT庫
  • 玩轉OneNET物聯網平臺之簡介
  • 玩轉OneNET物聯網平臺之MQTT服務①

2.遠程控制LED

2.1 實驗材料

  • ESP8266 NodeMcu
  • OneNet Mqtt調試工具
  • OneNet平臺

2.2 實驗步驟

2.2.1 創建 ESP8266智能燈系統 產品(MQTT協議)

image

注意點

  • 務必選擇MQTT協議

    創建完畢後,我們點擊查看具體的產品信息:

image

注意點

  • 需要記錄產品ID,其用來區分產品唯一標識符
  • Master-APIkey,網絡請求鑑權信息,接口調用需要帶入

2.2.2 API調試創建 deviceA和deviceB兩個設備

API接口定義

操作步驟

  • 通過API調試工具創建deviceA

image

http body

{
    "title": "mqtt_device_A",
    "desc": "mqtt_device_A",
    "tags": ["china", "mobile"],
    "location": {
        "lon": 109,
        "lat": 23.54
    },
    "auth_info": "mqtt_device_A",
    "other": {
        "version": "1.0.0",
        "manufacturer": "china mobile"
    }
}
  • 通過API調試工具創建deviceB

image

http body

{
    "title": "mqtt_device_B",
    "desc": "mqtt_device_B",
    "tags": ["china", "mobile"],
    "location": {
        "lon": 109,
        "lat": 23.54
    },
    "auth_info": "mqtt_device_B",
    "other": {
        "version": "1.0.0",
        "manufacturer": "china mobile"
    }
}
  • 查看設備列表

image

2.2.2 NodeMcu燒錄代碼 —— deviceA

    爲了明確區分代碼功能,博哥命名工程名爲P_OneNet_Exam01:

  • P_OneNet_Exam01.ino文件:
/**
 *  功能:ESP8266 Mqtt客戶端調試主題功能,訂閱OneNet Mqtt工具發過來的控制Led消息
 *  作者:單片機菜鳥
 *  時間:2019-06-25
 *  描述:
 *      1.OneNet平臺端:提前在OneNet平臺創建DeviceA,DeviceB兩個設備點,DeviceA屬於NodeMcu,DeviceB屬於OneNet Mqtt調試工具
 *      2.初始化工作:初始化網絡配置,Mqtt客戶端配置,連接鑑權,訂閱主題
 *      3.訂閱消息:獲取發送過來的消息(json格式),解析消息,實現控制亮滅燈
*/

#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <Ticker.h>
#include "H_project.h"

int state;
WiFiClient espClient;

//聲明方法
void initSystem();
void initOneNetMqtt();
void callback(char* topic, byte* payload, unsigned int length);

/**
 * 初始化
 */
void setup() {
  initSystem();
  initOneNetMqtt();
}

void loop() {
  ESP.wdtFeed();
  state = connectToOneNetMqtt();
  if(state == ONENET_RECONNECT){
     //重連成功 需要重新註冊
     mqttClient.subscribe(TOPIC,1);
     mqttClient.loop();
  }else if(state == ONENET_CONNECTED){
     mqttClient.loop();
  }
  delay(2000);
}

void initSystem(){
    int cnt = 0;
    Serial.begin (115200);
    Serial.println("\r\n\r\nStart ESP8266 MQTT");
    Serial.print("Firmware Version:");
    Serial.println(VER);
    Serial.print("SDK Version:");
    Serial.println(ESP.getSdkVersion());
    wifi_station_set_auto_connect(0);//關閉自動連接
    ESP.wdtEnable(5000);
    WiFi.disconnect();
    delay(100);
    WiFi.begin(ssid, password);
    while (WiFi.status() != WL_CONNECTED) {
          delay(500);
          cnt++;
          Serial.print(".");
          if(cnt>=40){
            cnt = 0;
            //重啓系統
            delayRestart(1);
          }
    }
    pinMode(LED_BUILTIN, OUTPUT); 
}

void initOneNetMqtt(){
    mqttClient.setServer(mqttServer,mqttPort);
    mqttClient.setClient(espClient);
    mqttClient.setCallback(callback);

    initOneNet(PRODUCT_ID,API_KEY,DEVICE_ID);
}

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

  if ((char)payload[0] == '1') {
    digitalWrite(LED_BUILTIN, LOW);
  } else {
    digitalWrite(LED_BUILTIN, HIGH);
  }
}
  • H_project.h 代碼:
#ifndef _MAIN_H__
#define _MAIN_H__


extern "C" {
#include "user_interface.h"
#include "smartconfig.h"
}

/************** ESP8266相關操作 **************************/
void delayRestart(float t);
void delayNs(uint8_t m);
/*********************************************************/

/*************** OneNet MQTT相關操作 ****************************/
void initOneNet(uint8_t *productId,uint8_t *apiKey,uint8_t *deviceId);
int connectToOneNetMqtt();
/*********************************************************/

#define ONENET_DISCONNECTED 1 //已經斷開
#define ONENET_CONNECTED 2    //已經連接上
#define ONENET_RECONNECT 3    //重連成功

//常量
#define VER             "MQTT_LED_V1.0"
const char* ssid = "xxxx";//wifi賬號
const char* password = "xxxx";//wifi祕密

//OneNet相關
PubSubClient mqttClient;
const char* mqttServer = "183.230.40.39";//mqtt服務器
const uint16_t mqttPort = 6002;
#define PRODUCT_ID    "xxxx" //此爲博哥自己的產品id 請新建自己的
#define API_KEY    "xxxx"
#define DEVICE_ID "xxxx"
#define TOPIC     "xxxx"

unsigned long lastWiFiCheckTick = 0;
bool ledState = 0;

#endif

    全部工程代碼,博哥放在個人QQ羣裏。

image

    把工程燒進NodeMcu,然後可以看到串口打印內容,如下:

image

    同時,也可以在OneNet平臺看到設備在線情況,如下:

image

2.2.3 官方調試工具發送控制燈消息 —— deviceB

  • 配置deviceB

image

注意點

  • 重點關注博主標紅的地方,DeviceID和ProductID、AuthInfo需要填寫讀者自身創建的

  • 配置完畢連接服務器

  • 發佈控制信息

image

2.2.4 遠程控制燈

  • 串口打印控制信息

image

  • NodeMcu效果圖
    image

3.總結

在理解MQTT協議的基礎上,本篇是非常容易操作的,但是也需要注意幾點:

  • 創建自己的OneNet產品,不要用博哥創建的
  • 理解訂閱主題含義

下一篇,博哥將結合App實現真正的遠程燈控制。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章