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.