microduino与onetnet测试

microduino与onetnet测试

  • 准备
  • 目标
  • 创建云端设备
  • 实现硬件设备
  • 调试
  • 附一下代码
  • 显示数据

准备

  • IDE
    • microduino基于arduino的集成开发环境
    • 下载:https://wiki.microduino.cn/index.php/Arduino
  • 硬件使用了microduino的ESP8266
    • 板子资料参考:https://wiki.microduino.cn/index.php/Microduino-Module_WIFI,ESP/zh
    • 板子默认已经带有固件
    • 板子非常好的支持库:ESP8266.cpp
      • 位于IED的\Arduino IDE for Microduino\libraries_03_m_Module_WIFI
  • 平台使用中移动的onenet
    • 地址:https://open.iot.10086.cn/
  • 协议:MQTT

目标

  • 上报数据:设备->ONENET
  • 下发命令:ONENET->设备
  • 订阅topic:设备接受“topic”信息
  • 发布topic:设备发送“topic”信息

创建云端设备

  1. 在onenet注册账户,然后登陆,然后选择右上角的“开发者中心”;
  2. 点击“创建产品”
    - 产品名称:自定义【如,HelloMqtt】(16个字符,英文)
    - 其他产品信息随便写
    - 设备接入协议:MQTT
    - 其他技术参数默认即可
  3. 创建成功后,就生成了产品信息:产品ID、创建时间、APIKey、用户ID等(其中产品ID等等需要用)
    产品信息
  4. 在设备管理中添加设备
    - 设备名称:自定义【如,mqttDev】
    - 鉴权信息:自定义【如,thisismqttdevtoken】
    - 数据保密性:公开(私有的话,其他应用无法访问数据)
  5. 设备创建成功后就生成了设备信息:(其中设备ID和自定义的设备鉴权信息等等需要用)
    设备信息
  6. 可以对设备的操作:
    - 编辑
    - 删除
    - 查看
    - 数据流管理
    - 添加触发器
    - 发送命令
    - 下发日志

实现硬件设备

  1. 配置设备接入互联网,修改user.h的SSID和PASSWORD
  2. 配置设备信息,修改user.h:
    - DEVICEID,onenet上创建的设备ID
    - DEVICETOKEN,onenet上创建设备时自定义的鉴权信息
    - PROJECTID,onenet上创建的产品ID
  3. 设备连接MQTT过程:
  • 设置MQTT服务器URL和端口
```
#define MQTTSERVER   "183.230.40.39"
#define MQTT_PORT   (6002)
wifi.mqttSetServer(MQTTSERVER, MQTT_PORT);
```
  • 连接MQTT服务器
    wifi.mqttConnect(DEVICEID, PROJECTID, DEVICETOKEN);
    
  • 连接成功后,连接状态为True
if(wifi.isMqttConnected() ){
	...
	}
  1. 设备上报数据过程
  • onenet接受json数据,自动解析,生成数据流
  • 设置上传Topic=" d p " , dp", dp"dp为系统上传数据点的指令
    #define PUBLISHTOPIC "$dp"
  • 设备使用String做一个json数据包
	  float temp = random(0.00,99.00);
      float humi = random(0.00,99.00);
      float lightness = random(0.00,99.00);
      jsonData = "{\"Humidity\":";
      jsonData += String(humi);
      jsonData += ",\"Temperature\":";
      jsonData += String(temp);
      jsonData += ",\"Lightness\":";
      jsonData += String(lightness);
      jsonData += "}";
  • 然后上传,header是头部信息
      uint16_t bodyLen = jsonData.length();
      unsigned char header[3];
      header[0] = 3;
      header[1] = (bodyLen >> 8);
      header[2] = (bodyLen & 0xFF);
	  wifi.mqttPubOneNet(PUBLISHTOPIC, header, jsonData);
  1. 设备接受命令过程,data会接收到onenet的命令字符串
data = wifi.getMqttJson();
  1. 设备订阅Topic
  • Topic自定义,必须是数字、英文、反斜杠(/)的组合,但不要以$开头,因为平台保留;
  • 每个客户端最多订阅100个topic;
  • 然后订阅该Topic,当Topic更新后会通过wifi.getMqttJson()接受到消息
String TOPIC = "hellomqtt";
wifi.mqttSetSubscrib(TOPIC);
  1. 设备发布Topic
  • Topic自定义,必须是数字、英文、反斜杠(/)的组合,但不要以$开头,因为平台保留;
  • 数据为json,与上报数据流的格式一致
wifi.mqttPublish(TOPIC,jsonData)

调试

  1. 配置后,烧录,设备上电,成功连接MQTT后,云端会看到对应设备在线
    microduino与onetnet测试_第1张图片
  2. 设备运行,会持续上报数据,云端通过“数据流管理”可以浏览上报的数据
    microduino与onetnet测试_第2张图片
  3. 云端通过命令下发,设备将收到命令字符
    microduino与onetnet测试_第3张图片
    设备接受
  4. 设备发送topic为“PUBTOPIC”的数据,成功(蓝线);设备接受topic为“SUBTOPIC”的数据(红线)
    topic

附一下代码

  • user.h
//WIFI
#define SSID        "gogogo"
#define PASSWORD    "11223344"

//ONENET
#define DEVICEID   "503743391"
#define DEVICETOKEN   "thisismqttdevtoken"
#define PROJECTID "186720"
  • ino文件
#include 
#include 
#include "user.h"

#ifdef ESP32
#error "This code is not recommended to run on the ESP32 platform! Please check your Tools->Board setting."
#endif

