diff options
Diffstat (limited to 'man/gpsd.xml')
-rw-r--r-- | man/gpsd.xml | 905 |
1 files changed, 905 insertions, 0 deletions
diff --git a/man/gpsd.xml b/man/gpsd.xml new file mode 100644 index 00000000..49489690 --- /dev/null +++ b/man/gpsd.xml @@ -0,0 +1,905 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +This file is Copyright (c) 2010 by the GPSD project +SPDX-License-Identifier: BSD-2-clause +--> +<!DOCTYPE refentry PUBLIC + "-//OASIS//DTD DocBook XML V4.1.2//EN" + "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" [ +<!ENTITY gpsdsock "/var/run/gpsd.sock"> +]> +<refentry id='gpsd.8'> +<refentryinfo><date>9 Aug 2004</date></refentryinfo> +<refmeta> +<refentrytitle>gpsd</refentrytitle> +<manvolnum>8</manvolnum> +<refmiscinfo class="source">The GPSD Project</refmiscinfo> +<refmiscinfo class="manual">GPSD Documentation</refmiscinfo> +</refmeta> +<refnamediv id='name'> +<refname>gpsd</refname> +<refpurpose>interface daemon for GPS receivers</refpurpose> +</refnamediv> + +<refsynopsisdiv id='synopsis'> + +<cmdsynopsis> + <command>gpsd</command> + <arg choice='opt'>-b </arg> + <arg choice='opt'>-D <replaceable>debuglevel</replaceable></arg> + <arg choice='opt'>-F <replaceable>control-socket</replaceable></arg> + <arg choice='opt'>-G </arg> + <arg choice='opt'>-h </arg> + <arg choice='opt'>-l </arg> + <arg choice='opt'>-n </arg> + <arg choice='opt'>-N </arg> + <arg choice='opt'>-P <replaceable>pidfile</replaceable></arg> + <arg choice='opt'>-r </arg> + <arg choice='opt'>-S <replaceable>listener-port</replaceable></arg> + <arg choice='opt'>-V </arg> + <arg rep='repeat'> + <group><replaceable>source-name</replaceable></group> + </arg> +</cmdsynopsis> +</refsynopsisdiv> + +<refsect1 id='quickstart'><title>QUICK START</title> + +<para>If you have a GPS attached on the lowest-numbered USB port of a +Linux system, and want to read reports from it on TCP/IP port 2947, it +will normally suffice to do this:</para> + +<programlisting> +gpsd /dev/ttyUSB0 +</programlisting> + +<para>For the lowest-numbered serial port:</para> + +<programlisting> +gpsd /dev/ttyS0 +</programlisting> + +<para>Change the device number as appropriate if you need to use a +different port. Command-line flags enable verbose logging, a control +port, and other optional extras but should not be needed for basic +operation; the one exception, on very badly designed hardware, might +be <option>-b</option> (which see).</para> + +<para>On Linux systems supporting udev, <application>gpsd</application> +is normally started automatically when a USB plugin event fires (if it +is not already running) and is handed the name of the newly active +device. In that case no invocation is required at all.</para> + +<para>For your initial tests set your GPS hardware to speak NMEA, as +<application>gpsd</application> is guaranteed to be able to process +that. If your GPS has a native or binary mode with better performance +that <application>gpsd</application> knows how to speak, +<application>gpsd</application> will autoconfigure that mode.</para> + +<para>You can verify correct operation by first starting +<application>gpsd</application> and then +<application>xgps</application>, the X windows test client.</para> + +<para>If you have problems, the GPSD project maintains a FAQ to +assist troubleshooting.</para> + +</refsect1> +<refsect1 id='description'><title>DESCRIPTION</title> + +<para><application>gpsd</application> is a monitor daemon that collects +information from GPSes, differential-GPS radios, or AIS receivers +attached to the host machine. Each GPS, DGPS radio, or AIS receiver +is expected to be direct-connected to the host via a USB or RS232C +serial device. The serial device may be specified to +<application>gpsd</application> at startup, or it may be set via a +command shipped down a local control socket (e.g. by a USB hotplug +script). Given a GPS device by either means, +<application>gpsd</application> discovers the correct port speed and +protocol for it.</para> + +<para><application>gpsd</application> should be able to query any GPS +that speaks either the standard textual NMEA 0183 protocol, or the +(differing) extended NMEA dialects used by MKT-3301, iTrax, Motorola +OnCore, Sony CXD2951, and Ashtech/Thales devices. It can also +interpret the binary protocols used by EverMore, Garmin, Navcom, +Rockwell/Zodiac, SiRF, Trimble, and u-blox ANTARIS devices. Under Linux +it can read NMEA2000 packets through the kernel CAN socket. It can read +heading and attitude information from the Oceanserver 5000 or TNT +Revolution digital compasses.</para> + +<para>The GPS reporting formats supported by your instance of +<application>gpsd</application> may differ depending on how it was +compiled; general-purpose versions support many, but it can be built +with protocol subsets down to a singleton for use in constrained +environments. For a list of the GPS protocols supported by your +instance, see the output of <command>gpsd -l</command></para> + +<para><application>gpsd</application> effectively hides the +differences among the GPS types it supports. It also knows about and +uses commands that tune these GPSes for lower latency. By using +<application>gpsd</application> as an intermediary, applications +avoid contention for serial devices.</para> + +<para><application>gpsd</application> can use differential-GPS +corrections from a DGPS radio or over the net, from a ground station +running a DGPSIP server or a Ntrip broadcaster that reports RTCM-104 +data; this will shrink position errors by roughly a factor of four. +When <application>gpsd</application> opens a serial device emitting +RTCM-104, it automatically recognizes this and uses the device as a +correction source for all connected GPSes that accept RTCM corrections +(this is dependent on the type of the GPS; not all GPSes have the +firmware capability to accept RTCM correction packets). See +<xref linkend='accuracy'/> and <xref linkend='files'/> for discussion.</para> + +<para>Client applications will communicate with <application>gpsd</application> +via a TCP/IP port, 2947 by default). Both IPv4 and IPv6 connections +are supported and a client may connect via either.</para> + +<para>The program accepts the following options:</para> +<variablelist remap='TP'> +<varlistentry> +<term>-b</term> +<listitem><para>Broken-device-safety mode, otherwise known as +read-only mode. A few bluetooth and USB receivers lock up or become +totally inaccessible when probed or reconfigured; see the hardware +compatibility list on the GPSD project website for details. This +switch prevents gpsd from writing to a receiver. This means that +<application>gpsd</application> cannot configure the receiver for +optimal performance, but it also means that +<application>gpsd</application> cannot break the receiver. A better +solution would be for Bluetooth to not be so fragile. A platform +independent method to identify serial-over-Bluetooth devices would +also be nice.</para></listitem> +</varlistentry> +<varlistentry> +<term>-D</term> +<listitem> +<para>Set debug level. At debug levels 2 and above, +<application>gpsd</application> reports incoming sentence and actions +to standard error if <application>gpsd</application> is in the foreground +(-N) or to syslog if in the background.</para> +</listitem> +</varlistentry> +<varlistentry> +<term>-F</term> +<listitem> +<para>Create a control socket for device addition and removal +commands. You must specify a valid pathname on your local filesystem; +this will be created as a Unix-domain socket to which you can write +commands that edit the daemon's internal device list.</para> +</listitem> +</varlistentry> +<varlistentry> +<term>-G</term> +<listitem><para>This flag causes <application>gpsd</application> to +listen on all addresses (INADDR_ANY) rather than just the loop back +(INADDR_LOOPBACK) address. For the sake of privacy and security, TPV +information is now private to the local machine until the user makes +an effort to expose this to the world.</para></listitem> +</varlistentry> +<varlistentry> +<term>-h</term> +<listitem><para>Display help message and terminate.</para></listitem> +</varlistentry> +<varlistentry> +<term>-l</term> +<listitem><para>List all drivers compiled into this +<application>gpsd</application> instance. The letters to the left of +each driver name are the <application>gpsd</application> +control commands supported by that driver.</para> +</listitem> +</varlistentry> +<varlistentry> +<term>-n</term> +<listitem> +<para>Don't wait for a client to connect before polling whatever GPS +is associated with it. Some RS232 GPSes wait in a standby mode +(drawing less power) when the host machine is not asserting DTR, and +some cellphone and handheld embedded GPSes have similar behaviors. +Accordingly, waiting for a watch request to open the device may save +battery power. (This capability is rare in consumer-grade devices). +</para> +</listitem> +</varlistentry> +<varlistentry> +<term>-N</term> +<listitem><para>Don't daemonize; run in foreground. +This switch is mainly useful for debugging.</para> +</listitem> +</varlistentry> +<varlistentry> +<term>-r</term> +<listitem><para>Use GPS time even with no current fix. Some GPS's have +battery powered Real Time Clocks (RTC's) built in, makeing them a valid time +source even before a fix is acquired. This can be useful on a Raspberry Pi, +or other device that has no battery powered RTC, and thus has no valid +time at startup.</para></listitem> +</varlistentry> +<varlistentry> +<term>-P</term> +<listitem> +<para>Specify the name and path to record the daemon's process ID.</para> +</listitem> +</varlistentry> +<varlistentry> +<term>-S</term> +<listitem><para>Set TCP/IP port on which to listen for GPSD clients +(default is 2947).</para></listitem> +</varlistentry> +<varlistentry> +<term>-V</term> +<listitem> +<para>Dump version and exit.</para> +</listitem> +</varlistentry> +</variablelist> + +<para>Arguments are interpreted as the names of data sources. +Normally, a data source is the device pathname of a local device from +which the daemon may expect GPS data. But there are three other +special source types recognized, for a total of four:</para> + +<variablelist> +<varlistentry> +<term>Local serial or USB device</term> +<listitem> +<para>A normal Unix device name of a serial or USB device to which a +sensor is attached. Example: +<filename>/dev/ttyUSB0</filename>.</para> +</listitem> +</varlistentry> +<varlistentry> +<term>Local PPS device</term> +<listitem> +<para>A normal Unix device name of a PPS device to which a PPS source +is attached. The device name must start with "/dev/pps" and a local +serial or USB GPS device must also be available. Example: +<filename>/dev/pps0</filename>.</para> +</listitem> +</varlistentry> +<varlistentry> +<term>TCP feed</term> +<listitem> +<para>A URI with the prefix "tcp://", followed by a hostname, a +colon, and a port number. The daemon will open a socket to the +indicated address and port and read data packets from it, which will +be interpreted as though they had been issued by a serial device. Example: +<filename>tcp://data.aishub.net:4006</filename>.</para> +</listitem> +</varlistentry> +<varlistentry> +<term>UDP feed</term> +<listitem> +<para>A URI with the prefix "udp://", followed by a hostname, a +colon, and a port number. The daemon will open a socket listening for +UDP datagrams arriving on the indicated address and port, which will +be interpreted as though they had been issued by a serial device. Example: +<filename>udp://127.0.0.1:5000</filename>.</para> +</listitem> +</varlistentry> +<varlistentry> +<term>Ntrip caster</term> +<listitem> +<para>A URI with the prefix "ntrip://" followed by the name of an +Ntrip caster (Ntrip is a protocol for broadcasting differential-GPS +fixes over the net). For Ntrip services that require authentication, a +prefix of the form "username:password@" can be added before the name +of the Ntrip broadcaster. For Ntrip service, you must specify which +stream to use; the stream is given in the form "/streamname". An +example DGPSIP URI could be "dgpsip://dgpsip.example.com" and a Ntrip +URI could be +"ntrip://foo:bar@ntrip.example.com:80/example-stream". Corrections +from the caster will be send to each attached GPS with the capability +to accept them.</para> +</listitem> +</varlistentry> +<varlistentry> +<term>DGPSIP server</term> +<listitem> +<para>A URI with the prefix "dgpsip://" followed by a hostname, a +colon, and an optional colon-separated port number (defaulting to +2101). The daemon will handshake with the DGPSIP server and +read RTCM2 correction data from it. Corrections +from the server will be set to each attached GPS with the capability +to accept them. Example: +<filename>dgpsip://dgps.wsrcc.com:2101</filename>.</para> +</listitem> +</varlistentry> +<varlistentry> +<term>Remote gpsd feed</term> +<listitem> +<para>A URI with the prefix "gpsd://", followed by a hostname and +optionally a colony and a port number (if the port is absent the +default <application>gpsd</application> port will be used). The daemon +will open a socket to the indicated address and port and emulate a +<application>gpsd</application> client, collecting JSON reports from +the remote <application>gpsd</application> instance that will be +passed to local clients.</para> +</listitem> +</varlistentry> +<varlistentry> +<term>NMEA2000 CAN data</term> +<listitem> +<para>A URI with the prefix "nmea2000://", followed by a CAN +devicename. Only Linux socket CAN interfaces are supported. The +interface must be configured to receive CAN messages +before <application>gpsd</application> can be started. If +there is more then one unit on the CAN bus that provides GPS data, +<application>gpsd</application> chooses the unit from which a GPS message +is first seen. Example: <filename>nmea2000://can0</filename>. +</para> +</listitem> +</varlistentry> +</variablelist> + +<para>(The "ais:://" source type supported in some older versions of +the daemon has been retired in favor of the more general +"tcp://".)</para> + +<para>Additionally, two serial device names have a side effect: +<variablelist> +<varlistentry> +<term>/dev/ttyAMA0</term> +<listitem> +<para>The UART device on a Raspberry Pi. Has the side effect of +opening /dev/pps0 for RFC2783 1PPS data.</para> +</listitem> +</varlistentry> +<varlistentry> +<term>Generic GPS device 0. Has the side effect of +opening /dev/pps0 for RFC2783 1PPS data/</term> +<listitem> +<para> </para> +</listitem> +</varlistentry> +</variablelist> +</para> + +<para>Internally, the daemon maintains a device pool holding the +pathnames of devices and remote servers known to the +daemon. Initially, this list is the list of device-name arguments +specified on the command line. That list may be empty, in which case +the daemon will have no devices on its search list until they are +added by a control-socket command (see <xref linkend='devices'/> for +details on this). Daemon startup will abort with an error if neither +any devices nor a control socket are specified.</para> + +<para>When a device is activated (i.e. a client requests data from it), +gpsd attempts to execute a hook from +<filename>/etc/gpsd/device-hook</filename> with first command line argument +set to the pathname of the device and the second to +<option>ACTIVATE</option>. On deactivation it does the same passing +<option>DEACTIVATE</option> for the second argument.</para> + +<para><application>gpsd</application> can export data to client applications +in three ways: via a sockets interface, via a shared-memory segment, and +via D-Bus. The next three major sections describe these interfaces.</para> + +</refsect1> +<refsect1 id='sockets'><title>THE SOCKET INTERFACE</title> + +<para>Clients may communicate with the daemon via textual request and +responses over a socket. It is a bad idea for applications to speak the protocol +directly: rather, they should use the +<application>libgps</application> client library and take appropriate +care to conditionalize their code on the major and minor protocol +version symbols.</para> + +<para>The request-response protocol for the socket interface is fully +documented in +<citerefentry><refentrytitle>gpsd_json</refentrytitle><manvolnum>5</manvolnum></citerefentry>.</para> + +</refsect1> + +<refsect1 id='shm'><title>SHARED-MEMORY AND DBUS INTERFACES</title> + +<para><application>gpsd</application> has two other (read-only) +interfaces.</para> + +<para>Whenever the daemon recognizes a packet from any attached +device, it writes the accumulated state from that device to a shared +memory segment. The C and C++ client libraries shipped with GPSD can +read this segment. Client methods, and various restrictions associated +with the read-only nature of this interface, are documented at +<citerefentry><refentrytitle>libgps</refentrytitle><manvolnum>3</manvolnum></citerefentry>. The +shared-memory interface is intended primarily for embedded deployments +in which <application>gpsd</application> monitors a single device, and +its principal advantage is that a daemon instance configured with +shared memory but without the sockets interface loses a significant +amount of runtime weight.</para> + +<para>The daemon may be configured to emit a D-Bus signal each time an +attached device delivers a fix. The signal path is <filename>path +/org/gpsd</filename>, the signal interface is "org.gpsd", and the +signal name is "fix". The signal payload layout is as follows:</para> + +<table frame="all" pgwide="0"><title>Satellite object</title> +<tgroup cols="2" align="left" colsep="1" rowsep="1"> +<thead> +<row> + <entry>Type</entry> + <entry><para>Description</para></entry> +</row> +</thead> +<tbody> +<row> + <entry>DBUS_TYPE_DOUBLE</entry> + <entry><para>Time (seconds since Unix epoch)</para></entry> +</row> +<row> + <entry>DBUS_TYPE_INT32</entry> + <entry><para>mode</para></entry> +</row> +<row> + <entry>DBUS_TYPE_DOUBLE</entry> + <entry><para>Time uncertainty (seconds).</para></entry> +</row> +<row> + <entry>DBUS_TYPE_DOUBLE</entry> + <entry><para>Latitude in degrees.</para></entry> +</row> +<row> + <entry>DBUS_TYPE_DOUBLE</entry> + <entry><para>Longitude in degrees.</para></entry> +</row> +<row> + <entry>DBUS_TYPE_DOUBLE</entry> + <entry><para>Horizontal uncertainty in meters, 95% confidence.</para></entry> +</row> +<row> + <entry>DBUS_TYPE_DOUBLE</entry> + <entry><para>Altitude in meters.</para></entry> +</row> +<row> + <entry>DBUS_TYPE_DOUBLE</entry> + <entry><para>Altitude uncertainty in meters, 95% confidence.</para></entry> +</row> +<row> + <entry>DBUS_TYPE_DOUBLE</entry> + <entry><para>Course in degrees from true north.</para></entry> +</row> +<row> + <entry>DBUS_TYPE_DOUBLE</entry> + <entry><para>Course uncertainty in meters, 95% confidence.</para></entry> +</row> +<row> + <entry>DBUS_TYPE_DOUBLE</entry> + <entry><para>Speed, meters per second.</para></entry> +</row> +<row> + <entry>DBUS_TYPE_DOUBLE</entry> + <entry><para>Speed uncertainty in meters per second, + 95% confidence.</para></entry> +</row> +<row> + <entry>DBUS_TYPE_DOUBLE</entry> + <entry><para>Climb, meters per second.</para></entry> +</row> +<row> + <entry>DBUS_TYPE_DOUBLE</entry> + <entry><para>Climb uncertainty in meters per second, + 95% confidence.</para></entry> +</row> +<row> + <entry>DBUS_TYPE_STRING</entry> + <entry><para>Device name</para></entry> +</row> +</tbody> +</tgroup> +</table> + +</refsect1> + +<refsect1 id='devices'><title>GPS DEVICE MANAGEMENT</title> + +<para><application>gpsd</application> maintains an internal list of +GPS devices (the "device pool"). If you specify devices on the +command line, the list is initialized with those pathnames; otherwise +the list starts empty. Commands to add and remove GPS device paths +from the daemon's device list must be written to a local Unix-domain +socket which will be accessible only to programs running as root. +This control socket will be located wherever the -F option specifies +it.</para> + +<para>A device may will also be dropped from the pool if GPSD gets a zero +length read from it. This end-of-file condition indicates that the' +device has been disconnected.</para> + +<para>When <application>gpsd</application> is properly installed along +with hotplug notifier scripts feeding it device-add commands over the +control socket, <application>gpsd</application> should require no +configuration or user action to find devices.</para> + +<para>Sending SIGHUP to a running <application>gpsd</application> +forces it to close all GPSes and all client connections. It will then +attempt to reconnect to any GPSes on its device list and resume +listening for client connections. This may be useful if your GPS +enters a wedged or confused state but can be soft-reset by pulling +down DTR.</para> + +<para>When <application>gpsd</application> is called with no initial +devices (thus, expecting devices to be passed to it by notifications to +the control socket), and reaches a state where there are no devices +connected and no subscribers <emphasis>after</emphasis> after some +devices have been seen, it shuts down gracefully. It is expected that +future device hotplug events will reactivate it.</para> + +<para>To point <application>gpsd</application> at a device that may be +a GPS, write to the control socket a plus sign ('+') followed by the +device name followed by LF or CR-LF. Thus, to point the daemon at +<filename>/dev/foo</filename>. send "+/dev/foo\n". To tell the daemon +that a device has been disconnected and is no longer available, send a +minus sign ('-') followed by the device name followed by LF or +CR-LF. Thus, to remove <filename>/dev/foo</filename> from the search +list, send "-/dev/foo\n".</para> + +<para>To send a control string to a specified device, write to the +control socket a '!', followed by the device name, followed by '=', +followed by the control string.</para> + +<para>To send a binary control string to a specified device, write to the +control socket a '&', followed by the device name, followed by '=', +followed by the control string in paired hex digits.</para> + +<para>Your client may await a response, which will be a line beginning +with either "OK" or "ERROR". An ERROR response to an add command means +the device did not emit data recognizable as GPS packets; an ERROR +response to a remove command means the specified device was not in +<application>gpsd</application>'s device pool. An ERROR response to a +! command means the daemon did not recognize the devicename +specified.</para> + +<para>The control socket is intended for use by hotplug scripts and +other device-discovery services. This control channel is separate +from the public <application>gpsd</application> service port, and only +locally accessible, in order to prevent remote denial-of-service and +spoofing attacks.</para> + +</refsect1> +<refsect1 id='accuracy'><title>ACCURACY</title> + +<para>The base User Estimated Range Error (UERE) of GPSes is 8 meters +or less at 66% confidence, 15 meters or less at 95% confidence. Actual +horizontal error will be UERE times a dilution factor dependent on current +satellite position. Altitude determination is more sensitive to +variability in ionospheric signal lag than latitude/longitude is, and is +also subject to errors in the estimation of local mean sea level; base +error is 12 meters at 66% confidence, 23 meters at 95% confidence. +Again, this will be multiplied by a vertical dilution of precision +(VDOP) dependent on satellite geometry, and VDOP is typically larger +than HDOP. Users should <emphasis>not</emphasis> rely on GPS altitude for +life-critical tasks such as landing an airplane.</para> + +<para>These errors are intrinsic to the design and physics of the GPS +system. <application>gpsd</application> does its internal +computations at sufficient accuracy that it will add no measurable +position error of its own.</para> + +<para>DGPS correction will reduce UERE by a factor of 4, provided you +are within about 100mi (160km) of a DGPS ground station from which you +are receiving corrections.</para> + +<para>On a 4800bps connection, the time latency of fixes provided by +<application>gpsd</application> will be one second or less 95% of the +time. Most of this lag is due to the fact that GPSes normally emit +fixes once per second, thus expected latency is 0.5sec. On the +personal-computer hardware available in 2005 and later, computation +lag induced by <application>gpsd</application> will be negligible, on +the order of a millisecond. Nevertheless, latency can introduce +significant errors for vehicles in motion; at 50km/h (31mi/h) of speed +over ground, 1 second of lag corresponds to 13.8 meters change in +position between updates.</para> + +<para>The time reporting of the GPS system itself has an intrinsic +accuracy limit of 14 nanoseconds, but this can only be approximated by +specialized receivers using that send the high-accuracy PPS +(Pulse-Per-Second) over RS232 to cue a clock crystal. Most GPS +receivers only report time to a precision of 0.01s or 0.001s, +and with no accuracy guarantees below 1sec.</para> + +<para>If your GPS uses a SiRF chipset at firmware level 231, reported +UTC time may be off by the difference between whatever default +leap-second offset has been compiled in and whatever leap-second +correction is currently applicable, from startup until complete +subframe information is received. Firmware levels 232 and up don't +have this problem. You may run <application>gpsd</application> at +debug level 4 to see the chipset type and firmware revision +level.</para> + +<para>There are exactly two circumstances under which +<application>gpsd</application> relies on the host-system +clock:</para> + +<para>In the GPS broadcast signal, GPS time is represented using a +week number that rolls over after 2^10 or 2^13 weeks (about 19.6 +years, or 157 years), depending on the spacecraft. Receivers are +required to disambiguate this to the correct date, but may have +difficulty due to not knowing time to within half this interval, or +may have bugs. Users have reported incorrect dates which appear to be +due to this issue. <application>gpsd</application> uses the startup +time of the daemon detect and compensate for rollovers while it is +running, but otherwise reports the date as it is reported by the +receiver without attempting to correct it.</para> + +<para>If you are using an NMEA-only GPS (that is, not using SiRF or +Garmin or Zodiac binary mode), <application>gpsd</application> relies +on the system clock to tell it the current century. If the system clock +returns an invalid value near zero, and the GPS does not emit GPZDA at +the start of its update cycle (which most consumer-grade NMEA GPSes do +not) then the century part of the dates +<application>gpsd</application> delivers may be wrong. Additionally, +near the century turnover, a range of dates as wide in seconds as the +accuracy of your system clock may be referred to the wrong +century.</para> +</refsect1> + +<refsect1 id='ntp'><title>USE WITH NTP</title> + +<para>gpsd can provide reference clock information to +<application>ntpd</application>, to keep the system clock synchronized +to the time provided by the GPS receiver.</para> + +<para>On Linux, <application>gpsd</application> includes support for +interpreting the PPS pulses emitted at the start of every clock second +on the carrier-detect lines of some serial GPSes; this pulse can be +used to update NTP at much higher accuracy than message time provides. +You can determine whether your GPS emits this pulse by running at -D 5 +and watching for carrier-detect state change messages in the logfile. +In addition, if your kernel provides the RFC 2783 kernel PPS API then +<application>gpsd</application> will use that for extra +accuracy.</para> + +<para>Detailed instructions for using GPSD to set up a high-quality +time service can be found among the documentation on the GPSD +website.</para> +</refsect1> + +<refsect1 id='dbus'><title>USE WITH D-BUS</title> + +<para>On operating systems that support D-BUS, +<application>gpsd</application> can be built to broadcast GPS fixes to +D-BUS-aware applications. As D-BUS is still at a pre-1.0 stage, we +will not attempt to document this interface here. Read the +<application>gpsd</application> source code to learn more.</para> + +</refsect1> +<refsect1 id='security'><title>SECURITY AND PERMISSIONS ISSUES</title> + +<para><application>gpsd</application>, if given the -G flag, will +listen for connections from any reachable host, and then disclose the +current position. Before using the -G flag, consider whether you +consider your computer's location to be sensitive data to be kept +private or something that you wish to publish.</para> + +<para><application>gpsd</application> must start up as root in order +to open the NTPD shared-memory segment, open its logfile, and create +its local control socket. Before doing any processing of GPS data, it +tries to drop root privileges by setting its UID to "nobody" (or another +configured userid) and its group ID to the group of the initial +GPS passed on the command line — or, if that device doesn't exist, +to the group of <filename>/dev/ttyS0</filename>.</para> + +<para>Privilege-dropping is a hedge against the possibility that +carefully crafted data, either presented from a client socket or from +a subverted serial device posing as a GPS, could be used to induce +misbehavior in the internals of <application>gpsd</application>. +It ensures that any such compromises cannot be used for privilege +elevation to root.</para> + +<para>The assumption behind <application>gpsd</application>'s +particular behavior is that all the tty devices to which a GPS might +be connected are owned by the same non-root group and allow group +read/write, though the group may vary because of distribution-specific +or local administrative practice. If this assumption is false, +<application>gpsd</application> may not be able to open GPS devices in +order to read them (such failures will be logged).</para> + +<para>In order to fend off inadvertent denial-of-service attacks by +port scanners (not to mention deliberate ones), +<application>gpsd</application> will time out inactive client +connections. Before the client has issued a command that requests a +channel assignment, a short timeout (60 seconds) applies. There is no +timeout for clients in watcher or raw modes; rather, +<application>gpsd</application> drops these clients if they fail to +read data long enough for the outbound socket write buffer to fill. +Clients with an assigned device in polling mode are subject to a +longer timeout (15 minutes).</para> + +</refsect1> +<refsect1 id='limitations'><title>LIMITATIONS</title> + +<para>If multiple NMEA talkers are feeding RMC, GLL, and GGA sentences +to the same serial device (possible with an RS422 adapter hooked up to +some marine-navigation systems), a 'TPV' response may mix an altitude +from one device's GGA with latitude/longitude from another's RMC/GLL +after the second sentence has arrived.</para> + +<para><application>gpsd</application> may change control settings on +your GPS (such as the emission frequency of various sentences or +packets) and not restore the original settings on exit. This is a +result of inadequacies in NMEA and the vendor binary GPS protocols, +which often do not give clients any way to query the values of control +settings in order to be able to restore them later.</para> + +<para>When using SiRF chips, the VDOP/TDOP/GDOP figures and associated +error estimates are computed by <application>gpsd</application> rather +than reported by the chip. The computation does not exactly match +what SiRF chips do internally, which includes some satellite weighting +using parameters <application>gpsd</application> cannot see.</para> + +<para>Autobauding on the Trimble GPSes can take as long as 5 seconds +if the device speed is not matched to the GPS speed.</para> + +<para>Generation of position error estimates (eph, epv, epd, eps, epc) +from the incomplete data handed back by GPS reporting protocols +involves both a lot of mathematical black art and fragile +device-dependent assumptions. This code has been bug-prone in tbe +past and problems may still lurk there.</para> + +<para>AIDVM decoding of types 16-17, 22-23, and 25-26 is unverified.</para> + +<para>GPSD presently fully recognizes only the 2.1 level of RTCM2 +(message types 1, 3, 4, 5, 6, 7, 9, 16). The 2.3 message types 13, 14, +and 31 are recognized and reported. Message types 8, 10-12, 15-27, +28-30 (undefined), 31-37, 38-58 (undefined), and 60-63 are not yet +supported.</para> + +<para>The ISGPS used for RTCM2 and subframes decoder logic is +sufficiently convoluted to confuse some compiler optimizers, notably +in GCC 3.x at -O2, into generating bad code.</para> + +<para>Devices meant to use PPS for high-precision timekeeping may +fail if they are specified after startup by a control-socket command, +as opposed to on the daemon's original command line. Root privileges +are dropped early, and some Unix variants require them in order to set +the PPS line discipline. Under Linux the POSIX capability to set the +line discipline is retained, but other platforms cannot use this +code.</para> + +<para>USB GPS devices often do not identify themselves through the USB +subsystem; they typically present as the class 00h (undefined) or +class FFh (vendor-specific) of USB-to-serial adapters. Because of +this, the Linux hotplug scripts must tell +<application>gpsd</application> to sniff data from every USB-to-serial +adapter that goes active and is known to be of a type used in +GPSes. No such device is sent configuration strings until after it has +been identified as a GPS, and <application>gpsd</application> never +opens a device that is opened by another process. But there is a tiny +window for non-GPS devices not opened; if the application that wants +them loses a race with GPSD its device open will fail and have to be +retried after GPSD sniffs the device (normally less than a second +later).</para> + +</refsect1> +<refsect1 id='files'><title>FILES</title> + +<variablelist> +<varlistentry> +<term><filename>/dev/ttyS0</filename></term> +<listitem> +<para>Prototype TTY device. After startup, +<application>gpsd</application> sets its group ID to the owning group of this +device if no GPS device was specified on the command line does not +exist.</para> +</listitem> +</varlistentry> +<varlistentry> +<term><filename>/etc/gpsd/device-hook</filename></term> +<listitem> +<para>Optional file containing the device activation/deactivation script. +Note that while <filename>/etc/gpsd</filename> is the default system +configuration directory, it is possible to build the GPSD source code +with different assumptions.</para> +</listitem> +</varlistentry> +<!-- +<varlistentry> +<term><filename>/usr/share/gpsd/dgpsip-servers</filename></term> +<listitem> +<para>A text file listing DGPSIP servers worldwide. If no DGPSIP +server is specified at startup (via the -d option) +<application>gpsd</application> will look here to find the +nearest one. Each line has three space-separated fields: +latitude (decimal degrees), longitude (decimal degrees) and +a server name (optionally followed by a colon and a port number). +Text following # on a line is ignored. Blank lines are ignored.</para> +</listitem> +</varlistentry> +--> +</variablelist> + +</refsect1> +<refsect1 id='environment'><title>ENVIRONMENT VARIABLES</title> + +<para>By setting the environment variable <envar>GPSD_SHM_KEY</envar>, +you can control the key value used to create the shared-memory segment +used for communication with the client library. This will be useful +mainly when isolating test instances of +<application>gpsd</application> from production ones.</para> + +</refsect1> +<refsect1 id='standards'><title>APPLICABLE STANDARDS</title> + +<para>The official NMEA protocol standards for NMEA0183 and NMEA2000 +are available from the National Marine Electronics Association, but are +proprietary and expensive; the maintainers of +<application>gpsd</application> have made a point of not looking at +them. The GPSD project website links to several documents that collect +publicly disclosed information about the protocol.</para> + +<para><application>gpsd</application> parses the following NMEA +sentences: RMC, GGA, GLL, GSA, GSV, VTG, ZDA, GBS, HDT, DBT, GST. It +recognizes these with either the normal GP talker-ID prefix, or with +the GN prefix used by GLONASS, or with the II prefix emitted by +Seahawk Autohelm marine navigation systems, or with the IN prefix +emitted by some Garmin units, or with the EC prefix emitted by ECDIS +units, or with the SD prefix emitted by depth sounders, or with the HC +and TI prefix emitted by some Airmar equipment. It recognizes some +vendor extensions: the PGRME emitted by some Garmin GPS models, the +OHPR emitted by Oceanserver digital compasses, the PTNTHTM emitted by +True North digital compasses, the PMTK omitted by some San Jose +Navigation GPSes, and the PASHR sentences emitted by some Ashtech +GPSes.</para> + +<para>Note that <application>gpsd</application> JSON returns pure decimal +degrees, not the hybrid degree/minute format described in the NMEA +standard.</para> + +<para>Differential-GPS corrections are conveyed by the RTCM +protocols. The applicable standard for RTCM-104 V2 is <citetitle>RTCM +Recommended Standards for Differential GNSS (Global Navigation +Satellite) Service</citetitle> RTCM Paper 136-2001/SC 104-STD. The +applicable standard for RTCM-104 V3 is <citetitle>RTCM Standard +10403.1 for Differential GNSS Services - Version 3</citetitle> RTCM +Paper 177-2006-SC104-STD. Ordering instructions for the RTCM standards +are accessible from the website of the Radio Technical Commission for Maritime +Services under "Publications".</para> + +<para>AIS is defined by ITU Recommendation M.1371, +<citetitle>Technical Characteristics for a Universal Shipborne +Automatic Identification System Using Time Division Multiple +Access</citetitle>. The AIVDM/AIVDO format understood by this program +is defined by IEC-PAS 61162-100, <citetitle>Maritime navigation and +radiocommunication equipment and systems</citetitle>. A more accessible +description of both can be found at <citetitle>AIVDM/AIVDO Protocol +Decoding</citetitle>, on the references page of the GPSD project +website.</para> + +<para>Subframe data is defined by IS-GPS-200E, <citetitle>GLOBAL +POSITIONING SYSTEM WING (GPSW) SYSTEMS ENGINEERING & INTEGRATION, +INTERFACE SPECIFICATION IS-GPS-200 Revision E</citetitle>. The format +understood by this program is defined in Section 20 (Appendix II) of +the IS-GPS-200E, <citetitle>GPS NAVIGATION DATA STRUCTURE FOR DATA, +D(t)</citetitle></para> + +<para>JSON is specified by RFC 7159, <citetitle>The JavaScript Object +Notation (JSON) Data Interchange Format</citetitle>.</para> + +<para>The API for PPS time service is specified by RFC 2783, +<citetitle>Pulse-Per-Second API for UNIX-like Operating Systems, +Version 1.0</citetitle></para> + +</refsect1> +<refsect1 id='see_also'><title>SEE ALSO</title> +<para> +<citerefentry><refentrytitle>gpsdctl</refentrytitle><manvolnum>8</manvolnum></citerefentry>, +<citerefentry><refentrytitle>gps</refentrytitle><manvolnum>1</manvolnum></citerefentry>, +<citerefentry><refentrytitle>libgps</refentrytitle><manvolnum>3</manvolnum></citerefentry>, +<citerefentry><refentrytitle>gpsd_json</refentrytitle><manvolnum>5</manvolnum></citerefentry>, +<citerefentry><refentrytitle>libgpsmm</refentrytitle><manvolnum>3</manvolnum></citerefentry>, +<citerefentry><refentrytitle>gpsprof</refentrytitle><manvolnum>1</manvolnum></citerefentry>, +<citerefentry><refentrytitle>gpsfake</refentrytitle><manvolnum>1</manvolnum></citerefentry>, +<citerefentry><refentrytitle>gpsctl</refentrytitle><manvolnum>1</manvolnum></citerefentry>, +<citerefentry><refentrytitle>gpscat</refentrytitle><manvolnum>1</manvolnum></citerefentry>, +</para> +</refsect1> + +<refsect1 id='maintainer'><title>AUTHORS</title> + +<para>Authors: Eric S. Raymond, Chris Kuethe, Gary Miller. Former +authors whose bits have been plowed under by code turnover: Remco +Treffcorn, Derrick Brashear, Russ Nelson. This manual page by Eric S. Raymond +<email>esr@thyrsus.com</email>.</para> +</refsect1> + +</refentry> |