/* Compile: raspberry@raspberrypi:~/LoRaHAM $ g++ -o rx_868_433 rx_868_433.cpp -I/home/raspberry/RadioLib/src -I/home/raspberry/RadioLib/src/modules -I/home/raspberry/RadioLib/src/protocols/PhysicalLayer /home/raspberry/RadioLib/libradiolib.a -llgpio */ /* Meshtastic unencrypted: [868] 27 Bytes HEX: FF FF FF FF 80 98 F1 AC 8C 9D B3 12 E7 0A 00 80 08 01 12 05 48 61 6C 6C 6F 48 00 [868 RX] 27 Bytes: ....................HalloH. [868] 35 Bytes HEX: FF FF FF FF 80 98 F1 AC 93 9D B3 12 E7 0A 00 80 08 01 12 0D 54 65 73 74 6E 61 63 68 72 69 63 68 74 48 00 Broadcast-----------^^ ^^ ^^ ^^ Node-ID (ac f1 98 80) ----------^^ ^^ ^^ ^^ unique packet ID for this packet -----------^^ ^^ ^^ ^^ Packet Header Flags E7= 1110 0111 ----------------------^^ 0A: Channel hash. hint for decryption for the receiver-----^^ 00: Next-hop used for relaying -------------------------------^^ 80: Relay node of the current transmission ----------------------^^ Actual packet data. ------------------------------------------------^^ 48 00: Maybe end delimiter H. ----------------------------------------------------------------^^ ^^ [433] 74 Bytes HEX: FF FF FF FF A0 9C 34 DB DB 8F 34 73 E7 08 00 A0 08 04 12 34 0A 09 21 64 62 33 34 39 63 61 30 12 13 4C 6F 52 61 48 41 4D 74 61 73 74 69 63 20 39 63 61 30 20 1A 04 4C 48 61 30 22 06 10 51 DB 34 9C A0 28 10 30 01 48 00 48 00 [433] 74 Bytes : ......4...4s.......4..!db349ca0..LoRaHAMtastic 9ca0 ..LHa0"..Q.4..(.0.H.H. [433] 73 Bytes HEX: FF FF FF FF CC 9C 34 DB FD 8D B0 8E E7 0A 00 CC 08 04 12 33 0A 09 21 64 62 33 34 39 63 63 63 12 13 44 43 32 57 41 20 4C 6F 52 61 48 41 4D 74 61 73 74 69 63 1A 03 32 57 41 22 06 10 51 DB 34 9C CC 28 10 30 01 48 00 48 00 [433] 73 Bytes : ......4............3..!db349ccc..DC2WA LoRaHAMtastic..2WA"..Q.4..(.0.H.H. */ #include "hal/RPi/PiHal.h" #include #include #include // für usleep // === Setup für 433 MHz === PiHal* hal_433 = new PiHal(0); // SPI0 Module mod_433 = Module(hal_433, RADIOLIB_NC, 25, 5, 24); SX1276 radio_433 = SX1276(&mod_433); // === Setup für 868 MHz === PiHal* hal_868 = new PiHal(1); // SPI1 Module mod_868 = Module(hal_868, RADIOLIB_NC, 16, 6, 12); SX1276 radio_868 = SX1276(&mod_868); uint8_t buffer[256]; void delay(unsigned int ms) { usleep(ms * 1000); } int main() { printf("[Init] Starte Dualband LoRa Receiver (433 + 868)\n"); int h = lgGpiochipOpen(0); if (h < 0) { printf("[GPIO] Fehler: gpiochip0 konnte nicht geöffnet werden!\n"); return -1; } // === Init 433 MHz === if (radio_433.begin() == RADIOLIB_ERR_NONE) { printf("[433] SX1276 init OK\n"); } else { printf("[433] Init FEHLGESCHLAGEN\n"); } // LoRa-APRS: radio_433.setFrequency(433.775); radio_433.setSpreadingFactor(12); radio_433.setBandwidth(125.0); radio_433.setSyncWord(0x12); radio_433.setPreambleLength(8); radio_433.setCodingRate(5); radio_433.setCRC(true); radio_433.autoLDRO(); radio_433.setOutputPower(1); // LoRa DX Cluster: radio_433.setFrequency(433.900); radio_433.setSpreadingFactor(10); radio_433.setBandwidth(125.0); radio_433.setSyncWord(0x12); radio_433.setPreambleLength(8); radio_433.setCodingRate(5); radio_433.setCRC(true); radio_433.autoLDRO(); radio_433.setOutputPower(10); // Meshtastic: radio_433.setFrequency(434.100); radio_433.setSpreadingFactor(11); radio_433.setBandwidth(250.0); radio_433.setSyncWord(0x2B); radio_433.setPreambleLength(16); radio_433.setCodingRate(5); radio_433.setCRC(true); radio_433.autoLDRO(); radio_433.setOutputPower(10); // Meshcom: /* radio_433.setFrequency(433.175); radio_433.setSpreadingFactor(11); radio_433.setBandwidth(250.0); radio_433.setSyncWord(0x2B); radio_433.setPreambleLength(8); radio_433.setCodingRate(6); radio_433.setCRC(true); radio_433.autoLDRO(); radio_433.setOutputPower(10); /* */ // === Init 868 MHz === if (radio_868.begin() == RADIOLIB_ERR_NONE) { printf("[868] SX1276 init OK\n"); } else { printf("[868] Init FEHLGESCHLAGEN\n"); } radio_868.setFrequency(869.525); radio_868.setSpreadingFactor(11); radio_868.setBandwidth(250.0); radio_868.setSyncWord(0x2B); radio_868.setPreambleLength(16); radio_868.setCodingRate(5); radio_868.setCRC(true); radio_868.autoLDRO(); radio_868.setOutputPower(10); // === Haupt-Loop === while (true) { // --- 433 MHz --- int state_433 = radio_433.receive(buffer, sizeof(buffer)); if (state_433 == RADIOLIB_ERR_NONE) { int len = radio_433.getPacketLength(); uint32_t toNode = buffer[0] | (buffer[1] << 8) | (buffer[2] << 16) | (buffer[3] << 24); uint32_t fromNode = buffer[4] | (buffer[5] << 8) | (buffer[6] << 16) | (buffer[7] << 24); uint32_t uniqueID = buffer[8] | (buffer[9] << 8) | (buffer[10] << 16) | (buffer[11] << 24); uint8_t hdrFlags = buffer[12]; uint8_t chHash = buffer[13]; uint8_t nextHop = buffer[14]; uint8_t rlyNodes = buffer[15]; // printf("[\e[93m433\e[0m] %d Bytes HEX from Node ", len); // printf("%08X:", fromNode); // %08X für Hex mit führenden Nullen // printf("\e[93m%08X\e[0m:", fromNode); // %08X für Hex mit führenden Nullen // printf("\n"); printf("[\e[93m433\e[0m] %d Bytes HEX from Node ", len); // printf("%08X:", fromNode); // %08X für Hex mit führenden Nullen printf("\e[93m%08X\e[0m to ", fromNode); // %08X für Hex mit führenden Nullen printf("\e[93m%08X\e[0m ID:", toNode); // %08X für Hex mit führenden Nullen printf("\e[93m%08X\e[0m", uniqueID); // %08X für Hex mit führenden Nullen printf(" Flag:\e[93m%02X\e[0m", hdrFlags); // %08X für Hex mit führenden Nullen printf(" Hash:\e[93m%02X\e[0m", chHash); // %08X für Hex mit führenden Nullen printf(" Hop:\e[93m%02X\e[0m", nextHop); // %08X für Hex mit führenden Nullen printf(" Node:\e[93m%02X\e[0m", rlyNodes); // %08X für Hex mit führenden Nullen printf("\n"); for (size_t i = 0; i < len; i++) { printf("%02X ", buffer[i]); } printf("\n"); printf("[\e[93m433\e[0m] %d Bytes : ", len); for (int i = 0; i < len; i++) { if (buffer[i] >= 32 && buffer[i] <= 126) printf("%c", buffer[i]); else printf("."); } printf(" RSSI: %.2f dBm\n", radio_433.getRSSI()); } // --- 868 MHz --- int state_868 = radio_868.receive(buffer, sizeof(buffer)); if (state_868 == RADIOLIB_ERR_NONE) { int len = radio_868.getPacketLength(); uint32_t toNode = buffer[0] | (buffer[1] << 8) | (buffer[2] << 16) | (buffer[3] << 24); uint32_t fromNode = buffer[4] | (buffer[5] << 8) | (buffer[6] << 16) | (buffer[7] << 24); uint32_t uniqueID = buffer[8] | (buffer[9] << 8) | (buffer[10] << 16) | (buffer[11] << 24); uint8_t hdrFlags = buffer[12]; uint8_t chHash = buffer[13]; uint8_t nextHop = buffer[14]; uint8_t rlyNodes = buffer[15]; printf("[\e[32m868\e[0m] %d Bytes HEX from Node ", len); // printf("%08X:", fromNode); // %08X für Hex mit führenden Nullen printf("\e[32m%08X\e[0m to ", fromNode); // %08X für Hex mit führenden Nullen printf("\e[32m%08X\e[0m ID:", toNode); // %08X für Hex mit führenden Nullen printf("\e[32m%08X\e[0m", uniqueID); // %08X für Hex mit führenden Nullen printf(" Flag:\e[32m%02X\e[0m", hdrFlags); // %08X für Hex mit führenden Nullen printf(" Hash:\e[32m%02X\e[0m", chHash); // %08X für Hex mit führenden Nullen printf(" Hop:\e[32m%02X\e[0m", nextHop); // %08X für Hex mit führenden Nullen printf(" Node:\e[32m%02X\e[0m", rlyNodes); // %08X für Hex mit führenden Nullen printf("\n"); for (size_t i = 0; i < len; i++) { printf("%02X ", buffer[i]); } printf("\n"); printf("[\e[32m868\e[0m] %d Bytes : ", len); for (int i = 0; i < len; i++) { if (buffer[i] >= 32 && buffer[i] <= 126) printf("%c", buffer[i]); else printf("."); } printf(" RSSI: %.2f dBm\n", radio_868.getRSSI()); } } lgGpiochipClose(h); return 0; }