TETRA

Motorola

Motorola

Setting up Dummy and LogCollector for a TETRAPack connection

Disclaimer

Hardware requirements

Prep work

CTS Setup

  1. Get a clear view of how the CTS is configured, and its necessary configuration files: bssparams.txt, set_x_gp, gm, sc, sub.csv, etc. Please make sure everything works as a standalone site before starting this entire endeavour!
  2. You also need good way to remotely connect to the CTS management interface (VNC is a good option).
  3. Plan ahead and make a list of the BrandMeister TGs you want your CTS to handle. Add them already to set_x_gp and gm.csv, reboot everything and make sure they already work locally in standalone mode.
  4. Open up bssparams.txt on your CTS, and do the following edits. Don't change anything else at this state:
    ## Base-Station Parameters ################################################################
    #### Set the name to something simple, short, no special caracters
    /base-station/name = "CTSBS";
    #### set this to id 1
    /base-station/base-station-id = 1;
    #### add or replace:
    /base-station/standalone-mode = false;
    #### add or replace:
    /base-station/use-local-site-fall-back = false;
    
    ## Air Interface BLE Parameters ###########################################################
    /base-station/BLE/neighbour-cells = 191;
    
    ## SDS Gateway Parameters #################################################################
    #### Remove all other lines, replace by:
    /system/sds-gateway/host-1 = { issi = 262999; ip-address = "44.225.64.18";};
    /system/sds-gateway/host-2 = { issi = 250999; ip-address = "44.225.64.19";};
    /system/sds-gateway/host-3 = { issi = 16777184; ip-address = "44.225.64.20";};
    # These ISSIs will be used for SMS and GPS services (via GWPC emulation, IP addresses don't matter)
    
    ## E1 Layout Parameters ###################################################################
    ### Remove all other E1 layout lines, and replace byt this:
    /network/E1-layout/time-slot-01 = { source-type = "SIGNALLING"; };
    /network/E1-layout/time-slot-02 = { source-type = "SIGNALLING"; };
    /network/E1-layout/time-slot-03 = { source-type = "SIGNALLING"; };
    /network/E1-layout/time-slot-04 = { source-type = "SIGNALLING"; };
    
    #### Real BS transceivers
    /network/E1-layout/time-slot-17 = { source-type = "BS"; base-station-id = 1; l-transceiver-id = 11; };
    
    #### Dummy's emulated BS transceivers
    /network/E1-layout/time-slot-22 = { source-type = "BS"; base-station-id = 8; l-transceiver-id = 11; u-transceiver-id = 12;};
    /network/E1-layout/time-slot-23 = { source-type = "BS"; base-station-id = 8; l-transceiver-id = 13; u-transceiver-id = 14;};
    /network/E1-layout/time-slot-24 = { source-type = "BS"; base-station-id = 8; l-transceiver-id = 15; u-transceiver-id = 16;};
    /network/E1-layout/time-slot-25 = { source-type = "BS"; base-station-id = 8; l-transceiver-id = 17; u-transceiver-id = 18;};
    
    #### Dummy's emulated GWPC encoders
    /network/E1-layout/time-slot-26 = { source-type = "DISP"; };
    /network/E1-layout/time-slot-27 = { source-type = "ISDN"; };
    /network/E1-layout/time-slot-28 = { source-type = "ISDN"; };
    /network/E1-layout/time-slot-29 = { source-type = "ISDN"; };
    /network/E1-layout/time-slot-30 = { source-type = "ISDN"; };
    
    
    ## Network Topology Parameters ############################################################
    #### Remove all other network topology parameters, and replace by this. Don't forget to change CTSNAME to the same name as in line 3!
    /network/topology/gateway-pc     = { name = "Gateway Server"; E1-connection-1 = "BS-8"; };
    /network/topology/base-station-1 = { name = "CTSBS"; E1-connection-1 = "BS-8"; };
    /network/topology/base-station-8 = { name = "DUMMY"; E1-connection-1 = "BS-1"; E1-connection-2 = "GW-PC"; };
    
    
  5. Save and reboot the CTS, make sure it still works.
  6. Copy bssparams.txt over to your local PC, you'll need it for your Raspberry Pi.
  7. Write down the IP address of your CTS BSC computer (mine was 10.10.15.31, but yours will probably be different). 

