查看: 2664|回复: 3

玩转OneNET物联网平台之MQTT服务② —— 远程控制LED

[复制链接]
  • TA的每日心情
    开心
    2020-7-1 09:10
  • 签到天数: 817 天

    [LV.10]以坛为家III

    发表于 2019-6-27 09:49 | 显示全部楼层 |阅读模式
    本帖最后由 单片机菜鸟 于 2019-11-28 09:16 编辑

    个人免费交流群:ESP物联网开发之旅 622368884


    image

    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 代码:
    
    ```c
    #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群里。

        把工程烧进NodeMcu,然后可以看到串口打印内容,如下:

    image

        同时,也可以在OneNet平台看到设备在线情况,如下:

    image

    2.2.3 官方调试工具发送控制灯消息 —— deviceB

    • 配置deviceB

    image

    注意点

    • 重点关注博主标红的地方,DeviceID和ProductID、AuthInfo需要填写读者自身创建的

    • 配置完毕连接服务器

    • 发布控制信息

    image

    2.2.4 远程控制灯

    • 串口打印控制信息

    image

    • NodeMcu效果图
      image

    3.总结

    在理解MQTT协议的基础上,本篇是非常容易操作的,但是也需要注意几点:

    • 创建自己的OneNet产品,不要用博哥创建的
    • 理解订阅主题含义

    下一篇,博哥将结合App实现真正的远程灯控制。


  • TA的每日心情
    开心
    2020-7-1 09:10
  • 签到天数: 817 天

    [LV.10]以坛为家III

     楼主| 发表于 2019-11-28 10:17 | 显示全部楼层
    自我顶一下  https://blog.csdn.net/dpjcn1990

    该用户从未签到

    发表于 2020-8-10 11:14 | 显示全部楼层
    各种PLC通过智能网关接入OneNET,详细操作步骤:https://blog.csdn.net/AutoCtrl666/article/details/107893434

    PLC_OneNET_IGT-GSER.pdf

    475 KB, 下载次数: 0

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    热门推荐

    5分钟带你快速了解新一代开发板:M5STACK
    5分钟带你快速了解新一代
    一、什么是M5Stack M5Stack是一种模块化、可堆叠扩展的开发板,每个模块
    创客火首发无人机编队套装,开启不一样的人工智能教育
    创客火首发无人机编队套装
    2017年国务院发布《新一代人工智能发展规划》,提出要广泛开展人工智能科普活动,在中
    未见过的TFT屏,是什么驱动芯片?
    未见过的TFT屏,是什么驱
    这两块屏是从POS机里拆的,准备做几个锂电池组电压监测,在网上没找到资料,在这里问
    win10系统显示不出端口信息,编译后显示serial port not selected。
    win10系统显示不出端口信
    求各位哥哥帮忙,小兄弟实在不懂是win10系统的原因,还是需要安装什么驱动程式?具体
    更智能的电脑远程开关机-基于继电器
    更智能的电脑远程开关机-
    我只是刚刚入门的萌新,所以有不足请指出 先展示下 功能:开关机,开关机检测,
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   
    快速回复 返回顶部 返回列表