User Tools

Site Tools


piaware

PiAware ADS-B Feeder

  • Raspberry Pi Model B v2 mounted in an aluminum alloy enclosure
  • FlightAware Pro Stick Plus USB ADS-B Receiver with 20dB integrated amplifier & 1090MHz filter
  • FlightAware 5dB 1090Mhz vertically polarized antenna ADS-B Antenna - 66cm with N connector
  • IEEE802.3af PoE 48V to 5V (2.4A) Micro USB adapter
  • Holux GR-213 GPS receiver

Maximum range based upon terrain …

Using a generic RTL-SDR (NooElec NESDR Nano 2+) …

Using FlightAware Pro Stick Plus USB ADS-B Receiver with 20dB integrated amplifier & 1090MHz filter …

Live data from the Raspberry Pi...


Setup

  • Burn the latest Piaware image to an SD card & boot up the Pi
  • Login using “Pi” with password “flightaware”
  • Open the terminal
 > sudo raspi-config
    Expand filesystem
    Set the boot option to console with auto login
    Set Wi-Fi country                 "US United States"
    Enable SSH
    Disable serial port console

Patches

 > sudo apt-get update
 > sudo apt-get upgrade

Change default pi password ("flightaware") & set the root password

 > passwd
 > sudo passwd root
 > sudo nano /etc/ssh/sshd_config
    change "PermitRootLogin without-password" to "PermitRootLogin yes"

firewalld

 > sudo apt-get install firewalld

Create firewall service for gpsd

 > sudo nano /etc/firewalld/services/gpsd.xml
    <?xml version="1.0" encoding="utf-8"?>
    <service>  
       <short>gpds</short>  
       <description>gpsd</description>  
       <port protocol="tcp" port="2947"/>  
    </service>
 > sudo chmod 640 /etc/firewalld/services/gpsd.xml 
 > sudo firewall-cmd --permanent --add-service=gpsd

Create firewall service for FlightAware

 > sudo nano /etc/firewalld/services/flightaware.xml
    <?xml version="1.0" encoding="utf-8"?>
    <service>  
       <short>FlightAware</short>  
       <description>FlightAware</description>  
       <port protocol="tcp" port="8080"/>
       <port protocol="tcp" port="30001"/>
       <port protocol="tcp" port="30104"/>
    </service>
 > sudo chmod 640 /etc/firewalld/services/flightaware.xml 
 > sudo firewall-cmd --permanent --add-service=flightaware

STOP HERE & MAKE A COPY OF THE SD CARD


gpsd

 > sudo apt-get install gpsd gpsd-clients python-gps
 > sudo nano /lib/systemd/system/gpsd.socket
    change "ListenStream=127.0.0.1:2947" to "ListenStream=0.0.0.0:2947"
 > sudo nano /etc/default/gpsd
    START_DAEMON="true"
    USBAUTO="false"
    DEVICES="/dev/ttyUSB0"
    GPSD_OPTIONS="-n"
    GPSD_SOCET="/var/run/gpsd.sock"
 > sudo /etc/init.d/gpsd restart
 > cgps -s
 

ntpd

 > sudo apt-get install ntp
 > sudo nano /etc/ntp.conf
    # GPS NMEA data reference
    server 127.127.28.0 minpoll 4
    fudge  127.127.28.0 time1 0.183 refid NMEA
 > sudo service ntp restart
 > sudo firewall-cmd --permanent --add-service=ntp
 > ntpq -p

gpspipe

