mirror of
https://github.com/meshtastic/firmware.git
synced 2025-04-26 09:59:01 +00:00
MQTT Json Payload variants (#1667)
* Payload variants * Waypoints and fixes * Remove json send to mesh. I think protobuf messages already do that * whoops
This commit is contained in:
parent
221843e176
commit
9d3cac7cdb
@ -44,17 +44,18 @@ void MQTT::onPublish(char *topic, byte *payload, unsigned int length)
|
|||||||
if (json["sender"].string_value().compare(owner.id) != 0) {
|
if (json["sender"].string_value().compare(owner.id) != 0) {
|
||||||
std::string jsonPayloadStr = json["payload"].dump();
|
std::string jsonPayloadStr = json["payload"].dump();
|
||||||
DEBUG_MSG("Received json payload %s, length %u\n", jsonPayloadStr.c_str(), jsonPayloadStr.length());
|
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
|
// construct protobuf data packet using TEXT_MESSAGE, send it to the mesh
|
||||||
MeshPacket *p = router->allocForSending();
|
// MeshPacket *p = router->allocForSending();
|
||||||
p->decoded.portnum = PortNum_TEXT_MESSAGE_APP;
|
// p->decoded.portnum = PortNum_TEXT_MESSAGE_APP;
|
||||||
if (jsonPayloadStr.length() <= sizeof(p->decoded.payload.bytes)) {
|
// if (jsonPayloadStr.length() <= sizeof(p->decoded.payload.bytes)) {
|
||||||
memcpy(p->decoded.payload.bytes, jsonPayloadStr.c_str(), jsonPayloadStr.length());
|
// memcpy(p->decoded.payload.bytes, jsonPayloadStr.c_str(), jsonPayloadStr.length());
|
||||||
p->decoded.payload.size = jsonPayloadStr.length();
|
// p->decoded.payload.size = jsonPayloadStr.length();
|
||||||
MeshPacket *packet = packetPool.allocCopy(*p);
|
// MeshPacket *packet = packetPool.allocCopy(*p);
|
||||||
service.sendToMesh(packet, RX_SRC_LOCAL);
|
// service.sendToMesh(packet, RX_SRC_LOCAL);
|
||||||
} else {
|
// } else {
|
||||||
DEBUG_MSG("Received MQTT json payload too long, dropping\n");
|
// DEBUG_MSG("Received MQTT json payload too long, dropping\n");
|
||||||
}
|
// }
|
||||||
} else {
|
} else {
|
||||||
DEBUG_MSG("Ignoring downlink message we originally sent.\n");
|
DEBUG_MSG("Ignoring downlink message we originally sent.\n");
|
||||||
}
|
}
|
||||||
@ -289,7 +290,14 @@ String MQTT::downstreamPacketToJson(MeshPacket *mp)
|
|||||||
memset(&scratch, 0, sizeof(scratch));
|
memset(&scratch, 0, sizeof(scratch));
|
||||||
if (pb_decode_from_bytes(mp->decoded.payload.bytes, mp->decoded.payload.size, &Telemetry_msg, &scratch)) {
|
if (pb_decode_from_bytes(mp->decoded.payload.bytes, mp->decoded.payload.size, &Telemetry_msg, &scratch)) {
|
||||||
decoded = &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{
|
msgPayload = Json::object{
|
||||||
{"temperature", decoded->variant.environment_metrics.temperature},
|
{"temperature", decoded->variant.environment_metrics.temperature},
|
||||||
{"relative_humidity", decoded->variant.environment_metrics.relative_humidity},
|
{"relative_humidity", decoded->variant.environment_metrics.relative_humidity},
|
||||||
@ -312,10 +320,12 @@ String MQTT::downstreamPacketToJson(MeshPacket *mp)
|
|||||||
memset(&scratch, 0, sizeof(scratch));
|
memset(&scratch, 0, sizeof(scratch));
|
||||||
if (pb_decode_from_bytes(mp->decoded.payload.bytes, mp->decoded.payload.size, &User_msg, &scratch)) {
|
if (pb_decode_from_bytes(mp->decoded.payload.bytes, mp->decoded.payload.size, &User_msg, &scratch)) {
|
||||||
decoded = &scratch;
|
decoded = &scratch;
|
||||||
msgPayload = Json::object{{"id", decoded->id},
|
msgPayload = Json::object{
|
||||||
|
{"id", decoded->id},
|
||||||
{"longname", decoded->long_name},
|
{"longname", decoded->long_name},
|
||||||
{"shortname", decoded->short_name},
|
{"shortname", decoded->short_name},
|
||||||
{"hardware", decoded->hw_model}};
|
{"hardware", decoded->hw_model}
|
||||||
|
};
|
||||||
|
|
||||||
} else
|
} else
|
||||||
DEBUG_MSG("Error decoding protobuf for nodeinfo message!\n");
|
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)) {
|
if (pb_decode_from_bytes(mp->decoded.payload.bytes, mp->decoded.payload.size, &Position_msg, &scratch)) {
|
||||||
decoded = &scratch;
|
decoded = &scratch;
|
||||||
msgPayload = Json::object{
|
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 {
|
} else {
|
||||||
DEBUG_MSG("Error decoding protobuf for position message!\n");
|
DEBUG_MSG("Error decoding protobuf for position message!\n");
|
||||||
}
|
}
|
||||||
@ -344,14 +383,16 @@ String MQTT::downstreamPacketToJson(MeshPacket *mp)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// assemble the final jsonObj
|
// assemble the final jsonObj
|
||||||
Json jsonObj = Json::object{{"id", Json((int)mp->id)},
|
Json jsonObj = Json::object{
|
||||||
|
{"id", Json((int)mp->id)},
|
||||||
{"timestamp", Json((int)mp->rx_time)},
|
{"timestamp", Json((int)mp->rx_time)},
|
||||||
{"to", Json((int)mp->to)},
|
{"to", Json((int)mp->to)},
|
||||||
{"from", Json((int)mp->from)},
|
{"from", Json((int)mp->from)},
|
||||||
{"channel", Json((int)mp->channel)},
|
{"channel", Json((int)mp->channel)},
|
||||||
{"type", msgType.c_str()},
|
{"type", msgType.c_str()},
|
||||||
{"sender", owner.id},
|
{"sender", owner.id},
|
||||||
{"payload", msgPayload}};
|
{"payload", msgPayload}
|
||||||
|
};
|
||||||
|
|
||||||
// serialize and return it
|
// serialize and return it
|
||||||
static std::string jsonStr = jsonObj.dump();
|
static std::string jsonStr = jsonObj.dump();
|
||||||
|
Loading…
Reference in New Issue
Block a user