The specs of the used RaspberryPi and the OS are:
Model: Raspberry Pi 3 Model B Plus Rev 1.3
RAM: 1GB
OS: Raspberry Pi OS Lite (bookworm)
OS System: 64-bit
OS Kernel version: 6.6
Debian version: 12 (bookworm)
I wanted to control my Icom IC-705 from the local network or over the Internet (using a VPN to connect to my local network).
I’ve made mixed experiences with the Icom RS-BA1 v2 software, that sometimes works perfectly but on other devices or other network "configurations" is unable to connect properly.
So I stumbled upon the software wfview that is an application developed by amateur radio enthusiasts to control modern Icom rigs using either a USB serial or network connection (ethernet or WiFi). Furthermore, it is free and open source software.
As I have a RasperryPi device in my shack I wanted to use it also for this purpose. The RaspberryPi is running Raspberry Pi OS Lite - without a graphical user interface respectively in headless mode.
2025-01-04: Updated to version 2.03 of wfview
As wfview doesn’t provide downloadable binaries for Linux and RaspberryPi based devices and I also wanted to run wfview in server mode, I had to compile it on my own. A short guide how to do that can be found under https://wfview.org/download/#source or https://gitlab.com/eliggett/wfview/-/blob/master/INSTALL.md.
Basically I had to take the following steps:
# Create directories and set file rights
sudo mkdir -p /opt/wfview/
sudo chown pi:pi /opt/wfview
# Change the directory
cd /opt/wfview/
# Download the build script
wget -O fullbuild-wfview.sh https://gitlab.com/eliggett/scripts/-/raw/master/fullbuild-wfview.sh?inline=false
# Modify buildscript to build wfserver (instead of wfview)
cp fullbuild-wfview.sh fullbuild-wfserver.sh
sed -i 's,qmake ../wfview/wfview.pro,qmake ../wfview/wfserver.pro,' fullbuild-wfserver.sh
# Make scripts executable
chmod ug+x fullbuild-wfview.sh fullbuild-wfserver.sh
# Build wfserver (Version/Tag 'v2.00') and answer the questions while running:
# - Press Y to install dependencies (Y/n): --> Y
# - Press enter to download wfview's source code. --> [ENTER]
# - Press enter to start. --> [ENTER]
# - Press Y to install wfview into your system (Y/n): --> Y
./fullbuild-wfserver.sh v2.03
# Test successful compilation and installation
command -v wfserver
# /usr/local/bin/wfserver
/usr/local/bin/wfserver -v
# wfserver version: 1.91 (Git:18458dc on Dec 27 2024 at 08:00:00 by pi@raspberry)
# Operating System: Debian GNU/Linux 12 (bookworm) (arm64)
# Build Qt Version 5.15.8. Current Qt Version: 5.15.8
Now the binaries built successfully!
Next step is to connect the Icom radio with the RaspberryPi: In my setup that is an Icom IC-705 connected via USB cable. The radio provides two serial connections.
To avoid later re-configurations I decided to have this serial connections named related to device. This will be done using custom udev rules. Another advantage is that we’ll be able to restart the wfserver service when a device reconnects later on.
But first we need to find out something more about the device and to use that for the rules:
# The IC-705 connected via USB provides two serial connections
ls -la /dev/ttyACM*
# crw-rw---- 1 root dialout 166, 0 Dec 28 08:00 /dev/ttyACM0
# crw-rw---- 1 root dialout 166, 1 Dec 28 08:00 /dev/ttyACM1
sudo udevadm test /dev/ttyACM0
...
ID_BUS=usb
ID_MODEL=IC-705
ID_MODEL_ENC=IC-705
ID_MODEL_ID=0036 (1)
ID_SERIAL=Icom_Inc._IC-705_IC-705_12345578
ID_SERIAL_SHORT=IC-705_12345578
ID_VENDOR=Icom_Inc.
ID_VENDOR_ENC=Icom\x20Inc.
ID_VENDOR_ID=0c26 (2)
ID_REVISION=0100
...
ID_USB_INTERFACE_NUM=00 (3)
ID_USB_DRIVER=cdc_acm
...
sudo udevadm test /dev/ttyACM1
...
ID_BUS=usb
ID_MODEL=IC-705
ID_MODEL_ENC=IC-705
ID_MODEL_ID=0036 (1)
ID_SERIAL=Icom_Inc._IC-705_IC-705_12345578
ID_SERIAL_SHORT=IC-705_12345578
ID_VENDOR=Icom_Inc.
ID_VENDOR_ENC=Icom\x20Inc.
ID_VENDOR_ID=0c26 (2)
ID_REVISION=0100
...
ID_USB_INTERFACE_NUM=02 (3)
ID_USB_DRIVER=cdc_acm
...
-
Model identifier
-
Vendor identifier
-
Interface number
Now we create a udev rule under /etc/udev/rules.d/90-wfserver.rules
ACTION=="add", KERNEL=="ttyACM*", SUBSYSTEMS=="usb", ATTRS{idVendor}=="0c26", ATTRS{idProduct}=="0036", ENV{ID_USB_INTERFACE_NUM}=="00", SYMLINK+="icom-ic-705-portA-CI-V", RUN+="service wfserver restart"
ACTION=="add", KERNEL=="ttyACM*", SUBSYSTEMS=="usb", ATTRS{idVendor}=="0c26", ATTRS{idProduct}=="0036", ENV{ID_USB_INTERFACE_NUM}=="02", SYMLINK+="icom-ic-705-portB"
Now disconnect and reconnect the Icom device and check if the rules worked as expected:
# The IC-705 connected via USB provides two serial connections
ls -la /dev/icom*
# lrwxrwxrwx 1 root root 7 Dec 28 08:00 /dev/icom-ic-705-portA-CI-V -> ttyACM0
# lrwxrwxrwx 1 root root 7 Dec 28 08:00 /dev/icom-ic-705-portB -> ttyACM1
Next step is the wfserver configuration - basically the rig itself and the credentials. Change to your needs accordingly:
[General]
AudioSystem=0
[Radios]
size=1
1\AudioInput=default:CARD=CODEC
1\AudioOutput=default:CARD=CODEC
# Setting 'ForceRTSasPTT' used before wfview 2.03
#1\ForceRTSasPTT=false
# Setting 'PTTType' used for wfview 2.03+ (see https://gitlab.com/eliggett/wfview/-/blob/master/wfviewtypes.h#L120)
1\PTTType=0
1\GUID={8b520db4-2918-4844-a5a3-5d1409b4d136} (1)
1\RigCIVuInt=164 (2)
1\RigName=IC-705
1\SerialPortBaud=115200
1\SerialPortRadio=/dev/icom-ic-705-portA-CI-V (3)
1\WaterfallFormat=0
[Server]
ServerAudioPort=50003
ServerCivPort=50002
ServerControlPort=50001
ServerEnabled=true
Users\size=1
Users\1\Username=username (4)
Users\1\Password=pass1234 (5)
Users\1\UserType=0
-
A generic UUID only to separate multiple devices - generate your own at https://www.uuidgenerator.net/version4
-
The CI-V address of the device. For the IC-705 this is
A4
as default (in hexadecimal notation) which corresponds to164
in decimal notation -
The CI-V port we configured in the previous steps
-
The username used by clients
-
The password used by clients
Finally, we create a system.d service unit under /opt/wfview/wfserver.service
:
[Unit]
Description=wfview Server
After=network.target
StartLimitIntervalSec=0
[Service]
Type=simple
Restart=always
RestartSec=1
User=pi
ExecStart=/usr/local/bin/wfserver --settings /opt/wfview/wfserver.conf --logfile /opt/wfview/wfserver.log
[Install]
WantedBy=multi-user.target
And now we register and start the service unit:
# Register the service
sudo systemctl enable /opt/wfview/wfserver.service
# Created symlink /etc/systemd/system/wfserver.service → /opt/wfview/wfserver.service.
# Created symlink /etc/systemd/system/multi-user.target.wants/wfserver.service → /opt/wfview/wfserver.service.
# Start the service
sudo service wfserver start
# Check if the service is running
sudo service wfserver status
To check for errors you can use the following commands:
sudo journalctl -xef -u wfserver
tail -f /opt/wfview/wfserver.log
On the remote device now install wfview (see https://wfview.org/download/) and use the IP of the RaspberryPi device, the configured port, username and password (see /opt/wfview/wfserver.conf
) to establish a connection.