keyFactor

This commit is contained in:
SpudGunMan
2025-10-15 20:17:44 -07:00
parent 19dedef1e6
commit 10d93b4fd3
+119 -61
View File
@@ -7,17 +7,21 @@
#include <WiFiUdp.h>
#include "mesh.pb.h"
#include "pb_decode.h"
#include <ctype.h>
#include <string.h>
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
}
}
}