diff --git a/document/flow.png b/document/flow.png new file mode 100644 index 00000000..5df01550 Binary files /dev/null and b/document/flow.png differ diff --git a/firmware/arduino/get-started/get-started.ino b/firmware/arduino/get-started/get-started.ino new file mode 100644 index 00000000..f8fbe916 --- /dev/null +++ b/firmware/arduino/get-started/get-started.ino @@ -0,0 +1,334 @@ +/****************************************************************************** + * author: kerwincui + * create: 2021-07-09 + * email:164770707@qq.com + * source:https://github.com/kerwincui/wumei-smart + ******************************************************************************/ +#include "EspMQTTClient.h" +#include + +char *deviceNum = "8CCGA1049ADA"; // 设备编号,唯一标识 +char *ownerId="1"; // 用户ID,后端查看,默认为amdin,ID为1 +long categoryId=1; // 设备分类,后端查看,默认为wifi通断器,ID为1 + +EspMQTTClient client( + "wifi-ssid", // WIFI的SSID + "wifi-password", // WIFI的密码 + "192.168.0.100", // MQTT消息服务器地址 + "admin", // Mqtt消息服务器账号 + "admin123", // Mqtt消息服务器密码 + deviceNum, // Mqtt客户端名称 + 1883 // Mqtt消息服务器端口 +); + +/** + * 启动 + * + */ +void setup() +{ + Serial.begin(115200); + client.enableDebuggingMessages(); // 打印调试信息 + client.setMaxPacketSize(1024); // 设置Mqtt数据包最大值 + client.setKeepAlive(5); // 保活时间间隔 + //遗嘱消息 + publishLastWill(); +} + +/** + * 循环执行 + * + */ +void loop() +{ + client.loop(); +} + +/** +* WIFI和MQTT连接成功后执行的回调函数 +*/ +void onConnectionEstablished() +{ + // 订阅消息 + subscribeUpdateStatus(); + subscribeGetStatus(); + subscribeUpdateSetting(); + subscribeGetSetting(); + // 发布消息 + publishDeviceInfo(); +} + +/** + * 1.更新设备状态 + * + */ +void subscribeUpdateStatus(){ + client.subscribe("status/set/"+(String)deviceNum, [](const String & payload) { + StaticJsonDocument<1024> doc; //1024字节内存池容量 + //解析JSON + DeserializationError error = deserializeJson(doc, payload); + if (error) { + Serial.print(F("deserializeJson() failed: ")); + Serial.println(error.f_str()); + return; + } + + // 获取状态 + const char* deviceNum = doc["deviceNum"]; + Serial.println("deviceNum:"+(String)deviceNum); + + int relayStatus = doc["relayStatus"]; + Serial.print("relayStatus:"); + Serial.println(relayStatus); + + int lightStatus = doc["lightStatus"]; + Serial.print("lightStatus:"); + Serial.println(lightStatus); + + int brightness = doc["brightness"]; + Serial.print("brightness:"); + Serial.println(brightness); + + int lightInterval = doc["lightInterval"]; + Serial.print("lightInterval:"); + Serial.println(lightInterval); + + int lightMode = doc["lightMode"]; + Serial.print("lightMode:"); + Serial.println(lightMode); + + int fadeTime = doc["fadeTime"]; + Serial.print("fadeTime:"); + Serial.println(fadeTime); + + int red = doc["red"]; + Serial.print("red:"); + Serial.println(red); + + int green = doc["green"]; + Serial.print("green:"); + Serial.println(green); + + int blue = doc["blue"]; + Serial.print("blue:"); + Serial.println(blue); + + // 最后发布设备状态 + publishStatus(); + }); +} + + +/** + * 2.获取设备状态 + * + */ +void subscribeGetStatus(){ + client.subscribe("status/get/"+(String)deviceNum, [](const String & payload) { + // 发布设备状态 + publishStatus(); + }); +} + +/** + * 3.更新设备配置 + * + */ +void subscribeUpdateSetting(){ + client.subscribe("setting/set/"+(String)deviceNum, [](const String & payload) { + StaticJsonDocument<1024> doc; //1024字节内存池容量 + //解析JSON + DeserializationError error = deserializeJson(doc, payload); + if (error) { + Serial.print(F("deserializeJson() failed: ")); + Serial.println(error.f_str()); + return; + } + + // 获取配置 + const char* deviceNum = doc["deviceNum"]; + Serial.println("deviceNum:"+(String)deviceNum); + + int isAlarm = doc["isAlarm"]; + Serial.print("isAlarm:"); + Serial.println(isAlarm); + + int isRadar = doc["isRadar"]; + Serial.print("isRadar:"); + Serial.println(isRadar); + + int isHost = doc["isHost"]; + Serial.print("isHost:"); + Serial.println(isHost); + + int isRfControl = doc["isRfControl"]; + Serial.print("isRfControl:"); + Serial.println(isRfControl); + + int rfOneFunc = doc["rfOneFunc"]; + Serial.print("rfOneFunc:"); + Serial.println(rfOneFunc); + + int rfTwoFunc = doc["rfTwoFunc"]; + Serial.print("rfTwoFunc:"); + Serial.println(rfTwoFunc); + + int rfThreeFunc = doc["rfThreeFunc"]; + Serial.print("rfThreeFunc:"); + Serial.println(rfThreeFunc); + + int rfFourFunc = doc["rfFourFunc"]; + Serial.print("rfFourFunc:"); + Serial.println(rfFourFunc); + + int isReset = doc["isReset"]; + Serial.print("isReset:"); + Serial.println(isReset); + + int isAp = doc["isAp"]; + Serial.print("isAp:"); + Serial.println(isAp); + + int isRfLearn = doc["isRfLearn"]; + Serial.print("isRfLearn:"); + Serial.println(isRfLearn); + + int isRfClear = doc["isRfClear"]; + Serial.print("isRfClear:"); + Serial.println(isRfClear); + + int isSmartConfig = doc["isSmartConfig"]; + Serial.print("isSmartConfig:"); + Serial.println(isSmartConfig); + + int radarInterval = doc["radarInterval"]; + Serial.print("radarInterval:"); + Serial.println(radarInterval); + + int isWifiOffline = doc["isWifiOffline"]; + Serial.print("isWifiOffline:"); + Serial.println(isWifiOffline); + + int isOpenCertifi = doc["isOpenCertifi"]; + Serial.print("isOpenCertifi:"); + Serial.println(isOpenCertifi); + + // 最后发布设备配置 + publishSetting(); + }); + +} + +/* + * 4.获取设备配置 + * + */ +void subscribeGetSetting(){ + client.subscribe("setting/get/"+(String)deviceNum, [](const String & payload) { + // 发布设备配置 + publishSetting(); + }); +} + + +/** + * 1.发布设备信息 + * + */ +void publishDeviceInfo(){ + StaticJsonDocument<300> doc; + doc["deviceNum"] = (String)deviceNum; + doc["categoryId"] = categoryId; + doc["firmwareVersion"] = "1.0"; + doc["ownerId"]= (String)ownerId; + Serial.print("publish device info:"); + serializeJson(doc, Serial); + //发布 + String output; + serializeJson(doc, output); + const char *msg=output.c_str(); + client.publish("device_info",msg); +} + +/** + * 2.发布设备状态 + * + */ +void publishStatus(){ + StaticJsonDocument<1024> doc; + doc["deviceNum"] = (String)deviceNum; + doc["relayStatus"] = 1; + doc["lightStatus"] = 1; + doc["isOnline"] = 1; + doc["rssi"] = -73; + doc["deviceTemperature"] = 28.68; + doc["airTemperature"] = 24.66; + doc["airHumidity"] = 46.8; + doc["triggerSource"] = 0; + doc["brightness"] = 100; + doc["lightInterval"] = 500; + doc["lightMode"] = 0; + doc["fadeTime"] = 259; + doc["red"] = 255; + doc["green"] = 255; + doc["blue"] = 255; + Serial.print("publish status:"); + serializeJson(doc, Serial); + // 发布 + String output; + serializeJson(doc, output); + const char *msg=output.c_str(); + client.publish("status",msg); +} + +/** + * 3.发布设备配置 + * + */ +void publishSetting(){ + StaticJsonDocument<1024> doc; + doc["deviceNum"] = (String)deviceNum; + doc["isAlarm"] = 0; + doc["isRadar"] = 0; + doc["isHost"] = 0; + doc["isRfControl"]= 1, + doc["rfOneFunc"] = 1; + doc["rfTwoFunc"] = 2; + doc["rfThreeFunc"] = 3; + doc["rfFourFunc"] = 4; + doc["ownerId"] = (String)ownerId; + doc["isReset"] = 0; + doc["isAp"] = 0; + doc["isRfLearn"] = 0; + doc["isRfClear"] = 0; + doc["isSmartConfig"] = 0; + doc["radarInterval"] = 5; + doc["isWifiOffline"] = 0; + doc["isOpenCertifi"] = 0; + Serial.print("publish setting:"); + serializeJson(doc, Serial); + //发布 + String output; + serializeJson(doc, output); + const char *msg=output.c_str(); + client.publish("setting",msg); +} + +/** + * 4.遗嘱消息 + * + */ +void publishLastWill(){ + StaticJsonDocument<100> doc; + doc["deviceNum"] = (String)deviceNum; + doc["isOnline"] = 0; + Serial.print("\npublish last will:"); + serializeJson(doc, Serial); + // 发布 + String output; + serializeJson(doc, output); + int len = output.length(); + char *msg =new char[len+1]; + strcpy(msg,output.c_str()); + client.enableLastWillMessage("offline",msg); +} diff --git a/firmware/arduino/get-started/制作中......txt b/firmware/arduino/get-started/制作中......txt deleted file mode 100644 index e69de29b..00000000