From 069641c5730f93f127244c18394cba43a94dc4c9 Mon Sep 17 00:00:00 2001 From: kerwincui <164770707@qq.com> Date: Sat, 30 Mar 2024 01:17:25 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=A0=E9=99=A4=E4=B8=80=E8=B5=B7=E7=9A=84SD?= =?UTF-8?q?K?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Arduino-ESP8266/Arduino-ESP8266.ino | 85 --- sdk/Arduino/Arduino-ESP8266/Base64.cpp | 137 ----- sdk/Arduino/Arduino-ESP8266/Base64.h | 79 --- sdk/Arduino/Arduino-ESP8266/Helper.cpp | 529 ------------------ sdk/Arduino/Arduino-ESP8266/Helper.h | 79 --- sdk/Arduino/WumeiArduino/Apconfig.cpp | 134 ----- sdk/Arduino/WumeiArduino/Apconfig.h | 28 - sdk/Arduino/WumeiArduino/Auth.cpp | 177 ------ sdk/Arduino/WumeiArduino/Auth.h | 29 - sdk/Arduino/WumeiArduino/Base64.cpp | 173 ------ sdk/Arduino/WumeiArduino/Base64.h | 84 --- sdk/Arduino/WumeiArduino/Config.cpp | 196 ------- sdk/Arduino/WumeiArduino/Config.h | 88 --- sdk/Arduino/WumeiArduino/Mqtt.cpp | 94 ---- sdk/Arduino/WumeiArduino/Mqtt.h | 29 - sdk/Arduino/WumeiArduino/User.cpp | 296 ---------- sdk/Arduino/WumeiArduino/User.h | 33 -- sdk/Arduino/WumeiArduino/WumeiArduino.ino | 149 ----- 18 files changed, 2419 deletions(-) delete mode 100644 sdk/Arduino/Arduino-ESP8266/Arduino-ESP8266.ino delete mode 100644 sdk/Arduino/Arduino-ESP8266/Base64.cpp delete mode 100644 sdk/Arduino/Arduino-ESP8266/Base64.h delete mode 100644 sdk/Arduino/Arduino-ESP8266/Helper.cpp delete mode 100644 sdk/Arduino/Arduino-ESP8266/Helper.h delete mode 100644 sdk/Arduino/WumeiArduino/Apconfig.cpp delete mode 100644 sdk/Arduino/WumeiArduino/Apconfig.h delete mode 100644 sdk/Arduino/WumeiArduino/Auth.cpp delete mode 100644 sdk/Arduino/WumeiArduino/Auth.h delete mode 100644 sdk/Arduino/WumeiArduino/Base64.cpp delete mode 100644 sdk/Arduino/WumeiArduino/Base64.h delete mode 100644 sdk/Arduino/WumeiArduino/Config.cpp delete mode 100644 sdk/Arduino/WumeiArduino/Config.h delete mode 100644 sdk/Arduino/WumeiArduino/Mqtt.cpp delete mode 100644 sdk/Arduino/WumeiArduino/Mqtt.h delete mode 100644 sdk/Arduino/WumeiArduino/User.cpp delete mode 100644 sdk/Arduino/WumeiArduino/User.h delete mode 100644 sdk/Arduino/WumeiArduino/WumeiArduino.ino diff --git a/sdk/Arduino/Arduino-ESP8266/Arduino-ESP8266.ino b/sdk/Arduino/Arduino-ESP8266/Arduino-ESP8266.ino deleted file mode 100644 index e204959e..00000000 --- a/sdk/Arduino/Arduino-ESP8266/Arduino-ESP8266.ino +++ /dev/null @@ -1,85 +0,0 @@ -/*********************************************************** - * author: kerwincui [物美智能 wumei-smart] - * create: 2022-02-20 - * email:164770707@qq.com - * source:https://github.com/kerwincui/wumei-smart - * board:esp8266 core for arduino v3.0.2 - ***********************************************************/ - -#include "Helper.h" - -long lastMqttConn; // 上次mqtt连接时间 -long lastPublishMonitor; // 上次发布监测数据时间 -long lastTimerMonitor; // 上次定时发布监测数据 - -/** - * 启动 - */ -void setup() -{ - //打开串行端口: - Serial.begin(115200); - printMsg("wumei smart device starting..."); - connectWifi(); - connectMqtt(); -} - -/** - * 循环执行 - */ -void loop() -{ - // Wifi掉线重连 - if (WiFi.status() != WL_CONNECTED) - { - connectWifi(); - } - - // 非阻塞Mqtt重连,间隔30秒 - if (WiFi.status() == WL_CONNECTED) - { - long now = millis(); - if (!mqttClient.connected()) - { - if (now - lastMqttConn > 30000) - { - lastMqttConn = now; - connectMqtt(); - } - } - else - { - mqttClient.loop(); - } - } - - // 非阻塞发布实时监测数据,间隔默认1秒 - if(WiFi.status() == WL_CONNECTED && monitorCount>0){ - long now = millis(); - if (now - lastPublishMonitor > monitorInterval) - { - lastPublishMonitor = now; - monitorCount--; - publishMonitor(); - } - } - - // 非阻塞定时上报,测试用,60秒发布一次 - if(WiFi.status() == WL_CONNECTED){ - long now = millis(); - if (now - lastTimerMonitor > 60000) - { - lastTimerMonitor = now; - printMsg("执行定时上报"); - // 发布事件 - publishEvent(); - // 发布时钟同步 - publishNtp(); - - // 发布属性(监测值) - String msg=randomPropertyData(); - publishProperty(msg); - } - } - -} diff --git a/sdk/Arduino/Arduino-ESP8266/Base64.cpp b/sdk/Arduino/Arduino-ESP8266/Base64.cpp deleted file mode 100644 index 71c40863..00000000 --- a/sdk/Arduino/Arduino-ESP8266/Base64.cpp +++ /dev/null @@ -1,137 +0,0 @@ -#include "Base64.h" - -#if (defined(__AVR__)) -#include -#else -#include -#endif - -const char PROGMEM b64_alphabet[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "abcdefghijklmnopqrstuvwxyz" - "0123456789+/"; - -/* 'Private' declarations */ -inline void a3_to_a4(unsigned char * a4, unsigned char * a3); -inline void a4_to_a3(unsigned char * a3, unsigned char * a4); -inline unsigned char b64_lookup(char c); - -int base64_encode(char *output, char *input, int inputLen) { - int i = 0, j = 0; - int encLen = 0; - unsigned char a3[3]; - unsigned char a4[4]; - - while(inputLen--) { - a3[i++] = *(input++); - if(i == 3) { - a3_to_a4(a4, a3); - - for(i = 0; i < 4; i++) { - output[encLen++] = pgm_read_byte(&b64_alphabet[a4[i]]); - } - - i = 0; - } - } - - if(i) { - for(j = i; j < 3; j++) { - a3[j] = '\0'; - } - - a3_to_a4(a4, a3); - - for(j = 0; j < i + 1; j++) { - output[encLen++] = pgm_read_byte(&b64_alphabet[a4[j]]); - } - - while((i++ < 3)) { - output[encLen++] = '='; - } - } - output[encLen] = '\0'; - return encLen; -} - -int base64_decode(char * output, char * input, int inputLen) { - int i = 0, j = 0; - int decLen = 0; - unsigned char a3[3]; - unsigned char a4[4]; - - - while (inputLen--) { - if(*input == '=') { - break; - } - - a4[i++] = *(input++); - if (i == 4) { - for (i = 0; i <4; i++) { - a4[i] = b64_lookup(a4[i]); - } - - a4_to_a3(a3,a4); - - for (i = 0; i < 3; i++) { - output[decLen++] = a3[i]; - } - i = 0; - } - } - - if (i) { - for (j = i; j < 4; j++) { - a4[j] = '\0'; - } - - for (j = 0; j <4; j++) { - a4[j] = b64_lookup(a4[j]); - } - - a4_to_a3(a3,a4); - - for (j = 0; j < i - 1; j++) { - output[decLen++] = a3[j]; - } - } - output[decLen] = '\0'; - return decLen; -} - -int base64_enc_len(int plainLen) { - int n = plainLen; - return (n + 2 - ((n + 2) % 3)) / 3 * 4; -} - -int base64_dec_len(char * input, int inputLen) { - int i = 0; - int numEq = 0; - for(i = inputLen - 1; input[i] == '='; i--) { - numEq++; - } - - return ((6 * inputLen) / 8) - numEq; -} - -inline void a3_to_a4(unsigned char * a4, unsigned char * a3) { - a4[0] = (a3[0] & 0xfc) >> 2; - a4[1] = ((a3[0] & 0x03) << 4) + ((a3[1] & 0xf0) >> 4); - a4[2] = ((a3[1] & 0x0f) << 2) + ((a3[2] & 0xc0) >> 6); - a4[3] = (a3[2] & 0x3f); -} - -inline void a4_to_a3(unsigned char * a3, unsigned char * a4) { - a3[0] = (a4[0] << 2) + ((a4[1] & 0x30) >> 4); - a3[1] = ((a4[1] & 0xf) << 4) + ((a4[2] & 0x3c) >> 2); - a3[2] = ((a4[2] & 0x3) << 6) + a4[3]; -} - -inline unsigned char b64_lookup(char c) { - if(c >='A' && c <='Z') return c - 'A'; - if(c >='a' && c <='z') return c - 71; - if(c >='0' && c <='9') return c + 4; - if(c == '+') return 62; - if(c == '/') return 63; - return -1; -} diff --git a/sdk/Arduino/Arduino-ESP8266/Base64.h b/sdk/Arduino/Arduino-ESP8266/Base64.h deleted file mode 100644 index 56d3271e..00000000 --- a/sdk/Arduino/Arduino-ESP8266/Base64.h +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright (c) 2013 Adam Rudd. - * See LICENSE for more information - */ -#ifndef _BASE64_H -#define _BASE64_H - -/* b64_alphabet: - * Description: Base64 alphabet table, a mapping between integers - * and base64 digits - * Notes: This is an extern here but is defined in Base64.c - */ -extern const char b64_alphabet[]; - -/* base64_encode: - * Description: - * Encode a string of characters as base64 - * Parameters: - * output: the output buffer for the encoding, stores the encoded string - * input: the input buffer for the encoding, stores the binary to be encoded - * inputLen: the length of the input buffer, in bytes - * Return value: - * Returns the length of the encoded string - * Requirements: - * 1. output must not be null or empty - * 2. input must not be null - * 3. inputLen must be greater than or equal to 0 - */ -int base64_encode(char *output, char *input, int inputLen); - -/* base64_decode: - * Description: - * Decode a base64 encoded string into bytes - * Parameters: - * output: the output buffer for the decoding, - * stores the decoded binary - * input: the input buffer for the decoding, - * stores the base64 string to be decoded - * inputLen: the length of the input buffer, in bytes - * Return value: - * Returns the length of the decoded string - * Requirements: - * 1. output must not be null or empty - * 2. input must not be null - * 3. inputLen must be greater than or equal to 0 - */ -int base64_decode(char *output, char *input, int inputLen); - -/* base64_enc_len: - * Description: - * Returns the length of a base64 encoded string whose decoded - * form is inputLen bytes long - * Parameters: - * inputLen: the length of the decoded string - * Return value: - * The length of a base64 encoded string whose decoded form - * is inputLen bytes long - * Requirements: - * None - */ -int base64_enc_len(int inputLen); - -/* base64_dec_len: - * Description: - * Returns the length of the decoded form of a - * base64 encoded string - * Parameters: - * input: the base64 encoded string to be measured - * inputLen: the length of the base64 encoded string - * Return value: - * Returns the length of the decoded form of a - * base64 encoded string - * Requirements: - * 1. input must not be null - * 2. input must be greater than or equal to zero - */ -int base64_dec_len(char *input, int inputLen); - -#endif // _BASE64_H diff --git a/sdk/Arduino/Arduino-ESP8266/Helper.cpp b/sdk/Arduino/Arduino-ESP8266/Helper.cpp deleted file mode 100644 index 92ba5932..00000000 --- a/sdk/Arduino/Arduino-ESP8266/Helper.cpp +++ /dev/null @@ -1,529 +0,0 @@ -/*********************************************************** - * author: kerwincui [物美智能 wumei-smart] - * create: 2022-02-20 - * email:164770707@qq.com - * source:https://github.com/kerwincui/wumei-smart - * board:esp8266 core for arduino v3.0.2 - ***********************************************************/ - -#include "Helper.h" - -WiFiClient wifiClient; -PubSubClient mqttClient; -float rssi = 0; -char wumei_iv[17] = "wumei-smart-open"; -int monitorCount = 0; -long monitorInterval = 1000; - -//==================================== 这是需要配置的项 =============================== -// Wifi配置 -char *wifiSsid = "wumei"; -char *wifiPwd = "wumei-smart"; - -// 设备信息配置 -String deviceNum = "D6329VL548866"; -String userId = "1"; -String productId = "41"; -float firmwareVersion = 1.0; -// 经度和纬度可选,如果产品使用设备定位,则必须传 -float latitude=0; -float longitude=0; - -// Mqtt配置 -char *mqttHost = "wumei.live"; -int mqttPort = 1883; -char *mqttUserName = "wumei-smart"; -char *mqttPwd = "PHYFED93WSFF1DAS"; -char mqttSecret[17] = "K2V5DE28XNUU3497"; -// 产品启用授权码,则授权码不能为空 -String authCode=""; - -// NTP地址(用于获取时间,可选的修改为自己部署项目的地址) -String ntpServer = "http://wumei.live:8080/iot/tool/ntp?deviceSendTime="; -//==================================================================================== - -// 订阅的主题 -String prefix = "/" + productId + "/" + deviceNum; -String sInfoTopic = prefix + "/info/get"; -String sOtaTopic = prefix + "/ota/get"; -String sNtpTopic = prefix + "/ntp/get"; -String sPropertyTopic = prefix + "/property/get"; -String sFunctionTopic = prefix + "/function/get"; -String sPropertyOnline = prefix + "/property-online/get"; -String sFunctionOnline = prefix + "/function-online/get"; -String sMonitorTopic = prefix + "/monitor/get"; -// 发布的主题 -String pInfoTopic = prefix + "/info/post"; -String pNtpTopic = prefix + "/ntp/post"; -String pPropertyTopic = prefix + "/property/post"; -String pFunctionTopic = prefix + "/function/post"; -String pMonitorTopic = prefix + "/monitor/post"; -String pEventTopic = prefix + "/event/post"; - -// 物模型-属性处理 -void processProperty(String payload) -{ - StaticJsonDocument<1024> doc; - DeserializationError error = deserializeJson(doc, payload); - if (error) { - Serial.print(F("deserializeJson() failed: ")); - Serial.println(error.f_str()); - return; - } - for (JsonObject object : doc.as()) - { - // 匹配云端定义的属性(不包含属性中的监测数据) - const char* id = object["id"]; - const char* value = object["value"]; - printMsg((String)id + ":" + (String)value); - } - // 最后发布属性,服务端订阅存储(重要) - publishProperty(payload); -} - -// 物模型-功能处理 -void processFunction(String payload) -{ - StaticJsonDocument<1024> doc; - DeserializationError error = deserializeJson(doc, payload); - if (error) { - Serial.print(F("deserializeJson() failed: ")); - Serial.println(error.f_str()); - return; - } - for (JsonObject object : doc.as()) - { - // 匹配云端定义的功能 - const char* id = object["id"]; - const char* value = object["value"]; - if (strcmp(id, "switch") == 0) - { - printMsg("开关 switch:" + (String) value); - } - else if (strcmp(id, "gear") == 0) - { - printMsg("档位 gear:" + (String)value); - } - else if (strcmp(id, "light_color") == 0) - { - printMsg("灯光颜色 light_color:" + (String)value); - } - else if (strcmp(id, "message") == 0) - { - printMsg("屏显消息 message:" + (String)value); - }else if(strcmp(id,"report_monitor")==0){ - String msg=randomPropertyData(); - printMsg("订阅到上报监测数据指令,上报数据:"); - printMsg(msg); - publishProperty(msg); - } - } - // 最后发布功能,服务端订阅存储(重要) - publishFunction(payload); -} - -// Mqtt回调 -void callback(char *topic, byte *payload, unsigned int length) -{ - blink(); - printMsg("接收数据:"); - String data = ""; - for (int i = 0; i < length; i++) - { - Serial.print((char)payload[i]); - data += (char)payload[i]; - } - - if (strcmp(topic, sOtaTopic.c_str()) == 0) - { - printMsg("订阅到设备升级指令..."); - StaticJsonDocument<256> doc; - DeserializationError error = deserializeJson(doc, payload); - if (error) - { - Serial.print(F("deserializeJson() failed: ")); - Serial.println(error.f_str()); - return; - } - String newVersion = doc["version"]; - String downloadUrl = doc["downloadUrl"]; - printMsg("固件版本:"+newVersion); - printMsg("下载地址:"+downloadUrl); - } - else if (strcmp(topic, sInfoTopic.c_str()) == 0) - { - printMsg("订阅到设备信息..."); - // 发布设备信息 - publishInfo(); - } - else if (strcmp(topic, sNtpTopic.c_str()) == 0) - { - printMsg("订阅到NTP时间..."); - StaticJsonDocument<256> doc; - DeserializationError error = deserializeJson(doc, payload); - if (error) - { - Serial.print(F("deserializeJson() failed: ")); - Serial.println(error.f_str()); - return; - } - // 计算设备当前时间:(${serverRecvTime} + ${serverSendTime} + ${deviceRecvTime} - ${deviceSendTime}) / 2 - float deviceSendTime = doc["deviceSendTime"]; - float serverSendTime = doc["serverSendTime"]; - float serverRecvTime = doc["serverRecvTime"]; - float deviceRecvTime = millis(); - float now = (serverSendTime + serverRecvTime + deviceRecvTime - deviceSendTime) / 2; - printMsg("当前时间:" + String(now, 0)); - } - else if (strcmp(topic, sPropertyTopic.c_str()) == 0 || strcmp(topic, sPropertyOnline.c_str()) == 0) - { - printMsg("订阅到属性指令..."); - processProperty(data); - } - else if (strcmp(topic, sFunctionTopic.c_str()) == 0 || strcmp(topic, sFunctionOnline.c_str()) == 0) - { - printMsg("订阅到功能指令..."); - processFunction(data); - } - else if (strcmp(topic, sMonitorTopic.c_str()) == 0) - { - printMsg("订阅到实时监测指令..."); - StaticJsonDocument<128> doc; - DeserializationError error = deserializeJson(doc, payload); - if (error) - { - Serial.print(F("deserializeJson() failed: ")); - Serial.println(error.f_str()); - return; - } - monitorCount = doc["count"]; - monitorInterval = doc["interval"]; - } -} - -// 连接wifi -void connectWifi() -{ - printMsg("连接 "); - Serial.print(wifiSsid); - WiFi.mode(WIFI_STA); - WiFi.begin(wifiSsid, wifiPwd); - while (WiFi.status() != WL_CONNECTED) - { - delay(500); - Serial.print("."); - } - printMsg("WiFi连接成功"); - printMsg("IP地址: "); - Serial.print(WiFi.localIP()); -} - -// 连接mqtt -void connectMqtt() -{ - printMsg("连接Mqtt服务器..."); - // 生成mqtt认证密码(设备加密认证,密码加密格式为:mqtt密码 & 过期时间 & 授权码,其中授权码为可选) - String password = generationPwd(); - String encryptPassword = encrypt(password, mqttSecret, wumei_iv); - printMsg("密码(已加密):" + encryptPassword); - mqttClient.setClient(wifiClient); - mqttClient.setServer(mqttHost, mqttPort); - mqttClient.setCallback(callback); - mqttClient.setBufferSize(1024); - mqttClient.setKeepAlive(10); - //连接 设备mqtt客户端Id格式为:认证类型(E=加密、S=简单) & 设备编号 & 产品ID & 用户ID - String clientId = "E&" + deviceNum + "&" + productId +"&" + userId; - bool connectResult = mqttClient.connect(clientId.c_str(), mqttUserName, encryptPassword.c_str()); - if (connectResult) - { - printMsg("连接成功"); - // 订阅(OTA、NTP、属性、功能、实时监测、信息) - mqttClient.subscribe(sInfoTopic.c_str(), 1); - mqttClient.subscribe(sOtaTopic.c_str(), 1); - mqttClient.subscribe(sNtpTopic.c_str(), 1); - mqttClient.subscribe(sPropertyTopic.c_str(), 1); - mqttClient.subscribe(sFunctionTopic.c_str(), 1); - mqttClient.subscribe(sPropertyOnline.c_str(), 1); - mqttClient.subscribe(sFunctionOnline.c_str(), 1); - mqttClient.subscribe(sMonitorTopic.c_str(), 1); - printMsg("订阅主题:" + sInfoTopic); - printMsg("订阅主题:" + sOtaTopic); - printMsg("订阅主题:" + sNtpTopic); - printMsg("订阅主题:" + sPropertyTopic); - printMsg("订阅主题:" + sFunctionTopic); - printMsg("订阅主题:" + sPropertyOnline); - printMsg("订阅主题:" + sFunctionOnline); - printMsg("订阅主题:" + sMonitorTopic); - // 发布设备信息 - publishInfo(); - } - else - { - printMsg("连接失败, rc="); - Serial.print(mqttClient.state()); - } -} - -// 1.发布设备信息 -void publishInfo() -{ - StaticJsonDocument<256> doc; - doc["rssi"] = WiFi.RSSI(); - doc["firmwareVersion"] = firmwareVersion; - doc["status"] = 3; // (1-未激活,2-禁用,3-在线,4-离线) - doc["userId"] = (String)userId; - doc["longitude"] = longitude; //经度 可选 - doc["latitude"] = latitude; // 纬度 可选 - // 设备摘要,可选(自定义配置信息) - JsonObject summary = doc.createNestedObject("summary"); - summary["name"]="wumei-smart"; - summary["chip"]="esp8266"; - summary["author"]="kerwincui"; - summary["version"]=1.6; - summary["create"]="2022-06-06"; - - printMsg("发布设备信息:"); - serializeJson(doc, Serial); - String output; - serializeJson(doc, output); - mqttClient.publish(pInfoTopic.c_str(), output.c_str()); -} - -// 2.发布时钟同步信,用于获取当前时间(可选) -void publishNtp() -{ - StaticJsonDocument<128> doc; - doc["deviceSendTime"] = millis(); - - printMsg("发布NTP信息:"); - serializeJson(doc, Serial); - String output; - serializeJson(doc, output); - mqttClient.publish(pNtpTopic.c_str(), output.c_str()); -} - -// 3.发布属性 -void publishProperty(String msg) -{ - printMsg("发布属性:" + msg); - mqttClient.publish(pPropertyTopic.c_str(), msg.c_str()); -} - -// 4.发布功能 -void publishFunction(String msg) -{ - printMsg("发布功能:" + msg); - mqttClient.publish(pFunctionTopic.c_str(), msg.c_str()); -} - -// 5.发布事件 -void publishEvent() -{ - // 匹配云端的事件 - StaticJsonDocument<512> doc; - JsonObject objTmeperature = doc.createNestedObject(); - objTmeperature["id"] = "height_temperature"; - objTmeperature["value"] = "40"; - objTmeperature["remark"] = "温度过高警告"; - - JsonObject objException = doc.createNestedObject(); - objException["id"] = "exception"; - objException["value"] = "异常消息,消息内容XXXXXXXX"; - objException["remark"] = "设备发生错误"; - - printMsg("发布事件:"); - serializeJson(doc, Serial); - String output; - serializeJson(doc, output); - mqttClient.publish(pEventTopic.c_str(), output.c_str()); -} - -// 6.发布实时监测数据 -void publishMonitor() -{ - String msg=randomPropertyData(); - // 发布为实时监测数据,不会存储 - printMsg("发布实时监测数据:"+msg); - mqttClient.publish(pMonitorTopic.c_str(), msg.c_str()); -} - -// 随机生成监测值 -String randomPropertyData(){ - // 匹配云端定义的监测数据,随机数代替监测结果 - float randFloat = 0; - int randInt=0; - StaticJsonDocument<1024> doc; - JsonObject objTmeperature = doc.createNestedObject(); - objTmeperature["id"] = "temperature"; - randFloat = random(1000, 3000) ; - objTmeperature["value"] = (String)(randFloat/100); - objTmeperature["remark"] = (String)millis(); - - JsonObject objHumidity = doc.createNestedObject(); - objHumidity["id"] = "humidity"; - randFloat = random(3000, 6000); - objHumidity["value"] = (String)(randFloat/100); - objHumidity["remark"] = (String)millis(); - - JsonObject objCo2 = doc.createNestedObject(); - objCo2["id"] = "co2"; - randInt = random(400, 1000); - objCo2["value"] = (String)(randInt); - objCo2["remark"] = (String)millis(); - - JsonObject objBrightness = doc.createNestedObject(); - objBrightness["id"] = "brightness"; - randInt = random(1000, 10000); - objBrightness["value"] = (String)(randInt); - objBrightness["remark"] = (String)millis(); - - printMsg("随机生成监测数据值:"); - serializeJson(doc, Serial); - String output; - serializeJson(doc, output); - return output; -} - -// 生成密码 -String generationPwd() -{ - String jsonTime = getTime(); - // 128字节内存池容量 - StaticJsonDocument<128> doc; - // 解析JSON - DeserializationError error = deserializeJson(doc, jsonTime); - if (error) - { - printMsg("Json解析失败:"); - Serial.print(error.f_str()); - return ""; - } - // 获取当前时间 - float deviceSendTime = doc["deviceSendTime"]; - float serverSendTime = doc["serverSendTime"]; - float serverRecvTime = doc["serverRecvTime"]; - float deviceRecvTime = millis(); - float now = (serverSendTime + serverRecvTime + deviceRecvTime - deviceSendTime) / 2; - // 过期时间 = 当前时间 + 1小时 - float expireTime = now + 1 * 60 * 60 * 1000; - // 密码加密格式为:mqtt密码 & 过期时间 & 授权码(可选),如果产品启用了授权码就必须加上 - String password=""; - if(authCode==""){ - password = (String)mqttPwd + "&" + String(expireTime, 0); - }else{ - password = (String)mqttPwd + "&" + String(expireTime, 0)+ "&" + authCode; - } - printMsg("密码(未加密):" + password); - return password; -} - -// HTTP获取时间 -String getTime() -{ - while (WiFi.status() == WL_CONNECTED) - { - HTTPClient http; - printMsg("获取时间..."); - if (http.begin(wifiClient, (ntpServer + (String)millis()).c_str())) - { - // 发送请求 - int httpCode = http.GET(); - if (httpCode > 0) - { - if (httpCode == HTTP_CODE_OK || httpCode == HTTP_CODE_MOVED_PERMANENTLY) - { - printMsg("获取时间成功,data:"); - Serial.print(http.getString()); - return http.getString(); - } - } - else - { - printMsg("获取时间失败,error:"); - Serial.printf(http.errorToString(httpCode).c_str()); - } - http.end(); - } - else - { - printMsg("连接Http失败"); - } - delay(500); - } - return "1672524366000"; -} - -//打印提示信息 -void printMsg(String msg) -{ - Serial.print("\r\n["); - Serial.print(millis()); - Serial.print("ms]"); - Serial.print(msg); -} - -// 控制指示灯闪烁 -void blink() -{ - printMsg("指示灯闪烁..."); - pinMode(15, OUTPUT); - for (int i = 0; i < 2; i++) - { - digitalWrite(15, HIGH); - delay(200); - digitalWrite(15, LOW); - delay(200); - } -} - -// 加密 (AES-CBC-128-pkcs5padding) -String encrypt(String plain_data, char *wumei_key, char *wumei_iv) -{ - int i; - // pkcs7padding填充 Block Size : 16 - int len = plain_data.length(); - int n_blocks = len / 16 + 1; - uint8_t n_padding = n_blocks * 16 - len; - uint8_t data[n_blocks * 16]; - memcpy(data, plain_data.c_str(), len); - for (i = len; i < n_blocks * 16; i++) - { - data[i] = n_padding; - } - uint8_t key[16], iv[16]; - memcpy(key, wumei_key, 16); - memcpy(iv, wumei_iv, 16); - // 加密 - br_aes_big_cbcenc_keys encCtx; - br_aes_big_cbcenc_init(&encCtx, key, 16); - br_aes_big_cbcenc_run(&encCtx, iv, data, n_blocks * 16); - // Base64编码 - len = n_blocks * 16; - char encoded_data[base64_enc_len(len)]; - base64_encode(encoded_data, (char *)data, len); - return String(encoded_data); -} - -// 解密 (AES-CBC-128-pkcs5padding) -String decrypt(String encoded_data_str, char *wumei_key, char *wumei_iv) -{ - int input_len = encoded_data_str.length(); - char *encoded_data = const_cast(encoded_data_str.c_str()); - int len = base64_dec_len(encoded_data, input_len); - uint8_t data[len]; - base64_decode((char *)data, encoded_data, input_len); - uint8_t key[16], iv[16]; - memcpy(key, wumei_key, 16); - memcpy(iv, wumei_iv, 16); - int n_blocks = len / 16; - br_aes_big_cbcdec_keys decCtx; - br_aes_big_cbcdec_init(&decCtx, key, 16); - br_aes_big_cbcdec_run(&decCtx, iv, data, n_blocks * 16); - // PKCS#7 Padding 填充 - uint8_t n_padding = data[n_blocks * 16 - 1]; - len = n_blocks * 16 - n_padding; - char plain_data[len + 1]; - memcpy(plain_data, data, len); - plain_data[len] = '\0'; - return String(plain_data); -} diff --git a/sdk/Arduino/Arduino-ESP8266/Helper.h b/sdk/Arduino/Arduino-ESP8266/Helper.h deleted file mode 100644 index 7bb28504..00000000 --- a/sdk/Arduino/Arduino-ESP8266/Helper.h +++ /dev/null @@ -1,79 +0,0 @@ -/*********************************************************** - * author: kerwincui [物美智能 wumei-smart] - * create: 2022-02-20 - * email:164770707@qq.com - * source:https://github.com/kerwincui/wumei-smart - * board:esp8266 core for arduino v3.0.2 - ***********************************************************/ - -#ifndef _HELPER_H -#define _HELPER_H - -#include "Base64.h" -#include -#include -#include -#include // 版本2.8.0 -#include // 版本6.19.1 - -extern WiFiClient wifiClient; -extern PubSubClient mqttClient; - -extern String deviceNum ; // 设备编号(重要,同时是Mqtt的clientId) -extern String userId; // 用户ID -extern String productId; // 产品ID -extern float rssi; // 信号强度(信号极好4格[-55— 0],信号好3格[-70— -55],信号一般2格[-85— -70],信号差1格[-100— -85]) -extern float firmwareVersion; // 固件版本 -extern char *wifiSsid; // WIFI的SSID -extern char *wifiPwd; // WIFI的密码 -extern char *mqttHost; // Mqtt消息服务器地址 -extern int mqttPort; // Mqtt消息服务器端口 -extern char *mqttUserName; // Mqtt消息服务器账号 -extern char *mqttPwd; // Mqtt消息服务器密码 -extern char mqttSecret[17]; // Mqtt秘钥,16位 -extern char wumei_iv[17]; // AES加密偏移量,固定值16位 -extern String ntpServer; // NTP服务地址,用于获取当前时间 -extern int monitorCount; // 发布监测数据的最大次数 -extern long monitorInterval; // 发布监测数据的间隔,默认1000毫秒 - - -// 连接wifi -void connectWifi(); -// 连接mqtt -void connectMqtt(); -// Mqtt回调 -void callback(char *topic, byte *payload, unsigned int length); - -// 发布设备信息 -void publishInfo(); -// 发布时钟同步信息 -void publishNtp(); -// 发布事件 -void publishEvent(); -// 发布实时监测数据 -void publishMonitor(); -// 随机生成监测值 -String randomPropertyData(); -// 发布属性 -void publishProperty(String msg); -// 发布功能 -void publishFunction(String msg); -// 属性处理 -void processProperty(String payload); -// 功能处理 -void processFunction(String payload); - -// 生成密码 -String generationPwd(); -// 获取时间 -String getTime(); -// AES加密 -String encrypt(String plain_data,char *wumei_key,char *wumei_iv); -// AES解密 -String decrypt(String encoded_data_str,char *wumei_key,char *wumei_iv); -//打印提示信息 -void printMsg(String tips); -// 控制指示灯闪烁 -void blink(); - -#endif diff --git a/sdk/Arduino/WumeiArduino/Apconfig.cpp b/sdk/Arduino/WumeiArduino/Apconfig.cpp deleted file mode 100644 index c0dc4c84..00000000 --- a/sdk/Arduino/WumeiArduino/Apconfig.cpp +++ /dev/null @@ -1,134 +0,0 @@ -/********************************************************************* - * function: 设备AP配网 - * board: esp8266 core for arduino v3.0.2 - * library: PubSubClient2.8.0 & ArduinoJson6.19.1 & OneButton2.0.4 - * source: https://gitee.com/kerwincui/wumei-smart - * copyright: wumei-smart and kerwincui all rights reserved. - ********************************************************************/ - -#include "ApConfig.h" - -String randomName = "wumei-device" + (String)random(1000); -const char *ap_ssid = randomName.c_str(); -//开放式网络,不设置密码 -const char *ap_password = ""; - -IPAddress local_IP(192, 168, 4, 1); -IPAddress gateway(192, 168, 4, 1); -IPAddress subnet(255, 255, 255, 0); -ESP8266WebServer server(80); - -/** - * 启动AP配网 - */ -void startApConfig() -{ - ledStatus(true); - WiFi.mode(WIFI_AP_STA); - WiFi.softAPConfig(local_IP, gateway, subnet); - WiFi.softAP(ap_ssid, ap_password); - printMsg("已启动AP配网,IP地址:" + WiFi.softAPIP().toString() + ", 热点名称:" + (String)ap_ssid); - // 启动web服务 - startWebServer(); -} - -/** - * 启动Web服务 - */ -void startWebServer() -{ - isApMode = true; - server.on("/status", HTTP_GET, handleStatus); - server.on("/config", HTTP_POST, handleConfig); - server.onNotFound(handleNotFound); - server.enableCORS(true); - server.begin(); - printMsg("HTTP服务已启动"); -} - -/** - * 检测设备接口 - */ -void handleStatus() -{ - server.send(200, "text/plain;charset=utf-8", "AP配网已准备就绪"); -} - -/** - * AP配网接口 - */ -void handleConfig() -{ - printMsg("进入配网......"); - config_type config; - // wifi名称、wifi密码、用户编号 - if (server.hasArg("SSID") && server.hasArg("password") && server.hasArg("userId")) - { - // 分配空间 - wifiSsid = (char *)malloc(32 * sizeof(char)); - wifiPwd = (char *)malloc(64 * sizeof(char)); - userId = (char *)malloc(16 * sizeof(char)); - strcpy(config.stassid, server.arg("SSID").c_str()); - strcpy(wifiSsid, server.arg("SSID").c_str()); - strcpy(config.stapsw, server.arg("password").c_str()); - strcpy(wifiPwd, server.arg("password").c_str()); - strcpy(config.userId, server.arg("userId").c_str()); - strcpy(userId, server.arg("userId").c_str()); - - printMsg("收到WIFI名称:" + (String)config.stassid); - printMsg("收到WIFI密码:" + (String)config.stapsw); - printMsg("收到用户编号:" + (String)config.userId); - } - else - { - printMsg("配网必须传递用户编号、WIFI名称和WIFI密码,配网失败"); - server.send(500, "text/plain;charset=utf-8", "配网必须传递用户编号、WIFI名称和WIFI密码,配网失败"); - return; - } - // 可选字段 - if (server.hasArg("deviceNum")) - { - deviceNum = (char *)malloc(32 * sizeof(char)); - strcpy(config.deviceNum, server.arg("deviceNum").c_str()); - strcpy(deviceNum, server.arg("deviceNum").c_str()); - printMsg("收到设备编号:" + server.arg("deviceNum")); - } - if (server.hasArg("authCode")) - { - authCode = (char *)malloc(32 * sizeof(char)); - strcpy(config.authCode, server.arg("authCode").c_str()); - strcpy(authCode, server.arg("authCode").c_str()); - printMsg("收到产品授权码:" + server.arg("authCode")); - } - if (server.hasArg("extra")) - { - printMsg("收到补充信息:" + server.arg("extra")); - } - server.send(200, "text/plain;charset=utf-8", "设备已更新WIFI配置,开始连接WIFI..."); - // 统一设置Mqtt消息主题前缀 - prefix = "/" + (String)productId + "/" + (String)deviceNum; - // 存储配置 - saveConfig(config); - // 连接Wifi - connectWifi(); -} - -/** - * 找不到页面和跨域处理 - */ -void handleNotFound() -{ - printMsg("进入预检请求或请求地址找不到"); - if (server.method() == HTTP_OPTIONS) - { - // 处理浏览器跨域问题 - server.sendHeader("Access-Control-Max-Age", "10000"); - server.sendHeader("Access-Control-Allow-Methods", "PUT,POST,GET,OPTIONS"); - server.sendHeader("Access-Control-Allow-Headers", "*"); - server.send(204); - } - else - { - server.send(404, "text/plain;charset=utf-8", "请求的地址找不到或无法访问"); - } -} diff --git a/sdk/Arduino/WumeiArduino/Apconfig.h b/sdk/Arduino/WumeiArduino/Apconfig.h deleted file mode 100644 index 57de5a69..00000000 --- a/sdk/Arduino/WumeiArduino/Apconfig.h +++ /dev/null @@ -1,28 +0,0 @@ -/********************************************************************* - * function: 设备AP配网 - * board: esp8266 core for arduino v3.0.2 - * library: PubSubClient2.8.0 & ArduinoJson6.19.1 & OneButton2.0.4 - * source: https://gitee.com/kerwincui/wumei-smart - * copyright: wumei-smart and kerwincui all rights reserved. - ********************************************************************/ - -#ifndef _APCONFIG_H -#define _APCONFIG_H - -#include "Config.h" -#include - -extern ESP8266WebServer server; - -// 启动AP配网 -void startApConfig(); -// 启动Web服务 -void startWebServer(); -// 配网接口 -void handleConfig(); -// 检测设备接口 -void handleStatus(); -// 找不到页面和浏览器跨域处理 -void handleNotFound(); - -#endif diff --git a/sdk/Arduino/WumeiArduino/Auth.cpp b/sdk/Arduino/WumeiArduino/Auth.cpp deleted file mode 100644 index eb003fed..00000000 --- a/sdk/Arduino/WumeiArduino/Auth.cpp +++ /dev/null @@ -1,177 +0,0 @@ -/********************************************************************* - * function: 设备认证 - * board: esp8266 core for arduino v3.0.2 - * library: PubSubClient2.8.0 & ArduinoJson6.19.1 & OneButton2.0.4 - * source: https://gitee.com/kerwincui/wumei-smart - * copyright: wumei-smart and kerwincui all rights reserved. - ********************************************************************/ - -#include "Auth.h" - -/* - * 连接MQTT,加密认证 - */ -void connectMqtt() -{ - printMsg("连接Mqtt服务器..."); - mqttClient.setClient(wifiClient); - mqttClient.setServer(mqttHost, mqttPort); - mqttClient.setBufferSize(1024); - mqttClient.setKeepAlive(5); - // 设置Mqtt回调函数 - mqttClient.setCallback(mqttCallback); - - // 生成mqtt加密密码 - String aesPassword = generationAESPwd(); - // 连接 设备mqtt客户端Id格式为:认证类型(E=加密、S=简单) & 设备编号 & 产品ID & 用户ID - String clientId = "E&" + (String)deviceNum + "&" + (String)productId + "&" + (String)userId; - printMsg("客户端ID:" + clientId); - bool connectResult = mqttClient.connect(clientId.c_str(), mqttUserName, aesPassword.c_str()); - if (connectResult) - { - printMsg("连接Mqtt成功"); - // 订阅系统主题 - subscribeTopic(); - // 发布设备信息,设备上电都需要发布一次 - publishInfo(); - } - else - { - printMsg("连接失败, rc="); - Serial.print(mqttClient.state()); - } -} - -/* - * 生成加密密码 - */ -String generationAESPwd() -{ - // 获取NTP时间 - String jsonTime = getTime(); - StaticJsonDocument<128> doc; - DeserializationError error = deserializeJson(doc, jsonTime); - if (error) - { - printMsg("Json解析失败:"); - Serial.print(error.f_str()); - return ""; - } - // 获取NTP时间=(设备发送消息时间 + 服务器接收消息时间 + 服务器发送消息时间 - 设备接收时间 最后除于2 ) - float deviceSendTime = doc["deviceSendTime"]; - float serverSendTime = doc["serverSendTime"]; - float serverRecvTime = doc["serverRecvTime"]; - float deviceRecvTime = millis(); - float now = (serverSendTime + serverRecvTime + deviceRecvTime - deviceSendTime) / 2; - // 过期时间 = 当前时间 + 1小时 - float expireTime = now + 1 * 60 * 60 * 1000; - // 加密认证,密码格式为:mqtt密码 & 过期时间 & 授权码(可选),如果产品启用了授权码就必须加上 - String password = ""; - if (authCode == "") - { - password = (String)mqttPwd + "&" + String(expireTime, 0); - } - else - { - password = (String)mqttPwd + "&" + String(expireTime, 0) + "&" + authCode; - } - // 密码加密 - printMsg("密码(未加密):" + password); - String encryptPassword = encrypt(password, mqttSecret, wumei_iv); - printMsg("密码(已加密):" + encryptPassword); - return encryptPassword; -} - -/* - * 通过HTTP获取NTP时间 - */ -String getTime() -{ - while (WiFi.status() == WL_CONNECTED) - { - HTTPClient http; - printMsg("获取时间..."); - if (http.begin(wifiClient, (ntpServer + (String)millis()).c_str())) - { - // 发送请求 - int httpCode = http.GET(); - if (httpCode > 0) - { - if (httpCode == HTTP_CODE_OK || httpCode == HTTP_CODE_MOVED_PERMANENTLY) - { - printMsg("获取时间成功,data:"); - Serial.print(http.getString()); - return http.getString(); - } - } - else - { - printMsg("获取时间失败,error:"); - Serial.printf(http.errorToString(httpCode).c_str()); - } - http.end(); - } - else - { - printMsg("连接Http失败"); - } - delay(500); - } - return ""; -} - -/* - * AES加密 (AES-CBC-128-pkcs5padding) - */ -String encrypt(String plain_data, char *wumei_key, char *wumei_iv) -{ - int i; - // pkcs7padding填充 Block Size : 16 - int len = plain_data.length(); - int n_blocks = len / 16 + 1; - uint8_t n_padding = n_blocks * 16 - len; - uint8_t data[n_blocks * 16]; - memcpy(data, plain_data.c_str(), len); - for (i = len; i < n_blocks * 16; i++) - { - data[i] = n_padding; - } - uint8_t key[16], iv[16]; - memcpy(key, wumei_key, 16); - memcpy(iv, wumei_iv, 16); - // 加密 - br_aes_big_cbcenc_keys encCtx; - br_aes_big_cbcenc_init(&encCtx, key, 16); - br_aes_big_cbcenc_run(&encCtx, iv, data, n_blocks * 16); - // Base64编码 - len = n_blocks * 16; - char encoded_data[base64_enc_len(len)]; - base64_encode(encoded_data, (char *)data, len); - return String(encoded_data); -} - -/* - * AES解密 (AES-CBC-128-pkcs5padding) - */ -String decrypt(String encoded_data_str, char *wumei_key, char *wumei_iv) -{ - int input_len = encoded_data_str.length(); - char *encoded_data = const_cast(encoded_data_str.c_str()); - int len = base64_dec_len(encoded_data, input_len); - uint8_t data[len]; - base64_decode((char *)data, encoded_data, input_len); - uint8_t key[16], iv[16]; - memcpy(key, wumei_key, 16); - memcpy(iv, wumei_iv, 16); - int n_blocks = len / 16; - br_aes_big_cbcdec_keys decCtx; - br_aes_big_cbcdec_init(&decCtx, key, 16); - br_aes_big_cbcdec_run(&decCtx, iv, data, n_blocks * 16); - // PKCS#7 Padding 填充 - uint8_t n_padding = data[n_blocks * 16 - 1]; - len = n_blocks * 16 - n_padding; - char plain_data[len + 1]; - memcpy(plain_data, data, len); - plain_data[len] = '\0'; - return String(plain_data); -} diff --git a/sdk/Arduino/WumeiArduino/Auth.h b/sdk/Arduino/WumeiArduino/Auth.h deleted file mode 100644 index f2a27971..00000000 --- a/sdk/Arduino/WumeiArduino/Auth.h +++ /dev/null @@ -1,29 +0,0 @@ -/********************************************************************* - * function: 设备认证 - * board: esp8266 core for arduino v3.0.2 - * library: PubSubClient2.8.0 & ArduinoJson6.19.1 & OneButton2.0.4 - * source: https://gitee.com/kerwincui/wumei-smart - * copyright: wumei-smart and kerwincui all rights reserved. - ********************************************************************/ - -#ifndef _AUTH_H -#define _AUTH_H - -#include "Config.h" -#include "User.h" -#include "Mqtt.h" -#include -#include - -// 连接mqtt, AES加密认证 -void connectMqtt(); -// 生成加密密码 -String generationAESPwd(); -// 获取时间 -String getTime(); -// AES加密 -String encrypt(String plain_data, char *wumei_key, char *wumei_iv); -// AES解密 -String decrypt(String encoded_data_str, char *wumei_key, char *wumei_iv); - -#endif diff --git a/sdk/Arduino/WumeiArduino/Base64.cpp b/sdk/Arduino/WumeiArduino/Base64.cpp deleted file mode 100644 index 9e827773..00000000 --- a/sdk/Arduino/WumeiArduino/Base64.cpp +++ /dev/null @@ -1,173 +0,0 @@ -/********************************************************************* - * function: Base64编码和解码 - * board: esp8266 core for arduino v3.0.2 - * library: PubSubClient2.8.0 & ArduinoJson6.19.1 & OneButton2.0.4 - * source: https://gitee.com/kerwincui/wumei-smart - * copyright: Copyright (c) 2013 Adam Rudd. - ********************************************************************/ - -#include "Base64.h" - -#if (defined(__AVR__)) -#include -#else -#include -#endif - -const char PROGMEM b64_alphabet[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "abcdefghijklmnopqrstuvwxyz" - "0123456789+/"; - -/* 'Private' declarations */ -inline void a3_to_a4(unsigned char *a4, unsigned char *a3); -inline void a4_to_a3(unsigned char *a3, unsigned char *a4); -inline unsigned char b64_lookup(char c); - -int base64_encode(char *output, char *input, int inputLen) -{ - int i = 0, j = 0; - int encLen = 0; - unsigned char a3[3]; - unsigned char a4[4]; - - while (inputLen--) - { - a3[i++] = *(input++); - if (i == 3) - { - a3_to_a4(a4, a3); - - for (i = 0; i < 4; i++) - { - output[encLen++] = pgm_read_byte(&b64_alphabet[a4[i]]); - } - - i = 0; - } - } - - if (i) - { - for (j = i; j < 3; j++) - { - a3[j] = '\0'; - } - - a3_to_a4(a4, a3); - - for (j = 0; j < i + 1; j++) - { - output[encLen++] = pgm_read_byte(&b64_alphabet[a4[j]]); - } - - while ((i++ < 3)) - { - output[encLen++] = '='; - } - } - output[encLen] = '\0'; - return encLen; -} - -int base64_decode(char *output, char *input, int inputLen) -{ - int i = 0, j = 0; - int decLen = 0; - unsigned char a3[3]; - unsigned char a4[4]; - - while (inputLen--) - { - if (*input == '=') - { - break; - } - - a4[i++] = *(input++); - if (i == 4) - { - for (i = 0; i < 4; i++) - { - a4[i] = b64_lookup(a4[i]); - } - - a4_to_a3(a3, a4); - - for (i = 0; i < 3; i++) - { - output[decLen++] = a3[i]; - } - i = 0; - } - } - - if (i) - { - for (j = i; j < 4; j++) - { - a4[j] = '\0'; - } - - for (j = 0; j < 4; j++) - { - a4[j] = b64_lookup(a4[j]); - } - - a4_to_a3(a3, a4); - - for (j = 0; j < i - 1; j++) - { - output[decLen++] = a3[j]; - } - } - output[decLen] = '\0'; - return decLen; -} - -int base64_enc_len(int plainLen) -{ - int n = plainLen; - return (n + 2 - ((n + 2) % 3)) / 3 * 4; -} - -int base64_dec_len(char *input, int inputLen) -{ - int i = 0; - int numEq = 0; - for (i = inputLen - 1; input[i] == '='; i--) - { - numEq++; - } - - return ((6 * inputLen) / 8) - numEq; -} - -inline void a3_to_a4(unsigned char *a4, unsigned char *a3) -{ - a4[0] = (a3[0] & 0xfc) >> 2; - a4[1] = ((a3[0] & 0x03) << 4) + ((a3[1] & 0xf0) >> 4); - a4[2] = ((a3[1] & 0x0f) << 2) + ((a3[2] & 0xc0) >> 6); - a4[3] = (a3[2] & 0x3f); -} - -inline void a4_to_a3(unsigned char *a3, unsigned char *a4) -{ - a3[0] = (a4[0] << 2) + ((a4[1] & 0x30) >> 4); - a3[1] = ((a4[1] & 0xf) << 4) + ((a4[2] & 0x3c) >> 2); - a3[2] = ((a4[2] & 0x3) << 6) + a4[3]; -} - -inline unsigned char b64_lookup(char c) -{ - if (c >= 'A' && c <= 'Z') - return c - 'A'; - if (c >= 'a' && c <= 'z') - return c - 71; - if (c >= '0' && c <= '9') - return c + 4; - if (c == '+') - return 62; - if (c == '/') - return 63; - return -1; -} diff --git a/sdk/Arduino/WumeiArduino/Base64.h b/sdk/Arduino/WumeiArduino/Base64.h deleted file mode 100644 index 7e53a549..00000000 --- a/sdk/Arduino/WumeiArduino/Base64.h +++ /dev/null @@ -1,84 +0,0 @@ - -/********************************************************************* - * function: Base64编码和解码 - * board: esp8266 core for arduino v3.0.2 - * library: PubSubClient2.8.0 & ArduinoJson6.19.1 & OneButton2.0.4 - * source: https://gitee.com/kerwincui/wumei-smart - * copyright: Copyright (c) 2013 Adam Rudd. - ********************************************************************/ - -#ifndef _BASE64_H -#define _BASE64_H - -/* b64_alphabet: - * Description: Base64 alphabet table, a mapping between integers - * and base64 digits - * Notes: This is an extern here but is defined in Base64.c - */ -extern const char b64_alphabet[]; - -/* base64_encode: - * Description: - * Encode a string of characters as base64 - * Parameters: - * output: the output buffer for the encoding, stores the encoded string - * input: the input buffer for the encoding, stores the binary to be encoded - * inputLen: the length of the input buffer, in bytes - * Return value: - * Returns the length of the encoded string - * Requirements: - * 1. output must not be null or empty - * 2. input must not be null - * 3. inputLen must be greater than or equal to 0 - */ -int base64_encode(char *output, char *input, int inputLen); - -/* base64_decode: - * Description: - * Decode a base64 encoded string into bytes - * Parameters: - * output: the output buffer for the decoding, - * stores the decoded binary - * input: the input buffer for the decoding, - * stores the base64 string to be decoded - * inputLen: the length of the input buffer, in bytes - * Return value: - * Returns the length of the decoded string - * Requirements: - * 1. output must not be null or empty - * 2. input must not be null - * 3. inputLen must be greater than or equal to 0 - */ -int base64_decode(char *output, char *input, int inputLen); - -/* base64_enc_len: - * Description: - * Returns the length of a base64 encoded string whose decoded - * form is inputLen bytes long - * Parameters: - * inputLen: the length of the decoded string - * Return value: - * The length of a base64 encoded string whose decoded form - * is inputLen bytes long - * Requirements: - * None - */ -int base64_enc_len(int inputLen); - -/* base64_dec_len: - * Description: - * Returns the length of the decoded form of a - * base64 encoded string - * Parameters: - * input: the base64 encoded string to be measured - * inputLen: the length of the base64 encoded string - * Return value: - * Returns the length of the decoded form of a - * base64 encoded string - * Requirements: - * 1. input must not be null - * 2. input must be greater than or equal to zero - */ -int base64_dec_len(char *input, int inputLen); - -#endif // _BASE64_H diff --git a/sdk/Arduino/WumeiArduino/Config.cpp b/sdk/Arduino/WumeiArduino/Config.cpp deleted file mode 100644 index 9c81763a..00000000 --- a/sdk/Arduino/WumeiArduino/Config.cpp +++ /dev/null @@ -1,196 +0,0 @@ -/********************************************************************* - * function: 设备配置和系统功能 - * board: esp8266 core for arduino v3.0.2 - * library: PubSubClient2.8.0 & ArduinoJson6.19.1 & OneButton2.0.4 - * source: https://gitee.com/kerwincui/wumei-smart - * copyright: wumei-smart and kerwincui all rights reserved. - ********************************************************************/ - -#include "Config.h" -#define LED 15 // LED指示灯引脚 - -WiFiClient wifiClient; -PubSubClient mqttClient; - -float rssi = 0; -char wumei_iv[17] = "wumei-smart-open"; -int monitorCount = 0; -long monitorInterval = 1000; -bool isApMode = false; - -// Mqtt订阅的主题,前缀格式为: /productId/devicenumber -String prefix = ""; -String sInfoTopic = "/info/get"; -String sOtaTopic = "/ota/get"; -String sNtpTopic = "/ntp/get"; -String sPropertyTopic = "/property/get"; -String sFunctionTopic = "/function/get"; -String sPropertyOnline = "/property-online/get"; -String sFunctionOnline = "/function-online/get"; -String sMonitorTopic = "/monitor/get"; -// Mqtt发布的主题 -String pInfoTopic = "/info/post"; -String pNtpTopic = "/ntp/post"; -String pPropertyTopic = "/property/post"; -String pFunctionTopic = "/function/post"; -String pMonitorTopic = "/monitor/post"; -String pEventTopic = "/event/post"; - -/********************************** begin 可配置的项 **********************************/ -// wifi信息 -char *wifiSsid = ""; -char *wifiPwd = ""; -char *userId = "1"; -// 产品启用授权码,则授权码不能为空 -char *authCode = ""; - -// 设备信息配置 -char *deviceNum = "D6329VL5668888"; -char *productId = "41"; -float firmwareVersion = 1.0; -// 经度和纬度可选,如果产品使用设备定位,则必须传 -float latitude = 0; -float longitude = 0; - -// Mqtt配置 -char *mqttHost = "wumei.live"; -int mqttPort = 1883; -char *mqttUserName = "wumei-smart"; -char *mqttPwd = "PHYFED93WSFF1DAS"; -char mqttSecret[17] = "K2V5DE28XNUU3497"; - -// NTP地址(用于获取时间,修改为自己部署项目的接口地址) -String ntpServer = "http://wumei.live:8080/iot/tool/ntp?deviceSendTime="; - -/********************************** end 可配置的项 **********************************/ - -// 连接wifi -void connectWifi() -{ - if (isApMode) - { - // 关闭AP配网模式,延迟2秒确保返回状态码给手机 - isApMode = false; - delay(2000); - server.stop(); - ledStatus(false); - } - printMsg("连接Wifi: "); - Serial.print(wifiSsid); - WiFi.mode(WIFI_STA); - WiFi.begin(wifiSsid, wifiPwd); -} - -// 存储配置 -void saveConfig(config_type config) -{ - // 标识为已经存储数据 - config.flag = 1; - EEPROM.begin(240); - printMsg("存储配置..."); - uint8_t *p = (uint8_t *)(&config); - for (int i = 0; i < sizeof(config); i++) - { - EEPROM.write(i, *(p + i)); - } - EEPROM.end(); -} - -// 加载配置 -void loadConfig() -{ - config_type config; - EEPROM.begin(240); - printMsg("加载配置..."); - uint8_t *p = (uint8_t *)(&config); - for (int i = 0; i < sizeof(config); i++) - { - *(p + i) = EEPROM.read(i); - } - if (config.flag != 1) - { - printMsg("flash暂无数据"); - return; - } - // wifi名称 - if (strlen(config.stassid) != 0) - { - wifiSsid = (char *)malloc(32 * sizeof(char)); - strcpy(wifiSsid, config.stassid); - } - // wifi密码 - if (strlen(config.stapsw) != 0) - { - wifiPwd = (char *)malloc(64 * sizeof(char)); - strcpy(wifiPwd, config.stapsw); - } - // 设备编号 - if (strlen(config.deviceNum) != 0) - { - deviceNum = (char *)malloc(32 * sizeof(char)); - strcpy(deviceNum, config.deviceNum); - } - // 用户编号 - if (strlen(config.userId) != 0) - { - userId = (char *)malloc(16 * sizeof(char)); - strcpy(userId, config.userId); - } - // 授权码 - if (strlen(config.authCode) != 0) - { - authCode = (char *)malloc(32 * sizeof(char)); - strcpy(authCode, config.authCode); - } - // 统一设置Mqtt消息主题前缀 - prefix = "/" + (String)productId + "/" + (String)deviceNum; -} - -// 清空配置 -void clearConfig() -{ - EEPROM.begin(240); - for (int i = 0; i < 240; i++) - { - EEPROM.write(i, 0); - } - EEPROM.end(); -} - -//打印提示信息 -void printMsg(String msg) -{ - Serial.print("\r\n["); - Serial.print(millis()); - Serial.print("ms]"); - Serial.print(msg); -} - -// 控制指示灯闪烁 -void blink() -{ - printMsg("指示灯闪烁..."); - pinMode(LED, OUTPUT); - for (int i = 0; i < 2; i++) - { - digitalWrite(LED, HIGH); - delay(100); - digitalWrite(LED, LOW); - delay(100); - } -} - -// 控制指示灯状态 -void ledStatus(bool status) -{ - printMsg("更改指示灯状态"); - pinMode(LED, OUTPUT); - if (status) - { - digitalWrite(LED, HIGH); - } - else - { - digitalWrite(LED, LOW); - } -} diff --git a/sdk/Arduino/WumeiArduino/Config.h b/sdk/Arduino/WumeiArduino/Config.h deleted file mode 100644 index ee997801..00000000 --- a/sdk/Arduino/WumeiArduino/Config.h +++ /dev/null @@ -1,88 +0,0 @@ -/********************************************************************* - * function: 设备配置和系统功能 - * board: esp8266 core for arduino v3.0.2 - * library: PubSubClient2.8.0 & ArduinoJson6.19.1 & OneButton2.0.4 - * source: https://gitee.com/kerwincui/wumei-smart - * copyright: wumei-smart and kerwincui all rights reserved. - ********************************************************************/ - -#ifndef _CONFIG_H -#define _CONFIG_H - -#include "Apconfig.h" -#include "Base64.h" -#include -#include -#include // 版本2.8.0 -#include // 版本6.19.1 - -// 存储的配置类型结构 -struct config_type -{ - char flag; // 是否有数据标识,等于1表示有数据 - char stassid[32]; // SSID配置项 - char stapsw[64]; // Password配置项 - char deviceNum[32]; // 设备编号配置项 - char userId[16]; // 用户ID配置项 - char authCode[32]; // 授权码配置项 -}; - -extern WiFiClient wifiClient; -extern PubSubClient mqttClient; - -// 全局变量 -extern char *deviceNum; // 设备编号(重要,同时是Mqtt的clientId) -extern char *userId; // 用户ID -extern char *productId; // 产品ID -extern float rssi; // 信号强度(信号极好4格[-55— 0],信号好3格[-70— -55],信号一般2格[-85— -70],信号差1格[-100— -85]) -extern float firmwareVersion; // 固件版本 -extern float latitude; // 设备精度 -extern float longitude; // 设备维度 -extern char *wifiSsid; // WIFI的SSID -extern char *wifiPwd; // WIFI的密码 -extern char *mqttHost; // Mqtt消息服务器地址 -extern int mqttPort; // Mqtt消息服务器端口 -extern char *mqttUserName; // Mqtt消息服务器账号 -extern char *mqttPwd; // Mqtt消息服务器密码 -extern char mqttSecret[17]; // Mqtt秘钥,16位 -extern char wumei_iv[17]; // AES加密偏移量,固定值16位 -extern char *authCode; // 产品授权码,产品未启用时为空字符串 -extern String ntpServer; // NTP服务地址,用于获取当前时间 -extern int monitorCount; // 发布监测数据的最大次数 -extern long monitorInterval; // 发布监测数据的间隔,默认1000毫秒 -extern bool isApMode; // 是否进入AP配网模式 - -// 订阅的主题 -extern String prefix; // Mqtt消息主题前缀 -extern String sInfoTopic; // 订阅设备信息 -extern String sOtaTopic; // 订阅OTA升级 -extern String sNtpTopic; // 订阅NTP时间 -extern String sPropertyTopic; // 订阅属性 -extern String sFunctionTopic; // 订阅功能 -extern String sPropertyOnline; // 订阅属性-在线模式 -extern String sFunctionOnline; // 订阅功能-在线模式 -extern String sMonitorTopic; // 订阅实时监测 -// 发布的主题 -extern String pInfoTopic; // 发布设备信息 -extern String pNtpTopic; // 发布NTP时间 -extern String pPropertyTopic; // 发布属性 -extern String pFunctionTopic; // 发布功能 -extern String pMonitorTopic; // 发布实时监测数据 -extern String pEventTopic; // 发布事件 - -// 连接WIFI -void connectWifi(); -// 加载配置 -void loadConfig(); -// 保存配置 -void saveConfig(config_type config); -// 清空配置 -void clearConfig(); -//打印提示信息 -void printMsg(String msg); -// 控制指示灯闪烁 -void blink(); -// 控制指示灯状态 -void ledStatus(bool status); - -#endif diff --git a/sdk/Arduino/WumeiArduino/Mqtt.cpp b/sdk/Arduino/WumeiArduino/Mqtt.cpp deleted file mode 100644 index 173e76c2..00000000 --- a/sdk/Arduino/WumeiArduino/Mqtt.cpp +++ /dev/null @@ -1,94 +0,0 @@ -/********************************************************************* - * function: 设备交互 - * board: esp8266 core for arduino v3.0.2 - * library: PubSubClient2.8.0 & ArduinoJson6.19.1 & OneButton2.0.4 - * source: https://gitee.com/kerwincui/wumei-smart - * copyright: wumei-smart and kerwincui all rights reserved. - ********************************************************************/ - -#include "Mqtt.h" - -// 订阅系统主题 -void subscribeTopic() -{ - mqttClient.subscribe((prefix + sInfoTopic).c_str(), 1); - mqttClient.subscribe((prefix + sOtaTopic).c_str(), 1); - mqttClient.subscribe((prefix + sNtpTopic).c_str(), 1); - mqttClient.subscribe((prefix + sPropertyTopic).c_str(), 1); - mqttClient.subscribe((prefix + sFunctionTopic).c_str(), 1); - mqttClient.subscribe((prefix + sPropertyOnline).c_str(), 1); - mqttClient.subscribe((prefix + sFunctionOnline).c_str(), 1); - mqttClient.subscribe((prefix + sMonitorTopic).c_str(), 1); - printMsg("订阅主题完成"); -} - -// 1.发布设备信息 -void publishInfo() -{ - StaticJsonDocument<256> doc; - doc["rssi"] = WiFi.RSSI(); - doc["firmwareVersion"] = firmwareVersion; - doc["status"] = 3; // (1-未激活,2-禁用,3-在线,4-离线) - doc["userId"] = (String)userId; - doc["longitude"] = longitude; //经度 可选 - doc["latitude"] = latitude; // 纬度 可选 - // 设备摘要,可选(自定义配置信息) - JsonObject summary = doc.createNestedObject("summary"); - summary["name"] = "wumei-smart"; - summary["chip"] = "esp8266"; - summary["author"] = "kerwincui"; - summary["version"] = 1.6; - summary["create"] = "2022-06-06"; - - printMsg("发布设备信息:"); - serializeJson(doc, Serial); - String output; - serializeJson(doc, output); - printMsg("主题为:" + prefix + pInfoTopic); - mqttClient.publish((prefix + pInfoTopic).c_str(), output.c_str()); -} - -// 2.发布时钟同步信,用于获取当前时间(可选) -void publishNtp() -{ - StaticJsonDocument<128> doc; - doc["deviceSendTime"] = millis(); - printMsg("发布主题:" + prefix + pNtpTopic); - printMsg("信息:"); - serializeJson(doc, Serial); - String output; - serializeJson(doc, output); - mqttClient.publish((prefix + pNtpTopic).c_str(), output.c_str()); -} - -// 3.发布属性 -void publishProperty(String msg) -{ - printMsg("发布属性:" + prefix + pPropertyTopic); - printMsg("消息:" + msg); - mqttClient.publish((prefix + pPropertyTopic).c_str(), msg.c_str()); -} - -// 4.发布功能 -void publishFunction(String msg) -{ - printMsg("发布功能:" + prefix + pFunctionTopic); - printMsg("消息:" + msg); - mqttClient.publish((prefix + pFunctionTopic).c_str(), msg.c_str()); -} - -// 5.发布事件 -void publishEvent(String msg) -{ - printMsg("发布事件:" + prefix + pEventTopic); - printMsg("消息:" + msg); - mqttClient.publish((prefix + pEventTopic).c_str(), msg.c_str()); -} - -// 6.发布实时监测数据 -void publishMonitor(String msg) -{ - // 发布实时监测数据(不会存储,需要实时存储则发布为属性) - printMsg("发布实时监测消息:" + msg); - mqttClient.publish((prefix + pMonitorTopic).c_str(), msg.c_str()); -} diff --git a/sdk/Arduino/WumeiArduino/Mqtt.h b/sdk/Arduino/WumeiArduino/Mqtt.h deleted file mode 100644 index f30124c1..00000000 --- a/sdk/Arduino/WumeiArduino/Mqtt.h +++ /dev/null @@ -1,29 +0,0 @@ -/********************************************************************* - * function: 设备交互 - * board: esp8266 core for arduino v3.0.2 - * library: PubSubClient2.8.0 & ArduinoJson6.19.1 & OneButton2.0.4 - * source: https://gitee.com/kerwincui/wumei-smart - * copyright: wumei-smart and kerwincui all rights reserved. - ********************************************************************/ - -#ifndef _MQTT_H -#define _MQTT_H - -#include "Config.h" - -// 订阅系统主题 -void subscribeTopic(); -// 发布设备信息 -void publishInfo(); -// 发布时钟同步信息 -void publishNtp(); -// 发布事件 -void publishEvent(String msg); -// 发布实时监测数据(不会存储,需要实时存储则发布属性) -void publishMonitor(String msg); -// 发布属性 -void publishProperty(String msg); -// 发布功能 -void publishFunction(String msg); - -#endif diff --git a/sdk/Arduino/WumeiArduino/User.cpp b/sdk/Arduino/WumeiArduino/User.cpp deleted file mode 100644 index 7a2ff927..00000000 --- a/sdk/Arduino/WumeiArduino/User.cpp +++ /dev/null @@ -1,296 +0,0 @@ -/********************************************************************* - * function: 用户自定义功能 - * board: esp8266 core for arduino v3.0.2 - * library: PubSubClient2.8.0 & ArduinoJson6.19.1 & OneButton2.0.4 - * source: https://gitee.com/kerwincui/wumei-smart - * copyright: wumei-smart and kerwincui all rights reserved. - ********************************************************************/ - -#include "User.h" -#define BUTTON 14 // 按键引脚 -#define RELAY 12 // 继电器引脚 - -OneButton button; -// 按钮单击事件 -static void buttonClick(); -// 按钮双击事件 -static void buttonDoubleClick(); -// 按钮长按事件 -static void buttonLongPress(); - -// 初始化用户配置 -void initUser() -{ - // 初始化按键为低电平,并添加单击、双击、长按事件 - button = OneButton(BUTTON, true, true); - button.attachClick(buttonClick); - button.attachDoubleClick(buttonDoubleClick); - button.attachLongPressStart(buttonLongPress); -} - -// Mqtt回调 -void mqttCallback(char *topic, byte *payload, unsigned int length) -{ - blink(); - printMsg("接收数据:"); - String data = ""; - for (int i = 0; i < length; i++) - { - Serial.print((char)payload[i]); - data += (char)payload[i]; - } - - if (strcmp(topic, (prefix + sOtaTopic).c_str()) == 0) - { - printMsg("订阅到设备升级指令..."); - StaticJsonDocument<256> doc; - DeserializationError error = deserializeJson(doc, payload); - if (error) - { - Serial.print(F("deserializeJson() failed: ")); - Serial.println(error.f_str()); - return; - } - String newVersion = doc["version"]; - String downloadUrl = doc["downloadUrl"]; - printMsg("固件版本:" + newVersion); - printMsg("下载地址:" + downloadUrl); - } - else if (strcmp(topic, (prefix + sInfoTopic).c_str()) == 0) - { - printMsg("订阅到设备信息..."); - // 发布设备信息 - publishInfo(); - } - else if (strcmp(topic, (prefix + sNtpTopic).c_str()) == 0) - { - printMsg("订阅到NTP时间..."); - StaticJsonDocument<256> doc; - DeserializationError error = deserializeJson(doc, payload); - if (error) - { - Serial.print(F("deserializeJson() failed: ")); - Serial.println(error.f_str()); - return; - } - // 计算设备当前时间:(${serverRecvTime} + ${serverSendTime} + ${deviceRecvTime} - ${deviceSendTime}) / 2 - float deviceSendTime = doc["deviceSendTime"]; - float serverSendTime = doc["serverSendTime"]; - float serverRecvTime = doc["serverRecvTime"]; - float deviceRecvTime = millis(); - float now = (serverSendTime + serverRecvTime + deviceRecvTime - deviceSendTime) / 2; - printMsg("当前时间:" + String(now, 0)); - } - else if (strcmp(topic, (prefix + sPropertyTopic).c_str()) == 0 || strcmp(topic, (prefix + sPropertyOnline).c_str()) == 0) - { - printMsg("订阅到属性指令..."); - processProperty(data); - } - else if (strcmp(topic, (prefix + sFunctionTopic).c_str()) == 0 || strcmp(topic, (prefix + sFunctionOnline).c_str()) == 0) - { - printMsg("订阅到功能指令..."); - processFunction(data); - } - else if (strcmp(topic, (prefix + sMonitorTopic).c_str()) == 0) - { - printMsg("订阅到实时监测指令..."); - StaticJsonDocument<128> doc; - DeserializationError error = deserializeJson(doc, payload); - if (error) - { - Serial.print(F("deserializeJson() failed: ")); - Serial.println(error.f_str()); - return; - } - monitorCount = doc["count"]; - monitorInterval = doc["interval"]; - } -} - -// 随机生成监测值 -String randomPropertyData() -{ - // 匹配云端定义的监测数据,随机数代替监测值 - float randFloat = 0; - int randInt = 0; - StaticJsonDocument<1024> doc; - JsonObject objTmeperature = doc.createNestedObject(); - objTmeperature["id"] = "temperature"; - randFloat = random(1000, 3000); - objTmeperature["value"] = (String)(randFloat / 100); - objTmeperature["remark"] = (String)millis(); - - JsonObject objHumidity = doc.createNestedObject(); - objHumidity["id"] = "humidity"; - randFloat = random(3000, 6000); - objHumidity["value"] = (String)(randFloat / 100); - objHumidity["remark"] = (String)millis(); - - JsonObject objCo2 = doc.createNestedObject(); - objCo2["id"] = "co2"; - randInt = random(400, 1000); - objCo2["value"] = (String)(randInt); - objCo2["remark"] = (String)millis(); - - JsonObject objBrightness = doc.createNestedObject(); - objBrightness["id"] = "brightness"; - randInt = random(1000, 10000); - objBrightness["value"] = (String)(randInt); - objBrightness["remark"] = (String)millis(); - - printMsg("模拟监测数据值:"); - serializeJson(doc, Serial); - String output; - serializeJson(doc, output); - return output; -} - -// 物模型-属性处理 -void processProperty(String msg) -{ - StaticJsonDocument<1024> doc; - DeserializationError error = deserializeJson(doc, msg); - if (error) - { - Serial.print(F("deserializeJson() failed: ")); - Serial.println(error.f_str()); - return; - } - for (JsonObject object : doc.as()) - { - // 匹配云端定义的属性(不包含属性中的监测数据) - const char *id = object["id"]; - const char *value = object["value"]; - printMsg((String)id + ":" + (String)value); - } - // 最后发布属性,服务端订阅存储(重要) - publishProperty(msg); -} - -// 物模型-功能处理 -void processFunction(String msg) -{ - StaticJsonDocument<1024> doc; - DeserializationError error = deserializeJson(doc, msg); - if (error) - { - Serial.print(F("deserializeJson() failed: ")); - Serial.println(error.f_str()); - return; - } - for (JsonObject object : doc.as()) - { - // 匹配云端定义的功能 - const char *id = object["id"]; - const char *value = object["value"]; - if (strcmp(id, "switch") == 0) - { - printMsg("开关 switch:" + (String)value); - if (strcmp(value, "1") == 0) - { - // 打开继电器 - relayStatus(true); - } - else if (strcmp(value, "0") == 0) - { - // 关闭继电器 - relayStatus(false); - } - } - else if (strcmp(id, "gear") == 0) - { - printMsg("档位 gear:" + (String)value); - } - else if (strcmp(id, "light_color") == 0) - { - printMsg("灯光颜色 light_color:" + (String)value); - } - else if (strcmp(id, "message") == 0) - { - printMsg("屏显消息 message:" + (String)value); - } - else if (strcmp(id, "report_monitor") == 0) - { - String msg = randomPropertyData(); - printMsg("订阅到上报监测数据指令,上报数据:"); - printMsg(msg); - publishProperty(msg); - } - } - // 最后发布功能,服务端订阅存储(重要) - publishFunction(msg); -} - -// 物模型-事件上传 -void processEvent() -{ - // 匹配云端的事件 - StaticJsonDocument<512> doc; - JsonObject objTmeperature = doc.createNestedObject(); - objTmeperature["id"] = "height_temperature"; - objTmeperature["value"] = "40"; - objTmeperature["remark"] = "温度过高警告"; - - JsonObject objException = doc.createNestedObject(); - objException["id"] = "exception"; - objException["value"] = "异常消息,消息内容XXXXXXXX"; - objException["remark"] = "设备发生错误"; - - printMsg("发布事件:"); - serializeJson(doc, Serial); - String output; - serializeJson(doc, output); - - // 最后发布功能,服务端订阅存储(重要) - publishEvent(output); -} - -//打开继电器A -void relayStatus(bool status) -{ - pinMode(RELAY, OUTPUT); - if (status) - { - digitalWrite(RELAY, HIGH); - } - else - { - digitalWrite(RELAY, LOW); - } -} - -// 按钮单击事件 -static void buttonClick() -{ - printMsg("检测到按键单击,打开继电器"); - relayStatus(true); - // 匹配云端定义的开关,格式如:[{"id":"switch","value":"1"}] - String msg = "[{\"id\":\"switch\",\"value\":\"1\"}]"; - publishProperty(msg); -} - -// 按钮双击事件 -static void buttonDoubleClick() -{ - printMsg("检测到按键双击,关闭继电器"); - relayStatus(false); - // 匹配云端定义的开关,格式如:[{"id":"switch","value":"0"}] - String msg = "[{\"id\":\"switch\",\"value\":\"0\"}]"; - publishProperty(msg); -} - -// 按钮长按事件,进入配网模式 -static void buttonLongPress() -{ - printMsg("检测到按键长按"); - if (isApMode) - { - printMsg("设备重启..."); - ESP.restart(); - } - else - { - printMsg("开始AP配网"); - startApConfig(); - } -} diff --git a/sdk/Arduino/WumeiArduino/User.h b/sdk/Arduino/WumeiArduino/User.h deleted file mode 100644 index 9c03c63e..00000000 --- a/sdk/Arduino/WumeiArduino/User.h +++ /dev/null @@ -1,33 +0,0 @@ -/********************************************************************* - * function: 用户自定义功能 - * board: esp8266 core for arduino v3.0.2 - * library: PubSubClient2.8.0 & ArduinoJson6.19.1 & OneButton2.0.4 - * source: https://gitee.com/kerwincui/wumei-smart - * copyright: wumei-smart and kerwincui all rights reserved. - ********************************************************************/ - -#ifndef _USER_H -#define _USER_H - -#include "Config.h" -#include "Mqtt.h" -#include // 版本2.0.4 - -extern OneButton button; - -// 初始化用户配置 -void initUser(); -// Mqtt回调 -void mqttCallback(char *topic, byte *payload, unsigned int length); -// 属性处理(物模型) -void processProperty(String msg); -// 功能处理(物模型) -void processFunction(String msg); -// 事件处理(无模型) -void processEvent(); -// 模拟监测值 -String randomPropertyData(); -// 控制继电器状态 -void relayStatus(bool status); - -#endif diff --git a/sdk/Arduino/WumeiArduino/WumeiArduino.ino b/sdk/Arduino/WumeiArduino/WumeiArduino.ino deleted file mode 100644 index 717975a7..00000000 --- a/sdk/Arduino/WumeiArduino/WumeiArduino.ino +++ /dev/null @@ -1,149 +0,0 @@ -/********************************************************************* - * function: 程序入口 - * board: esp8266 core for arduino v3.0.2 - * library: PubSubClient2.8.0 & ArduinoJson6.19.1 & OneButton2.0.4 - * source: https://gitee.com/kerwincui/wumei-smart - * copyright: wumei-smart and kerwincui all rights reserved. - ********************************************************************/ - -#include "Config.h" -#include "Auth.h" -#include "Apconfig.h" -#include "User.h" - -long lastWifiConn; // 上次wifi连接时间 -long lastMqttConn; // 上次mqtt连接时间 -long lastPublishMonitor; // 上次发布监测数据时间 -long lastPublishSimulateData; // 上次发布测试数据时间 - -/** - * 启动 - */ -void setup() -{ - //打开串行端口: - Serial.begin(115200); - printMsg("wumei smart device starting..."); - // 加载配置 - loadConfig(); - // 初始化用户配置 - initUser(); - - if (strcmp(wifiSsid, "") == 0) - { - // 启动配网 - startApConfig(); - } - else - { - // 连接Wifi - connectWifi(); - } -} - -/** - * 循环执行 - */ -void loop() -{ - // 监测按钮 - button.tick(); - - if (isApMode) - { - // 配网时的Web服务 - server.handleClient(); - } - else - { - // Wifi重连 - wifiReconnectionClient(); - // Mqtt连接 - mqttReconnectionClient(); - // 发布实时监测数据 - publicMonitorClient(); - // 发布模拟数据,测试用 - publishSimulateDataClient(); - } -} - -/* - * Wifi掉线重连(非阻塞,间隔5s) - */ -void wifiReconnectionClient() -{ - long now = millis(); - if (WiFi.status() != WL_CONNECTED) - { - if (now - lastWifiConn > 5000) - { - lastWifiConn = now; - WiFi.reconnect(); - } - } -} - -/* - * mqtt连接(非阻塞、间隔5s) - */ -void mqttReconnectionClient() -{ - if (WiFi.status() == WL_CONNECTED) - { - long now = millis(); - if (!mqttClient.connected()) - { - if (now - lastMqttConn > 5000) - { - lastMqttConn = now; - connectMqtt(); - } - } - else - { - mqttClient.loop(); - } - } -} - -/* - * 发布实时监测数据(非阻塞、间隔默认1秒) - */ -void publicMonitorClient() -{ - if (WiFi.status() == WL_CONNECTED && monitorCount > 0) - { - long now = millis(); - if (now - lastPublishMonitor > monitorInterval) - { - lastPublishMonitor = now; - monitorCount--; - String msg = randomPropertyData(); - publishMonitor(msg); - } - } -} - -/* - * 发布模拟数据(非阻塞、仅用于测试,间隔60秒) - */ -void publishSimulateDataClient() -{ - if (WiFi.status() == WL_CONNECTED) - { - long now = millis(); - if (now - lastPublishSimulateData > 60000) - { - lastPublishSimulateData = now; - printMsg("执行定时上报"); - // 发布事件 - processEvent(); - // 发布时钟同步 - publishNtp(); - - // 发布属性(监测值) - String msg = randomPropertyData(); - publishProperty(msg); - } - } -}