|
|
@@ -0,0 +1,176 @@
|
|
|
+# Meshcore payloads
|
|
|
+Inside of each [meshcore packet](./packet_structure.md) is a payload, identified by the payload type in the packet header. The types of payloads are:
|
|
|
+
|
|
|
+* Request (destination/source hashes + MAC).
|
|
|
+* Response to REQ or ANON_REQ.
|
|
|
+* Plain text message.
|
|
|
+* Acknowledgment.
|
|
|
+* Node advertisement.
|
|
|
+* Group text message (unverified).
|
|
|
+* Group datagram (unverified).
|
|
|
+* Anonymous request.
|
|
|
+* Returned path.
|
|
|
+* Custom packet (raw bytes, custom encryption).
|
|
|
+
|
|
|
+This document defines the structure of each of these payload types
|
|
|
+
|
|
|
+# Node advertisement
|
|
|
+This kind of payload notifies receivers that a node exists, and gives information about the node
|
|
|
+
|
|
|
+| Field | Size (bytes) | Description |
|
|
|
+|---------------|-----------------|----------------------------------------------------------|
|
|
|
+| public key | 32 | Ed25519 public key |
|
|
|
+| timestamp | 4 | unix timestamp of advertisement |
|
|
|
+| signature | 64 | Ed25519 signature of public key, timestamp, and app data |
|
|
|
+| appdata | rest of payload | optional, see below |
|
|
|
+
|
|
|
+Appdata
|
|
|
+
|
|
|
+| Field | Size (bytes) | Description |
|
|
|
+|---------------|-----------------|-------------------------------------------------------|
|
|
|
+| flags | 1 | specifies which of the fields are present, see below |
|
|
|
+| latitude | 4 | decimal latitude multiplied by 1000000, integer |
|
|
|
+| longitude | 4 | decimal longitude multiplied by 1000000, integer |
|
|
|
+| feature 1 | 2 | reserved for future use |
|
|
|
+| feature 2 | 2 | reserved for future use |
|
|
|
+| name | rest of appdata | name of the node |
|
|
|
+
|
|
|
+Appdata Flags
|
|
|
+
|
|
|
+| Value | Name | Description |
|
|
|
+|--------|-----------|---------------------------------------|
|
|
|
+| `0x10` | location | appdata contains lat/long information |
|
|
|
+| `0x20` | feature 1 | Reserved for future use. |
|
|
|
+| `0x40` | feature 2 | Reserved for future use. |
|
|
|
+| `0x80` | name | appdata contains a node name |
|
|
|
+
|
|
|
+# Acknowledgement
|
|
|
+| Field | Size (bytes) | Description |
|
|
|
+|----------|--------------|------------------------------------------------------------|
|
|
|
+| checksum | 4 | CRC checksum of message timestamp, text, and sender pubkey |
|
|
|
+
|
|
|
+
|
|
|
+# Returned path, request, response, and plain text message
|
|
|
+| Field | Size (bytes) | Description |
|
|
|
+|------------------|-----------------|------------------------------------------------------|
|
|
|
+| destination hash | 1 | first byte of destination node public key |
|
|
|
+| source hash | 1 | first byte of source node public key |
|
|
|
+| cipher MAC | 2 | MAC for encrypted data in next field |
|
|
|
+| ciphertext | rest of payload | encrypted message, see subsections below for details |
|
|
|
+
|
|
|
+## Returned path
|
|
|
+
|
|
|
+| Field | Size (bytes) | Description |
|
|
|
+|-------------|--------------|----------------------------------------------------------------------------------------------|
|
|
|
+| path length | 1 | length of next field |
|
|
|
+| path | see above | a list of node hashes (one byte each) describing the route from us to the packet author |
|
|
|
+| extra type | 1 | extra, bundled payload type, eg., acknowledgement or response. See packet structure spec |
|
|
|
+| extra | rest of data | extra, bundled payload content, follows same format as main content defined by this document |
|
|
|
+
|
|
|
+## Request
|
|
|
+
|
|
|
+| Field | Size (bytes) | Description |
|
|
|
+|--------------|-----------------|----------------------------|
|
|
|
+| timestamp | 4 | send time (unix timestamp) |
|
|
|
+| request type | 1 | see below |
|
|
|
+| request data | rest of payload | depends on request type |
|
|
|
+
|
|
|
+Request type
|
|
|
+
|
|
|
+| Value | Name | Description |
|
|
|
+|--------|--------------------|---------------------------------------|
|
|
|
+| `0x01` | get status | get status of repeater or room server |
|
|
|
+| `0x02` | keepalive | TODO |
|
|
|
+| `0x03` | get telemetry data | TODO |
|
|
|
+
|
|
|
+### Get status
|
|
|
+
|
|
|
+Gets information about the node, possibly including the following:
|
|
|
+
|
|
|
+* Battery level (millivolts)
|
|
|
+* Current transmit queue length
|
|
|
+* Current free queue length
|
|
|
+* Last RSSI value
|
|
|
+* Number of received packets
|
|
|
+* Number of sent packets
|
|
|
+* Total airtime (seconds)
|
|
|
+* Total uptime (seconds)
|
|
|
+* Number of packets sent as flood
|
|
|
+* Number of packets sent directly
|
|
|
+* Number of packets received as flood
|
|
|
+* Number of packets received directly
|
|
|
+* Error flags
|
|
|
+* Last SNR value
|
|
|
+* Number of direct route duplicates
|
|
|
+* Number of flood route duplicates
|
|
|
+* Number posted (?)
|
|
|
+* Number of post pushes (?)
|
|
|
+
|
|
|
+### Keepalive
|
|
|
+
|
|
|
+No-op request.
|
|
|
+
|
|
|
+### Get telemetry data
|
|
|
+
|
|
|
+Request data about sensors on the node, including battery level.
|
|
|
+
|
|
|
+## Response
|
|
|
+
|
|
|
+| Field | Size (bytes) | Description |
|
|
|
+|---------|-----------------|-------------|
|
|
|
+| tag | 4 | TODO |
|
|
|
+| content | rest of payload | TODO |
|
|
|
+
|
|
|
+## Plain text message
|
|
|
+
|
|
|
+| Field | Size (bytes) | Description |
|
|
|
+|--------------|-----------------|--------------------------------------------------------------|
|
|
|
+| timestamp | 4 | send time (unix timestamp) |
|
|
|
+| flags + TODO | 1 | first six bits are flags (see below), last two bits are TODO |
|
|
|
+| message | rest of payload | the message content, see next table |
|
|
|
+
|
|
|
+Flags
|
|
|
+
|
|
|
+| Value | Description | Message content |
|
|
|
+|--------|---------------------------|------------------------------------------------------------|
|
|
|
+| `0x00` | plain text message | the plain text of the message |
|
|
|
+| `0x01` | CLI command | the command text of the message |
|
|
|
+| `0x02` | signed plain text message | two bytes of sender prefix, followed by plain text message |
|
|
|
+
|
|
|
+# Anonymous request
|
|
|
+
|
|
|
+| Field | Size (bytes) | Description |
|
|
|
+|------------------|-----------------|-------------------------------------------|
|
|
|
+| destination hash | 1 | first byte of destination node public key |
|
|
|
+| public key | 32 | sender's Ed25519 public key |
|
|
|
+| cipher MAC | 2 | MAC for encrypted data in next field |
|
|
|
+| ciphertext | rest of payload | encrypted message, see below for details |
|
|
|
+
|
|
|
+Plaintext message
|
|
|
+
|
|
|
+| Field | Size (bytes) | Description |
|
|
|
+|----------------|-----------------|-------------------------------------------------------------------------------|
|
|
|
+| timestamp | 4 | send time (unix timestamp) |
|
|
|
+| sync timestamp | 4 | for room server, otherwise absent: sender's "sync messages SINCE x" timestamp |
|
|
|
+| password | rest of message | password for repeater/room |
|
|
|
+
|
|
|
+# Group text message / datagram
|
|
|
+
|
|
|
+| Field | Size (bytes) | Description |
|
|
|
+|--------------|-----------------|------------------------------------------|
|
|
|
+| channel hash | 1 | TODO |
|
|
|
+| cipher MAC | 2 | MAC for encrypted data in next field |
|
|
|
+| ciphertext | rest of payload | encrypted message, see below for details |
|
|
|
+
|
|
|
+Plaintext for text message
|
|
|
+
|
|
|
+| Field | Size (bytes) | Description |
|
|
|
+|-----------|-----------------|----------------------------------|
|
|
|
+| timestamp | 4 | send time (unix timestamp) |
|
|
|
+| content | rest of message | plain group text message content |
|
|
|
+
|
|
|
+TODO: describe what datagram looks like
|
|
|
+
|
|
|
+# Custom packet
|
|
|
+
|
|
|
+Custom packets have no defined format.
|