One Pi, Two Dongles, Two Maps, Two Receivers

DUMP1090-FA

The method for dump1090-fa is different because:

  1. File /etc/init.d/dump1090-fa does not exist
  2. File /etc/default/dump1090-fa is in a different format. Further, in the Piaware image, it is over-written by piaware-config at restart of piaware or reboot of Pi.

In view of above, following method is adopted to run second Dongle with 2nd instance of dump1090-fa.

DETAILED PROCEDURE

STEP-1: Serialize Dongles

Serialize two dongles (DVB-T / ProStick), one serial number 00000000, other serial number 00000001

Stop dump1090-mutability.
Plug in one Dongle into Pi, serialize it, and put sticker of serial number.
Unplug first dongle, plugin 2nd dongle and serialize it, and put sticker of serial number.

How to Change Serial Number of Dongle - ADSB 1090 + UAT 978 Dongles Plugged Into Same Pi

STEP-2: Create 2nd instance of dump1090-fa which will use 2nd Dongle.

(1) Create a blank file /etc/init.d/dump1090-fa-2

sudo touch /etc/init.d/dump1090-fa-2

(2) Make new file executable

sudo chmod +x /etc/init.d/dump1090-fa-2   

(3) Open newly created blank file to edit

sudo nano /etc/init.d/dump1090-fa-2   

(4) Copy-paste following code in new blank file

#!/bin/sh
### BEGIN INIT INFO
# Provides:          dump1090-mutability
# Required-Start:    $remote_fs $network
# Required-Stop:     $remote_fs $network
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: dump1090 daemon (mutability variant)
# Description:       Receives ADS-B messages from a RTLSDR dongle
#                    and makes them available to other applications via
#                    a variety of network protocols.
### END INIT INFO

# Do NOT "set -e"

# PATH should only include /usr/* if it runs after the mountnfs.sh script
PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC="dump1090-fa-2 daemon"
NAME=dump1090-fa-2
DAEMON=/usr/bin/dump1090-fa
ARGS="--measure-noise "
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME

# Exit if the package is not installed
[ -x "$DAEMON" ] || exit 0

# Read configuration variable file if it is present
[ -r /etc/default/$NAME ] && . /etc/default/$NAME

# work out daemon args

# sanitize missing settings
[ -z "$START_DUMP1090" ] && START_DUMP1090=no
[ -z "$DUMP1090_USER" ] && DUMP1090_USER="missing-DUMP1090_USER-setting-in-config"
[ -z "$RAW_INPUT_PORT" ] && RAW_INPUT_PORT=0
[ -z "$RAW_OUTPUT_PORT" ] && RAW_OUTPUT_PORT=0
[ -z "$SBS_OUTPUT_PORT" ] && SBS_OUTPUT_PORT=0
[ -z "$BEAST_INPUT_PORT" ] && BEAST_INPUT_PORT=0
[ -z "$BEAST_OUTPUT_PORT" ] && BEAST_OUTPUT_PORT=0
[ -z "$NET_BUFFER" ] && NET_BUFFER=0
[ -z "$JSON_INTERVAL" ] && JSON_INTERVAL=0
[ -z "$MAX_RANGE" ] && MAX_RANGE=300

# receiver:
NICELEVEL="--nicelevel -5"
case "x$DEVICE" in
 x|x0) ARGS="$ARGS --net" ;;
 xnone) ARGS="$ARGS --net-only"; NICELEVEL="" ;;
 *) ARGS="$ARGS --net --device-index $DEVICE" ;;
esac
case "x$GAIN" in
 x|xmax) ;;
 xagc) ARGS="$ARGS --gain -10" ;;
 *) ARGS="$ARGS --gain $GAIN" ;;
esac
if [ -n "$PPM" ]; then ARGS="$ARGS --ppm $PPM"; fi

# decoder:
if [ "x$FIX_CRC" = "xyes" ]; then ARGS="$ARGS --fix"; fi
if [ -n "$LAT" ]; then ARGS="$ARGS --lat $LAT"; fi
if [ -n "$LON" ]; then ARGS="$ARGS --lon $LON"; fi
ARGS="$ARGS --max-range $MAX_RANGE"

# net:

ARGS="$ARGS \
--net-ri-port $RAW_INPUT_PORT --net-ro-port $RAW_OUTPUT_PORT \
--net-bi-port $BEAST_INPUT_PORT --net-bo-port $BEAST_OUTPUT_PORT \
--net-sbs-port $SBS_OUTPUT_PORT"
if [ -n "$NET_HEARTBEAT" ]; then ARGS="$ARGS --net-heartbeat $NET_HEARTBEAT"; fi
if [ -n "$NET_OUTPUT_SIZE" ]; then ARGS="$ARGS --net-ro-size $NET_OUTPUT_SIZE"; fi
if [ -n "$NET_OUTPUT_INTERVAL" ]; then ARGS="$ARGS --net-ro-interval $NET_OUTPUT_INTERVAL"; fi
if [ "$NET_BUFFER" -le "65536" ]; then ARGS="$ARGS --net-buffer 0"
elif [ "$NET_BUFFER" -le "131072" ]; then ARGS="$ARGS --net-buffer 1"
elif [ "$NET_BUFFER" -le "262144" ]; then ARGS="$ARGS --net-buffer 2"
else ARGS="$ARGS --net-buffer 3"; fi
if [ -n "$NET_BIND_ADDRESS" ]; then ARGS="$ARGS --net-bind-address $NET_BIND_ADDRESS"; fi