Software Stack Install

  1. Prepare an SD card with a 64-bit Raspbian Bookworm (Debian 12)
  2. Update/Upgrade the OS after boot:
    sudo apt update && sudo apt upgrade
    reboot

  3. Add the Osmocom repo, as per Osmocom's documentation:
    sudo su
    OSMOCOM_REPO="https://downloads.osmocom.org/packages/osmocom:/latest/Debian_12" 
    wget $OSMOCOM_REPO/Release.key
    mv Release.key /etc/apt/trusted.gpg.d/osmocom-latest.asc
    echo "deb [signed-by=/etc/apt/trusted.gpg.d/osmocom-latest.asc] $OSMOCOM_REPO/ ./" > /etc/apt/sources.list.d/osmocom-latest.list
    apt update
  4. Install Osmocom E1D:
    sudo apt install osmo-e1d
  5. Add the TetraPack repository:
    wget https://packages.tetrapack.online/install/public.key
    mv public.key tetrapack.asc
    sudo apt-key add tetrapack.asc
    sudo echo "deb [arch=arm64] http://packages.tetrapack.online/repository/ bookworm main" > /etc/apt/sources.list.d/tetrapack.list
    sudo apt update
  6. Install TetraPack dummy and cts-logcollector
    sudo apt install tetrapack-dummy cts-logcollector
  7. Plug in the icE1USB to your Rpi, recover the interface serial number:
    sudo lsusb -d 1d50:6145 -v 2> /dev/null | grep iSerial
  8. Open (with for instance nano) /etc/osmocom/osmo-e1d.cfg, copy/paste this:
    log syslog daemon
    e1d
     interface 0 icE1usb
      usb-serial [interface serial number]
      line 0
  9. Reload the service:
    sudo systemctl restart osmo-e1d
  1. Make sure Dummy is off with:
    sudo systemctl stop dummy@default.service 
  2. Open/Create /opt/TetraPack/bssparams.txt, and copy/paste the contents from the file created at the CTS setup step. Edit the following lines
    
    ## System Parameters #####################################################################
    ### Edit/Replace
    /system/name = "DUMMY";
    
    
    ## Base-Station Parameters ################################################################
    ### Edit/Replace
    /base-station/name = "DUMMY";
    /base-station/base-station-id = 8;
  3. Open/Create /opt/TetraPack/default.env
    # E1D interface and line in format [interface number].[line number]
    DUMMY_LINE=0.0
    
    # Path to CTS topology file (bss3.txt or bssparams.txt)
    DUMMY_TOPOLOGY=/opt/TetraPack/bssparams.txt
    
    # IP address and mask for CTS VTUN interface
    DUMMY_NETWORK="192.168.0.8 mask 255.255.255.0"
    
    # Specific options (multiple values can be delimited with comma):
    # replace-forwarded-link-status - replace IP-forwarded status for both E1 lines status of local BSs/GWPC to up
    # emulated-bs-line1-down        - set E1-1 status of emulated BS to down
    # emulated-bs-line2-down        - set E1-2 status of emulated BS to down
    # emulated-gwpc-line1-down      - set E1-1 status of emulated GWPC to down
    # emulated-gwpc-line2-down      - set E1-2 status of emulated GWPC to down
    DUMMY_OPTION=
    
    # Server connection URI in format http(s)://[user]:[password]@[address]/[path and parameters]
    # If you care about securely stored password, please put credentials into /opt/TetraPack/.netrc (man netrc)
    # REPLACE <YOUR DMR-ID> and <YOUR HOTSPOT/REPEATER PASSWORD> with your radio ID and password :)
    DUMMY_CONNECTION="http://<YOUR DMR-ID>:<YOUR HOTSPOT/REPEATER PASSWORD>@core.tetrapack.online:8081/dummy/?mode=bs+gwpc"
    
    # Instance name for D-BUS IPC interface
    DUMMY_INSTANCE=default
    
  4. Save everything, cross your fingers and connect E1.1 from your BSC to the left port of icE1usb, like so:

    image.png

  5. The matching LED on the port should stop blinking, and the red LED on E1-1 should turn off. 
  6. Try to start dummy from the console:
    cd /opt/TetraPack
    ./run.sh default.env
    
    # First, read starup messages and check that configuration (default.env and bssparams.txt) parsed successfuly
    # Second, check connection: if you see, in blue, "Q.921 connection established", congratulations! Your E1 link works!
    # You should also see "Socket Connection Established" - this means, connection to server established
  7. If everything works, Ctrl+C to stop the console instance, and enable the service + start it
    sudo systemctl start dummy@default.service

LogCollector - CTS Management interface setup

  1. Connect the USB/Ethernet interface to the Pi, and connect an Ethernet cable from BSC management port to the usb dongle. 
  2. Stop LogCollector:
    sudo systemctl stop cts-logcollector@default.service
  3. Set a static IP on the interface (probably eth1) on the same range as the BSC, by editing /etc/dhcpcd.conf and adding this:
    # Don't forget to edit your ip address to match the range of your BSC!
    interface eth1
    static ip_address=10.10.15.20
    static routers=10.10.15.1
  4. Test if you can connect via telnet:
    telnet [BSC IP ADDR] 51600
    #If you get "220 Network Management Interface is ready.", you're good to go!
  5. Through that telnet interface, you can check if you got a good E1 link with Dummy:
    login a
    cd network
    netstat
    #Look at the table that pops up, and focus on the "Links" column
    #260-rsp
    #260-Node    Links     DD      AI    ISDN    DISP
    #260---------------------------------------------
    #260-BS-1      u -      u       u       -       -
    #260-BS-2      ? ?      ?       ?       -       -
    #260-BS-3      ? ?      ?       ?       -       -
    #260-BS-4      ? ?      ?       ?       -       -
    #260-BS-5      ? ?      ?       ?       -       -
    #260-BS-6      ? ?      ?       ?       -       -
    #260-BS-7      ? ?      ?       ?       -       -
    #260-BS-8      u u      u       u       -       -
    #260-GWPC      d u      u       -       u       d
    #260-
    #260 .
    #BS-1 should have first link on U, BS-8 should have both U, and GWPC should have D U
    #If it's not the case, check the topology with:
    cd topology
    ls
    #Should show this: 
    #260-      d-- gateway-pc
    #260-      d-- base-station-1
    #260-      d-- base-station-8
    #If not, check your bssparams.txt on both the CTS and the Pi, something is wrong. 
    
    
    
  6. Close the Telnet session (Ctrl+c), open /opt/LogCollector/default.env, and change the ip address:
    # [IP of basestation] [dummy instance name] [basestation ID (1-8)]
    COMMAND_ARGUMENTS=[YOUR BSC IP] default 1
  7. Enable/Restart LogCollector, wait for a bit and see if you get data coming from the CTS when you place a call or attach to a group:
    sudo systemctl enable cts-logcollector@default.service
    sudo systemctl start cts-logcollector@default.service
    #Let's monitor syslog to see if it recovers logs from the CTS. You should see a bunch of lines show up.
    tail -f /var/log/syslog | grep cts
  8. If it works, great! LogCollector is ready. Ctrl+C to quit tail, carry on to the rest
Motorola

EBTS

Introduction 

  1. No LST! (No Red Lights on TSC, and No Annoying Notification on the Front of your Radios)
  2. Network Wide Group Calling - TGS Configured in our Core are Routed between ALL Linked BTS Sites
  3. Local Site Private Calling - Having a Linked site allows for 1-1 Private Calling (NOT FULL DUPLEX). Simply Dial the ISSI Number of the radio you wish to dial and hit PTT, this will call the radio and establish a 1-1 Call
  4. Wide Area Private Calling - As Above, Just across the network! - Call your buddys across the world via their ISSI Number.

The aim of this guide is to help you get your EBTS connected to our Virtual Core, and enjoy all TETRA features (+ TPC interconnects, coming soon™). 

Disclaimer

Prep Work

Connection methods

Option 1 - Cisco router

Untitled.jpg

The complete setup will look like this:

Untitled Diagram.drawio.png

Raspberry Pi Setup

  1. Prepare an SD Card with a 64-Bit version of Raspberry OS Lite(Bookworm being the latest, We Don't Need a GUI). Don't forget to configure SSH and WiFi if you plan to use it. You can also use an additional USB/Ethernet dongle instead of Wifi (you'll need an available ethernet port to connect to the Cisco Router either way).
  2. Update/Upgrade the OS after boot:
    sudo apt get update && sudo apt upgrade
    reboot
  3. Download and run the following configuration script. This will create the bridging interface, and add you to the ZeroTier network: 
    wget https://packages.tetrapack.online/install/tools/EBTS/CiscoBridge.sh | sudo bash
  4. Connect the USB-Ethernet dongle if needed, and reboot. Connect the Cisco Router FastEthernet0/0 port to the dongle, and your WAN network to the Pi's onboard jack (or to the main Pi Ethernet jack if you're using Wifi to get online).


    Sometimes the Pi will pick either the internal Eth or the Dongle Eth to be Eth0. If you notice that you cannot get a connection via your LAN to the Pi, try swapping the connection to the Cisco over.

Cisco Router Setup

  1. Connect your computer to the Console port of the router (via either an USB/RS232 adapter or a native DB9 port if you're lucky enough to still have one). Open up your favourite terminal program (I personally use putty) at 9600 baud. 
  2. Follow these steps to reset your router to factory defaults.
  3. Once you finish step 8 on this before-mentioned guide, type "no" then enter. 
  4. Check your Firmware Version:
    show version
    Cisco IOS Software, C2600 Software (C2600-IPBASEK9-M), Version 12.4(12), RELEASE SOFTWARE (fc1) is Required
  5. If you see any other version than what's mentioned above, reach out to one of the Core Network Team to update it. 
  6. Open the Cisco Router config file you received (see "Prep Work") and copy its content (Ctrl+C). Enable the console and enter configuration mode: 
    config t
    Ctrl+V (paste)
    end
    write mem
  7. Once done, you should be able to ping the Core via:
    ping 192.168.250.254
  8. Almost there! If for some reason your FastEthernet0/0 interface didn't go up, type: 
    config t
    int Fast0/0
    no shutdown
    end
    write mem

Option 2 - icE1usb interface

Please read article FrameRelay-over-E1 Daemon (FRED)

After FRED install please edit /opt/FRED/default.env and run following command:

sudo /opt/FRED/dimetra-setup.sh

EBTS Site Controller

  1. Connect a USB/RS232 (or native DB9, again) from your computer to the service access port of the TSC. Open up BTS Service Software (aka TESS), select Dimetra R8. Password is Sys*mgr123$%. Under Configuration ==> Direct Settings, make sure you selected the right COM Port. 
  2. Select Connection ==> Connect Direct. Turn on the TSC and wait for it to boot up completely. If it's already on, just press on enter, you should get a prompt for a user/password. Defaults should be factory/factory. 
  3. Select Upload Configuration, and download the latest file from the Site Controller. Once done, close the connection via Connection ==> Close Connection.
  4. Open the TSC Configuration file you just pulled via File ==> Open. Edit the Site Configuration via Personality ==> Modify. Click on "Edit Site Controller"
  5. From the Core Team, you should have received the following data: Site ID, BTS IP Address, PVC Primary, PVC Backup and Network Mgr IP Address. Make sure you have them close by, you'll need them now.
  6. Check your configuration matches the screenshots below, and copy over your site-specific data: 

    image.pngimage.png

     

    Untitled.jpgUntitled.jpg

    Untitled.jpgimage.png

     

     

    Untitled.jpgimage.png

     

  7. Once you're finished, double check everything. Save the file, and reconnect to the TSC (Connection ==> Connect Direct). 
  8. Click on Connection ==> Send Files. Select "Configuration Files" and select the file you just saved. In the “File Download” window, enter a version label, check “Use Next” and click on “Update Selected Items”. Press OK to start the transfer. You'll get a prompt to select which configuration file to replace. Select the one with all the minus signs.
  9. Remember when uploading the new configuration to update the "Use Next" Flag
  10. Reset the TSC by issuing the "reset" command on the terminal. Wait for the reboot, and log yourself in again (with factory/factory)
  11. Type the following commands to enable Site Link: 
    .sitelink -e1
    .e1config -crdStart 1 -crd 31 -ts16Skip off -portNo 1 -crc on
    reset
  12. After reboot, your TSC should now be connected to the Core Network! Enjoy :)

Final Steps

Once you have connected your BTS to the Core Network, Please go to https://map.tetrapack.online and register your user.
When an admin approves your user, you can log in and add your BTS to the map!

You will need the following information available when registering your BTS:
Zerotier Client ID: you will get this when setting up your Pi for Either Cisco or FRED configuration. 
TX Frequency
RX Frequency
Duplex Table
Duplex Spacing

Once the BTS is approved by an Admin it will appear automatically on our BTS Map!

Cable Management Mod for Option 1

I found it quite convenient to put the Pi inside the empty Primary Network Module slot. A small mounting plate with double sided tape, another one for the USB/Eth dongle, and it's already much cleaner! 

Untitled.jpg

Bonus points if you use the Cisco Router's power supply to supply 5V to the Pi! Just solder a couple of wires on the edge card connector at the front of the router's mainboard. Leftmost pin is GND, then 12V (don't solder there!) then 5V. Double and triple check with a multimeter before hooking the Pi up. 

image.pngimage.png

Pins 2 and 6 on the Pi can respectively be used as 5V and GND. An old servo connector does the job quite well! 

Untitled.jpg

Motorola

Dummy

Intro

* Some revisions of Raspberry Pi 3 have issues with icE1usb connection stability due to USB NIC

P2-TP-Feb2023.pdf

Configuration

Default configuration file is /opt/TetraPack/default.env

# E1D interface and line in format [interface number].[line number]
DUMMY_LINE=0.0

# Path to CTS topology file (bss.txt or bssparams.txt)
DUMMY_TOPOLOGY=/opt/TetraPack/bssparams.txt

# IP address and mask for CTS VTUN interface
DUMMY_NETWORK="192.168.0.8 mask 255.255.255.0"

# Specific options (multiple values can be delimited with comma):
# replace-forwarded-link-status - replace IP-forwarded status for both E1 lines status of local BSs/GWPC to up
# emulated-bs-line1-down        - set E1-1 status of emulated BS to down
# emulated-bs-line2-down        - set E1-2 status of emulated BS to down
# emulated-gwpc-line1-down      - set E1-1 status of emulated GWPC to down
# emulated-gwpc-line2-down      - set E1-2 status of emulated GWPC to down
DUMMY_OPTION=

# Server connection URI in format http(s)://[user]:[password]@[address]/[path and parameters]
# If you care about securely stored password, please put credentials into /opt/TetraPack/.netrc (man netrc)
DUMMY_CONNECTION="http://xxxxxx:password@core.tetrapack.online:8081/dummy/?emulation=bs+gwpc"

# Instance name for D-BUS IPC interface
DUMMY_INSTANCE=default

Connection URL

Parameters:

Topology

bssparams.txt is used to map CTS system topology and E1 layout as well as a system configuration. Parameter /base-station/base-station-id is used as identifier of emulated basestation (identifier of GWPC is hardcoded in CTS).

A capacity (amount of concurrent calls) of emulated basestation depends on amount on configured virtual transceivers for this basestation. Capacity = [count of transceivers] * 4 - 1

Please keep in mind that due to specific of CTS system topology must me configured as a chain of nodes, connected end-to-end. For example if you have two physical BSs, topology file has to be configured in scheme BS1 <-> BS2 <-> emulated BS <-> emulated GWPC. Regarding to this scheme you have to have properly configured termination endpoint in the main configuration (.env):

# emulated-bs-line1-down        - set E1-1 status of emulated BS to down
# emulated-bs-line2-down        - set E1-2 status of emulated BS to down
# emulated-gwpc-line1-down      - set E1-1 status of emulated GWPC to down
# emulated-gwpc-line2-down      - set E1-2 status of emulated GWPC to down
DUMMY_OPTION=emulated-gwpc-line1-down

Multiple instances

You can have several separated CTS systems connected to one or more core servers (for example, production and test). For such case you need to have several .env files for each configuration. use sudo ./setup.sh install to register all instances.

Also it's possible to run dummy in command line - sudo ./run.sh <configuration.env>

Motorola

CTS Log Collector

CTS Log Collector is an additional software for Dummy. It connects to CTS basestation via TCP to logging ports and forward log entries to locally installed dummy.

The need

CTS Log Collector does following important things:

Configuration

# [IP of basestation] [dummy instance name] [basestation ID (1-8)]
COMMAND_ARGUMENTS=10.0.0.1 default 1
Motorola

MTS

Motorola's MTS Series of Tetra Base Stations are currently supported in TetraPack.

Installation

curl http://packages.tetrapack.online/install/tools/MTS/mts-setup.sh | sudo bash
Motorola

CTS Updater

CTS Updater (update-cts.py) is a small script to upload and update CTS configuration or database remotely and without restart. Better to run it on the same Linux system where dummy runs.

Utility creates index data, starts specific embedded ftp server, connects to CTS and initiates update. After updating it stops.

Installation

sudo apt install python3-pip python3-pyftpdlib
sudo pip install telnetlib3

Please make sure, you don't use firewall between your CTS and Linux. Also please make sure you have no ftp servers run on Linux system or use port TCP 21.

Usage

$ sudo ./update-cts.py <IP-address of CTS> [db|cfg] <path to folder>

Exit codes:

Update database
$ ls db1/
sum-gm.csv sum-gp.csv sum-sc.csv sum-sub.csv
$ sudo ./update-cts.py 10.2.0.10 db db1 ; echo $?
Update configuration
$ ls -l cfg1/
bssparams.txt
$ sudo ./update-cts.py 10.2.0.10 cfg cfg1 ; echo $?
Motorola

CTS

Motorola CTS-x00 is a series of basestations for CompactTETRA product line of Motorola. Literally its OEM-product of DAMM with software from Frequentis.

Following articles is about how to connect it to TetraPack:

 

Rohill


Rohill

TetraNode

Intro

Rohill TetraNode is pure IP-based solution, for better TetraPack service implementation we decided to use proprietary InterTNX protocol instead of available TetraNode Interconnect Gateway protocol (TIGv2). By this approach we created a special agent software - TetraPack Peak, which should be run inside TetraNode' private IP network and emulates a subset of required TNX functionality. 
BM-TP-2025-TNX.png
On the one side it connects to TNXs directly, on the other side it connects to TetraPack Core system over public Internet.

Limitations

Peak installation and configuration

  1. Add repository and install a package
    curl http://packages.tetrapack.online/install/tools/Debian/add-repository.sh | bash
    sudo apt install -y tetrapack-peak

  2. Configure Peak - /opt/TetraPack/default.env

    # TNX connection settings
    
    # Port settings should correspond to values on your TNXs
    NODE_PORT=39451
    CONFIG_PORT=39450
    
    # That is optional multicast address used by TNXs for discovery
    # If you use broadcast or static configuration, you can comment it 
    CONFIG_ADDRESS=238.1.2.3
    
    # You have to use any free Node ID since Peak emulates a node,
    # exchange and location should be unique inside TetraNode zone
    LOCAL_NODE=3
    LOCAL_EXCHANGE=peak
    LOCAL_LOCATION=peak
    
    # Server connection URI in format http(s)://[user]:[password]@[address]/[path and parameters]
    # If you care about securely stored password, please put credentials into /opt/TetraPack/.netrc (man netrc)
    
    TRANSPORT_CONNECTION="http://core.tetrapack.online:8081/peak/?country=901&network=9999"
  3. Restart service - sudo systemctl restart peak@default
  4. Logs are available in syslog / journald

TNX configuration

Node Settings

as above All Interconnected Nodes must have Numerical ID's

Settings can be configured via WebNMS at the link http://#IP_OF_TNX#/nms/Tnx/Install

The Settings should look Similar to the Below:

image.png

InterTNX

This is usually fine to leave as the Defaults - But the main Setting to Watch out for is in the InterTNX Configuration.
this Watches on a Multicast Address (238.1.2.3 By Default)
It Can be Checked via the TNX WebNMS Configurator:
http://#IP_OF_TNX#/nms/Tnx/InterTnx

image.png

the page should look like the above (If the default configuration is still applied.

If not, Match these Settings.

Network Protocol

as of 03/01/2024 - a bug in the Network Protocols of TNX was discovered when connected to a peak instance.
in that if an ID was registered in the DMR Network, it would then not register via RF to a TetraNode.

in the event that an ID cannot register via RF after connecting to the DMR Network, please wait 10 Mins and reboot the tetra radio.

please check the following URL and ensure that "ForwardRegistration" is set to "Supported" and "LA Timer" is set to "10 Minutes"
http://#IP_OF_TNX/nms/Network/Protocol/Tetra/TetraRegistration

image.png

Telephony (PABX)

as of 2nd January 2025 TetraPack now supports telephony integration directly with Rohill TetraNode.

In order to configure this you need to check a couple of settings at "Network" level within your TNX.
1) http://#IP_OF_TNX/nms/Network/ExternalGateways inside this Page, Create 2 new External Gateways named "16777186" and "16777184"

ExternalGateways

image.png

Gateway - 16777186

image.png

Gateway - 16777184

image.png

2) http://#IP_OF_TNX/nms/Network/Trunks in this section create 2x new Trunks named "16777186" and "16777184" 

image.png

3) Once Created, enter the Trunks and Ensure that both of them match the settings in the Screenshot Below:

