client-howto.adoc 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643
  1. = GPSD Client HOWTO =
  2. :description: This document is a guide to interfacing client applications with GPSD.
  3. :keywords: time, GPSD, NTP, time, precision, 1PPS, PPS, stratum, jitter
  4. Eric S. Raymond <esr@thyrsus.com>
  5. v1.19, Jul 2015
  6. == Introduction ==
  7. This document is a guide to interfacing client applications with GPSD.
  8. It surveys the available bindings and their use cases. It also explains
  9. some sharp edges in the client API which, unfortunately, are fundamental
  10. results of the way GPS sensor devices operate, and suggests tactics
  11. for avoiding being cut.
  12. == Sensor behavior matters ==
  13. GPSD handles two main kinds of sensors: GPS receivers and AIS
  14. receivers. It has rudimentary support for some other kinds of
  15. specialized geolocation-related sensors as well, notably compass and
  16. yaw/pitch/roll, but those sensors are usually combined with GPS/AIS
  17. receivers and behave like them.
  18. In an ideal world, GPS/AIS sensors would be oracles that you could
  19. poll at any time to get clean data. But despite the existence of some
  20. vendor-specific query and control strings on some devices, a GPS/AIS
  21. sensor is not a synchronous device you can query for specified data
  22. and count on getting a response back from in a fixed period of time.
  23. It gets radio data on its own schedule (usually once per second for a
  24. GPS), and emits the reports it feels like reporting asynchronously
  25. with variable lag during the following second. *If* it supports query
  26. strings, reports from these are intermixed with the regular
  27. reports, and usually scheduled at a lower priority (often with a lag
  28. of more than a second).
  29. A GPS/AIS receiver, or any sensor that behaves like one, is in effect
  30. a datagram emitter similar to a UDP data source; you get no guarantees
  31. about sequence or timing at finer resolution than "TPV roughly once
  32. per second" (or whatever the main type of report and report interval
  33. is).
  34. The only way to simulate synchronous querying of such a sensor is to
  35. have an agent between you and it that caches the data coming out of
  36. the device; you can then query the agent and expect a reasonably
  37. synchronous response from the cache (we support this for
  38. GPSs). However, note that this doesn't work for a freshly opened
  39. device - there's no cached data.
  40. Consider what this implies for GPses, in particular:
  41. * You can't actually poll them. They report to you over a serial
  42. (RS232 or USB-serial) interface at a fixed interval, usually once
  43. per second.
  44. * They don't always have a fix to report, because they can only
  45. get one when they have satellite lock.
  46. * They may fail to have satellite lock when your skyview is poor.
  47. If you are moving through uneven terrain or anywhere with trees
  48. or buildings, your skyview can degrade in an instant.
  49. * They may also fail to have lock because they're initially powering
  50. on (cold start), or waking from a power-conserving sleep mode (warm
  51. start). While most modern GPSs with a good skyview can get
  52. satellite lock in 30 seconds from a warm start, a GPS that has
  53. been off for a while can take 15 minutes or more to acquire lock
  54. Time to fix after a power-on matters because in many use cases for
  55. GPSs they're running off a battery, and you can't afford to keep them
  56. powered when you don't actually need location data. This is why GPS
  57. sensors are sometimes designed to go to a low-power mode when you close
  58. the serial port they're attached to.
  59. AIS receivers have a simpler set of constraints. They report
  60. navigational and ID information from any AIS transmitter in line of
  61. sight; there are no skyview issues, and they're ready instantly when
  62. powered up. Furthermore, they're not normally battery constrained.
  63. However, you don't poll them either; they receive information
  64. packets over the air and ship them to you at unpredictable intervals
  65. over a serial port.
  66. The design of the GPSD reporting protocol surrenders to reality. Its data
  67. packets translate the GPS's stream of datagrams into
  68. device-type-independent datagrams, but it can't impose timing and
  69. sequencing regularities on them that the underlying device doesn't
  70. already obey.
  71. == What GPSD does, and what it cannot do ==
  72. GPSD solves some of the problems with GPS/AIS sensors. First:
  73. multiplexing; it allows multiple applications to get sensor data
  74. without having to contend for a single serial device. Second:
  75. coping with the hideous gallimaufry of badly-designed protocols these
  76. devices use -- regardless of device type, you will get data in a single
  77. well-documented format. Third: on operating systems with a hotplug
  78. facility (like Linux udev), GPSD will handle all the device
  79. management as USB devices are plugged in and unplugged.
  80. What GPSD can't do is pull fix data out of thin air when your
  81. device hasn't reported any. Nor is it a magic power supply,
  82. so its device management has to be designed around keeping the
  83. attached sensors open only when a client application actually
  84. needs a fix.
  85. As you'll see, these constraints explain most of the design of the GPSD
  86. wire protocol, and of the library APIs your client application
  87. will be using.
  88. == How the GPSD wire protocol works ==
  89. While GPSD project ships several library bindings that will hide the
  90. details of the wire protocol from you, you'll understand the library APIs
  91. better by knowing what a wire-protocol session looks like. After
  92. reading this section, you can forget the details about commands and
  93. responses and attributes as long as you hold on to the basic
  94. logical flow of a session.
  95. Your client library's open function is going to connect a socket to
  96. port 2947 on the host your sensors are attached to, usually
  97. localhost. On connection, the gpsd daemon will ship a banner that
  98. looks something like this:
  99. -----------------------------------------------------------------------------
  100. {"class":"VERSION","release":"2.93","rev":"2010-03-30T12:18:17",
  101. "proto_major":3,"proto_minor":2}
  102. -----------------------------------------------------------------------------
  103. There's nothing mysterious here. Your server daemon is identifying
  104. itself with information that may allow a client library to work
  105. around bugs or potential incompatibilities produced by upgrades.
  106. To get data from the attached sensors, you need to explicitly tell the
  107. daemon you want it. (Remember that it's trying to minimize the amount
  108. of time the devices are held open and in a fully powered state.) You
  109. do this by issuing a WATCH command:
  110. -----------------------------------------------------------------------------
  111. ?WATCH={"enable":true,"json":true}
  112. -----------------------------------------------------------------------------
  113. This tells the daemon to watch all devices and to issue reports in
  114. JSON. It can ship some other protocols as well (notably, NMEA 0183)
  115. but JSON is the most capable and usually what you want.
  116. A side effect of the WATCH command is that the daemon will ship you
  117. back some information on available devices.
  118. -----------------------------------------------------------------------------
  119. {"class":"DEVICES","devices":[{"class":"DEVICE","path":"/dev/ttyUSB0",
  120. "activated":1269959537.20,"native":0,"bps":4800,"parity":"N",
  121. "stopbits":1,"cycle":1.00}]}
  122. {"class":"WATCH","enable":true,"json":true,"nmea":false,"raw":0,
  123. "scaled":false,"timing":false,"pps":false}
  124. -----------------------------------------------------------------------------
  125. The DEVICES response tells you what devices are available to the
  126. daemon; this list is maintained in a way you as the application
  127. designer don't have to care about. The WATCH response will
  128. immediately follow and tells you what all your watch request settings
  129. are.
  130. Up to this point, nothing has been dependent on the state of the
  131. sensors. At this time, it may well be that none of those devices is
  132. fully powered up yet. In fact, they won't be, unless another
  133. GPSD-enabled application is already watching when you open your
  134. connection. If that's the case, you will start seeing data
  135. immediately.
  136. For now, though, let's go back to the case where gpsd has to fire up
  137. the sensors. After issuing the WATCH response, the daemon opens all of
  138. them and watches for incoming packets that it can recognize. *After
  139. a variable delay*, it will ship a notification that looks something
  140. like this:
  141. -----------------------------------------------------------------------------
  142. {"class":"DEVICE","path":"/dev/ttyUSB0","activated":1269960793.97,
  143. "driver":"SiRF binary","native":1,"bps":4800,
  144. "parity":"N","stopbits":1,"cycle":1.00}
  145. -----------------------------------------------------------------------------
  146. This is the daemon telling you that it has recognized a SiRF binary
  147. GPS on /dev/ttyUSB0 shipping report packets at 4800 bits per second.
  148. This notification is not delayed by the time it takes to achieve
  149. satellite lock; the GPS will cheerfully ship packets before that. But
  150. it will be delayed by the time required for the daemon to sync up with
  151. the GPS.
  152. The GPSD daemon is designed so it doesn't have to know anything about the
  153. sensor in advance - not which of a dozen reporting protocols it uses,
  154. and not even the baud rate of the serial device. The reason for this
  155. agnosticism is so the daemon can adapt properly to anything a hotplug
  156. event night throw at it. If you unplug your GPS while your
  157. application is running, and then plug in one of a different type, the
  158. daemon will cope. Your application won't know the difference unless
  159. you have told it to notice device types.
  160. You can even start your application, have it issue a WATCH, realize
  161. you forgot to plug in a GPS, and do that. The hotplug event will
  162. tell gpsd, which will add the new device to the watched-devices list
  163. of every client that has issued a ?WATCH.
  164. In order to make this work, gpsd has a packet sniffer inside it that
  165. does autobauding and packet-protocol detection. Normally the packet
  166. sniffer will achieve sync in well under a second (my measured times
  167. range from 0.10 to 0.53 sec at 4800bps), but it can take longer if
  168. your serial traffic is degraded by dodgy cables or electrical noise,
  169. or if the GPS is configured to run at an unusual speed/parity/stopbit
  170. configuration.
  171. The real point here is that the delay is *variable*. The client
  172. library, and your application, can't assume a neat lockstep of
  173. request and instant response.
  174. Once you do get your device(s) synced, things become more predictable.
  175. The sensor will start shipping fix reports at a constant interval,
  176. usually every second, and the daemon will massage them into JSON and
  177. pass them up the client to your application.
  178. However, until the sensor achieves satellite lock, those fixes will be
  179. "mode 1" - no valid data (mode 2 is a 2D fix, mode 3 is a 3D fix).
  180. Here's what that looks like:
  181. -----------------------------------------------------------------------------
  182. {"class":"TPV","device":"/dev/ttyUSB0",
  183. "time":"2010-04-30T11:47:43.28Z","ept":0.005,"mode":1}
  184. -----------------------------------------------------------------------------
  185. Occasionally you'll get another kind of sentence, SKY, that reports a
  186. satellite skyview. But TPV is the important one. Here's what it
  187. looks like when the sensor has a fix to report:
  188. -----------------------------------------------------------------------------
  189. {"class":"TPV","time":"2010-04-30T11:48:20.10Z","ept":0.005,
  190. "lat":46.498204497,"lon":7.568061439,"alt":1327.689,
  191. "epx":15.319,"epy":17.054,"epv":124.484,"track":10.3797,
  192. "speed":0.091,"climb":-0.085,"eps":34.11,"mode":3}
  193. -----------------------------------------------------------------------------
  194. Note the "mode":3 at the end. This is how you tell that the GPS is
  195. reporting a full 3D fix with altitude.
  196. If you have an AIS receiver attached, it too will have been opened
  197. and autobauded and protocol-sniffed after your WATCH. The stream of
  198. JSON objects will then include things like this:
  199. -----------------------------------------------------------------------------
  200. {"class":"AIS","type":5,"repeat":0,"mmsi":351759000,"scaled":true,
  201. "imo":9134270,"ais_version":0,"callsign":"3FOF8",
  202. "shipname":"EVER DIADEM",
  203. "shiptype":"Cargo - all ships of this type",
  204. "to_bow":225,
  205. "to_stern":70,"to_port":1,"to_starboard":31,"draught":12.2,
  206. "epfd":"GPS","eta":"05-15T14:00Z",
  207. "destination":"NEW YORK","dte":0}
  208. -----------------------------------------------------------------------------
  209. When your application shuts down, it can cancel its watch:
  210. -----------------------------------------------------------------------------
  211. ?WATCH={"enable":false}
  212. -----------------------------------------------------------------------------
  213. This will enable the daemon to close devices and conserve
  214. power. Supposing you don't do this, the daemon will time out devices
  215. with no listeners, so canceling your watch is not strictly necessary.
  216. But it is good manners.
  217. Another way to use the daemon is with the ?POLL command To do this, issue
  218. -----------------------------------------------------------------------------
  219. ?WATCH={"enable":true}
  220. -----------------------------------------------------------------------------
  221. This activates all devices without enabling streaming of reports. You
  222. can then say "?POLL;" to poll gpsd's recorded data.
  223. -----------------------------------------------------------------------------
  224. ?POLL;
  225. {"class":"POLL","time":"2012-04-05T15:00:01.501Z","active":1,
  226. "tpv":[{"class":"TPV","device":"/dev/ttyUSB0","mode":3,"time":"2012-04-05T15:00:00.000Z","ept":0.005,"lat":40.035083522,"lon":-75.519982905,"alt":166.145,"epx":9.125,"epy":17.778,"epv":34.134,"track":0.0000,"speed":0.000,"climb":0.000,"eps":36.61}],"gst":[{"class":"GST","device":"/dev/ttyUSB0","time":"1970-01-01T00:00:00.000Z","rms":0.000,"major":0.000,"minor":0.000,"orient":0.000,"lat":0.000,"lon":0.000,"alt":0.000}],
  227. "sky":[{"class":"SKY","device":"/dev/ttyUSB0","time":"2012-04-05T15:00:00.000Z","xdop":0.61,"ydop":1.19,"vdop":1.48,"tdop":1.14,"hdop":1.40,"gdop":2.30,"pdop":1.99,"satellites":[{"PRN":26,"el":15,"az":49,"ss":29,"used":true},{"PRN":18,"el":62,"az":315,"ss":31,"used":true},{"PRN":15,"el":60,"az":43,"ss":44,"used":true},{"PRN":21,"el":71,"az":237,"ss":0,"used":false},{"PRN":27,"el":52,"az":94,"ss":40,"used":true},{"PRN":9,"el":48,"az":136,"ss":33,"used":true},{"PRN":22,"el":21,"az":291,"ss":36,"used":true},{"PRN":3,"el":8,"az":303,"ss":25,"used":true}]}]}
  228. -----------------------------------------------------------------------------
  229. This interface is intended for use with applications like CGI scripts
  230. that cannot wait on output from the daemon but must poke it into responding.
  231. If you're a clever sort, you're already wondering what the daemon does
  232. if the application at the other end of the client socket doesn't read data
  233. out of it as fast as gpsd is shipping it upwards. And the answer is
  234. this: eventually the socket buffer fills up, a write from the daemon
  235. throws an error, and the daemon shuts down that client socket.
  236. From the point of view of the application, it reads all the buffered
  237. data and then gets a read return indicating the socket shutdown. We'll
  238. return to this in the discussion of client libraries, but the thing
  239. for you to know right now is that this edge case is actually quite
  240. difficult to fall afoul of. Total data volume on these sockets is not
  241. high. As long as your application checks for and reads socket data no
  242. less often than once a second, you won't -- and a second is a *lot* of
  243. time in which to come back around your main loop.
  244. == Interfacing from the client side ==
  245. The gpsd daemon exports data in three different ways: via a sockets
  246. interface, via DBUS broadcasts, and via a shared-memory interface,
  247. It is possible one or more of these may be configured out in your
  248. installation.
  249. === The sockets interface ===
  250. The GPSD project provides client-side libraries in C, C++, and Python
  251. that exercise the sockets export. A Perl module is separately
  252. available from CPAN. While the details of these libraries vary, they
  253. all have the same two purposes and the same limitations.
  254. One purpose of the libraries is to handle the details of unpacking
  255. JSON-based wire-protocol objects into whatever native structure/record
  256. feature your application language has. This is particularly important
  257. in the C and C++ libraries, because those languages don't have
  258. good native support for JSON.
  259. Another purpose is to hide the details of the wire protocol from the
  260. application. This gives the GPSD developers room to improve extend
  261. the protocol without breaking every client application. Depend
  262. on wire-protocol details only at your own risk!
  263. The limitations the libraries have to cope with are the nature of
  264. the data flow from the sensors, and the simple fact that they're
  265. not necessarily delivering fixes at any given time.
  266. For details of the libraries' APIs, see their reference
  267. documentation; the objective of the rest of this section is to teach
  268. you the general model of client-side interfacing that they all have to
  269. follow because of the way the daemon works.
  270. Each library has the following entry points:
  271. * Open a session socket to the daemon. Named something like "open()".
  272. * Set watch policy. Named something like "stream()"
  273. * Send wire-protocol commands to the daemon. Deprecated; makes your
  274. code dependent on the wire protocol. There is no longer a real
  275. use case for this entry point; if you think you need no use it,
  276. you have probably failed to understand the rest of the interface.
  277. * Blocking check to see if data from the daemon is waiting. Named
  278. something like "waiting()" and taking a wait timeout as argument.
  279. Note that choosing a wait timeout of less than twice the cycle time
  280. of your device will be hazardous, as the receiver will probably not
  281. supply input often enough to prevent a spurious error indication.
  282. For the typical 1-second cycle time of GPSes this implies a minimum
  283. 2-second timeout.
  284. * Blocking read for data from the daemon. Named something like "read()"
  285. (this was "poll()" in older versions).
  286. * Close the session socket. Named something like "close()".
  287. * Enable debugging trace messages
  288. The fact that the data-waiting check and the read both block means
  289. that, if your application has to deal with other input sources than
  290. the GPS, you will probably have to isolate the read loop in a thread with
  291. a mutex lock on the gps_data structure.
  292. Here is a complete table of the binding entry points:
  293. .Entry points in client bindings
  294. [frame="topbot",options="header"]
  295. |========================================================================
  296. |C |C++ |Python |
  297. Function
  298. |gps_open() |gpsmm.gpsmm() |gps.\_\_init__() |
  299. In OO languages the client class initializer opens the daemon socket.
  300. |gps_send() |gpsmm.send() |gps.send() |
  301. Send wire-protocol commands to the daemon. Deprecated and unstable.
  302. |gps_stream() |gpsmm.stream() |gps.stream() |
  303. Set watch policy. What you should use instead of send().
  304. |gps_waiting() |gpsmm.waiting() |gps.waiting() |
  305. Blocking check with timeout to see if input is waiting.
  306. |gps_read() |gpsmm.read() |gps.read() |
  307. Blocking read for data from the daemon.
  308. |gps_unpack() | |gps.unpack() |
  309. Parse JSON from a specified buffer into a session structure
  310. |gps_close() |gpsmm.~gpsmm() |gps.close() |
  311. Close the daemon socket and end the session.
  312. |gps_data() |gpsmm.data() |gps.data() |
  313. Get the contents of the client buffer.
  314. |gps_enable_debug() |gpsmm_enable_debug() | |
  315. Enable debug tracing. Only useful for GPSD developers.
  316. |gps_clear_fix() |gpsmm.clear_fix() | |
  317. Clear the contents of the fix structure.
  318. |========================================================================
  319. The tricky part is interpreting what you get from the blocking
  320. read. The reason it's tricky is that you're not guaranteed that
  321. every read will pick up exactly one complete JSON object from the
  322. daemon. It may grab one response object, or more than one, or
  323. part of one, or one or more followed by a fragment.
  324. What the library does on each read is this: get what it can from the
  325. socket, append that to a private buffer, and then consume as many JSON
  326. objects from the front of the buffer as it can. Any incomplete JSON
  327. is left in the private buffer to be completed and unpacked on a later
  328. go-round.
  329. In C, the library "consumes" a JSON object by unpacking its content
  330. into a blackboard structure passed to the read entry point by
  331. address. The structure contains a state-flag mask that you can (and
  332. should!) check so you'll know which parts of the structure contain
  333. valid data. It is safe to do nothing unless the PACKET_SET mask bit
  334. is on, which is the library's way of telling you that at least one
  335. complete JSON response has arrived since the last read.
  336. Data may accumulate on the blackboard over multiple reads,
  337. with new TPV reports overwriting old ones; it is guaranteed that
  338. overwrites are not partial. Expect this pattern to be replicated
  339. in any compiled language with only fixed-extent structures.
  340. In Python and Perl the read entry point returns an object containing
  341. accumulated data. The state-flag mask is still useful for telling you
  342. which parts contain data, and there is still a PACKET_SET bit. Expect
  343. this pattern to be replicated in other dynamic OO languages when we
  344. support them.
  345. The C++ binding is a very thin wrapper around the C. You get back an
  346. object, but it's just a reference to the C blackboard structure. There's
  347. no unpack() method because it doesn't fit the gpsmm object's RAII model.
  348. All bindings will throw a recognizable error from the read entry
  349. point when the socket is closed from the daemon side.
  350. [WARNING]
  351. The timing of your read loop is important. When it has satellite lock,
  352. the daemon will be writing into its end of the socket once per
  353. whatever the normal reporting-cycle time of your device is - for a GPS
  354. normally one peer second. *You must poll the socket more often that
  355. that.*
  356. If necessary, spawn a worker thread to do this, mutex-locking the
  357. structure where it outs the reports. If you don't do this, data
  358. will back up in your socket buffers and position reports will be
  359. more and more delayed until the socket FIFO fills, at which point the
  360. daemon will conclude the client has died and drop the connection.
  361. AIVDM clients have a longer maximum allowable poll interval, but a
  362. problem of a different kind. you have the problem that later sentences
  363. of (say) Type 1 don't obsolete the data in earlier ones. This is a
  364. problem, because the library is designed so that read calls pull any
  365. JSON reports waiting from the daemon and interpret them all.
  366. To avoid losing data, you want to poll the daemon more often than once
  367. per two seconds (that being the minimum transmission period for the
  368. most frequently shipped sentences, Type 1/2/3). That way the read
  369. buffer will never contain both a message and a later message of the
  370. same type that steps on it.
  371. === Shared-memory interface ===
  372. Whenever gpsd recognizes a packet from any attached device, it writes
  373. the accumulated state from that device to a shared memory segment. The
  374. C and C++ client libraries shipped with GPSD can read this segment.
  375. The API for reading the segment uses the same gps_open(), gps_read()
  376. and gps_close() entry points as the sockets interface. To enable using
  377. shared memory instead, it is only necessary to use the macro constant
  378. GPSD_SHARED_MEMORY as the host argument of gps_open().
  379. The gps_stream(), gps_send(), gps_waiting(), and gps_data() entry
  380. points are not available with this interface. You cannot set a device
  381. filter on it. You will not get device activation or deactivation
  382. notices through it. And, of course, it is only good for local and not
  383. networked access. Its main advantage is that it is very fast and
  384. lightweight, especially suitable for use in low-power embedded
  385. deployments with a single device on a fixed port and the sockets
  386. interface configured out.
  387. Under the shared-memory interface, gps_read() after a successful
  388. gps_open() will always return with data; its return is the size of a
  389. struct gps_data_t in bytes. The 'gps_fd' member of the struct gpsdata
  390. instance handed to you will always be -1. The PACKET_SET flag will
  391. always be asserted. The other flag bits in the 'set' member will tell
  392. you what data is updated in the instance, just as in the sockets
  393. interface.
  394. The shared-memory interface is not yet available from Python.
  395. === D-Bus broadcasts ===
  396. If your system supports D-Bus, gpsd broadcasts a signal with path /org/gpsd,
  397. interface "org.gpsd", and name "fix" whenever it received a position
  398. report from any device attached to it. See the gpsd(8) manual page for
  399. details of the binary payload layout.
  400. == C Examples ==
  401. The source distribution includes two example clients in C;
  402. gpxlogger.c and cgps.c.
  403. gpxlogger.c illustrates the simplest possible program flow; open,
  404. followed by stream, followed by the library main loop.
  405. cgps.c shows what an interactive application using the library and
  406. also hw processing user commands works. Note the use of the curses
  407. nodelay function to ensure that wgetch() does not block the GPS
  408. polling loop.
  409. == C++ examples ==
  410. The following code skeleton implements a C++ client:
  411. ----------------------------------------------------------------------
  412. int main(void)
  413. {
  414. gpsmm gps_rec("localhost", DEFAULT_GPSD_PORT);
  415. if (gps_rec.stream(WATCH_ENABLE|WATCH_JSON) == NULL) {
  416. cerr << "No GPSD running.\n";
  417. return 1;
  418. }
  419. for (;;) {
  420. struct gps_data_t* newdata;
  421. if (!gps_rec.waiting(50000000))
  422. continue;
  423. if ((newdata = gps_rec.read()) == NULL) {
  424. cerr << "Read error.\n";
  425. return 1;
  426. } else {
  427. PROCESS(newdata);
  428. }
  429. }
  430. return 0;
  431. }
  432. ----------------------------------------------------------------------
  433. Note the absence of explicit open and close methods. The object
  434. interface is designed on the RAII (Resource Acquisition Is
  435. Initialization) model; you close it by deallocating it.
  436. Look at test_gpsmm.cpp in the distribution for a full example.
  437. == Python examples ==
  438. There's a very simple Python example analogous to gpxlogger attached
  439. to the source code for the gps.py library.
  440. The heart of it is this code:
  441. -----------------------------------------------------------------------------
  442. session = gps(**opts)
  443. session.stream(WATCH_ENABLE|WATCH_NEWSTYLE)
  444. for report in session:
  445. print report
  446. -----------------------------------------------------------------------------
  447. If you need to intersperse other processing in a main event loop,
  448. like this:
  449. ----------------------------------------------------------------------
  450. session = gps(mode=WATCH_ENABLE)
  451. try:
  452. while True:
  453. # Do stuff
  454. report = session.next()
  455. # Check report class for 'DEVICE' messages from gpsd. If
  456. # we're expecting messages from multiple devices we should
  457. # inspect the message to determine which device
  458. # has just become available. But if we're just listening
  459. # to a single device, this may do.
  460. if report['class'] == 'DEVICE':
  461. # Clean up our current connection.
  462. session.close()
  463. # Tell gpsd we're ready to receive messages.
  464. session = gps(mode=WATCH_ENABLE)
  465. # Do more stuff
  466. except StopIteration:
  467. print "GPSD has terminated"
  468. ----------------------------------------------------------------------
  469. Each call to the iterator yields a report structure until the daemon
  470. terminates, at which point the iterator next() method will raise
  471. StopIteration and the loop will terminate.
  472. The report object returned by next() can be accessed either as a dictionary
  473. or as an object. As a dictionary, it is the raw contents of the last
  474. JSON response re-encoded in plain ASCII. For convenience, you may
  475. also access it as an object with members for each attribute in the
  476. dictionary. It is especially useful to know that the object will
  477. always have a "class" member giving the response type (TPV, SKY,
  478. DEVICE, etc.) as a string.
  479. For more interesting examples integrated with X and GTK, see xgps and
  480. xgpsspeed.
  481. == Other Client Bindings ==
  482. There are a couple of client bindings for GPSD that are maintained
  483. separately from the GPSD distribution. We don't try to document their
  484. APIs here, but just provide pointers to them.
  485. == Java ==
  486. There is a Java binding, described at http://gpsd4java.forge.hoegergroup.de/
  487. This binding is available at maven central. See that web page for how
  488. to use it in a maven build.
  489. == Perl ==
  490. There's a Perl client library at http://search.cpan.org/dist/Net-GPSD3/
  491. == Backward Incompatibility and Future Changes ==
  492. The C/C++ binding makes available two preprocessor symbols,
  493. GPSD_API_MAJOR_VERSION and GPSD_API_MINOR_VERSION, in gps.h.
  494. The Python module has corresponding symbols.
  495. In major versions before 5:
  496. * gps_open() didn't take a third argument; instead, it returned malloc storage.
  497. * The 'read()' method in various bindings was named 'poll()', blocked
  498. waiting for input, and had a different return convention. The name
  499. 'poll()' will at some point be reintroduced as an interface to the
  500. wire-protocol POLL command.
  501. * Clients needed to define a hook for client-side logging if they
  502. didn't want code in netlib.c and libgps_core.c to occasionally send
  503. messages to stderr. This requirement is now gone.
  504. * There was a set_raw_hook() method in the C and Python bindings, now gone.
  505. C clients should call gps_data(); the buffer is available directly in Python,
  506. both as str (response) and bytes (bresponse). The distinction matters
  507. in Python 3.
  508. //end