From 0ef02dcf4bd261103a5d2f383077ece5174c9aa1 Mon Sep 17 00:00:00 2001 From: strawmanbobi Date: Sat, 19 Mar 2022 15:53:39 +0800 Subject: [PATCH] implemented downstream topic subscribe and receive --- lib/AliyunIoTSDK/src/AliyunIoTSDK.cpp | 8 ++++-- lib/AliyunIoTSDK/src/AliyunIoTSDK.h | 21 ++++++++++----- platformio.ini | 4 +-- src/IRbabyAlink.cpp | 39 ++++++++++++++++----------- 4 files changed, 47 insertions(+), 25 deletions(-) diff --git a/lib/AliyunIoTSDK/src/AliyunIoTSDK.cpp b/lib/AliyunIoTSDK/src/AliyunIoTSDK.cpp index 906d951..dd04fdd 100644 --- a/lib/AliyunIoTSDK/src/AliyunIoTSDK.cpp +++ b/lib/AliyunIoTSDK/src/AliyunIoTSDK.cpp @@ -148,7 +148,7 @@ int AliyunIoTSDK::mqttCheckConnect() { return mqttStatus; } -void AliyunIoTSDK::begin(Client &espClient, +int AliyunIoTSDK::begin(Client &espClient, const char *_productKey, const char *_deviceName, const char *_deviceSecret, @@ -189,7 +189,7 @@ void AliyunIoTSDK::begin(Client &espClient, client->setCallback(callback); #endif - mqttCheckConnect(); + return mqttCheckConnect(); } int AliyunIoTSDK::loop() { @@ -236,6 +236,10 @@ void AliyunIoTSDK::sendCustomData(const char *topic, const uint8_t *data, int le Serial.println(d); } +boolean AliyunIoTSDK::subscribe(const char* topic, int qos) { + return client->subscribe(topic, qos); +} + void AliyunIoTSDK::registerCustomCallback(MQTT_CALLBACK_SIGNATURE) { client->setCallback(callback); } diff --git a/lib/AliyunIoTSDK/src/AliyunIoTSDK.h b/lib/AliyunIoTSDK/src/AliyunIoTSDK.h index f8e0b41..84fcc2d 100644 --- a/lib/AliyunIoTSDK/src/AliyunIoTSDK.h +++ b/lib/AliyunIoTSDK/src/AliyunIoTSDK.h @@ -64,11 +64,11 @@ public: * @param _deviceSecret : AliyunIoT device secret * @param _region : AliyunIoT region */ - static void begin(Client &espClient, - const char *_productKey, - const char *_deviceName, - const char *_deviceSecret, - const char *_region); + static int begin(Client &espClient, + const char *_productKey, + const char *_deviceName, + const char *_deviceSecret, + const char *_region); /** * Send data @@ -134,9 +134,18 @@ public: */ static void sendCustomData(const char *topic, const uint8_t *data, int length); + /** + * Subscribe MQTT topic for Aliot + * + * @param topic : topic in string + * @param qos : MQTT qos param + * @return if succeeded + */ + static boolean subscribe(const char* topic, int qos); + /** * Register customized MQTT message callback - * + * * @param callback : callback pointer */ static void registerCustomCallback(MQTT_CALLBACK_SIGNATURE); diff --git a/platformio.ini b/platformio.ini index 37e482e..36618b9 100644 --- a/platformio.ini +++ b/platformio.ini @@ -18,8 +18,8 @@ platform = espressif8266 framework = arduino monitor_speed = 115200 upload_speed = 115200 -upload_port = COM6 -monitor_port = COM6 +upload_port = COM5 +monitor_port = COM5 board_build.flash_mode = dout build_flags = -Wno-unused-function diff --git a/src/IRbabyAlink.cpp b/src/IRbabyAlink.cpp index ded0999..1255624 100644 --- a/src/IRbabyAlink.cpp +++ b/src/IRbabyAlink.cpp @@ -26,6 +26,7 @@ #include "IRbabySerial.h" #include "IRbabyAlink.h" +#include "IRbabyIRIS.h" #include "IRbabyGlobal.h" #include "IRbaby.h" @@ -38,26 +39,31 @@ String g_device_name = ""; String g_device_secret = ""; String g_region_id = "cn-shanghai"; String g_upstream_topic = ""; +String g_downstream_topic = ""; int g_app_id = 0; + +static bool downstream_topic_subscribed = false; static AliyunIoTSDK iot; static ep_state_t endpoint_state = FSM_IDLE; -static void registerCallback(); +static void registerCallback(const char* topic, int qos); static void irisAlinkCallback(const char *topic, uint8_t *data, int length); static int iot_retry = 0; -static void sendIrisKitHeartBeat(); - void connectToAliyunIoT() { + downstream_topic_subscribed = false; INFOF("Try connecting to Aliyun IoT : %s, %s, %s, %s\n", g_product_key.c_str(), g_device_name.c_str(), g_device_secret.c_str(), g_region_id.c_str()); - iot.begin(wifi_client, g_product_key.c_str(), g_device_name.c_str(), g_device_secret.c_str(), - g_region_id.c_str()); + + if (0 == iot.begin(wifi_client, g_product_key.c_str(), g_device_name.c_str(), g_device_secret.c_str(), + g_region_id.c_str())) { + sendIrisKitConnect(); + } INFOLN("Aliyun IoT connect done"); g_upstream_topic = g_product_key + "/" + g_device_name + "/user/iris/upstream"; - registerCallback(); + g_downstream_topic = g_product_key + "/" + g_device_name + "/user/iris/downstream"; } void checkAlinkMQTT() { @@ -66,7 +72,12 @@ void checkAlinkMQTT() { if (0 == mqttStatus) { iot_retry = 0; - sendIrisKitHeartBeat(); + if (false == downstream_topic_subscribed) { + registerCallback(g_downstream_topic.c_str(), 0); + downstream_topic_subscribed = true; + } else { + sendIrisKitHeartBeat(); + } } else { INFOF("Alink MQTT check failed, retry = %d\n", iot_retry); iot_retry++; @@ -86,15 +97,13 @@ AliyunIoTSDK getSession() { return iot; } -static void registerCallback() { - iot.registerCustomCallback(irisAlinkCallback); +static void registerCallback(const char* topic, int qos) { + if (iot.subscribe(topic, qos)) { + INFOLN("topic subscribed"); + iot.registerCustomCallback(irisAlinkCallback); + } } static void irisAlinkCallback(const char *topic, uint8_t *data, int length) { - INFO("IRIS Alink callback triggerd : topic = "); - INFO(topic); - INFO(", data = "); - INFO((char*)data); - INFO(", length = "); - INFOLN(length); + INFOF("IRIS downstream message : topic = %s, length = %d, data = %s\n", topic, length, (char*) data); }