====== Custom Applications in LinBPQ ======
When you connect to a BPQ32 Node, you may be offered custom applications as well as the standard commands:
ABNGDN:G6FJI} BBS CHAT HARS CONNECT BYE INFO NODES PORTS ROUTES USERS MHEARD
Here the first three commands are applications defined in the nodes configuration file, bpq32.cfg:
APPLICATION 1,BBS,,G6FJI-2,ABIBBS,254
APPLICATION 2,CHAT,,G6FJI-1,ABICHT,254
APPLICATION 3,HARS,C 1 HARS S
Applications 1 and 2, BBS and CHAT are standard features in BPQ32; Application 3 is simply a user shortcut: typing ''HARS'' is the same as typing ''C 1 HARS S''.
BPQ32 also has a facility to make a TCP connection to a port on the same machine, which allows you to create custom applications within your node. This page describes setting up an application on a Linux system using systemd - I have not seen any documentation to make this work on Windows.
===== 'Hello World' Example Application =====
This example assumes you have a 'standard' BPQ32 installation running on Linux, with Port 1 using RF and Port 2 using Telnet.
==== BPQ32 Configuration ====
First we must add a CMDPORT line to the Telnet Port. The syntax is ''CMDPORT ... '', eg:
CMDPORT 63001 63002
Then we add a Node APPLICATION which calls that port. The options used here are:
* Application number
* Application name
* Command to execute
* User to connect as
APPLICATION 5,HELLO-WORLD,C 2 HOST 0 S,G6FJI
The command syntax is ''C(onnect) HOST S''; the S at the end means return to the current session rather than disconnect completely.
==== Custom Application Configuration ====
Our 'Hello World' application is simply a bash script called as a systemd service. Using your editor of choice, create a file 'hello-world.sh' containing this script:
#!/bin/bash
echo "Hello world"
Make the script executable and check you can run it:
martinr@UbuMini:~$ chmod +x hello-world.sh
martinr@UbuMini:~$ ./hello-world.sh
Hello world
Now we need to set up the systemd service to call the script. This is in two parts - the socket and the service. First create the socket part with ''sudo nano /lib/systemd/system/hw.socket''
[Unit]
Description=Hello World
[Socket]
ListenStream=63001
Accept=yes
[Install]
WantedBy=sockets.target
The bit that matters here is the port number in the ListenStream must match the CMDPORT you created in the BPQ configuration.
Then we need the matching service file: ''sudo nano /lib/systemd/system/hw@.service'' - note the @ in the name.
[Unit]
Description=Hello World Server
[Service]
ExecStart=/home/martinr/hello-world.sh
StandardInput=socket
Here the important parts are the script to run and the line telling it to take standard input from the socket - there won't be a keyboard connected to the service.
Reload the systemd configuration and start the service, then test it using netcat:
martinr@UbuMini:~$ sudo systemctl daemon-reload
martinr@UbuMini:~$ sudo systemctl start hw.socket
martinr@UbuMini:~$ nc localhost 63001
Hello world
To have the new service run on start up, run this command:
martinr@UbuMini:~$ sudo systemctl enable hw.socket
Finally restart your node and test:
ABNGDN:G6FJI} BBS CHAT HARS HELLO-WORLD CONNECT BYE INFO NODES PORTS ROUTES USERS MHEARD
HELLO-WORLD
Connected to HELLO-WORLD
Hello world
Returned to Node ABNGDN:G6FJI
==== Other Servers ====
* [[packet:AuthServer|packet:AuthServer]] OTP authentication server that has a configurable menu that can call a URL (useful for remote controlling/monitoring of a node)
* [[packet:temperature_graph|Temperature graph]]
* [[packet:ADSB_latest_script|packet:ADSB_latest_script]]
===== References =====
I found these links useful in getting this to work:
The official documentation uses inetd and doesn't really explain the significance of the port list in the CMDPORT line:\\
[[https://www.cantab.net/users/john.wiseman/Documents/LinBPQ%20Applications%20Interface.html]]
This presentation is quite helpful once you work out the typos and which bits are meant to be there:\\
[[https://www.prinmath.com/ham/talks/BPQ.pdf]]
These pages were useful for understanding the systemd services and testing them\\
[[https://www.linux.com/training-tutorials/writing-systemd-services-fun-and-profit/]]\\
[[https://mgdm.net/weblog/systemd-socket-activation/]]
Here is a completely separate write-up\\
[[https://labby.co.uk/linbpq-bpq32-linux-add-custom-application/]]
Another approach: https://github.com/bradbrownjr/bpq-apps