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”信息
创建云端设备
- 在onenet注册账户,然后登陆,然后选择右上角的“开发者中心”;
- 点击“创建产品”
- 产品名称:自定义【如,HelloMqtt】(16个字符,英文)
- 其他产品信息随便写
- 设备接入协议:MQTT
- 其他技术参数默认即可
- 创建成功后,就生成了产品信息:产品ID、创建时间、APIKey、用户ID等(其中产品ID等等需要用)
- 在设备管理中添加设备
- 设备名称:自定义【如,mqttDev】
- 鉴权信息:自定义【如,thisismqttdevtoken】
- 数据保密性:公开(私有的话,其他应用无法访问数据)
- 设备创建成功后就生成了设备信息:(其中设备ID和自定义的设备鉴权信息等等需要用)
- 可以对设备的操作:
- 编辑
- 删除
- 查看
- 数据流管理
- 添加触发器
- 发送命令
- 下发日志
实现硬件设备
- 配置设备接入互联网,修改user.h的SSID和PASSWORD
- 配置设备信息,修改user.h:
- DEVICEID,onenet上创建的设备ID
- DEVICETOKEN,onenet上创建设备时自定义的鉴权信息
- PROJECTID,onenet上创建的产品ID
- 设备连接MQTT过程:
```
#define MQTTSERVER "183.230.40.39"
#define MQTT_PORT (6002)
wifi.mqttSetServer(MQTTSERVER, MQTT_PORT);
```
if(wifi.isMqttConnected() ){
...
}
- 设备上报数据过程
- 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 += "}";
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);
- 设备接受命令过程,data会接收到onenet的命令字符串
data = wifi.getMqttJson();
- 设备订阅Topic
- Topic自定义,必须是数字、英文、反斜杠(/)的组合,但不要以$开头,因为平台保留;
- 每个客户端最多订阅100个topic;
- 然后订阅该Topic,当Topic更新后会通过wifi.getMqttJson()接受到消息
String TOPIC = "hellomqtt";
wifi.mqttSetSubscrib(TOPIC);
- 设备发布Topic
- Topic自定义,必须是数字、英文、反斜杠(/)的组合,但不要以$开头,因为平台保留;
- 数据为json,与上报数据流的格式一致
wifi.mqttPublish(TOPIC,jsonData)
调试
- 配置后,烧录,设备上电,成功连接MQTT后,云端会看到对应设备在线
- 设备运行,会持续上报数据,云端通过“数据流管理”可以浏览上报的数据
- 云端通过命令下发,设备将收到命令字符
- 设备发送topic为“PUBTOPIC”的数据,成功(蓝线);设备接受topic为“SUBTOPIC”的数据(红线)
附一下代码
//WIFI
#define SSID "gogogo"
#define PASSWORD "11223344"
//ONENET
#define DEVICEID "503743391"
#define DEVICETOKEN "thisismqttdevtoken"
#define PROJECTID "186720"
#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();
}
}
}
显示数据
在应用管理里面建立一个应用,绑定相应的数据流,可以使用一些图标实时反馈数据的变化,也可以增加按钮来作为简单命令的下发