image.png

4) http://#IP_OF_TNX/nms/Network/SubscriberProfiles/Default/TrunkMapping - See Here, you will notice a single entry with the name "[0]" - From here copy and paste the below URL in order to create a second entry: http://#IP_OF_TNX/nms/Network/SubscriberProfiles/Default/TrunkMapping?add=%5b1%5d 
Your Page should look like this now:

image.png

5) Configure the TrunkMapping Parameters as per the below Photographs:


Entry [0]

image.png

Entry [1]

image.png

6) Reboot your TNX and once reloaded navigate to http://#IP_OF_TNX/nms/Network/Status/TrunkLocations if everything is configured correctly you should see the 2x Following entries.
(Note - "@3" May show differently, this will be the Node ID of Peak that you configured in "LOCAL_NODE" in the configuration file)

image.png

7) Try and make a PABX call from your Radio (You can access the TetraPack Core Echotest program at Number 600 as a PABX Call)

Hytera

Hytera

PTC760

TETRA

  1. It works on EBTS as well as on CTS.
  2. Group calls, individual calls (duplex and simplex), scan-lists work well. Phone calls require to switch radio to full-duplex mode first (how they are going to make phone calls in half-duplex? ;)).

  3. PD and SDS don’t work at all. Since I have tested it on EBTS and CTS, it’s FW bug (3.5, from the factory). I was checking with adb and it seems there is a kind of mismatch between NB and Android parts of device. At least in case of PD phase of PDP attach finishes well, CHAP works correctly, the problem comes on the latest part of attach on the radio.

  4. It has some specific with spacing configuration. Standard spacings 0-4 are hardcoded in FW. User-defined spacing uses index 7.

    image.png


    image.png


    So if your EBTS/MBTS/MTS uses 7.6 spacing at index 7 there is no problem. But in case of CTS there is a difficult. CTS allows only to configure spacing to indexes 0-4 or so. So since i use CTS as a „hotspot“ with dummy load I decided to switch spacing to index 3 and 8 MHz by moving lower frequency down a bit. Most of CTSs use index 1 with 7.6 to fit to allocation with keeping limitations in mind.

