Skip to content

Instantly share code, notes, and snippets.

@bryanjhv
Created December 19, 2022 19:30
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bryanjhv/997d7719ca9ab33f3b9e46a2c2f1982a to your computer and use it in GitHub Desktop.
Save bryanjhv/997d7719ca9ab33f3b9e46a2c2f1982a to your computer and use it in GitHub Desktop.
GPSD for GeoClue2 using NMEA over TCP

CLUE-NMEA-GPSD

GPSD for GeoClue2 using NMEA over TCP.

Installation

  1. Copy the XML file to /etc/avahi/services/nmea-0183.service.
  2. Run glue.py in order to start the service (listens on 10110/tcp).
  3. Optionally create a service (systemd or the like) for it to start at boot.
  4. Optionally disable all GeoClue2 sources except network-nmea to use GPS only.

Notes

  • Make sure you have GPSD enabled (sudo systemctl enable --now gpsd.socket).
  • Make sure you have a hardware GPS connected and configured in GPSD.
  • This version doesn't handle reconnections to GPSD yet.
#!/usr/bin/env python3
from socket import socket, AF_INET, SOCK_STREAM, IPPROTO_TCP, TCP_NODELAY
from socketserver import TCPServer, ThreadingMixIn, StreamRequestHandler
class ServerHandler(StreamRequestHandler):
def handle(self):
print("connected %s:%d" % self.client_address)
gpsd = socket(AF_INET, SOCK_STREAM)
gpsd.setsockopt(IPPROTO_TCP, TCP_NODELAY, True)
gpsd.connect(("127.0.0.1", 2947))
with gpsd.makefile("brw", 0) as upstream:
upstream.readline() # consume VERSION report
upstream.write("?WATCH={\"enable\":true,\"nmea\":true}".encode())
upstream.readline() # consume DEVICES report
upstream.readline() # consume WATCH report
while True:
try:
self.wfile.write(upstream.readline())
except BrokenPipeError:
break
gpsd.close()
print("disconnected %s:%d" % self.client_address)
class ThreadedTCPServer(ThreadingMixIn, TCPServer):
pass
def main():
try:
with ThreadedTCPServer(("0.0.0.0", 10110), ServerHandler) as server:
server.serve_forever()
except KeyboardInterrupt:
print()
if __name__ == "__main__":
main()
<?xml version="1.0" standalone="no"?>
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">
<service-group>
<name replace-wildcards="yes">%h</name>
<service>
<type>_nmea-0183._tcp</type>
<port>10110</port>
<txt-record>accuracy=exact</txt-record>
</service>
</service-group>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment