Διάφορες εφαρμογές

GPS tracker με raspberry και αποστολή δεδομένων στο traccar server

Hardware

  1. Raspberry pi (Εγώ έβαλα ένα παλιό σειρά Β)
  2. 4G USB Modem (Δουλεύω ένα HUAWEI E3372 σε HiLink)
  3. USB GPS Dongle (U Blox 7)

Software

Οι drivers για να δουλέψει το USB Dongle

sudo apt update
sudo apt install gpsd gpsd-clients -y

Προσθέτουμε τη θύρα που θα δουλέψει το dongle στις ρυθμίσεις του gpsd

sudo nano /etc/default/gpsd

DEVICES=”/dev/ttyACM0″
GPSD_OPTIONS=”-n”
START_DAEMON=”true”

Κάνουμε τέστ

sudo systemctl restart gpsd

cgps -s

Πρώτο python script στο /usr/bin/api.py

import requests
import pengugps as gpsd
import time

ID = “ΕΔΩ ΒΑΖΟΥΜΕ ΤΟ ID ΤΟΥ TRACKER” # Identifier when adding new device to the traccar server, should be long and random since there is no authentication
UPDATE_DELAY = 3 # ΧΡΟΝΟΣ UPLOAD ΔΕΔΟΜΕΝΩΝ / Seconds waited between each request made to the traccar server
BAD_DATA_DELAY = 0.1 # Seconds waited before requesting coordinates again from GPS when it first returns invalid data
RECONNECT_DELAY = 1 # Seconds waited before trying to reconnect to the GPS module when something goes wrong (for example GPS module not found)

class API:
def init(self, id):
self.url2 = “http://ΕΔΩ ΘΑ ΜΠΕΙ Ο traccar SERVER:5055/?id=%s&lat={0}&lon={1}&timestamp={2}&accuracy={3}&speed={4}” % id
self.url3 = self.url2 + “&altitude={5}”

def update(self, args):
	if len(args) == 6:
		requests.post(self.url3.format(*args))
	elif len(args) == 5:
		requests.post(self.url2.format(*args))

api = API(ID)

while True:
try:
gpsd.connect()
while True:
packet = gpsd.get_current()
if not packet.lat:
time.sleep(BAD_DATA_DELAY)
continue

		args = []
		args.append(packet.lat)
		args.append(packet.lon)
		args.append(packet.time)
		args.append(max(packet.error["x"], packet.error["y"]))
		args.append(packet.hspeed)
		if packet.mode == 3:
			args.append(packet.alt)

		api.update(args)
		
		time.sleep(UPDATE_DELAY)
except Exception as e:
	print(e)
	time.sleep(RECONNECT_DELAY)

Δίνουμε τα δικαιώματα

chmod 755 /usr/bin/api.py

Δέυτερο python script στο /usr/bin/pengugps.py

import socket
import json
import logging
import datetime

gpsd_socket = None
gpsd_stream = None
state = {}

def _parse_state_packet(json_data):
global state
if json_data[‘class’] == ‘DEVICES’:
if not json_data[‘devices’]:
raise Exception(“No gps devices found”)
state[‘devices’] = json_data
elif json_data[‘class’] == ‘WATCH’:
state[‘watch’] = json_data
else:
raise Exception(
“Unexpected message received from gps: {}”.format(json_data[‘class’]))

class GpsResponse(object):
def init(self):
self.mode = 0
self.sats = 0
self.sats_valid = 0
self.lon = 0.0
self.lat = 0.0
self.alt = 0.0
self.track = 0
self.hspeed = 0
self.climb = 0
self.time = ”
self.error = {}