RoIP

Tested on A7 3.5 and A10 4.5 firmwares.

Location / APRS

APRS location information is accepted from the PTC760 via RoIP and RF, configured in the same way as the Dimetra APRS Settings.
The PTC760 also allows you to specify a LIP Location for both TMO/RoIP and DMO separately, meaning your APRS should work between TetraPack and the HAM-TETRA networks seamlessly.

General Location Service Settings

image.png

Example Triggers

image.png

Control Centers (Destinations)

image.png

Remember that on TetraPack there is only 1x destination for Location Data, 200999

 

What you have to know else:
We have call floor management but without late call entry. So when call will be preempted or overlapped the next one will come only when the it begins. Only Scan List are affected with this specific. In general the late call entry is supported by TetraPack inside each GSSI.

Scan lists and SDSs are supported.

Interfacing

Interfacing

E1/T1 Interface

Why not TDMoIP / CESoIP?

Usual E1/T1 over IP protocols use generic frames over IP transfer that makes more than 2 megabits constant rate with up to 8000 packets per second. That approach:

Fur such kind of integrations we prefer to have our own agent software on-site with hardware E1/T1 interfaces.

icE1usb

image.png

We have chosen Osmocom icE1usb as a primary interface for our projects for several reasons:

User manual can be found here.

NOTICE

