Here's some docs on how I connected to OCTOI using a Raspberry Pi, an icE1usb, and my Cisco 2921 voice router.
I contacted LaF0rge from #retronetworking on libera.chat. He asked me to email him at (redacted). He asked me to wait to email him until I had everything ready to go.
I believe all he really needs is the desired 4-digit prefix and some evidence that you're seriously interested and not wasting his time.
You can buy an icE1usb here:
https://shop.sysmocom.de/Osmocom-icE1usb-E1-interface-for-USB/icE1usb-kit
There is a discount code that brings the cost down substantially. You can get this code by emailing [email protected]. The cost for me was then 90 EUR + 40 EUR shipping to USA.
You'll also need to provide your own GPS patch antenna. The receiver seems fairly good. It works with the antenna sitting in my basement window.
Plug a E-1 crossover cable into the right-most port of the icE1usb and a port on the Cisco 2921. I used the left most port on my 2921, which is 0/3/0.
Plug the icE1usb into one of the USB 2 ports on the Pi.
Plug the Pi into ethernet and install Raspberry Pi OS Lite 32-bit.
On octoi-pi, put this in /etc/osmo-e1d-octoi-client.cfg
!
! osmo-e1d (0.3.0.17-07c2) configuration saved from vty
!!
!
log stderr
logging filter all 1
logging color 1
logging print category-hex 0
logging print category 1
logging timestamp 0
logging print file basename last
logging print level 1
logging level e1d info
logging level linp info
!
!
line vty
no login
!
e1d
interface 0 icE1usb
usb-serial dc(redacted)
line 0
mode e1oip
octoi-client (redacted) (redacted)
local-bind 0.0.0.0 3245
account (redacted)
mode ice1usb
ice1usb serial-number dc(redacted)
Put this in /etc/systemd/system/osmo-e1d.service:
[Unit]
Description=Osmocom E1 Interface Daemon
Wants=osmo-e1d.service
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
Restart=always
ExecStart=/usr/local/bin/osmo-e1d -c /etc/osmo-e1d-octoi-client.cfg
RestartSec=2
[Install]
WantedBy=multi-user.target
Then run something like this:
# Prereqs
sudo apt-get install -y \
build-essential libtool libtalloc-dev libsctp-dev shtool autoconf automake \
git-core pkg-config make gcc gnutls-dev python3-dev python-is-python3 \
libusb-1.0.0-dev libmnl-dev liburing-dev \
dfu-util tshark bwm-ng minicom vim-nox tmux git \
libtool pkg-config libosmocore libusb-1.0-0-dev libtalloc-dev
# Get sources
mkdir build && cd build
git clone https://gitea.osmocom.org/osmocom/libosmocore
git clone https://gitea.osmocom.org/retronetworking/osmo-e1d
# Build libosmocore
cd libosmocore
autoreconf -fi && ./configure --disable-pcsc && make && sudo make install
sudo ldconfig
cd ..
# Build osmo-e1d
cd osmo-e1d
autoreconf -fi && ./configure && make && sudo make install
# get the gateware for the FPGA & latest stock firmware
wget https://people.osmocom.org/tnt/ice1usb/icE1usb-202210-5890f3e4.bin
wget https://downloads.osmocom.org/binaries/icE1usb/firmware/all/icE1usb-fw-0.2-71-gf1e228d.bin
# enter DFU mode
sudo dfu-util -e
# flash the gateware
sudo dfu-util -d 1d50:6144 -a 0 -D icE1usb-202210-5890f3e4.bin
# flash the firmware & back to run mode
sudo dfu-util -d 1d50:6144 -a 1 -D icE1usb-fw-0.2-71-gf1e228d.bin -R
# start & enable osmo-e1d
sudo systemctl enable --now osmo-e1d
On the Cisco 2921, do something like this:
card type e1 0 3
network-clock-participate wic 3
network-clock-select 1 E1 0/3/0
trunk group OCTOI
controller E1 0/3/0
pri-group timeslots 1-20
trunk-group OCTOI timeslots 1-20
interface Serial0/3/0:15
no ip address
encapsulation hdlc
no cdp enable
isdn switch-type primary-ni
isdn incoming-voice voice
voice-port 0/3/0:15
dial-peer voice 40 pots
trunkgroup OCTOI
huntstop
destination-pattern 500........
forward-digits 8
Now any 8 digits starting with 500 will immediately route to OCTOI over the E1. Note that you probably want 1-30 instead of 1-20 in both spots. I don't have enough DSP resources for that right now. Will improve. Then make your Asterisk box route 500XXXXXXXX to Cisco 2921. And make your Asterisk box handle 7920XXXX from Cisco as from-octoi
The icE1usb can output USB interrupts with PPS information. This can be used to synchronize the system clock with ntpd/chrony. There will be a lot of jitter as USB is only polled every 1ms. Over very long averaging times, this might be okay.
First you need an experimental firmware on the icE1usb:
wget https://people.osmocom.org/~tnt/ice1usb/pps/icE1usb-fw-0.2-71-gf1e228d-dirty.bin
sudo dfu-util -e
sudo dfu-util -d 1d50:6144 -a 1 -D icE1usb-fw-0.2-71-gf1e228d-dirty.bin -R
You'll want to restart the Pi after that, as it will move the device to ttyACM1 and that's annoying.
gpsd and chrony have a bit of a dependency loop. What I came up with was some small mods to the chrony.service file:
[Unit]
...
StartLimitInterval=200
StartLimitBurst=10
[Service]
Restart=always
RestartSec=30
...
Then put this in /etc/default/gpsd:
# Devices gpsd should collect to at boot time.
# They need to be read/writeable, either by user gpsd or the group dialout.
DEVICES="/dev/ttyACM0"
# Other options you want to pass to gpsd
GPSD_OPTIONS="-n"
# Automatically hot add/remove USB GPS devices via gpsdctl
USBAUTO="true"
And this at end of /etc/chrony/chrony.conf:
refclock PPS /dev/pps0 lock NMEA refid PPS
refclock SHM 0 refid NEMA precision 1e-1 offset 0.0 noselect
allow
Finally, just run:
sudo systemctl enable --now gpsd chronyd
Monitor with something like:
sudo chronyc -n sources; sudo chronyc -n sourcestats; sudo chronyc -n tracking
The following links were helpful to me at one point or another:
https://osmocom.org/projects/octoi/wiki/Getting_Started
https://downloads.osmocom.org/docs/latest/icE1usb-usermanual.pdf
https://downloads.osmocom.org/binaries/icE1usb/firmware/latest/