(This only supports one client, so don't use this. Use gpsd2nmea)

 >  sudo nano gpsd_nmea.sh
     #!/bin/bash
     # Read gpsd output, convert to NMEA and create TCP socket on port 12101
     gpspipe -r | nc -l 12101
 >  sudo chmod +x gpsd_nmea.sh
 >  sudo nano /etc/systemd/system/gpsd_nmea.service
     [Unit]
     Description=gpsd_nmea
     After=gpsd.service
  
     [Install]
     WantedBy=multi-user.target
  
     [Service]
     User=pi
     Type=simple
     ExecStart=/home/pi/gpsd_nmea.sh
  
 >  sudo systemctl enable /etc/systemd/system/gpsd_nmea.service
 >  sudo systemctl start gpsd_nmea
 >  sudo systemctl status gpsd_nmea
 

Create firewall service for gpspipe

 > sudo nano /etc/firewalld/services/gpspipe.xml
    <?xml version="1.0" encoding="utf-8"?>
    <service>  
       <short>gpspipe</short>  
       <description>gpspipe</description>  
       <port protocol="tcp" port="12101"/>
    </service>
 > sudo chmod 640 /etc/firewalld/services/gpspipe.xml 
 > sudo firewall-cmd --permanent --add-service=gpspipe

gpsd2nmea

 >  sudo nano gpsd2nmea.sh
     #!/usr/bin/python
     # 2017 Ilker Temir
     #
     import argparse
     import os
     import socket
     import sys
     import threading
     clients = set()
     addresses = {}
     clients_lock = threading.Lock()
     def listener(client, address):
         if cli_options.verbose:
             print "New connection %s." % str(address)
         addresses[client.fileno()] = address
         with clients_lock:
             clients.add(client)
         try:    
             while True:
                 pass
         finally:
             with clients_lock:
                 clients.remove(client)
          client.close()
     def read_ais_messages(gpsd):
         while True:
             try:
                 ais_message = gpsd.recv(2048)
             except (IOError, socket.error):
                 print 'Error reading from gpsd'
                 sys.exit(1) 
             if cli_options.verbose:
                 log = ais_message.strip()
                 print 'Received NMEA sentence: %s' % log
             clients_to_remove = set()
             clients_lock.acquire()
             for client in clients:
                 try:
                     client.sendall(ais_message)
                 except (IOError, socket.error):
                     clients_to_remove.add(client)
             for client in clients_to_remove:
                 if cli_options.verbose:
                     print "Connection dropped %s." % str(addresses[client.fileno()])
                 clients.remove(client)
             clients_lock.release()
     parser = argparse.ArgumentParser()
     parser.add_argument('--gpsd-server',
                         dest='gpsd_server',
                         default='127.0.0.1',
                         help='gpsd server address (default: 127.0.0.1)')
     parser.add_argument('--gpsd-port',
                         dest='gpsd_port',
                         type=int,
                         default=2947,
                         help='gpsd port number (default: 2947)')
     parser.add_argument('--port',
                         dest='port',
                         type=int,
                         default=2948,
                         help='Listen on TCP port number (default: 2948)')
     parser.add_argument('-v',
                         '--verbose',
                         dest='verbose',
                         action='store_true',
                         help='Enable debug messages')
     cli_options = parser.parse_args()
     try:
         gpsd = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
         gpsd.connect((cli_options.gpsd_server, cli_options.gpsd_port))
         gpsd.send('?WATCH=              
   {"enable":true,"json":false,"nmea":true,"raw":0,"scaled":false,"timing":false,"split24":false,"pps":false}')
     except (IOError, socket.error):
         print 'Error opening connection to %s:%s' % (cli_options.gpsd_server, cli_options.gpsd_port)
         sys.exit(1)
     s = socket.socket()
     s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
     s.bind(('0.0.0.0',cli_options.port))
     s.listen(3)
     ais_thread = threading.Thread(target=read_ais_messages, args=(gpsd,))
     ais_thread.start()
     th = []
     while True:
         client, address = s.accept()
         th.append(threading.Thread(target=listener, args = (client,address)).start())
     s.close()
 >  sudo chmod +x gpsd2nmea.sh
 >  sudo nano /etc/systemd/system/gpsd2nmea.service
     [Unit]
     Description=gpsd2nmea
     After=gpsd.service
  
     [Install]
     WantedBy=multi-user.target
  
     [Service]
     User=USERNAME
     Type=simple
     ExecStart=/home/USERNAME/gpsd2nmea.sh
  
 >  sudo systemctl enable /etc/systemd/system/gpsd2nmea.service
 >  sudo systemctl start gpsd2nmea
 >  sudo systemctl status gpsd2nmea
 

Create firewall service for gpsd2nmea

 > sudo nano /etc/firewalld/services/gpsd2nmea.xml
    <?xml version="1.0" encoding="utf-8"?>
    <service>  
       <short>gpsd2nmea</short>  
       <description>gpsd2nmea</description>  
       <port protocol="tcp" port="2948"/>
    </service>
 > sudo chmod 640 /etc/firewalld/services/gpsd2nmea.xml 
 > sudo firewall-cmd --permanent --add-service=gpsd2nmea

Config

sudo nano /boot/piaware-config.txt

 wired-network yes
 wired-type static
 wired-address 192.168.10.110
 wired-netmask 255.255.255.0
 wired-broadcast 192.168.10.255
 wired-gateway 192.168.10.1
piaware.txt · Last modified: 2023/09/28 20:02 by w5ged