Please be careful! Or your device will be damaged! Front-panel RJ45 connectors accepts 120 Om E1. Back-panel RJ45 is for GPIO and accepts TTL only. Don't try to connect the device to Ethernet. USB-C port should be connected to computer, since it's just an interface. Minijack connector is only to reprogram firmware. Also please configure properly internal jumpers to master (NE) or slave (NT) E1 mode.

PLEASE READ USER MANUAL FIRST.

Hardware configuration

Almost in all our cases you need this interface in NT (Network Termination) mode. In this mode the interface works as a network side and you can use a normal Ethernet cable for connection (no crossing required).

To change the mode, unscrew the 2 PH0 screws on the side with the 2 RJ45 jacks. You’ll also need to unscrew the nut on the SMA jack on the other side. After that, the cover plate and rubber gasket around the 2 RJ45 jacks can be removed. The PCB can be slid out of the case.

Then swap the jumpers so they match this picture:

R7EkjMk3OLkjHuoP-image.png

Driver installation

You can get Osmocom E1D from Osmocom's Debian repository (amd64, arm64). 

sudo apt install extrepo
sudo extrepo enable osmocom-latest
sudo apt update
sudo apt install -y osmo-e1d

Driver configuration

/etc/osmocom/osmo-e1d.cfg

log syslog daemon
 logging level force-all fatal
e1d
 interface 0 icE1usb
  usb-serial [interface serial number]
  line 0
  line 1

More information about logging section can be found here, here and here.
(If you care about configuration file format, please check the sources here).

How to find a serial number of connected icE1usb:

sudo lsusb -d 1d50:6145 -v 2> /dev/null | grep iSerial

Reload a service:

sudo systemctl restart osmo-e1d

You can also test your configuration from the command line:

sudo osmo-e1d -c /etc/osmocom/osmo-e1d.cfg

Recomended settings

/etc/rsyslog.d/99-e1d.conf 

if ($programname contains "osmo-e1d") and (($msg contains "Received Only 0 bytes") or ($msg contains "TS read underflow")) then {
  ~/dev/null
  stop
}

/etc/systemd/system/osmo-e1d.service.d/override.conf

[Service]
TimeoutStopSec=2s

Issues with the second E1 port

Please note that on many XHCI host controllers there seem to be implementation flaws in the XHCI host controller firmware preventing the activation of both icE1usb ports simultaneously. The XHCI controller firmware erroneously claims that there is insufficient bus bandwidth. However, the same icE1usb hardware/firmware works perfectly fine with OHCI, UHCI and EHCI host controllers. See https://osmocom.org/projects/e1-t1-adapter/wiki/Isochronous_USB_Issues for a user-maintained list of USB hosts / controllers and whether or not they work with two E1 ports.

In most installations it's not a real issue, because of need in a single port only.

We have tested it with following equipment:

Interfacing

FrameRelay over E1

FrameRelay-over-E1 Daemon (FRED)

Intro

Installation

sudo apt install extrepo
sudo extrepo enable osmocom-latest
curl http://packages.tetrapack.online/install/tools/Debian/add-repository.sh | bash
sudo apt install -y osmo-e1d fred

Configuration

Default configuration file is /opt/FRED/default.env

#
# Parameters for FRED binary
#

# E1D interface and line in format <interface number>.<line number>
FRED_LINE=0.0

# E1 slot list in format <first slot>-<last slot>
FRED_SLOT_LIST=1-31

# FrameRelay feature list in format <option>[,...]
# FRF.12-OUTER - outer frame sequence counting and fragmentation (incoming frames only supported)
FRED_FEATURE_LIST=

# DLCI list in format <DLCI>:<type>[,...]
# LMI-DCE-PVC
# IP  - IP bridge (RFC 2427 for IPv4, RFC 2590 for IPv6)
# ETH - Ethernet bridge (RFC 2427)
FRED_DLCI_LIST=0:LMI-DCE-PVC,16:IP,17:IP

# Path to configuration script to manage IP interface configuration on up and down
FRED_SCRIPT=./dimetra-hook.sh

#
# Parameters for dimetra-hook.sh
#

# Zone ID
DIMETRA_ZONE=1

# Local Site ID
DIMETRA_SITE=12

# FrameRelay DLCIs
DIMETRA_DLCI_PRIMARY=16
DIMETRA_DLCI_SECONDARY=17

# When set, routes will be added to FRR's OSPF prefix list
FRR_PREFIX_LIST=dimetra

Use with Dimetra

FRED package includes prepared scripts to establish connection between EBTS and Dimetra MPVPN network. 

sudo /opt/FRED/dimetra-setup.sh

Best settings for EBTS TSC will be:

Multiple instances

You can have several separated systems connected to a local Linux system. For such case you need to have several .env files for each configuration. use sudo ./setup.sh install to register all instances.

Also it's possible to run FRED in command line - sudo ./run.sh <configuration.env>

Detroit (DMR -TETRA) Bridge

Detroit (DMR -TETRA) Bridge

Radio Settings

Specific setting for bridged individual calls

image.png

Specific setting for bridged group calls

Screenshot 2023-09-11 at 21.59.50.png

Location reporting

Core supports LIP and NMEA reports over SDS. Typical ISSI is 200999 (same as in DMR), where xxx is a MCC of connected core.

Settings for Mobile IP-data and WAP

Some points, if you get access via Dimetra-based system:

For Motorola radios you should have these settings in CPS:

image.png

