From 10d93b4fd3b0ea85fbf4ca821128c4429fb35a2c Mon Sep 17 00:00:00 2001 From: SpudGunMan Date: Wed, 15 Oct 2025 20:17:44 -0700 Subject: [PATCH] keyFactor --- etc/meshview.ino | 180 +++++++++++++++++++++++++++++++---------------- 1 file changed, 119 insertions(+), 61 deletions(-) diff --git a/etc/meshview.ino b/etc/meshview.ino index fc15d95..23d0ce0 100644 --- a/etc/meshview.ino +++ b/etc/meshview.ino @@ -7,17 +7,21 @@ #include #include "mesh.pb.h" #include "pb_decode.h" +#include +#include const char* ssid = "YOUR_WIFI_SSID"; const char* password = "YOUR_WIFI_PASSWORD"; const char* MCAST_GRP = "224.0.0.69"; const uint16_t MCAST_PORT = 4403; +const char* PUBKEY = "1PG7OiApB1nwvP+rz05pAQ=="; unsigned long udpPacketCount = 0; WiFiUDP udp; IPAddress multicastIP; + void setup() { Serial.begin(115200); delay(1000); @@ -64,12 +68,36 @@ void setup() { Serial.println("Failed to start UDP multicast listener."); } - } else { - Serial.print("\nFailed to connect to WiFi. SSID: "); - Serial.println(ssid); - Serial.println("Check if the SSID is correct and in range, and verify your password."); - } + } else { + Serial.print("\nFailed to connect to WiFi. SSID: "); + Serial.println(ssid); + Serial.println("Check if the SSID is correct and in range, and verify your password."); + } +} +// Base64 decode helper (returns number of output bytes) +static size_t b64_decode(const char *in, uint8_t *out) { + size_t len = strlen(in); + int val = 0, valb = -8; + size_t o = 0; + for (size_t i = 0; i < len; ++i) { + unsigned char c = in[i]; + int d; + if (c >= 'A' && c <= 'Z') d = c - 'A'; + else if (c >= 'a' && c <= 'z') d = c - 'a' + 26; + else if (c >= '0' && c <= '9') d = c - '0' + 52; + else if (c == '+') d = 62; + else if (c == '/') d = 63; + else if (c == '=') break; + else continue; + val = (val << 6) + d; + valb += 6; + if (valb >= 0) { + out[o++] = (uint8_t)((val >> valb) & 0xFF); + valb -= 8; + } + } + return o; } // Buisness happens here @@ -82,66 +110,96 @@ void loop() { uint8_t buffer[512]; int len = udp.read(buffer, sizeof(buffer)); - if (len > 0) { - meshtastic_MeshPacket packet = meshtastic_MeshPacket_init_zero; - pb_istream_t stream = pb_istream_from_buffer(buffer, len); - // Decode the packet - if (pb_decode(&stream, meshtastic_MeshPacket_fields, &packet)) { - Serial.print("id: "); Serial.println(packet.id); - Serial.print("rx_time: "); Serial.println(packet.rx_time); - Serial.print("rx_snr: "); Serial.println(packet.rx_snr, 2); - Serial.print("hop_limit: "); Serial.println(packet.hop_limit); - Serial.print("priority: "); Serial.println(packet.priority); - Serial.print("rx_rssi: "); Serial.println(packet.rx_rssi); - Serial.print("hop_start: "); Serial.println(packet.hop_start); - Serial.print("delayed: "); Serial.println(packet.delayed); - Serial.print("via_mqtt: "); Serial.println(packet.via_mqtt); - Serial.print("from: "); Serial.println(packet.from); - Serial.print("to: "); Serial.println(packet.to); - Serial.print("channel: "); Serial.println(packet.channel); + if (len <= 0) { + //Serial.println("Failed to read UDP packet."); + delay(100); + return; + } - // Always try to process decoded payload - Serial.println("Attempting to process decoded payload..."); - meshtastic_Data data = packet.decoded; - Serial.print("Data portnum: "); - Serial.print("Data payload size: "); Serial.println(data.payload.size); + meshtastic_MeshPacket packet = meshtastic_MeshPacket_init_zero; + pb_istream_t stream = pb_istream_from_buffer(buffer, len); - if (data.payload.size > 0) { - // Print payload as hex - Serial.print("Data payload (hex): "); - for (size_t i = 0; i < data.payload.size; i++) { - Serial.printf("%02X ", data.payload.bytes[i]); - } - Serial.println(); - Serial.print("Data payload (string): "); - for (size_t i = 0; i < data.payload.size; i++) { - char c = data.payload.bytes[i]; - if (isprint(c)) { - Serial.print(c); - } else { - Serial.print('.'); - } - } - Serial.println(); - Serial.println("No decoded payload. Raw packet as ASCII:"); - for (int i = 0; i < len; i++) { - char c = buffer[i]; - if (isprint(c)) { - Serial.print(c); - } else { - Serial.print('.'); - } - } - Serial.println(); - } else { - Serial.println("Failed to decode Meshtastic_MeshPacket."); + if (!pb_decode(&stream, meshtastic_MeshPacket_fields, &packet)) { + Serial.print("Failed to decode Meshtastic_MeshPacket: "); + Serial.println(PB_GET_ERROR(&stream)); + // print raw packet ASCII + Serial.println("Raw packet as ASCII:"); + for (int i = 0; i < len; i++) { + char c = buffer[i]; + if (isprint((unsigned char)c)) Serial.print(c); + else Serial.print('.'); } + Serial.println(); + delay(100); + return; + } + + // Print header/meta + Serial.print("id: "); Serial.println(packet.id); + Serial.print("rx_time: "); Serial.println(packet.rx_time); + Serial.print("rx_snr: "); Serial.println(packet.rx_snr, 2); + Serial.print("hop_limit: "); Serial.println(packet.hop_limit); + Serial.print("priority: "); Serial.println(packet.priority); + Serial.print("rx_rssi: "); Serial.println(packet.rx_rssi); + Serial.print("hop_start: "); Serial.println(packet.hop_start); + Serial.print("delayed: "); Serial.println(packet.delayed); + Serial.print("via_mqtt: "); Serial.println(packet.via_mqtt); + Serial.print("from: "); Serial.println(packet.from); + Serial.print("to: "); Serial.println(packet.to); + Serial.print("channel: "); Serial.println(packet.channel); + + // Decode PUBKEY base64 and provide to packet.key + uint8_t keybin[64]; + size_t keylen = b64_decode(PUBKEY, keybin); + if (keylen == 0) { + Serial.println("Warning: PUBKEY base64 decode produced 0 bytes; using raw string bytes"); + static uint8_t saved_key_raw[64]; + size_t rawlen = strlen(PUBKEY); + if (rawlen > sizeof(saved_key_raw)) rawlen = sizeof(saved_key_raw); + memcpy(saved_key_raw, PUBKEY, rawlen); + packet.key.bytes = saved_key_raw; + packet.key.size = rawlen; } else { - Serial.println("Failed to read UDP packet."); + static uint8_t saved_key[64]; + if (keylen > sizeof(saved_key)) keylen = sizeof(saved_key); + memcpy(saved_key, keybin, keylen); + packet.key.bytes = saved_key; + packet.key.size = keylen; + } + + // Always attempt to process decoded payload + Serial.println("Attempting to process decoded payload..."); + meshtastic_Data data = packet.decoded; // try to read decoded variant + + Serial.print("Data portnum: "); Serial.println(data.portnum); + Serial.print("Data payload size: "); Serial.println(data.payload.size); + + if (data.payload.size > 0 && data.payload.bytes != NULL) { + // Print payload as hex + Serial.print("Data payload (hex): "); + for (size_t i = 0; i < data.payload.size; i++) { + Serial.printf("%02X ", data.payload.bytes[i]); + } + Serial.println(); + + // Print payload as ASCII with non-printables as '.' + Serial.print("Data payload (string): "); + for (size_t i = 0; i < data.payload.size; i++) { + char c = data.payload.bytes[i]; + if (isprint((unsigned char)c)) Serial.print(c); + else Serial.print('.'); + } + Serial.println(); + } else { + Serial.println("No decoded payload. Raw packet as ASCII:"); + for (int i = 0; i < len; i++) { + char c = buffer[i]; + if (isprint((unsigned char)c)) Serial.print(c); + else Serial.print('.'); + } + Serial.println(); } } + delay(100); // Small delay to avoid overwhelming the serial output - } -} - - +} \ No newline at end of file