EA7KLX · Ayuda de ic705suite

Montar el core en un servidor

Por qué un servidor#

Al empezar, el core corre dentro del propio cliente: abres ic705suite, se conecta a la radio y, al cerrarlo, la suelta. Es lo más sencillo, pero la radio solo está disponible mientras ese programa esté abierto.

Con el core en un servidor (ic705suite --serve), por ejemplo una Raspberry Pi junto a la radio:

  • la radio queda siempre conectada, y cualquier cliente (terminal o ventana, en Linux o en Windows) se conecta y desconecta cuando quiere, varios a la vez;
  • FT8, el seguimiento de D-STAR y su pasarela USB, el packet y la BBS, y las subidas a LoTW siguen funcionando con todos los clientes cerrados;
  • la página de la antena para el móvil está siempre en http://servidor:8705;
  • hay un solo diario para todos los clientes (Diario compartido).

Una Raspberry Pi 4 lo lleva todo con margen, decodificación de FT8 incluida. Vale cualquier Linux (y también Windows) con Python 3.11 o posterior.

Instalar la suite#

En el servidor, la suite va en un entorno virtual de Python, instalada desde la wheel de la última versión. En Raspberry Pi OS de 64 bits, Debian o Ubuntu:

sudo apt install python3-venv
python3 -m venv ~/ic705suite-venv
VERSION=0.25.0     # la última, mira la página de versiones
URL=https://github.com/manuel-alcocer/ic705suite/releases/download
~/ic705suite-venv/bin/pip install \
  "ic705suite[postgres] @ $URL/v$VERSION/ic705suite-$VERSION-py3-none-any.whl"

El extra postgres hace falta para el diario compartido; el servidor no necesita el extra gui.

Raspberry Pi OS de 32 bits. numpy y compañía vienen mejor de los paquetes del sistema: sudo apt install python3-numpy python3-sqlalchemy python3-websockets python3-soundfile y el entorno creado con python3 -m venv --system-site-packages ~/ic705suite-venv.

Según lo que vaya a hacer el servidor, instala también:

Para Paquetes (Debian, Ubuntu, Raspberry Pi OS)
FT8 (el decodificador jt9) wsjtx
Packet con un TNC propio direwolf
Diario compartido postgresql
LoTW trustedqsl xvfb

Configurar#

Contesta a las preguntas como en un cliente (cómo llegar a la radio, el indicativo, si puede transmitir…):

~/ic705suite-venv/bin/ic705suite --configure

y abre ~/.config/ic705suite/config.toml para la sección [server]: la dirección en la que escucha y el token que los clientes deben presentar.

[rig]
connection = "lan"
host = "192.168.1.84"        # la IC-705
username = "usuario"
password = "contraseña"
tx_enabled = true            # cuando la ROE esté bien

[station]
callsign = "EA7KLX"
locator = "IM77ah"

[server]
listen = "0.0.0.0:7373"      # toda la red; sin esta línea, solo esta máquina
token = "una-cadena-larga-y-aleatoria"

ic705suite --init-config escribe una plantilla completa con un token aleatorio ya puesto. Un servidor que escucha en la red sin token no arranca.

Pruébalo a mano antes de dejarlo como servicio:

~/ic705suite-venv/bin/ic705suite --serve

En el log debe aparecer la conexión con la IC-705. Ctrl+C lo para.

Como servicio de systemd#

Para que arranque con la máquina y se levante solo si se cae, crea /etc/systemd/system/ic705suite-core.service (cambia pi por tu usuario):

[Unit]
Description=ic705suite core
After=sound.target network-online.target
Wants=network-online.target

[Service]
User=pi
Group=pi
SupplementaryGroups=audio dialout
ExecStart=/home/pi/ic705suite-venv/bin/ic705suite --serve
Restart=always
RestartSec=10
Environment=PYTHONUNBUFFERED=1

[Install]
WantedBy=multi-user.target

Los grupos audio y dialout son para la tarjeta de sonido y el puerto serie del packet (un Digirig) y para la IC-705 por USB. Luego:

sudo systemctl daemon-reload
sudo systemctl enable --now ic705suite-core
journalctl -u ic705suite-core -f        # lo que va diciendo

Al pararlo, cada parte del core tiene unos segundos para cerrar limpia (los canales de CW sin guardar se archivan); si alguna se atasca, el core lo dice en el log y sale igualmente, sin esperar a que systemd lo mate.