Server Bridging

Server Bridging

Asterisk PBX

Disclaimer

Modules

Environment variables

CODECPACK=/<path>/CodecPack.so

asterisk.conf

[options]
systemname = <numeric ID of local system>

Dialplan

Outbound calls

Dial(Transit/<Core ID>/<ISSI>[/<options>])

Where options are:

By-default duplex individual call with ACELP (0) and normal priority (0) will be created.

Example:

Dial(Transit/2505/${EXTEN}/t)

Inbound calls

Channel variables:

Outbound messages

MessageSend(Transit:<Link ID>[/<Destination ISSI>][,<Source ISSI>[ <External Number>]])

Please keep your eyes on formatting. There no spaces in <to> section, no space after comma in <from> section and only single space between source ISSI and external number.

Channel variables:

Inbound messages

Channel variables:

TransitBridge sends delivery report when terminal requested that. Delivery status depends on the status of dialplan proceeding.

Technical Information

Channel ID format

Specific Hangup-Cause codes

Transit <TETRA disconnect-cause code>

Get TETRA disconnect-cause codes at Table 14.55 in ETSI EN 300 392-2 V3.8.1. Read more about Hangup Cause here.

Dialplan example

exten => 9XXXXXXX,1,Dial(Transit/2505/${EXTEN:1}/t)
same  => n,NoOp(Disconnect Cause: ${HANGUPCAUSE(${HANGUPCAUSE_KEYS()},tech)})
same  => n,HangUp()
exten => 16777184,1,NoOp(Incoming message)
same  => n,NoOp(From: ${MESSAGE(from)})
same  => n,NoOp(To: ${MESSAGE(to)})
same  => n,NoOp(Body: ${MESSAGE(body)})
same  => n,NoOp(TRANSIT_TYPE: ${MESSAGE_DATA(TRANSIT_TYPE)})
same  => n,MessageSend(Transit:2505/${MESSAGE(from)},16777184 911)
same  => n,NoOp(Message send status: ${MESSAGE_SEND_STATUS})
Server Bridging

SVXLink

Note for owners of SVXLink nodes running TetraLogic

Note for owners of SVXReflector servers for TETRA

Administrating SVXLink bridges

Disclaimer about information bellow

Modules

Environment variables

svxlink.conf

[GLOBAL]
MODULE_PATH=/opt/SVXLink/lib/svxlink
CFG_DIR=/opt/SVXLink/etc/svxlink/svxlink.d
LOGICS=DockLogic,ReflectorLogic
LINKS=Link
TIMESTAMP_FORMAT="%c"

# Should be always 8 KHz!
CARD_SAMPLE_RATE=8000

[DockLogic]
TYPE=Dock
RX=Rx1
TX=Tx1
CALLSIGN=<Node call, should be completely the same as ReflectorLogic has>
EVENT_HANDLER=/opt/SVXLink/share/svxlink/events.tcl

# TetraPack Core IPC socket path
SOCKET=/tmp/Dock-<TetraPack Core ID>

# GSSI at TetraPack Core
GSSI=<GSSI of talk group at TetraPack>

# Default ISSI (used when ISSI is unknown)
ISSI=9999

# MNI for Qso:info messages (4 digits for MCC and 5 digits for MNC)
MNI=090116383

[Rx1]
TYPE=Dock

[Tx1]
TYPE=Dock

# Delay (in 60 ms frames) in bridged call start (SVXLink -> TetraPack), required for ISSI detection heuristics 
DELAY=5

# Gain before encoding to ACELP (0.1 .. 1.0, default is 0.5)
GAIN=0.5

[ReflectorLogic]
TYPE=Reflector
HOSTS=<SVXReflector's DNS/IP address>
CALLSIGN="<Node call>"
AUTH_KEY="<Key>"
UDP_HEARTBEAT_INTERVAL=5
DEFAULT_TG=<Bridged SVXReflector's TG>
MONITOR_TGS=<Bridged SVXReflector's TG>
EVENT_HANDLER=/opt/SVXLink/share/svxlink/events.tcl
MUTE_FIRST_TX_LOC=0
MUTE_FIRST_TX_REM=0

[Link]
CONNECT_LOGICS=DockLogic,ReflectorLogic
DEFAULT_ACTIVE=1
TIMEOUT=0

Compatibility chart

Disclaimer: this chart is only about type of services passed between particular systems and TetraPack Core.
For example, location services could work locally inside a system but not handled by TetraPack.


Group calls

Simplex

individual calls

Duplex

individual calls

Phone calls

Text

messaging

Location Packet data

Motorola

CompactTETRA

+ + + + + + +

Motorola 

Dimetra

+ + + + + + +
Hytera RoIP + + + - + + -
Rohill TetraNode + + + + + + -

Legend:

Specifications

Specifications

Brew

Brew

TETRA Homebrew Protocol

Protocol is based on WebSocket version 13 (RFC 6455) without extensions. It's highly recommended to use socket options TCP_NODELAY and TCP_QUICKACK.

Endpoint, authentication

To establish a new connection client should make a HTTP GET call to get web socket's endpoint and pass authentication procedure. Authentication is based on HTTP Digest Access Authentication (RFC 2831). As a result of successful authentication server returns HTTP 200 and a URI to an endpoint to be used for WebSocket connection.

GET /brew/ HTTP/1.1


HTTP/1.1 200 OK

/brew/722e2b04-07ad-4976-ac55-75e845ae4d8a

Server supports following response codes: 101 (Switching protocols), 200 (OK), 301 (Moved), 401 (Unauthorized), 403 (Forbidden), 404 (Not found), 426 (Upgrade required), 429 (Too many requests), 500 (Internal server error).

WebSocket transport layer

Client should support following frame opcodes:

Binary messages

Every message contains two-byte prefix:

  1. Message class
  2. Message type

All following data has non-aligned values in Little-Endian order