/**
**CoreUSB UART Port: [Serial1] [D0,D1]
**Core+ UART Port: [Serial1] [D2,D3]
**/
#if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega1284P__) || defined (__AVR_ATmega644P__) || defined(__AVR_ATmega128RFA1__)
#define EspSerial Serial1
#define UARTSPEED  115200
#endif

/**
**Core UART Port: [SoftSerial] [D2,D3]
**/
#if defined (__AVR_ATmega168__) || defined (__AVR_ATmega328__) || defined (__AVR_ATmega328P__)
#include 
SoftwareSerial mySerial(2, 3); /* RX:D2, TX:D3 */

#define EspSerial mySerial
#define UARTSPEED  9600
#endif

#define MQTTSERVER   "183.230.40.39"
#define MQTT_PORT   (6002)

#define PUBLISHTOPIC   "$dp"
#define PUBTOPIC  "hellomqtt"
#define SUBTOPIC  "hellomqtt"

static const uint8_t stateLEDPin=4;

#define INTERVAL_sensor 10000
unsigned long sensorlastTime = millis();

float tempOLED, humiOLED, lightnessOLED, gasOLED;

String mCottenData;
String jsonData;

ESP8266 wifi(&EspSerial);

void setup(void) {

  Serial.begin(115200);

  pinMode(stateLEDPin,OUTPUT);
  digitalWrite(stateLEDPin,LOW);


  while (!Serial); // wait for Leonardo enumeration, others continue immediately
  Serial.print(F("setup begin\r\n"));
  delay(100);

  WifiInit(EspSerial, UARTSPEED);

  Serial.print(F("FW Microduino Version:"));
  Serial.println(wifi.getMVersion().c_str());

  if (wifi.setOprToStation()) {
    Serial.print(F("to station ok\r\n"));
  } else {
    Serial.print(F("to station err\r\n"));
  }

  if (wifi.joinAP(SSID, PASSWORD)) {
    wifi.setWiFiconnected(true);
    Serial.print(F("Join AP success\r\n"));
    Serial.print(F("IP:"));
    Serial.println(wifi.getMLocalIP().c_str());
  } else {
    wifi.setWiFiconnected(false);
    Serial.print(F("Join AP failure\r\n"));
    Serial.print(F("Make sure your SSID, PASS correctly!\r\n"));
    while (true) {
      mCottenData = wifi.getMqttJson();
      if (mCottenData != "") {
        mCottenData.trim();
        Serial.println(mCottenData);
      }
    }
  }

  if (wifi.mqttSetServer(MQTTSERVER, MQTT_PORT)) {
    Serial.print(F("mqtt set server ok\r\n"));
  } else {
    Serial.print(F("mqtt set server err\r\n"));
  }
  if (wifi.mqttConnect(DEVICEID, PROJECTID, DEVICETOKEN)) {
    wifi.setMqttConnected(true);
    digitalWrite(stateLEDPin,HIGH);
    Serial.print(F("mqtt connect onenet ok\r\n"));
  } else {
    wifi.setMqttConnected(false);
    Serial.print(F("mqtt connect onenet err\r\n"));
  }

  if (wifi.isMqttConnected()) {
    if(wifi.mqttSetSubscrib(SUBTOPIC)){
      Serial.print(F("set sub topic ok\r\n"));
    }else{
      Serial.print(F("set sub topic err\r\n"));
    }
  }
}

void loop(void) {

  mCottenData = wifi.getMqttJson();

  if (mCottenData != "") {
    mCottenData.trim();

    Serial.println(mCottenData);

    if (mCottenData.equals("WIFI DISCONNECT")) {
      wifi.setWiFiconnected(false);
      wifi.setMqttConnected(false);
      digitalWrite(stateLEDPin,LOW);
    } else if (mCottenData.equals("WIFI Connected")) {
      wifi.setWiFiconnected(true);
    } else if (mCottenData.equals("MQTT: Disconnected")) {
      wifi.setMqttConnected(false);
      digitalWrite(stateLEDPin,LOW);
    } else if (mCottenData.equals("MQTT: Connected")) {
      wifi.setMqttConnected(true);
      digitalWrite(stateLEDPin,HIGH);
    }

    if (!wifi.isWiFiconnected()) {
      return;
    }
  }

  if (wifi.isMqttConnected()) {
    if (sensorlastTime > millis())
      sensorlastTime = millis();
    if (millis() - sensorlastTime > INTERVAL_sensor) {

      float temp = random(0.00,99.00);
      float humi = random(0.00,99.00);
      float lightness = random(0.00,99.00);
      tempOLED = temp;
      humiOLED = humi;
      lightnessOLED = lightness;
      jsonData = "{\"Humidity\":";
      jsonData += String(humi);
      jsonData += ",\"Temperature\":";
      jsonData += String(temp);
      jsonData += ",\"Lightness\":";
      jsonData += String(lightness);
      jsonData += "}";
      
      uint16_t bodyLen = jsonData.length();
      unsigned char header[3];
      header[0] = 3;
      header[1] = (bodyLen >> 8);
      header[2] = (bodyLen & 0xFF);

      if (wifi.mqttPubOneNet(PUBLISHTOPIC, header, jsonData)) {
        Serial.print(F("mqtt publish for oneNet ok\r\n"));
      } else {
        Serial.print(F("mqtt publish for oneNet err\r\n"));
      }

      if(wifi.mqttPublish(PUBTOPIC,jsonData)){
        Serial.print(F("mqtt publish topic ok\r\n"));
      }else{
        Serial.print(F("mqtt publish topic err\r\n"));
      }
      sensorlastTime = millis();
    }
  }
}

显示数据

在应用管理里面建立一个应用,绑定相应的数据流,可以使用一些图标实时反馈数据的变化,也可以增加按钮来作为简单命令的下发
microduino与onetnet测试_第4张图片

你可能感兴趣的:(microduino)