Conectar los clientes#

Desde cualquier ordenador de la red, para una vez:

ic705suite --connect raspberrypi.local --token una-cadena-larga-y-aleatoria
ic705suite --connect raspberrypi.local --gui

(sin puerto se usa el 7373). Para que el cliente use siempre ese core, sin escribir nada, en su configuración (o contestando server en --configure):

[rig]
connection = "server"

[client]
connect = "raspberrypi.local:7373"
token = "una-cadena-larga-y-aleatoria"

Entonces ic705suite y ic705suite --gui van al servidor; --sim sigue abriendo el simulador en local. La línea de estado muestra las dos máquinas por su nombre, con su CPU, memoria y temperatura. Si el core se va (un reinicio, la red), la radio aparece desconectada, las pantallas siguen funcionando y el cliente se reconecta solo cuando vuelve.

El audio de recepción viaja del servidor solo a los clientes que lo piden (el botón del altavoz del cliente gráfico).

Lo que sigue funcionando sin clientes#

Con el core en un servidor
FT8 decodifica; un QSO en marcha, el CQ y el modo automático siguen. Tras [ft8] unattended minutos sin ningún cliente (10 por defecto) deja de transmitir y sigue decodificando
D-STAR sigue la radio en DV y guarda cada pase en el historial; la pasarela USB (EXT) mantiene enlazado el reflector
Packet y BBS las sesiones de los 8 canales y la BBS siguen en el aire
Diario y LoTW firma y sube a LoTW los QSO nuevos, y trae las confirmaciones
Antena la página del móvil en http://servidor:8705
CW los canales siguen en el core; al pararlo se archivan los que no estén guardados ([channels] autosave_on_server_exit)

Puertos y seguridad#

Puerto Qué es
7373/TCP los clientes (WebSocket, con token)
8705/TCP la página de la antena para el móvil (HTTP)

El enlace entre clientes y core no va cifrado: el token y lo que se dice viajan en claro. Está pensado para tu red local. Para usar la estación desde fuera, entra en tu red por una VPN (WireGuard, por ejemplo); no abras estos puertos a Internet. La página de la antena, igual: usa una contraseña propia para su control remoto ([swr] remote_password), no una que uses en otro sitio.

Con [swr] host = "127.0.0.1" la página de la antena solo se ve desde la propia máquina, y con [swr] web = false no se sirve.

D-STAR por USB#

Además del modo Terminal con la pasarela interna de la radio (por WiFi), el core puede ser la pasarela externa de la IC-705 conectada por USB a la máquina del core: enlaza los reflectores (DPlus, DCS, DExtra) él mismo, arranca con el core y vuelve a enlazar el último reflector en cuanto la radio contesta por USB.

En la radio: MENU > DV GW > Gateway Select en External Gateway USB y el indicativo de terminal <tu indicativo> B. La suite encuentra sola el puerto de datos de D-STAR (en /dev/serial/by-id); [dstar] usb_port lo fija, u "off" lo desactiva. El usuario del servicio necesita el grupo dialout. Más en D-STAR.

Packet las 24 horas en otra máquina#

Un core también puede no tener radio de la suite ([rig] connection = "none") y dedicarse al packet: una Raspberry Pi con un Digirig y otra radio, con su Direwolf y la BBS en el aire mientras el ordenador está apagado. Los clientes abren el packet allí con [packet] core y core_token, y el resto de la suite con su propia radio. Los detalles están en Packet.

Actualizar el core#

Instala la wheel nueva encima y reinicia el servicio:

VERSION=0.26.0
URL=https://github.com/manuel-alcocer/ic705suite/releases/download
~/ic705suite-venv/bin/pip install --upgrade \
  "ic705suite[postgres] @ $URL/v$VERSION/ic705suite-$VERSION-py3-none-any.whl"
sudo systemctl restart ic705suite-core

Ojo: reiniciar el core corta lo que esté haciendo (un QSO de FT8, una sesión de packet). Los clientes se reconectan solos. Conviene que clientes y core vayan en la misma versión.

En Windows#

ic705suite --serve también funciona en Windows, con la misma configuración (%APPDATA%\ic705suite\config.toml). Para que arranque solo, una tarea del Programador de tareas que lo lance al iniciar sesión. FT8 usa el jt9 que instala WSJT-X, y el packet el Direwolf de su instalador.