Subscriber control (mobility and affiliation, message class 0xf0)

#define BREW_SUBSCRIBER_DEREGISTER   0
#define BREW_SUBSCRIBER_REGISTER     1
#define BREW_SUBSCRIBER_REREGISTER   2
#define BREW_SUBSCRIBER_AFFILIATE    8
#define BREW_SUBSCRIBER_DEAFFILIATE  9

struct BrewSubscriberControlData
{
  uint8_t kind;        // 0xf0
  uint8_t type;        // BREW_SUBSCRIBER_*
  uint32_t number;     // ISSI
  uint64_t time;       // UNIX timestamp
  uint32_t fraction;   // Nanoseconds
  uint32_t groups[0];  // GSSIs (BREW_SUBSCRIBER_AFFILIATE / BREW_SUBSCRIBER_DEAFFILIATE)
} __attribute__((packed));

TBD

Call control (message class 0xf1)

#define CALL_STATE_GROUP_TX         2   // | Simplified
#define CALL_STATE_GROUP_IDLE       3   // |   Group Call

#define CALL_STATE_SETUP_REQUEST    4   // |                | Origin -> Receiver
#define CALL_STATE_SETUP_ACCEPT     5   // |                | Origin <- Receiver
#define CALL_STATE_SETUP_REJECT     6   // | General        | Origin <- Receiver
#define CALL_STATE_CALL_ALERT       7   // |   Circuit Call | Origin <- Receiver
#define CALL_STATE_CONNECT_REQUEST  8   // |                | Origin <- Receiver
#define CALL_STATE_CONNECT_CONFIRM  9   // |                | Origin -> Receiver
#define CALL_STATE_CALL_RELEASE     10  // |                |

#define CALL_STATE_SHORT_TRANSFER   11  // 

#define CALL_STATE_SIMPLEX_GRANTED  12  // | Simplex Call
#define CALL_STATE_SIMPLEX_IDLE     13  // |   (on top of Circuit Call)

#define CALL_STATE_PDP_REQUEST      14  // |
#define CALL_STATE_PDP_ACCEPT       15  // | Packed Data
#define CALL_STATE_PDP_REJECT       16  // |
#define CALL_STATE_PDP_RELEASE      17  // |

#define PDP_FLAG_IPV4               (1 << 0)
#define PDP_FLAG_IPV6               (1 << 1)

struct BrewCircularCall
{
  uint32_t source;
  uint32_t destination;
  char number[32];        // External number (ASCII)
  uint8_t priority;       // Call priority
  uint8_t service;        // Table 14.79: Speech service
  uint8_t mode;           // Table 14.52: Circuit mode type
  uint8_t duplex;         // Duplex flag
  uint8_t method;         // Table 14.62: Hook method
  uint8_t communication;  // Table 14.54: Communication type
  uint8_t grant;          // Table 14.80: Transmission grant
  uint8_t permission;     // Table 14.81: Transmission request permission
  uint8_t timeout;        // Table 14.50: Call time-out
  uint8_t t30x;           // T301, T303 - Table 14.51: Call time-out, set-up 
  uint8_t ownership;      // Table 14.38: Call ownership
  uint8_t queued;         // Table 14.48: Call queued
} __attribute__((packed));

struct BrewCircularGrant
{
  uint8_t grant;          // Table 14.80: Transmission grant
  uint8_t permission;     // Table 14.81: Transmission request permission
} __attribute__((packed));

struct BrewShortData
{
  uint32_t source;
  uint32_t destination;
} __attribute__((packed));

struct BrewPacketContext
{
  uint32_t number;        // ISSI
  uint8_t flags;          // PDP_FLAG_*
  in_addr_t v4;           // IPv4
  struct in6_addr v6;     // IPv6
  uint32_t profile;       // GSM 04.08 QoS Profile
} __attribute__((packed));

struct BrewCallControlData
{
  uint8_t kind;       // 0xf1
  uint8_t type;       // CALL_STATE_*
  uuid_t identifier;  // Call session UUID
  union
  {
    uint8_t cause;    // Table 14.55: Disconnect cause / GTP cause (ETSI TS 29.060 v3.9.0 7.7)
    struct BrewShortData data;
    struct BrewCircularGrant grant;
    struct BrewPacketContext packet;
    struct BrewCircularCall circular;
    struct BrewGroupTransmission group;
  };
} __attribute__((packed));

TBD

Voice and data frames (message class 0xf2)

#define FRAME_TYPE_TRAFFIC_CHANNEL  0
#define FRAME_TYPE_SDS_TRANSFER     1
#define FRAME_TYPE_SDS_REPORT       2
#define FRAME_TYPE_DTMF_DATA        3
#define FRAME_TYPE_PACKET_DATA      4

struct BrewFrameData
{
  uint8_t kind;       // 0xf2
  uint8_t type;       // FRAME_TYPE_*
  uuid_t identifier;  // Call session UUID
  uint16_t length;    // Length of following data in bits
  uint8_t data[0];
} __attribute__((packed));
FRAME_TYPE_TRAFFIC_CHANNEL

The audio frame contains 60 ms of audio in format, based on STE defined at ETSI TS 100 392-3-6 V1.1.1 (2003-12)

FRAME_TYPE_SDS_TRANSFER

Data field contains full SDS Type 4 PDU. So the first octet of data should contain protocol identifier, defined at ETSI TS 100 392-2 V3.9.1 (2019-01), Table 29.21

FRAME_TYPE_SDS_REPORT

This frame indicates SDS delivery and NOT SDS-TL delivery report. Data contains single-byte status code:

FRAME_TYPE_DTMF_DATA

Data field contains single DTMF code encoded in ASCII: '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '*', '#', 'A', 'B', 'C', 'D' 

FRAME_TYPE_PACKET_DATA

Data field contains an IPv4 or IPv6 packet