设备接入ONENET(5)esp8266 订阅 onenet 主题(arduino)

重要提示:由于OneNET版本迭代,导致鉴权方式可能变更,若程序无法连接,请参考官方手册或再OneNET论坛搜索相关内容

本文假设你有一定的编程基础,并且对MQTT和OneNET有一点了解。

1. 简介

esp8266 作为一款带 WiFI 收发硬件的 MCU,是可以直接与 OneNET平台连接的,好处就是节约了一颗MCU的成品,对于不熟悉 esp8266 的用户使用 SDK 的方式开发可能有一定困难,本文使用 arduino 的方式,示例了esp8266 如何订阅一个主题。

2. 准备

  • Arduino IDE(软件) :Arduino IDE 是开发Arduino一个简易的IDE环境
  • NodeMCU(硬件):NodeMCU 使用 ESP-12E 模组的一个最小系统板子,可以支持一键下载
  • MQTT Simulate Device(软件) :这是一个可以模拟MQTT设备的软件,本文需要用该软件模拟一个设备,以便发送一个主题。
  • OneNET云平台:你需要在OneNET云平台建立2个MQTT设备

3. Arduino IDE要求

  • esp8266 开发板:开发esp8266,你需要在IDE中安装改开发板
  • PubSubClient库:你需要通过Arduino IDE 安装该库,它支持用户创建一个 MQTT 客户端等操作

4. 程序源码

#include <ESP8266WiFi.h>
#include <PubSubClient.h>

/*************************************** Config ********************************************************/
//WiFi 配置
const char* ssid     = "TP-LINK_4252";               //WiFi账号:需要修改为所处环境的WiFi 账号
const char* password = "pp12345678";                 //WiFi密码:秘密需要修改为所处环境的WiFi 密码

//OneNet MQTT 配置
const char*    mqttServer = "183.230.40.39";          //目前 Onenet mqtt服务器 的 ip地址
const uint16_t mqttPort = 6002;                       //目前 Onenet mqtt服务器 的 端口号

//【以下三项更改时请注意保留双引号】
#define PRODUCT_ID    "364161"                        //产品ID,需要更改为你自己创建的产品的 ID     
#define API_KEY       "7GMiWLTMtluwREq1x8SAC9bko0k="  //APIKEY,需要更改为你自己创建的产品的 APIKEY
#define DEVICE_ID     "617424064"                     //APIKEY,需要更改为你自己创建的产品的 设备ID
/******************************************************************************************************/

#define ONENET_DISCONNECTED (1)                       //已经断开
#define ONENET_CONNECTED    (2)                       //已经连接上
#define ONENET_RECONNECT    (3)                       //重连成功

#define TOPIC         "LED"                           //主题

int sta_mqtt_connect;
WiFiClient     espClient;                             //创建一个 WiFi 客户端
PubSubClient   mqttClient;                            //创建一个 mqtt 客户端


//Onenet MQTT 连接
int Onenet_MQTT_Connect(void){
    int cnt = 0;
    while(!mqttClient.connected()){
       cnt++;
       Serial.println("Connect to OneNet MQTT...");
       /* 连接 Onenet 云平台*/
       if (mqttClient.connect(DEVICE_ID,PRODUCT_ID,API_KEY)) {
             Serial.println("\r\nconnect success!");
             return ONENET_RECONNECT;
        } else {
             Serial.print("Connect Fail!");
             Serial.println("Retry in 5 seconds");
             delay(5000);
        }
        if(cnt >=10){
          cnt = 0;
          Serial.println("Connet Failed");
          Serial.println("Please Check API_KEY and  Device ID,Product ID");
          while(1){
            delay(1);
          }
        }
    }
    return ONENET_CONNECTED;
}

//MQTT 消息回调函数
void callback(char* topic, byte* payload, unsigned int length) {
  Serial.print("Message Recive: topic[");
  Serial.print(topic);
  Serial.print("],value: ");
  
  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);
  }
}

void setup() {
    //#0. 配置串口
    Serial.begin (115200);
    Serial.println("\r\n\r\nESP826(MQTT)Start:  ");
    delay(100);
    //#1. 连接WIFI
    WiFi.begin(ssid, password);
    Serial.print("Wait for WiFi Connect");
    while (WiFi.status() != WL_CONNECTED) {
          static int wait_cnt = 0;
          if(50 <= wait_cnt++){
            Serial.println("\r\nConnect Fialed");
            Serial.println("Please Check Your WiFi SSID and PWD or");
            Serial.println("Reset the Device and Retry");
            while(1)
            {
              Serial.print("*");
              delay(5000);
            }  
          }
          delay(500);
          Serial.print(".");
    }
    Serial.println(" ");
    
    pinMode(LED_BUILTIN, OUTPUT); 

    //#2. 客户端设置MQTT服务器 & 回调函数
    mqttClient.setServer(mqttServer,mqttPort);
    mqttClient.setClient(espClient);
    mqttClient.setCallback(callback);
}

void loop() {
  //#3.连接 Onenet
  sta_mqtt_connect = Onenet_MQTT_Connect();
  if(sta_mqtt_connect == ONENET_RECONNECT){
    mqttClient.subscribe(TOPIC,1);                          //订阅主题,消息质量 QOS = 1
    mqttClient.loop();
  }
  else if(sta_mqtt_connect == ONENET_CONNECTED){
     mqttClient.loop();
  }
}

5. 如何使用

  1. 首先将程序源码需要更改的部分(具体参考程序注释,这些配置在 Config 区中),然后通过 Arduino IDE 编译后下载到 esp8266 中,此时观察通过串口监视器:
    在这里插入图片描述
    该调试信息表示设备已经成功接入 OneNET,此时再开发者平台中,可以看到设备在线:
    在这里插入图片描述
  2. 使用 软件模拟另一个设备,以便发送信息:
    在这里插入图片描述3. 模拟设备发送一个主题消息:
    在这里插入图片描述
    4.点击Submit发送:
    在这里插入图片描述
  • 1
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值