@classmethod
def from_json(cls, packet):
    result = cls()
    if not packet['active']:
        raise Exception('GPS not active')
    last_tpv = packet['tpv'][-1]
    last_sky = packet['sky'][-1]

    if 'satellites' in last_sky:
        result.sats = len(last_sky['satellites'])
        result.sats_valid = len(
            [sat for sat in last_sky['satellites'] if sat['used'] == True])
    else:
        result.sats = 0;
        result.sats_valid = 0;

    result.mode = last_tpv['mode']

    if last_tpv['mode'] >= 2:
        result.lon = last_tpv['lon'] if 'lon' in last_tpv else 0.0
        result.lat = last_tpv['lat'] if 'lat' in last_tpv else 0.0
        result.track = last_tpv['track'] if 'track' in last_tpv else 0
        result.hspeed = last_tpv['speed'] if 'speed' in last_tpv else 0
        result.time = last_tpv['time'] if 'time' in last_tpv else ''
        result.error = {
            'c': 0,
            's': last_tpv['eps'] if 'eps' in last_tpv else 0,
            't': last_tpv['ept'] if 'ept' in last_tpv else 0,
            'v': 0,
            'x': last_tpv['epx'] if 'epx' in last_tpv else 0,
            'y': last_tpv['epy'] if 'epy' in last_tpv else 0
        }

    if last_tpv['mode'] >= 3:
        result.alt = last_tpv['alt'] if 'alt' in last_tpv else 0.0
        result.climb = last_tpv['climb'] if 'climb' in last_tpv else 0
        result.error['c'] = last_tpv['epc'] if 'epc' in last_tpv else 0
        result.error['v'] = last_tpv['epv'] if 'epv' in last_tpv else 0

    return result

def __repr__(self):
    modes = {
        0: 'No mode',
        1: 'No fix',
        2: '2D fix',
        3: '3D fix'
    }
    if self.mode < 2:
        return "<GpsResponse {}>".format(modes[self.mode])
    if self.mode == 2:
        return "<GpsResponse 2D Fix {} {}>".format(self.lat, self.lon)
    if self.mode == 3:
        return "<GpsResponse 3D Fix {} {} ({} m)>".format(self.lat, self.lon, self.alt)

def connect(host=”127.0.0.1″, port=2947):
global gpsd_socket, gpsd_stream, verbose_output, state
gpsd_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
gpsd_socket.connect((host, port))
gpsd_stream = gpsd_socket.makefile(mode=”rw”)
welcome_raw = gpsd_stream.readline()
welcome = json.loads(welcome_raw)
if welcome[‘class’] != “VERSION”:
raise Exception(
“Unexpected data received as welcome. Is the server a gpsd 3 server?”)
gpsd_stream.write(‘?WATCH={“enable”:true}\n’)
gpsd_stream.flush()

for i in range(0, 2):
    raw = gpsd_stream.readline()
    parsed = json.loads(raw)
    _parse_state_packet(parsed)

def get_current():
global gpsd_stream, verbose_output
gpsd_stream.write(“?POLL;\n”)
gpsd_stream.flush()
raw = gpsd_stream.readline()
response = json.loads(raw)
if response[‘class’] != ‘POLL’:
raise Exception(
“Unexpected message received from gps: {}”.format(response[‘class’]))
return GpsResponse.from_json(response)

Δίνουμε τα δικαιώματα

chmod 755 /usr/bin/pengugps.py

Στο traccar server πάμε στο:

sudo nano /opt/traccar/conf/traccar.xml

και προσθέτουμε:

<entry key=’osmand.speed’>mps</entry>

έτσι θα μας δείχνει την σωστή ταχύτητα το traccar

Πηγή για τις πληροφορίες

Raspberry στο αυτοκίνητο

Μετά τη διακοπή της 2G μπάντας στη κινητή τηλεφωνία τοπόθετησα ενα raspberry pi4 με 2gb ram στην αρχή και μετά με 4gb στο αυτοκίνητο. Η διαφορά τεράστια στην απόδοση και αξίζει το γρήγορο ράσπι.

Ο σκοπός ήταν να δουλέψει σαν gps τράκερ με το traccar server που τρέχει στο σπίτι επίσης απο raspberry.

Για λειτουργικό τρέχει android LineageOS και συνδέεται με την εφαρμογή VPN client pro αυτόματα στον openvpn server του σπιτιού. Για να μην πάει χαμένο τέτοιο εργαλείο εχω συνδέσει και μια microsoft usb webcam και μπορώ να έχω εικόνα (streaming) απο την εφαρμογή CamON Live. Η σύνδεση για το gps γίνεται με ένα φθηνό usb gps dongle και την εφαρμογή traccar client.

Το raspberry λαμβάνει το σήμα του ίντερνετ μέσω wifi απο ένα Huawei LTE στικάκι. Όχι οτι καλύτερο γι αυτό έκανα παραγγελία απο Κίνα ένα base HAT. Είμαι περίεργος αν θα έχω αποτέλεσμα.

