So, doing some more digging here. One question people might ask is what kind of applications would I use over this network?
HTTP really isn’t designed for low-bandwidth links, as Steve Netting demonstrated:
The page itself is bad enough, but even then, it’s loaded after a minute. The real slow bit is the 20kB GIF.
So yeah, slow-scan television, the ability to send weather radar images over, that is something I was thinking of, but not like that!
HTTP uses pretty verbose headers:
GET /qld/forecasts/brisbane.shtml?ref=hdr HTTP/1.1 Host: www.bom.gov.au User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:62.0) Gecko/20100101 Firefox/62.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-AU,en-GB;q=0.8,en-US;q=0.5,en;q=0.3 Accept-Encoding: gzip, deflate Referer: http://www.bom.gov.au/products/IDR664.loop.shtml Cookie: bom_meteye_windspeed_units_knots=yes Connection: keep-alive Upgrade-Insecure-Requests: 1 Pragma: no-cache Cache-Control: no-cache HTTP/1.1 200 OK Accept-Ranges: bytes Content-Encoding: gzip Content-Type: text/html; charset=UTF-8 Server: Apache Vary: Accept-Encoding Content-Length: 6321 Date: Sat, 20 Oct 2018 10:56:12 GMT Connection: keep-alive
That request is 508 bytes and the response headers are 216 bytes. It’d be inappropriate on 6LoWPAN as you’d be fragmenting that packet left right and centre in order to squeeze it into the 128-byte 802.15.4 frames.
In that video, ICMP echo requests were also demonstrated, and those weren’t bad! Yes, a little slow, but workable. So to me, it’s not the packet network that’s the problem, it’s just that something big like HTTP is just not appropriate for a 1200-baud radio link.
It might work on 9600 baud packet … maybe. My Kantronics KPC3 doesn’t do 9600 baud over the air.
CoAP was designed for tight messages. It is UDP based, so your TCP connection overhead disappears, and the “options” are encoded as individual bytes in many cases. There are other UDP-based protocols that would work fine too, as well as older TCP protocols such as Telnet.
A request, and reply in CoAP look something like this:
Hex dump of request: 00000000 40 01 00 01 3b 65 78 61 6d 70 6c 65 2e 63 6f 6d @...;exa mple.com 00000010 81 63 03 52 46 77 11 3c .c.RFw.< Hex dump of response: 00000000 60 45 00 01 c1 3c ff a1 1a 00 01 11 70 a1 01 a3 `E...<.. ....p... 00000010 04 18 64 02 6b 31 39 32 2e 31 36 38 2e 30 2e 31 ..d.k192 .168.0.1 00000020 03 64 65 74 68 30 .deth0
Or in more human readable form:
Request: Constrained Application Protocol, Confirmable, GET, MID:1 01.. .... = Version: 1 ..00 .... = Type: Confirmable (0) .... 0000 = Token Length: 0 Code: GET (1) Message ID: 1 Opt Name: #1: Uri-Host: example.com Opt Desc: Type 3, Critical, Unsafe 0011 .... = Opt Delta: 3 .... 1011 = Opt Length: 11 Uri-Host: example.com Opt Name: #2: Uri-Path: c Opt Desc: Type 11, Critical, Unsafe 1000 .... = Opt Delta: 8 .... 0001 = Opt Length: 1 Uri-Path: c Opt Name: #3: Uri-Path: RFw Opt Desc: Type 11, Critical, Unsafe 0000 .... = Opt Delta: 0 .... 0011 = Opt Length: 3 Uri-Path: RFw Opt Name: #4: Content-Format: application/cbor Opt Desc: Type 12, Elective, Safe 0001 .... = Opt Delta: 1 .... 0001 = Opt Length: 1 Content-type: application/cbor [Uri-Path: coap://example.com/c/RFw] Response: Constrained Application Protocol, Acknowledgement, 2.05 Content, MID:1 01.. .... = Version: 1 ..10 .... = Type: Acknowledgement (2) .... 0000 = Token Length: 0 Code: 2.05 Content (69) Message ID: 1 Opt Name: #1: Content-Format: application/cbor Opt Desc: Type 12, Elective, Safe 1100 .... = Opt Delta: 12 .... 0001 = Opt Length: 1 Content-type: application/cbor End of options marker: 255 Payload: Payload Content-Format: application/cbor, Length: 31 Payload Desc: application/cbor [Payload Length: 31] Concise Binary Object Representation Map: (1 entries) Unsigned Integer: 70000 Map: (1 entries) ...0 0001 = Unsigned Integer: 1 Map: (3 entries) ...0 0100 = Unsigned Integer: 4 Unsigned Integer: 100 ...0 0010 = Unsigned Integer: 2 Text String: 192.168.0.1 ...0 0011 = Unsigned Integer: 3 Text String: eth0
That there, also shows another tool to data packing: CBOR. CBOR is basically binary JSON. Just like JSON it is schemaless, it has objects, arrays, strings, booleans, nulls and numbers (CBOR differentiates between integers of various sizes and floats). Unlike JSON, it is tight. The CBOR blob in this response would look like this as JSON (in the most compact representation possible):
The entire exchange is 190 bytes, less than a quarter of the size of just the HTTP request alone. I think that would work just fine over 1200 baud packet. As a bonus, you can also multicast, try doing that with HTTP.
So you’d be writing higher-level services that would use this instead of JSON-REST interfaces. There’s a growing number of libraries that can consume this sort of thing, and IoT is pushing that further. I think it’s doable.
Now, on the routing front, I’ve been digging up a bit on Net/ROM. Net/ROM is actually two parts, Net/ROM Level 3 does the routing and level 4 does the circuit switching. It’s the “Level 3” bit we want.
Coming up with a definitive specification of the protocol has been a bit tough, it doesn’t help that there is a company called NetROM, but I did manage to find this document. In a way, if I could make my software behave like a Net/ROM node, I could piggy-back off that to discover neighbours. Thus this protocol would co-exist along side Net/ROM networks that may be completely oblivious to TCP/IP.
This is preferable to just re-inventing the wheel…yes I know non-circular wheels are so much fun! Really, once Net/ROM L3 has figured out where everyone is, IP routing just becomes a matter of correctly addressing the AX.25 frame so the next hop receives the message.
VK4RZB at Mt. Coot-tha is one such node running TheNet. Easy enough to do tests on as it’s a mere stone throw away from my home QTH.
There’s a little consideration to make about how to label the AX.25 frame. Obviously, it’ll be a UI frame, but what PID field should I use? My instinct suggests that I should just label it as “ARPA Internet Protocol”, since it is Internet Protocol traffic, just IPv6 instead of v4. Not all the codes are taken though, 0xc9 is free, so I could be cheeky and use that instead. If the idea takes off, we can talk with the TAPR then.