Sideband as JS8Call Interface #441
Replies: 4 comments 16 replies
-
I wouldn't discourage pursuing it, even if it ends up not working, it'll be a great exercise in JS8Call and Reticulum. But I do wonder if it's the right tool for the job. I wrote up a little pseudo-POP implementation (https://github.com/faragher/POPR) and encourage you to look through it for mechanics of creating LXMF messages and adding arbitrary message payloads. I learned so much writing that, and I probably went through ten iterations before it was actually clean and Reticulum appropriate. And that's important. The flow of Reticulum is unique; not in a programming way, but in how it feels and the mindset behind it. I again highly encourage playing around with an implementation to get a feel for it. Play with the POPR code until you understand why I made all those decisions. It's MIT licensed, that's what it's there for! To my comments on your proposed system: You shouldn't modify Sideband. Not because you don't want new functionality, but if you can make it interface invisibly over LXMF, then any client can use it. POPR acts as an end point that sends and receives messages as a node, but can be accessed by any authorized POPR client to read or create new messages. If you have an LXMF to JS8Call "server" then it can do the same thing. I'm going to call the concept L2J because I'm lazy. It's a terrible name. So, let's say you had an L2J server L2Js. Someone would send a message, and it would check the identity and either respond "Hey, you're not authorized to send messages, please contact the administrator at XYZ123 for authorization" or process the request. Since you're already keeping a directory of RNS addresses/identities to callsigns, you already need some sort of database. You could also share contact information and identities over fast connections, cache radio broadcast identities, etc. Since the address size is considerable, it's worth preventing sending them repeatedly. A plain destination is basically useless. It can't be routed, so it's really only for local broadcasts and while it does the job it's designed for very well, it's not what you're looking for. So, what I would do: Make an LXMF bot. Write up a script where when you send a message, it responds somehow. POPR or EchoBot (https://github.com/faragher/ReticulumExamples) are good places to start. Remember, you want to only send and receive LXM messages. You can use stock Sideband or NomadNet to test. Now make sure you can figure out how to send/receive plaintext control messages. For example, try to get it to send "I should be sending message 'Foo' to address 'Bar'" if you send it the message "SEND: Bar Foo". Remember to test for spaces and error handling. Then set it to display the destination and message on the server's console. Once you're there, you need to set up the JS8Call stuff. Write up a send routine and we're half done. From the JS8Call receive routine, receive the message and destination callsign. Look up the callsign, check for the identity, make the LXM message like in POPR, set the destination and L2Js address, and send it along via Reticulum. Have it send something like "Received from CALLSIGN: MESSAGE" You now have a 100% LXMF compatible radio bridge that works with all clients present and future. There are some implementation details (do you have a central database of identities over the Internet? What control codes do you support? Etc.) but in broad strokes you now have a system that works as-is and is human-readable. And if you want a simple system where people don't need to remember SEND: or the like, you can make a custom/modified app to add/remove these commands to be seamless for the user. There are other options, such as using fields, but that requires a little coordination with the LXMF standards, so it's likely not a good idea at this time. As an aside, JS8Call can't support bytes? It's quite inefficient, but can it at least support Base64? (A-Z,a-z,0-9,+,/,=) |
Beta Was this translation helpful? Give feedback.
-
If I may, and not to derail the conversation from JS8Call, you could go the route of Fldigi. Fldigi does support KISS TCP/IP. If you want a weak signal mode like JS8Call, you could go the Olivia route within Fldigi. As you probably already know, Olivia does rival FT8 and JS8 as a weak signal mode. It's just an idea, but I don't know if it would be a good fit for the QDX though. As a sidenote, for the countries that allow encryption, it just crossed my mind that you should be able to directly connect fldigi to reticulum and access all the various modes that fldigi has to offer, including the weak signal modes. I played the audio through my speakers and it took a little over 2 minutes to announce using Olivia-16/500 and under 1 minute using Olivia-8/1K. For the non-ham radio operator, here are some links to better understand Olivia. https://www.sigidwiki.com/wiki/Olivia Based on this website: http://www.w1hkj.com/modes/olivia.htm You could achieve up to a staggering 125 baud using Olivia! If you don't find this relevant, please feel free to ignore, but hope this helps! |
Beta Was this translation helpful? Give feedback.
-
js8call is interesting but it would be nice if the lower level protocol was separated from the upper layers, giving it more utility. As it is, it's not very robust as a networking tool. It also suffers from being power-hungry. If you look at power-usage over time, the slowest mode is suited to QRP operation (because it will get through with small amounts of tx power) but the duty cycle increases significantly, which means much higher current draw for given message length (it depends on repeated tx to get through). If you're running on batteries you get fewer comm windows when using the lower more robust speeds. The faster modes are far more efficient power-wise but require more tx power to punch through. |
Beta Was this translation helpful? Give feedback.
-
I have personally moved on from this topic for now, but in case anyone is interested in the proof of concept that came out of it: https://github.com/simplyequipped/pyjs8call/blob/lxmf/pyjs8call/lxmf.py |
Beta Was this translation helpful? Give feedback.
-
Background
One of my overarching goals has been making radio-based communication more accessible to the average user. So far I have settled on the need for a simplified interface for something like JS8Call, primarily because JS8Call can obscure some of the challenges of HF propagation and the inefficiencies of a simple antenna installation. Also, since JS8Call also handles the radio interfacing part, simple radio solutions like the QDX become a great fit.
I have run into some challenges with sending encrypted data over JS8Call. It seems that JS8Call does not support sending byte strings directly, and JS8Call only supports a limited character set that cannot represent 256 individual characters in order to map byte values to characters. Basically, the already extremely low data rate takes a significant hit because you have to use multiple characters to represent over half of the byte values.
See #11 for low data rate discussions. See #399 for encryption in amateur radio discussion.
Main Topic
I have been considering using Sideband as an interface for JS8Call. The initial concept is to add an LXMF interface to pyjs8call that would map incoming messages to RNS destinations with the origin callsign as the display name. The device to receive JS8Call notifications would be specified by LXMF address when starting the pyjs8call LXMF interface. I am envisioning a command like the following to start pyjs8call, JS8Call, and the LXMF router:
python -m pyjs8call --lxmf LXMF_TARGET_DESTINATION_HASH
Incoming Message Processing:
incoming JS8Call message -> pyjs8call.Message -> pyjs8call LXMF message -> RNS transport -> Sideband message
Outgoing Message (Response) Processing:
outgoing Sideband message -> RNS transport -> pyjs8call LXMF message -> pyjs8call.Message -> outgoing JS8Call message
Obviously this would convert the encrypted Sideband message into plain text to be sent via JS8Call. It would be important to indicate to the Sideband user that the conversation will be unencrypted. Maybe a Plain destination type would be appropriate (I don't know offhand how that is handled or displayed in Sideband), or at least including a JS8Call prefix to the display name to indicate the source/destination of the conversation.
One limitation of this system would be that a Sideband user cannot initiate a JS8Call outgoing message without first receiving an incoming message to create the callsign destination on the pyjs8call end. This will require some consideration.
I am open to feedback on whether this should be pursued, and how it could be best configured for usability.
Beta Was this translation helpful? Give feedback.
All reactions