Ακόμα μια εφαρμογή που θα βάλω και δέν μπόρεσε να λειτουργήσει αρχικά με το πρώτο ράσπι λόγω μικρής ram θα είναι το bimmerlink. Ένα απο τα καλύτερα app να διαβάζει την OBD σε bmw αυτοκίνητα.

Για τέλος που θα είναι και το κερασάκι στην τούρτα θα αφήσω τη σύνδεση του ράσπι με την android auto συμβατή συσκευή που διαθέτω. Μακάρι να λειτουργήσει.

Το ράσπι είναι κρυμένο στο πίσω μέρος και έχει 30 λεπτά λειτουργίας μετά τη στάθμευση μέχρι το αυτοκίνητο να του κλείσει αυτόματα το ρεύμα. Με το άνοιγμα των θυρών λαμβάνει πάλι ρεύμα και κάνει αυτόματα boot κάθε φορά.

Μάιος 2023 / UPDATE σε raspberry Pi OS Debian version: 11 (bullseye) λειτουργικό. Καλύτερες ταχύτητες. Σύνδεση στο ίντερνετ με LAN.

GPS: FoxtrotGPS

Video streaming: VLC

OBD data: pyobd με το scanner vLinker MC+ BLE and Bluetooth

Για το traccar δυστυχώς δεν μπόρεσα να βρώ κάποιο script να δουλεύει.

Car GPS Tracker

Φθηνή και αξιόπιστη λύση για GPS tracking σε οχήματα με σπιτικό σέρβερ ένα raspberry και την εφαρμογή ελεύθερου λογισμικού Traccar. Τα δεδομένα μεταφέροντε κάθε 30 δεπτερόλεπτα μέσω GPRS (2G). Στην Ελλάδα υποστηρίζεται ακόμα.

Τα tracker είναι δύο κινέζικα γνήσια xexun. Το ΤΚ103 και το XT009 που κανονικά προορίζεται για μοτοσυκλέτα. Οι κλώνοι δουλεύουν εξίσου καλά αλλά λόγο διαφορετικών firmware σε ταλαιπωρούν στο setup. Για δεδομένα δουλεύω μια κάρτα σιμ της Inter Telecom και μία ελβετική της lycamobile. Οι δύο κάρτες μπορούν να χρεώνουν δεδομένα ανα mb.

Μετά απο 5+ χρόνια λειτουργίας δεν έχω παράπονο. Το Traccar έχει πολλές δυνατότητες σαν λογισμικό και είναι συμβατό με google maps. Ετσί μπορώ να ελέγχω την κίνηση στο δρόμο. Πρακτικότατο!

Οι κάρτες θέλουν περίπου κάθε 4 μήνες ανανέωση υπολοίπου. Δεν έχουν ημερομηνία λήξης και φραγή όπως οι νορμάλ prepaid π.χ. cosmote,vodafone,wind κλπ.

Το Traccar θα το βρείτε εδώ: https://www.traccar.org/

Οδηγός για εγκατάσταση σε raspberry: https://www.instructables.com/Setup-Your-Own-GPS-Tracking-Server-on-a-Raspberry-/

Για Prepaid κάρτες φθηνές λύσεις υπάρχουν πολλές στο ebay. Η χρέωση λόγω roaming δεν είναι τραγική. Λόγω ελευθερίας στις επικοινωνίες μέσα στην Ε.Ε. έχουν φθηνήνει οι τιμές απο πρίν μερικά χρόνια.

Flightradar

Οι δύο δέκτες ADB S που έχω σε λειτουργία για το Ελ. Βενιζέλος LGAV (Αρτέμιδα) και το αεροδρόμιο της Ζυρίχης LSZH (Duebendorf). Ο πρώτος ειναι συνδεμένος με ένα beaglebone (debian) και ο δεύτερος με ένα raspberry (raspbian).

Η εμβέλεια στην Αρτέμιδα λόγω της περιοχής που βρίσκεται το σπίτι είναι δυστυχώς μόνο 16 NM. Στο Duebendorf φτάνω τα 96 NM. Η κεραία είναι πολύ ψηλοτερα.

Για περισσότερες πληροφορίες: https://www.flightradar24.com/build-your-own

Ο δέκτης που χρησιμοποιώ και είμαι πολύ ικανοποιημένος είναι ο: RTL SDR https://www.rtl-sdr.com/buy-rtl-sdr-dvb-t-dongles/