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();