mirror of
https://github.com/dz0ny/meshcore-sar.git
synced 2026-08-11 16:30:28 +00:00
feat: Enhance Device Configuration Screen with Device Info and Telemetry Modes
- Added a new section to display device information including Device Type, Max Contacts, Max Channels, Telemetry Modes, and Manual Add Contacts. - Implemented helper methods to convert device types and telemetry modes to user-friendly strings. - Removed Message History Screen and its references from the Home Screen. - Simplified message sending logic in Messages Tab to always send to the public channel. - Introduced a new channel selection feature in the SAR Update Sheet for sending messages. - Updated MeshCore BLE service to handle send confirmation responses and improved message sending protocols.
This commit is contained in:
517
CLAUDE.md
517
CLAUDE.md
@@ -68,72 +68,513 @@ lib/
|
||||
|
||||
### MeshCore Protocol
|
||||
|
||||
The app implements the MeshCore BLE protocol based on https://github.com/meshcore-dev/meshcore.js
|
||||
The app implements the MeshCore BLE Companion Radio protocol based on https://github.com/meshcore-dev/meshcore.js
|
||||
|
||||
**BLE Service**: `6E400001-B5A3-F393-E0A9-E50E24DCCA9E`
|
||||
**RX Characteristic** (write): `6E400002-B5A3-F393-E0A9-E50E24DCCA9E`
|
||||
**TX Characteristic** (notify): `6E400003-B5A3-F393-E0A9-E50E24DCCA9E`
|
||||
|
||||
#### Command Codes (Client → Device)
|
||||
- `4`: Get contacts list
|
||||
- `2`: Send text message
|
||||
- `39`: Request telemetry
|
||||
#### Protocol Overview
|
||||
|
||||
#### Response Codes (Device → Client)
|
||||
- `3`: Contact information
|
||||
- `7`: Message received
|
||||
- `0x8B` (139): Telemetry response (Cayenne LPP format)
|
||||
The companion radio acts as a 'server', responding to requests from the connected app (the 'client').
|
||||
|
||||
#### Binary Protocol Format
|
||||
**Frame Delimiters**:
|
||||
- **BLE**: A frame is a single characteristic value (BLE link layer handles integrity)
|
||||
- **USB**:
|
||||
- Outbound (radio → app): Starts with `>` (0x3E), 2-byte length (LE), then frame data
|
||||
- Inbound (app → radio): Starts with `<` (0x3C), 2-byte length (LE), then frame data
|
||||
|
||||
All protocol messages use little-endian byte order.
|
||||
**NOTE**: All uint32 values use Little Endian byte order!
|
||||
|
||||
**Get Contacts Request**:
|
||||
#### Command Codes (App → Radio)
|
||||
|
||||
| Code | Name | Description |
|
||||
|------|------|-------------|
|
||||
| 1 | CMD_APP_START | First command after connection, returns RESP_CODE_SELF_INFO(5) |
|
||||
| 2 | CMD_SEND_TXT_MSG | Send text message to contact (DM) |
|
||||
| 3 | CMD_SEND_CHANNEL_TXT_MSG | Send flood-mode text message to channel |
|
||||
| 4 | CMD_GET_CONTACTS | Sync contacts list (optional 'since' param) |
|
||||
| 5 | CMD_GET_DEVICE_TIME | Get device clock (epoch secs, UTC) |
|
||||
| 6 | CMD_SET_DEVICE_TIME | Set device clock |
|
||||
| 7 | CMD_SEND_SELF_ADVERT | Send Advertisement packet (optional flood-mode) |
|
||||
| 8 | CMD_SET_ADVERT_NAME | Update node name in advertisements |
|
||||
| 9 | CMD_ADD_UPDATE_CONTACT | Add or modify a contact |
|
||||
| 10 | CMD_SYNC_NEXT_MESSAGE | Get next text message from queue |
|
||||
| 11 | CMD_SET_RADIO_PARAMS | Save new radio parameters |
|
||||
| 12 | CMD_SET_RADIO_TX_POWER | Set radio TX power level |
|
||||
| 13 | CMD_RESET_PATH | Reset out_path for a contact |
|
||||
| 14 | CMD_SET_ADVERT_LATLON | Update lat/lon in advertisements |
|
||||
| 15 | CMD_REMOVE_CONTACT | Remove a contact |
|
||||
| 16 | CMD_SHARE_CONTACT | Share contact via zero-hop advert |
|
||||
| 17 | CMD_EXPORT_CONTACT | Export contact as 'business card' |
|
||||
| 18 | CMD_IMPORT_CONTACT | Import contact from 'business card' |
|
||||
| 19 | CMD_REBOOT | Reboot companion device |
|
||||
| 20 | CMD_GET_BATT_AND_STORAGE | Get battery mV and storage stats |
|
||||
| 21 | CMD_SET_TUNING_PARAMS | Set tuning parameters |
|
||||
| 22 | CMD_DEVICE_QUERY | First command to send, returns RESP_CODE_DEVICE_INFO(13) |
|
||||
| 25 | CMD_SEND_RAW_DATA | Transmit PAYLOAD_TYPE_RAW_CUSTOM packet |
|
||||
| 26 | CMD_SEND_LOGIN | Send login request to repeater/room |
|
||||
| 27 | CMD_SEND_STATUS_REQ | Send status request to repeater/sensor |
|
||||
| 36 | CMD_SEND_TRACE_PATH | Initiate TRACE packet with SNR collection |
|
||||
| 37 | CMD_SET_DEVICE_PIN | Set BLE PIN code |
|
||||
| 38 | CMD_SET_OTHER_PARAMS | Set various other parameters |
|
||||
| 39 | CMD_SEND_TELEMETRY_REQ | Send telemetry request to node |
|
||||
| 40 | CMD_GET_CUSTOM_VARS | Retrieve all custom variables |
|
||||
| 41 | CMD_SET_CUSTOM_VAR | Set single custom variable |
|
||||
| 42 | CMD_GET_ADVERT_PATH | Query last advert path for contact |
|
||||
| 43 | CMD_GET_TUNING_PARAMS | Get airtime-factor and rx-delay settings |
|
||||
| 50 | CMD_SEND_BINARY_REQ | Send binary request to node (preferred over CMD_SEND_TELEMETRY_REQ) |
|
||||
| 51 | CMD_FACTORY_RESET | Erase flash file system |
|
||||
|
||||
#### Response Codes (Radio → App)
|
||||
|
||||
| Code | Name | Description |
|
||||
|------|------|-------------|
|
||||
| 0 | RESP_CODE_OK | Success |
|
||||
| 1 | RESP_CODE_ERR | Error (includes err_code) |
|
||||
| 2 | RESP_CODE_CONTACTS_START | Start of contacts sync sequence |
|
||||
| 3 | RESP_CODE_CONTACT | Single contact information |
|
||||
| 4 | RESP_CODE_END_OF_CONTACTS | End of contacts sync sequence |
|
||||
| 5 | RESP_CODE_SELF_INFO | Node's own information |
|
||||
| 6 | RESP_CODE_SENT | Message sent with expected ACK/TAG |
|
||||
| 7 | RESP_CODE_CONTACT_MSG_RECV | Contact message received |
|
||||
| 8 | RESP_CODE_CHANNEL_MSG_RECV | Channel message received |
|
||||
| 9 | RESP_CODE_CURR_TIME | Current device time |
|
||||
| 10 | RESP_CODE_NO_MORE_MESSAGES | Message queue empty |
|
||||
| 11 | RESP_CODE_EXPORT_CONTACT | Contact export data |
|
||||
| 12 | RESP_CODE_BATT_AND_STORAGE | Battery and storage info |
|
||||
| 13 | RESP_CODE_DEVICE_INFO | Device firmware and hardware info |
|
||||
| 21 | RESP_CODE_CUSTOM_VARS | Custom variables state |
|
||||
| 22 | RESP_CODE_ADVERT_PATH | Last advert path for contact |
|
||||
|
||||
#### Push Notifications (Radio → App, Async)
|
||||
|
||||
| Code | Name | Description |
|
||||
|------|------|-------------|
|
||||
| 0x80 | PUSH_CODE_ADVERT | New advertisement packet received |
|
||||
| 0x81 | PUSH_CODE_PATH_UPDATED | Contact received new path |
|
||||
| 0x82 | PUSH_CODE_SEND_CONFIRMED | Message ACK received |
|
||||
| 0x83 | PUSH_CODE_MSG_WAITING | New text message received |
|
||||
| 0x84 | PUSH_CODE_RAW_DATA | PAYLOAD_TYPE_RAW_CUSTOM received |
|
||||
| 0x85 | PUSH_CODE_LOGIN_SUCCESS | Login response successful |
|
||||
| 0x86 | PUSH_CODE_LOGIN_FAIL | Login response failed |
|
||||
| 0x87 | PUSH_CODE_STATUS_RESPONSE | Status response received |
|
||||
| 0x89 | PUSH_CODE_TRACE_DATA | TRACE packet reached end of path |
|
||||
| 0x8A | PUSH_CODE_NEW_ADVERT | New contact advert (manual_add_contacts=1) |
|
||||
| 0x8B | PUSH_CODE_TELEMETRY_RESPONSE | Telemetry response received |
|
||||
| 0x8C | PUSH_CODE_BINARY_RESPONSE | Binary response received |
|
||||
|
||||
#### Frame Formats
|
||||
|
||||
**CMD_DEVICE_QUERY (22)**:
|
||||
```
|
||||
[0x04] - Command code
|
||||
[0x16] - Command code (22)
|
||||
[1 byte] - App target version (protocol version app understands)
|
||||
```
|
||||
|
||||
**Contact Response**:
|
||||
**RESP_CODE_DEVICE_INFO (13)**:
|
||||
```
|
||||
[0x03] - Response code
|
||||
[0x0D] - Response code (13)
|
||||
[1 byte] - Firmware version
|
||||
[1 byte] - Max contacts ÷ 2 (ver 3+)
|
||||
[1 byte] - Max channels (ver 3+)
|
||||
[4 bytes] - BLE PIN (uint32, ver 3+)
|
||||
[12 bytes] - Firmware build date (ASCII null-terminated, e.g., "19 Feb 2025")
|
||||
[40 bytes] - Manufacturer model (ASCII null-terminated)
|
||||
[20 bytes] - Semantic version (ASCII null-terminated)
|
||||
```
|
||||
|
||||
**CMD_APP_START (1)**:
|
||||
```
|
||||
[0x01] - Command code (1)
|
||||
[1 byte] - App version
|
||||
[6 bytes] - Reserved (zeros)
|
||||
[N bytes] - App name (remainder of frame, varchar)
|
||||
```
|
||||
|
||||
**RESP_CODE_SELF_INFO (5)**:
|
||||
```
|
||||
[0x05] - Response code (5)
|
||||
[1 byte] - Type (ADV_TYPE_*)
|
||||
[1 byte] - TX power in dBm (current)
|
||||
[1 byte] - Max TX power radio supports
|
||||
[32 bytes] - Public key
|
||||
[1 byte] - Contact type (0=none, 1=chat, 2=repeater, 3=room)
|
||||
[64 bytes] - Advertised name (null-terminated string)
|
||||
[4 bytes] - Latitude (int32, divide by 10000 for degrees)
|
||||
[4 bytes] - Longitude (int32, divide by 10000 for degrees)
|
||||
[4 bytes] - Advert latitude * 1E6 (int32)
|
||||
[4 bytes] - Advert longitude * 1E6 (int32)
|
||||
[1 byte] - Multi ACKs (0=no extra, 1=send extra ACK)
|
||||
[1 byte] - Advert location policy (0=don't share, 1=share)
|
||||
[1 byte] - Telemetry modes (bits 0-1: Base mode, bits 2-3: Location mode)
|
||||
Modes: 0=DENY, 1=apply contact.flags, 2=ALLOW ALL
|
||||
[1 byte] - Manual add contacts (0 or 1)
|
||||
[4 bytes] - Radio freq * 1000 (uint32)
|
||||
[4 bytes] - Radio bandwidth (kHz) * 1000 (uint32)
|
||||
[1 byte] - Spreading factor
|
||||
[1 byte] - Coding rate
|
||||
[N bytes] - Name (remainder of frame, varchar)
|
||||
```
|
||||
|
||||
**Message Received**:
|
||||
**CMD_GET_CONTACTS (4)**:
|
||||
```
|
||||
[0x07] - Response code
|
||||
[1 byte] - Message type (0=contact, 1=channel)
|
||||
[4 bytes] - Sender public key prefix
|
||||
[4 bytes] - Recipient public key prefix
|
||||
[2 bytes] - Text length (uint16)
|
||||
[N bytes] - UTF-8 text
|
||||
[0x04] - Command code (4)
|
||||
[4 bytes] - (Optional) Since timestamp (uint32, last contact.lastmod received)
|
||||
```
|
||||
|
||||
**Send Text Message**:
|
||||
**RESP_CODE_CONTACTS_START (2)**:
|
||||
```
|
||||
[0x02] - Command code
|
||||
[32 bytes] - Recipient public key
|
||||
[2 bytes] - Text length (uint16)
|
||||
[N bytes] - UTF-8 text
|
||||
[0x02] - Response code (2)
|
||||
[4 bytes] - Total contact count (uint32)
|
||||
```
|
||||
|
||||
**Request Telemetry**:
|
||||
**RESP_CODE_CONTACT (3)**:
|
||||
```
|
||||
[0x27] (39) - Command code
|
||||
[32 bytes] - Contact public key
|
||||
[0x03] - Response code (3)
|
||||
[32 bytes] - Public key
|
||||
[1 byte] - Type (ADV_TYPE_*)
|
||||
[1 byte] - Flags
|
||||
[1 byte] - Out path length (signed)
|
||||
[64 bytes] - Out path
|
||||
[32 bytes] - Advertised name (null-terminated)
|
||||
[4 bytes] - Last advert timestamp (uint32)
|
||||
[4 bytes] - Advert latitude * 1E6 (int32)
|
||||
[4 bytes] - Advert longitude * 1E6 (int32)
|
||||
[4 bytes] - Last modified timestamp (uint32)
|
||||
```
|
||||
|
||||
**Telemetry Response**:
|
||||
**RESP_CODE_END_OF_CONTACTS (4)**:
|
||||
```
|
||||
[0x8B] (139) - Response code
|
||||
[4 bytes] - Contact public key prefix
|
||||
[N bytes] - Cayenne LPP payload
|
||||
[0x04] - Response code (4)
|
||||
[4 bytes] - Most recent lastmod (uint32, use for next 'since' param)
|
||||
```
|
||||
|
||||
**CMD_SET_DEVICE_TIME (6)**:
|
||||
```
|
||||
[0x06] - Command code (6)
|
||||
[4 bytes] - Epoch seconds (uint32)
|
||||
```
|
||||
|
||||
**RESP_CODE_CURR_TIME (9)**:
|
||||
```
|
||||
[0x09] - Response code (9)
|
||||
[4 bytes] - Epoch seconds (uint32)
|
||||
```
|
||||
|
||||
**CMD_SEND_SELF_ADVERT (7)**:
|
||||
```
|
||||
[0x07] - Command code (7)
|
||||
[1 byte] - (Optional) Type: 1=flood, 0=zero-hop (default)
|
||||
```
|
||||
|
||||
**CMD_SET_ADVERT_NAME (8)**:
|
||||
```
|
||||
[0x08] - Command code (8)
|
||||
[N bytes] - Name (remainder of frame, varchar)
|
||||
```
|
||||
|
||||
**CMD_SET_ADVERT_LATLON (14)**:
|
||||
```
|
||||
[0x0E] - Command code (14)
|
||||
[4 bytes] - Latitude * 1E6 (int32)
|
||||
[4 bytes] - Longitude * 1E6 (int32)
|
||||
[4 bytes] - (Optional) Altitude (int32, future support)
|
||||
```
|
||||
|
||||
**CMD_ADD_UPDATE_CONTACT (9)**:
|
||||
```
|
||||
[0x09] - Command code (9)
|
||||
[32 bytes] - Public key
|
||||
[1 byte] - Type (ADV_TYPE_*)
|
||||
[1 byte] - Flags
|
||||
[1 byte] - Out path length (signed)
|
||||
[64 bytes] - Out path
|
||||
[32 bytes] - Advertised name (null-terminated)
|
||||
[4 bytes] - Last advert timestamp (uint32)
|
||||
[4 bytes] - (Optional) Advert latitude * 1E6 (int32)
|
||||
[4 bytes] - (Optional) Advert longitude * 1E6 (int32)
|
||||
```
|
||||
|
||||
**CMD_REMOVE_CONTACT (15)**:
|
||||
```
|
||||
[0x0F] - Command code (15)
|
||||
[32 bytes] - Public key
|
||||
```
|
||||
|
||||
**CMD_SHARE_CONTACT (16)**:
|
||||
```
|
||||
[0x10] - Command code (16)
|
||||
[32 bytes] - Public key
|
||||
```
|
||||
|
||||
**CMD_EXPORT_CONTACT (17)**:
|
||||
```
|
||||
[0x11] - Command code (17)
|
||||
[32 bytes] - (Optional) Public key (if omitted, export SELF)
|
||||
```
|
||||
|
||||
**RESP_CODE_EXPORT_CONTACT (11)**:
|
||||
```
|
||||
[0x0B] - Response code (11)
|
||||
[N bytes] - Card data (remainder of frame)
|
||||
Format: "meshcore://{hex(card_data)}"
|
||||
```
|
||||
|
||||
**CMD_IMPORT_CONTACT (18)**:
|
||||
```
|
||||
[0x12] - Command code (18)
|
||||
[N bytes] - Card data (remainder of frame)
|
||||
```
|
||||
|
||||
**CMD_RESET_PATH (13)**:
|
||||
```
|
||||
[0x0D] - Command code (13)
|
||||
[32 bytes] - Public key
|
||||
```
|
||||
|
||||
**CMD_SEND_TXT_MSG (2)**:
|
||||
```
|
||||
[0x02] - Command code (2)
|
||||
[1 byte] - Text type (TXT_TYPE_*, 0=plain)
|
||||
[1 byte] - Attempt (0-3, attempt number)
|
||||
[4 bytes] - Sender timestamp (uint32)
|
||||
[6 bytes] - Recipient public key prefix (first 6 bytes)
|
||||
[N bytes] - Text (remainder of frame, varchar, max 160 bytes)
|
||||
```
|
||||
|
||||
**CMD_SEND_CHANNEL_TXT_MSG (3)**:
|
||||
```
|
||||
[0x03] - Command code (3)
|
||||
[1 byte] - Text type (TXT_TYPE_*, 0=plain)
|
||||
[1 byte] - Channel index (reserved, 0 for 'public')
|
||||
[4 bytes] - Sender timestamp (uint32)
|
||||
[N bytes] - Text (remainder of frame, max 160 - len(advert_name) - 2)
|
||||
```
|
||||
|
||||
**RESP_CODE_SENT (6)**:
|
||||
```
|
||||
[0x06] - Response code (6)
|
||||
[1 byte] - Send type: 1=flood, 0=direct
|
||||
[4 bytes] - Expected ACK code or TAG
|
||||
[4 bytes] - Suggested timeout (uint32, milliseconds)
|
||||
```
|
||||
|
||||
**PUSH_CODE_SEND_CONFIRMED (0x82)**:
|
||||
```
|
||||
[0x82] - Push code
|
||||
[4 bytes] - ACK code
|
||||
[4 bytes] - Round trip time (uint32, milliseconds)
|
||||
```
|
||||
|
||||
**RESP_CODE_CONTACT_MSG_RECV (7)**:
|
||||
```
|
||||
[0x07] - Response code (7)
|
||||
[6 bytes] - Sender public key prefix (first 6 bytes)
|
||||
[1 byte] - Path length (0xFF if direct, else hop count for flood-mode)
|
||||
[1 byte] - Text type (TXT_TYPE_*, 0=plain)
|
||||
[4 bytes] - Sender timestamp (uint32)
|
||||
[N bytes] - Text (remainder of frame, varchar)
|
||||
```
|
||||
|
||||
**RESP_CODE_CHANNEL_MSG_RECV (8)**:
|
||||
```
|
||||
[0x08] - Response code (8)
|
||||
[1 byte] - Channel index (reserved, 0 for 'public')
|
||||
[1 byte] - Path length (0xFF if direct, else hop count for flood-mode)
|
||||
[1 byte] - Text type (TXT_TYPE_*, 0=plain)
|
||||
[4 bytes] - Sender timestamp (uint32)
|
||||
[N bytes] - Text (remainder of frame, varchar)
|
||||
```
|
||||
|
||||
**CMD_SET_RADIO_PARAMS (11)**:
|
||||
```
|
||||
[0x0B] - Command code (11)
|
||||
[4 bytes] - Radio freq * 1000 (uint32)
|
||||
[4 bytes] - Radio bandwidth (kHz) * 1000 (uint32)
|
||||
[1 byte] - Spreading factor
|
||||
[1 byte] - Coding rate
|
||||
```
|
||||
|
||||
**CMD_SET_RADIO_TX_POWER (12)**:
|
||||
```
|
||||
[0x0C] - Command code (12)
|
||||
[1 byte] - TX power in dBm
|
||||
```
|
||||
|
||||
**CMD_SET_TUNING_PARAMS (21) / RESP_CODE_TUNING_PARAMS**:
|
||||
```
|
||||
[0x15] - Command/Response code (21)
|
||||
[4 bytes] - RX delay base * 1000 (uint32)
|
||||
[4 bytes] - Airtime factor * 1000 (uint32)
|
||||
[8 bytes] - Reserved (set to zero)
|
||||
```
|
||||
|
||||
**CMD_SET_OTHER_PARAMS (38)**:
|
||||
```
|
||||
[0x26] - Command code (38)
|
||||
[1 byte] - Manual add contacts (0 or 1)
|
||||
[1 byte] - (Optional v5+) Telemetry modes
|
||||
[1 byte] - (Optional v5+) Advert location policy
|
||||
[1 byte] - (Optional v7+) Multi ACKs (0=no extra, 1=send extra)
|
||||
```
|
||||
|
||||
**RESP_CODE_BATT_AND_STORAGE (12)**:
|
||||
```
|
||||
[0x0C] - Response code (12)
|
||||
[2 bytes] - Millivolts (uint16)
|
||||
[4 bytes] - (Optional) Used KB (uint32)
|
||||
[4 bytes] - (Optional) Total KB (uint32, zero if unknown)
|
||||
```
|
||||
|
||||
**CMD_SEND_RAW_DATA (25)**:
|
||||
```
|
||||
[0x19] - Command code (25)
|
||||
[1 byte] - Path length
|
||||
[N bytes] - Path (variable length)
|
||||
[M bytes] - Payload (remainder of frame)
|
||||
```
|
||||
|
||||
**PUSH_CODE_RAW_DATA (0x84)**:
|
||||
```
|
||||
[0x84] - Push code
|
||||
[1 byte] - SNR * 4 (signed)
|
||||
[1 byte] - RSSI (signed)
|
||||
[1 byte] - Reserved (0xFF)
|
||||
[N bytes] - Payload (remainder of frame)
|
||||
```
|
||||
|
||||
**CMD_SEND_LOGIN (26)**:
|
||||
```
|
||||
[0x1A] - Command code (26)
|
||||
[32 bytes] - Public key (repeater or room server)
|
||||
[N bytes] - Password (remainder of frame, varchar, max 15 bytes)
|
||||
```
|
||||
|
||||
**PUSH_CODE_LOGIN_SUCCESS (0x85)**:
|
||||
```
|
||||
[0x85] - Push code
|
||||
[1 byte] - Permissions (lowest bit=is_admin)
|
||||
[6 bytes] - Public key prefix (first 6 bytes)
|
||||
[4 bytes] - Tag (int32)
|
||||
[1 byte] - (V7+) New permissions
|
||||
```
|
||||
|
||||
**CMD_SEND_STATUS_REQ (27)**:
|
||||
```
|
||||
[0x1B] - Command code (27)
|
||||
[32 bytes] - Public key (repeater or sensor)
|
||||
```
|
||||
|
||||
**PUSH_CODE_STATUS_RESPONSE (0x87)**:
|
||||
```
|
||||
[0x87] - Push code
|
||||
[1 byte] - Reserved (zero)
|
||||
[6 bytes] - Public key prefix (first 6 bytes)
|
||||
[N bytes] - Status data (remainder of frame)
|
||||
```
|
||||
|
||||
**CMD_SEND_TELEMETRY_REQ (39)**:
|
||||
```
|
||||
[0x27] - Command code (39)
|
||||
[3 bytes] - Reserved (zeros)
|
||||
[32 bytes] - Public key (destination node)
|
||||
```
|
||||
|
||||
**PUSH_CODE_TELEMETRY_RESPONSE (0x8B)**:
|
||||
```
|
||||
[0x8B] - Push code
|
||||
[1 byte] - Reserved (zero)
|
||||
[6 bytes] - Public key prefix (first 6 bytes)
|
||||
[N bytes] - LPP sensor data (Cayenne LPP format, remainder of frame)
|
||||
```
|
||||
|
||||
**CMD_SEND_BINARY_REQ (50)** *(Preferred over CMD_SEND_TELEMETRY_REQ)*:
|
||||
```
|
||||
[0x32] - Command code (50)
|
||||
[32 bytes] - Public key (contact to send request to)
|
||||
[N bytes] - Request code and params (remainder of frame)
|
||||
```
|
||||
|
||||
**PUSH_CODE_BINARY_RESPONSE (0x8C)**:
|
||||
```
|
||||
[0x8C] - Push code
|
||||
[1 byte] - Reserved (zero)
|
||||
[4 bytes] - Tag (uint32, matches RESP_CODE_SENT expected_ack_or_tag)
|
||||
[N bytes] - Response data (remainder of frame)
|
||||
```
|
||||
|
||||
**CMD_SEND_TRACE_PATH (36)**:
|
||||
```
|
||||
[0x24] - Command code (36)
|
||||
[4 bytes] - Tag (int32, random initiator tag)
|
||||
[4 bytes] - Auth code (int32, optional authentication)
|
||||
[1 byte] - Flags (zero for now)
|
||||
[N bytes] - Path (remainder of frame, hashes for TRACE to follow)
|
||||
```
|
||||
|
||||
**PUSH_CODE_TRACE_DATA (0x89)**:
|
||||
```
|
||||
[0x89] - Push code
|
||||
[1 byte] - Reserved (zero)
|
||||
[1 byte] - Path length
|
||||
[1 byte] - Flags (zero for now)
|
||||
[4 bytes] - Tag (int32)
|
||||
[4 bytes] - Auth code (int32)
|
||||
[N bytes] - Path hashes (variable length)
|
||||
[N+1 bytes] - Path SNRs (last byte = SNR for last hop, each byte = SNR * 4)
|
||||
```
|
||||
|
||||
**CMD_SET_DEVICE_PIN (37)**:
|
||||
```
|
||||
[0x25] - Command code (37)
|
||||
[4 bytes] - BLE PIN (uint32)
|
||||
```
|
||||
|
||||
**CMD_GET_ADVERT_PATH (42)**:
|
||||
```
|
||||
[0x2A] - Command code (42)
|
||||
[1 byte] - Reserved (zero)
|
||||
[32 bytes] - Public key (contact being queried)
|
||||
```
|
||||
|
||||
**RESP_CODE_ADVERT_PATH (22)**:
|
||||
```
|
||||
[0x16] - Response code (22)
|
||||
[4 bytes] - Receive timestamp (uint32, by local clock)
|
||||
[1 byte] - Path length
|
||||
[N bytes] - Path (variable length)
|
||||
```
|
||||
|
||||
**CMD_FACTORY_RESET (51)**:
|
||||
```
|
||||
[0x33] - Command code (51)
|
||||
[5 bytes] - ASCII "reset" (confirmation)
|
||||
```
|
||||
|
||||
**RESP_CODE_ERR (1)**:
|
||||
```
|
||||
[0x01] - Response code (1)
|
||||
[1 byte] - Error code (ERR_CODE_*)
|
||||
```
|
||||
|
||||
#### Constants
|
||||
|
||||
**ADV_TYPE (Advertisement/Contact Type)**:
|
||||
- `0` - ADV_TYPE_NONE (unknown/invalid)
|
||||
- `1` - ADV_TYPE_CHAT (team member, shown on map)
|
||||
- `2` - ADV_TYPE_REPEATER (network repeater node)
|
||||
- `3` - ADV_TYPE_ROOM (communication channel/room)
|
||||
|
||||
**TXT_TYPE (Text Message Type)**:
|
||||
- `0` - TXT_TYPE_PLAIN (plain text message)
|
||||
- `1` - TXT_TYPE_CLI_DATA (CLI command)
|
||||
- `2` - TXT_TYPE_SIGNED_PLAIN (plain text, signed by sender)
|
||||
|
||||
**ERR_CODE (Error Codes)**:
|
||||
- `1` - ERR_CODE_UNSUPPORTED_CMD
|
||||
- `2` - ERR_CODE_NOT_FOUND
|
||||
- `3` - ERR_CODE_TABLE_FULL
|
||||
- `4` - ERR_CODE_BAD_STATE
|
||||
- `5` - ERR_CODE_FILE_IO_ERROR
|
||||
- `6` - ERR_CODE_ILLEGAL_ARG
|
||||
|
||||
### Cayenne LPP Format
|
||||
|
||||
Telemetry data uses Cayenne Low Power Payload format:
|
||||
|
||||
Reference in New Issue
Block a user