# misc:
if [ -n "$STATS_INTERVAL" ]; then ARGS="$ARGS --stats-every $STATS_INTERVAL"; fi
if [ -n "$JSON_DIR" ]; then ARGS="$ARGS --write-json $JSON_DIR"; fi
if [ -n "$JSON_INTERVAL" ]; then ARGS="$ARGS --write-json-every $JSON_INTERVAL"; fi
case "x$JSON_LOCATION_ACCURACY" in
  xexact) ARGS="$ARGS --json-location-accuracy 2" ;;
  xapproximate) ARGS="$ARGS --json-location-accuracy 1" ;;
  *) ARGS="$ARGS --json-location-accuracy 0" ;;
esac

if [ "x$LOG_DECODED_MESSAGES" != "xyes" ]; then ARGS="$ARGS --quiet"; fi

if [ -n "$EXTRA_ARGS" ]; then ARGS="$ARGS $EXTRA_ARGS"; fi

# Load the VERBOSE setting and other rcS variables
. /lib/init/vars.sh

# Define LSB log_* functions.
# Depend on lsb-base (>= 3.2-14) to ensure that this file is present
# and status_of_proc is working.
. /lib/lsb/init-functions

#
# Function that starts the daemon/service
#
do_start()
{
        # Return
        #   0 if daemon has been started
        #   1 if daemon was already running
        #   2 if daemon could not be started

        if [ "x$START_DUMP1090" != "xyes" ]; then
            log_warning_msg "Not starting $NAME daemon, disabled via /etc/default/$NAME"
            return 2
        fi

        start-stop-daemon --start --quiet --pidfile $PIDFILE --user "$DUMP1090_USER" --exec $DAEMON --test > /dev/null \
                || return 1

        # create JSON_DIR with the appropriate permissions
        # (it is on /run by default, so will be lost on reboot)
        if [ "x$JSON_DIR" != "x" ]; then
           if [ ! -e $JSON_DIR ]; then
             (mkdir $JSON_DIR && chmod 0755 $JSON_DIR && chown $DUMP1090_USER $JSON_DIR) || log_warning_msg "Failed to create $JSON_DIR"
           fi
        fi

        # create logfile with the appropriate permissions if not already there
        touch $LOGFILE
        chown "$DUMP1090_USER":root $LOGFILE

        start-stop-daemon --start $NICELEVEL --quiet --pidfile $PIDFILE --user "$DUMP1090_USER" --chuid "$DUMP1090_USER" --make-pidfile --background --no-close --exec $DAEMON -- \
                $ARGS >>$LOGFILE 2>&1 \
                || return 2
        sleep 1
}

#
# Function that stops the daemon/service
#
do_stop()
{
        # Return
        #   0 if daemon has been stopped
        #   1 if daemon was already stopped
        #   2 if daemon could not be stopped
        #   other if a failure occurred
        start-stop-daemon --stop --retry=TERM/30/KILL/5 --pidfile $PIDFILE --user "$DUMP1090_USER" --exec $DAEMON
        RETVAL="$?"
        [ "$RETVAL" = 2 ] && return 2
        sleep 1
        # Many daemons don't delete their pidfiles when they exit.
        rm -f $PIDFILE
        return "$RETVAL"
}

case "$1" in
  start)
        [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
        do_start
        case "$?" in
                0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
                2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
        esac
        ;;
  stop)
        [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
        do_stop
        case "$?" in
                0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
                2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
        esac
        ;;
  status)
        status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
        ;;
  restart|force-reload)
        log_daemon_msg "Restarting $DESC" "$NAME"
        do_stop
        case "$?" in
          0|1)
                do_start
                case "$?" in
                        0) log_end_msg 0 ;;
                        1) log_end_msg 1 ;; # Old process is still running
                        *) log_end_msg 1 ;; # Failed to start
                esac
                ;;
          *)
                # Failed to stop
                log_end_msg 1
                ;;
        esac
        ;;
  *)
        echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2
        exit 3
        ;;
esac

:


.

(5) Save file (Ctrl+o) and close it (Ctrl+x)

(6) IMPORTANT : Enable Daemon dump1090-fa-2 to autostart at boot.

sudo update-rc.d dump1090-fa-2 defaults   
sudo systemctl daemon-reload    

(7) Create a new blank file /etc/default/dump1090-fa-2

sudo nano /etc/default/dump1090-fa-2

(8) Copy-paste following code into this blank file, and Save (Ctrl+o)

