srne-mqtt/Protocol.md

86 lines
4.3 KiB
Markdown
Raw Permalink Normal View History

# Protocol
The protocol checksum is litle-endian CRC16-MODBUS, but the data itself seems to be big-endian (network order).
It is structured around 16bit words (read 4 returns 8 bytes).
I have seen the "Transfer ID?" field containing 0xFF and 0x01, I am not yet sure of the putpose of this field. Most transactions it is set to 0xFF.
## Reading
### Read request
```text
┌──────────────┐
╔═╡ Transfer ID? │
║ └──────────────┘
║ ┌────────────────────┐
║ ╔═╡ Operation (3=read) │
║ ║ └────────────────────┘
║ ║ ┌───────────────┐
║ ║ ╔═╡ Start address │
║ ║ ║ └───────────────┘
║ ║ ║ ┌────────────────────────────────┐
║ ║ ║ ╔═╡ Number of 2-byte words to read │
║ ║ ║ ║ └────────────────────────────────┘
║ ║ ║ ║ ┌─────────────────┐
║ ║ ║ ║ ╔═╡ Transaction CRC │
║ ║ ║ ║ ║ └─────────────────┘
┌╨─┬╨─┬──╨──┬──╨──┬──╨──┐
│FF│03│00 0C│00 08│91 d1│
└──┴──┴─────┴─────┴─────┘
```
### Read response
```text
┌──────────────┐
╔═╡ Transfer ID? │
║ └──────────────┘
║ ┌────────────────────┐
║ ╔═╡ Operation (3=read) │
║ ║ └────────────────────┘
║ ║ ┌──────────────────────────┐
║ ║ ╔═╡ Number of bytes returned │
║ ║ ║ └──────────────────────────┘
║ ║ ║ ┌──────┐ ┌─────────────────┐
║ ║ ║ ╔═╡ Data │ │ Transaction CRC ╞═╗
║ ║ ║ ║ └──────┘ └─────────────────┘ ║
┌╨─┬╨─┬╨─┬╨──────────────────────────────────────────────┬──╨──┐
│FF│03│10│20 20 20 20 4D 4C 32 34 32 30 20 20 20 20 20 20│FD 17│
└──┴──┴──┴───────────────────────────────────────────────┴─────┘
```
This particular memory section contains the device SKU: ML2420
## Writing
### Write request
```text
┌──────────────┐
╔═╡ Transfer ID? │
║ └──────────────┘
║ ┌─────────────────────┐
║ ╔═╡ Operation (6=write) │
║ ║ └─────────────────────┘
║ ║ ┌─────────┐
║ ║ ╔═╡ Address │
║ ║ ║ └─────────┘
║ ║ ║ ┌──────┐
║ ║ ║ ╔═╡ Data │
║ ║ ║ ║ └──────┘
║ ║ ║ ║ ┌─────────────────┐
║ ║ ║ ║ ╔═╡ Transaction CRC │
║ ║ ║ ║ ║ └─────────────────┘
┌╨─┬╨─┬──╨──┬──╨──┬──╨──┐
│FF│06│01 0A│00 01│7C 2A│
└──┴──┴─────┴─────┴─────┘
```
The data at 0x010A is a boolean controlling the load output switch.
### Write response
Seems to return exactly the same as the data written,
presumably to allow verifying that the data did indeed get written.