From 9d3cac7cdb8155cf6ab092dae6d054561827268d Mon Sep 17 00:00:00 2001 From: Ben Meadors Date: Thu, 1 Sep 2022 17:54:24 -0500 Subject: [PATCH 1/4] MQTT Json Payload variants (#1667) * Payload variants * Waypoints and fixes * Remove json send to mesh. I think protobuf messages already do that * whoops --- src/mqtt/MQTT.cpp | 89 ++++++++++++++++++++++++++++++++++------------- 1 file changed, 65 insertions(+), 24 deletions(-) diff --git a/src/mqtt/MQTT.cpp b/src/mqtt/MQTT.cpp index 284b09c6a..71fabed66 100644 --- a/src/mqtt/MQTT.cpp +++ b/src/mqtt/MQTT.cpp @@ -44,17 +44,18 @@ void MQTT::onPublish(char *topic, byte *payload, unsigned int length) if (json["sender"].string_value().compare(owner.id) != 0) { std::string jsonPayloadStr = json["payload"].dump(); DEBUG_MSG("Received json payload %s, length %u\n", jsonPayloadStr.c_str(), jsonPayloadStr.length()); + // FIXME Not sure we need to be doing this // construct protobuf data packet using TEXT_MESSAGE, send it to the mesh - MeshPacket *p = router->allocForSending(); - p->decoded.portnum = PortNum_TEXT_MESSAGE_APP; - if (jsonPayloadStr.length() <= sizeof(p->decoded.payload.bytes)) { - memcpy(p->decoded.payload.bytes, jsonPayloadStr.c_str(), jsonPayloadStr.length()); - p->decoded.payload.size = jsonPayloadStr.length(); - MeshPacket *packet = packetPool.allocCopy(*p); - service.sendToMesh(packet, RX_SRC_LOCAL); - } else { - DEBUG_MSG("Received MQTT json payload too long, dropping\n"); - } + // MeshPacket *p = router->allocForSending(); + // p->decoded.portnum = PortNum_TEXT_MESSAGE_APP; + // if (jsonPayloadStr.length() <= sizeof(p->decoded.payload.bytes)) { + // memcpy(p->decoded.payload.bytes, jsonPayloadStr.c_str(), jsonPayloadStr.length()); + // p->decoded.payload.size = jsonPayloadStr.length(); + // MeshPacket *packet = packetPool.allocCopy(*p); + // service.sendToMesh(packet, RX_SRC_LOCAL); + // } else { + // DEBUG_MSG("Received MQTT json payload too long, dropping\n"); + // } } else { DEBUG_MSG("Ignoring downlink message we originally sent.\n"); } @@ -289,7 +290,14 @@ String MQTT::downstreamPacketToJson(MeshPacket *mp) memset(&scratch, 0, sizeof(scratch)); if (pb_decode_from_bytes(mp->decoded.payload.bytes, mp->decoded.payload.size, &Telemetry_msg, &scratch)) { decoded = &scratch; - if (decoded->which_variant == Telemetry_environment_metrics_tag) { + if (decoded->which_variant == Telemetry_device_metrics_tag) { + msgPayload = Json::object{ + {"battery_level", (int)decoded->variant.device_metrics.battery_level}, + {"voltage", decoded->variant.device_metrics.voltage}, + {"channel_utilization", decoded->variant.device_metrics.channel_utilization}, + {"air_util_tx", decoded->variant.device_metrics.air_util_tx}, + }; + } else if (decoded->which_variant == Telemetry_environment_metrics_tag) { msgPayload = Json::object{ {"temperature", decoded->variant.environment_metrics.temperature}, {"relative_humidity", decoded->variant.environment_metrics.relative_humidity}, @@ -312,10 +320,12 @@ String MQTT::downstreamPacketToJson(MeshPacket *mp) memset(&scratch, 0, sizeof(scratch)); if (pb_decode_from_bytes(mp->decoded.payload.bytes, mp->decoded.payload.size, &User_msg, &scratch)) { decoded = &scratch; - msgPayload = Json::object{{"id", decoded->id}, - {"longname", decoded->long_name}, - {"shortname", decoded->short_name}, - {"hardware", decoded->hw_model}}; + msgPayload = Json::object{ + {"id", decoded->id}, + {"longname", decoded->long_name}, + {"shortname", decoded->short_name}, + {"hardware", decoded->hw_model} + }; } else DEBUG_MSG("Error decoding protobuf for nodeinfo message!\n"); @@ -331,7 +341,36 @@ String MQTT::downstreamPacketToJson(MeshPacket *mp) if (pb_decode_from_bytes(mp->decoded.payload.bytes, mp->decoded.payload.size, &Position_msg, &scratch)) { decoded = &scratch; msgPayload = Json::object{ - {"latitude_i", decoded->latitude_i}, {"longitude_i", decoded->longitude_i}, {"altitude", decoded->altitude}}; + {"time", (int)decoded->time}, + {"pos_timestamp", (int)decoded->pos_timestamp}, + {"latitude_i", decoded->latitude_i}, + {"longitude_i", decoded->longitude_i}, + {"altitude", decoded->altitude} + }; + } else { + DEBUG_MSG("Error decoding protobuf for position message!\n"); + } + }; + break; + } + + case PortNum_WAYPOINT_APP: { + msgType = "position"; + Waypoint scratch; + Waypoint *decoded = NULL; + if (mp->which_payloadVariant == MeshPacket_decoded_tag) { + memset(&scratch, 0, sizeof(scratch)); + if (pb_decode_from_bytes(mp->decoded.payload.bytes, mp->decoded.payload.size, &Waypoint_msg, &scratch)) { + decoded = &scratch; + msgPayload = Json::object{ + {"id", (int)decoded->id}, + {"name", decoded->name}, + {"description", decoded->description}, + {"expire", (int)decoded->expire}, + {"locked", decoded->locked}, + {"latitude_i", decoded->latitude_i}, + {"longitude_i", decoded->longitude_i}, + }; } else { DEBUG_MSG("Error decoding protobuf for position message!\n"); } @@ -344,14 +383,16 @@ String MQTT::downstreamPacketToJson(MeshPacket *mp) } // assemble the final jsonObj - Json jsonObj = Json::object{{"id", Json((int)mp->id)}, - {"timestamp", Json((int)mp->rx_time)}, - {"to", Json((int)mp->to)}, - {"from", Json((int)mp->from)}, - {"channel", Json((int)mp->channel)}, - {"type", msgType.c_str()}, - {"sender", owner.id}, - {"payload", msgPayload}}; + Json jsonObj = Json::object{ + {"id", Json((int)mp->id)}, + {"timestamp", Json((int)mp->rx_time)}, + {"to", Json((int)mp->to)}, + {"from", Json((int)mp->from)}, + {"channel", Json((int)mp->channel)}, + {"type", msgType.c_str()}, + {"sender", owner.id}, + {"payload", msgPayload} + }; // serialize and return it static std::string jsonStr = jsonObj.dump(); From 70e1a208d544ac1fd202b9d1bbcdf74860ac9773 Mon Sep 17 00:00:00 2001 From: Neil Hao Date: Sat, 3 Sep 2022 08:43:33 +0800 Subject: [PATCH 2/4] 'snow_screen_hotfix' (#1670) --- variants/nano-g1/variant.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/variants/nano-g1/variant.h b/variants/nano-g1/variant.h index 0915013a0..ff0fb4401 100644 --- a/variants/nano-g1/variant.h +++ b/variants/nano-g1/variant.h @@ -28,3 +28,5 @@ // code) #endif +// different screen +#define USE_SH1106 From 8fb8212434faf84113fbad3db27c8d55c9e050a2 Mon Sep 17 00:00:00 2001 From: lewis he Date: Sat, 3 Sep 2022 20:26:49 +0800 Subject: [PATCH 3/4] i2cScan probe adds another ssd1306 subclass new to output logs correctly (#1671) --- src/detect/i2cScan.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/detect/i2cScan.h b/src/detect/i2cScan.h index ca7b40a14..c1c6f8f87 100644 --- a/src/detect/i2cScan.h +++ b/src/detect/i2cScan.h @@ -45,7 +45,7 @@ uint8_t oled_probe(byte addr) if (r == 0x08 || r == 0x00) { o_probe = 2; // SH1106 - } else if ( r == 0x03 || r == 0x06 || r == 0x07) { + } else if ( r == 0x03 || r == 0x04 || r == 0x06 || r == 0x07) { o_probe = 1; // SSD1306 } c++; From 84e438f72f06d39890d3f2ca8a7ad0ac4f2ba180 Mon Sep 17 00:00:00 2001 From: Ben Meadors Date: Sat, 3 Sep 2022 14:06:10 -0500 Subject: [PATCH 4/4] Mqtt json_enabled (#1672) * Payload variants * Waypoints and fixes * Remove json send to mesh. I think protobuf messages already do that * whoops * Added json_enabled mqtt config --- protobufs | 2 +- src/mesh/generated/localonly.pb.h | 2 +- src/mesh/generated/module_config.pb.h | 13 ++++++++----- src/mqtt/MQTT.cpp | 18 ++++++++++-------- 4 files changed, 20 insertions(+), 15 deletions(-) diff --git a/protobufs b/protobufs index d8213ad13..a72983993 160000 --- a/protobufs +++ b/protobufs @@ -1 +1 @@ -Subproject commit d8213ad133c42fb59a052326659e2cbfde3db6d6 +Subproject commit a72983993ccd9c2dabb1ef9e17b2fe79bd94d671 diff --git a/src/mesh/generated/localonly.pb.h b/src/mesh/generated/localonly.pb.h index eac4444da..28c282ff0 100644 --- a/src/mesh/generated/localonly.pb.h +++ b/src/mesh/generated/localonly.pb.h @@ -145,7 +145,7 @@ extern const pb_msgdesc_t LocalModuleConfig_msg; /* Maximum encoded size of messages (where known) */ #define LocalConfig_size 333 -#define LocalModuleConfig_size 268 +#define LocalModuleConfig_size 270 #ifdef __cplusplus } /* extern "C" */ diff --git a/src/mesh/generated/module_config.pb.h b/src/mesh/generated/module_config.pb.h index e7e99b6b3..b79b74ac6 100644 --- a/src/mesh/generated/module_config.pb.h +++ b/src/mesh/generated/module_config.pb.h @@ -76,6 +76,7 @@ typedef struct _ModuleConfig_MQTTConfig { char username[32]; char password[32]; bool encryption_enabled; + bool json_enabled; } ModuleConfig_MQTTConfig; typedef struct _ModuleConfig_RangeTestConfig { @@ -152,7 +153,7 @@ extern "C" { /* Initializer values for message structs */ #define ModuleConfig_init_default {0, {ModuleConfig_MQTTConfig_init_default}} -#define ModuleConfig_MQTTConfig_init_default {0, "", "", "", 0} +#define ModuleConfig_MQTTConfig_init_default {0, "", "", "", 0, 0} #define ModuleConfig_SerialConfig_init_default {0, 0, 0, 0, _ModuleConfig_SerialConfig_Serial_Baud_MIN, 0, _ModuleConfig_SerialConfig_Serial_Mode_MIN} #define ModuleConfig_ExternalNotificationConfig_init_default {0, 0, 0, 0, 0, 0} #define ModuleConfig_StoreForwardConfig_init_default {0, 0, 0, 0, 0} @@ -160,7 +161,7 @@ extern "C" { #define ModuleConfig_TelemetryConfig_init_default {0, 0, 0, 0, 0} #define ModuleConfig_CannedMessageConfig_init_default {0, 0, 0, 0, _ModuleConfig_CannedMessageConfig_InputEventChar_MIN, _ModuleConfig_CannedMessageConfig_InputEventChar_MIN, _ModuleConfig_CannedMessageConfig_InputEventChar_MIN, 0, 0, "", 0} #define ModuleConfig_init_zero {0, {ModuleConfig_MQTTConfig_init_zero}} -#define ModuleConfig_MQTTConfig_init_zero {0, "", "", "", 0} +#define ModuleConfig_MQTTConfig_init_zero {0, "", "", "", 0, 0} #define ModuleConfig_SerialConfig_init_zero {0, 0, 0, 0, _ModuleConfig_SerialConfig_Serial_Baud_MIN, 0, _ModuleConfig_SerialConfig_Serial_Mode_MIN} #define ModuleConfig_ExternalNotificationConfig_init_zero {0, 0, 0, 0, 0, 0} #define ModuleConfig_StoreForwardConfig_init_zero {0, 0, 0, 0, 0} @@ -191,6 +192,7 @@ extern "C" { #define ModuleConfig_MQTTConfig_username_tag 3 #define ModuleConfig_MQTTConfig_password_tag 4 #define ModuleConfig_MQTTConfig_encryption_enabled_tag 5 +#define ModuleConfig_MQTTConfig_json_enabled_tag 6 #define ModuleConfig_RangeTestConfig_enabled_tag 1 #define ModuleConfig_RangeTestConfig_sender_tag 2 #define ModuleConfig_RangeTestConfig_save_tag 3 @@ -243,7 +245,8 @@ X(a, STATIC, SINGULAR, BOOL, enabled, 1) \ X(a, STATIC, SINGULAR, STRING, address, 2) \ X(a, STATIC, SINGULAR, STRING, username, 3) \ X(a, STATIC, SINGULAR, STRING, password, 4) \ -X(a, STATIC, SINGULAR, BOOL, encryption_enabled, 5) +X(a, STATIC, SINGULAR, BOOL, encryption_enabled, 5) \ +X(a, STATIC, SINGULAR, BOOL, json_enabled, 6) #define ModuleConfig_MQTTConfig_CALLBACK NULL #define ModuleConfig_MQTTConfig_DEFAULT NULL @@ -330,12 +333,12 @@ extern const pb_msgdesc_t ModuleConfig_CannedMessageConfig_msg; /* Maximum encoded size of messages (where known) */ #define ModuleConfig_CannedMessageConfig_size 49 #define ModuleConfig_ExternalNotificationConfig_size 20 -#define ModuleConfig_MQTTConfig_size 103 +#define ModuleConfig_MQTTConfig_size 105 #define ModuleConfig_RangeTestConfig_size 10 #define ModuleConfig_SerialConfig_size 26 #define ModuleConfig_StoreForwardConfig_size 22 #define ModuleConfig_TelemetryConfig_size 18 -#define ModuleConfig_size 105 +#define ModuleConfig_size 107 #ifdef __cplusplus } /* extern "C" */ diff --git a/src/mqtt/MQTT.cpp b/src/mqtt/MQTT.cpp index 71fabed66..9e8427b54 100644 --- a/src/mqtt/MQTT.cpp +++ b/src/mqtt/MQTT.cpp @@ -27,7 +27,7 @@ void MQTT::onPublish(char *topic, byte *payload, unsigned int length) { // parsing ServiceEnvelope ServiceEnvelope e = ServiceEnvelope_init_default; - if (!pb_decode_from_bytes(payload, length, ServiceEnvelope_fields, &e)) { + if (moduleConfig.mqtt.json_enabled && !pb_decode_from_bytes(payload, length, ServiceEnvelope_fields, &e)) { // check if this is a json payload message using namespace json11; @@ -238,13 +238,15 @@ void MQTT::onSend(const MeshPacket &mp, ChannelIndex chIndex) pubSub.publish(topic.c_str(), bytes, numBytes, false); - // handle json topic - using namespace json11; - auto jsonString = this->downstreamPacketToJson((MeshPacket *)&mp); - if (jsonString.length() != 0) { - String topicJson = jsonTopic + channelId + "/" + owner.id; - DEBUG_MSG("publish json message to %s, %u bytes: %s\n", topicJson.c_str(), jsonString.length(), jsonString.c_str()); - pubSub.publish(topicJson.c_str(), jsonString.c_str(), false); + if (moduleConfig.mqtt.json_enabled) { + // handle json topic + using namespace json11; + auto jsonString = this->downstreamPacketToJson((MeshPacket *)&mp); + if (jsonString.length() != 0) { + String topicJson = jsonTopic + channelId + "/" + owner.id; + DEBUG_MSG("publish json message to %s, %u bytes: %s\n", topicJson.c_str(), jsonString.length(), jsonString.c_str()); + pubSub.publish(topicJson.c_str(), jsonString.c_str(), false); + } } } }