# dump1090-fa-2 configuration file
# This is a POSIX shell fragment.
# You can edit this file directly.

# Set to "yes" to start dump1090 on boot.
START_DUMP1090="yes"

# User to run dump1090 as.
DUMP1090_USER="dump1090"

# Logfile to log to
LOGFILE="/var/log/dump1090-fa-2.log"

#
# Receiver options
#

# RTLSDR device index or serial number to use
# If set to "none", dump1090 will be started in --net-only mode
DEVICE="1"

# RTLSDR gain in dB.
# If set to "max" the maximum supported gain is used.
# If set to "-10" (the default) the tuner AGC is used to set the gain.
GAIN="-10"

# RTLSDR frequency correction in PPM
PPM="0"

#
# Decoding options
#

# If yes, fixes messages with correctable CRC errors.
FIX_CRC="yes"

# If set, supplies a reference location for local position decoding.
LAT=""
LON=""

# If set, provides the absolute maximum receiver range used to
# filter bad position reports, and to determine when local position
# decoding is safe to use. Specify this in nautical miles (NM).
MAX_RANGE="300"

#
# Networking options
#

# Port to listen on for raw (AVR-format) input connections. 0 disables.
RAW_INPUT_PORT="31001"

# Port to listen on for raw (AVR-format) output connections. 0 disables.
RAW_OUTPUT_PORT="31002"

# Port to listen on for SBS-format output connections. 0 disables.
SBS_OUTPUT_PORT="31003"

# Port to listen on for Beast-format input connections. 0 disables.
BEAST_INPUT_PORT="31004,31104"

# Port to listen on for Beast-format output connections. 0 disables.
BEAST_OUTPUT_PORT="31005"

# TCP heartbeat interval in seconds. 0 disables.
NET_HEARTBEAT="60"

# Minimum output buffer size per write, in bytes.
NET_OUTPUT_SIZE="500"

# Maximum buffering time before writing, in seconds.
NET_OUTPUT_INTERVAL="1"

# TCP buffer size, in bytes
NET_BUFFER="262144"

# Bind ports on a particular address. If unset, binds to all interfaces.
# This defaults to binding to localhost. If you need to allow remote
# connections, change this.
#NET_BIND_ADDRESS="127.0.0.1"

#
# Misc options
#

# Interval (in seconds) between logging stats to the logfile. 0 disables.
STATS_INTERVAL="3600"

# Path to write json state to (for use with an external webserver). Blank disables.
JSON_DIR="/run/dump1090-fa-2"

# Interval between writing json state (in seconds). 0 disables.
JSON_INTERVAL="1"

# Accuracy of receiver location to write to json state, one of "exact" / "approximate" / "none"
JSON_LOCATION_ACCURACY="approximate"

# Set to yes to log all decoded messages
# This can get large fast!
LOG_DECODED_MESSAGES="no"

# Additional options that are passed to the Daemon.
EXTRA_ARGS=""
NET_BIND_ADDRESS=""

.

(9) The file /etc/default/dump1090-fa-2 is configuration file for dump1090-fa-2.
Add your required Gain, Latitude and Longitude in it in following lines:

# RTLSDR gain in dB.
# If set to "max" the maximum supported gain is used.
# If set to "-10" (the default) the tuner AGC is used to set the gain.
GAIN="-10"


# If set, supplies a reference location for local position decoding._
LAT=""
LON=""

STEP-3: Enable 2 Separate Maps for 2 Dongles.

Map 1 at < IP OF PI >/dump1090-fa/
Map 2 at < IP OF PI >/dump1090-fa-2/

(1) Make a copy of FOLDER /usr/share/dump1090-fa with name /usr/share/dump1090-fa-2. This folder contains folder html which contains all map files.

cd /usr/share    
sudo cp -r dump1090-fa dump1090-fa-2    

(2) Create new file /etc/lighttpd/conf-available/89-dump1090-fa-2.conf

sudo nano /etc/lighttpd/conf-available/89-dump1090-fa-2.conf  

(3) Copy-paste following code in the newly created blank file 89-dump1090-fa-2.conf

# Allows access to the static files that provide the dump1090 map view,
# and also to the dynamically-generated json parts that contain aircraft
# data and are periodically written by the dump1090 daemon.


alias.url += (
  "/dump1090-fa-2/data/" => "/run/dump1090-fa-2/",
  "/dump1090-fa-2/" => "/usr/share/dump1090-fa-2/html/"
)


# redirect the slash-less URL
url.redirect += (
  "^/dump1090-fa-2$" => "/dump1090-fa-2/"
)

.
(4) Save file (Ctrl+o) and close (Ctrl+x)

(5) IMPORTANT : Enable lighttpd module dump1090-fa-2

sudo lighty-enable-mod dump1090-fa-2   
sudo /etc/init.d/lighttpd force-reload   

(6) REBOOT PI

MAP-1

http:// < IP-OF-PI >/dump1090-fa/

MAP-2

http:// < IP-OF-PI >/dump1090-fa-2/