- Troubleshooting GPSD: the basics
- Licensing and support
- GPS performance
- Problems with specific applications
- Troubleshooting GPSD: advanced topics
- Application development with GPSD
- Linux issues
If none of these FAQs seems to address your problem, look at the Upstream Bugs page.
For Windows 7 and earlier, legacy versions of Audacity are available on the Legacy Windows downloads page. For macOS 10.12 (Sierra) and earlier, legacy versions of Audacity are available on the Legacy Mac downloads page. For Linux, the appropriate version of Audacity for your operating system is usually included in your distribution’s. Follow these steps - How to Install ADB USB Driver on Windows 7 / 8 / 8.1 / 10 PC, if you want to install android device 15 Seconds drivers with.exe file in. USB Driver Updates. Need USB Driver Downloads for Windows 10, Windows 8, Windows 7, Vista and XP? If you are having problems with your USB not working, read the article below to help fix your USB problems. USB issues often, but not always, relate to drivers problems. Jan 02, 2010 Its look you forgot to click on Download and to check the boxes Extract (32&64bit) & start Portable Virtualbox before you click on ‘OK’. Because then the VirtualBox installation just install it on your USB driver, no files are left at the PC. Also the services will be started/stopped when you start-up or close Portable VirtalBox.
1. First, check that the GPS has power. If it is a USB device, itneeds to be cabled to a USB port to have power. All Bluetooth GPSesand some serial GPSes are powered by an on-board battery; check thatthe battery is present and charged. The GPS may have an on-off switchwhich needs to be in the 'on' position.
2. Most GPSes have a power-on LED; it should be continuously onor blinking once a second. If it is continuously off, your GPS is deador disconnected. Check that it has power.
3. For anything other than a serial (RS232) device, there should bea discovery utility that allows you to check that the device is connected.
3a. For a USB device, run 'lsusb'
before and afterconnecting your GPS; after, you should see an additional lineindicating a new device. Expect the new line to describe aserial-to-USB adapter chip, often (but not always) the ProlificTechnology PL2303. Then run 'dmesg', looking for a message indicatinga new USB device of that kind and giving you the device path -/dev/ttyUSBn
for some number n.
3b. If your receiver lists in lsusb(1) but doesn't show up as a ttyUSBxdevice, don't lose hope. It might be a ttyACM device, probably/dev/ttyACM0; some receivers, including for example the u-blox EVK 6Hevaluation kit, announce themselves as USB modems.
3c. For a Bluetooth device, see our Bluetoothinstructions.
4. If you have installed a GPSD binary package on a Linux system andare using a USB GPS, you should not need to start gpsd manually,because the hotplug system will have done it for you. You should beable to start a test client (such as cgps
or xgps
)and watch it report fixes.
5. If your test client fails to run, a good test to try is to,after stopping any instances of gpsd that are running(eg, killall gpsd
),run gpsmon
on the device (give it the device path as anargument). If yours reports no data at all, you probably have somelow-level system problem with serial or USB that you'll need to fixbefore gpsd
will operate.
6. USB GPSes actually emulate RS232 serial using converter chips.Under Linux, the usbserial kernel module must be loaded for correctoperation of this class of device. Normally this module load shouldhappen automatically when the device activates, but if you don'treceive data check for it with lsmod(1).
On Linux systems with module autoloading disabled or misconfigured,it is possible you may need to load the module manually with a commandsuch as sudo modprobe usbserial vendor=0x1a86product=0x7523
. Do not copy those hex numbers slavishly, theyare examples. To get the right numbers, you will need to dig up thevendor and product ID of your USB-serial converter device.
For more detailed troubleshooting instructions, see the Troubleshooting Guide.
Probably.
GPSD's support for the NMEA protocol is mature and stable. If thespecification for your receiver says 'NMEA 0183' (maybe with a version 2.xor 3.x qualifier) it should just work.
Beware of receivers that do not say 'NMEA' somewhere in the specification;while it may indicate that the receiver only uses a binary protocol, it oftenmeans that the receiver cannot be used as data source for a computer, as isusually the case with car navigation devices.
We also support many proprietary protocols, in case your receiverdoesn't emit NMEA. Datasheets often indicate which chip the receiveris based on, for example a NavCorp NX666. Check to see if otherNavCorp receivers are listed, either as a vendor or achipset. Compare this with the output of gpsd -l
whichwill list the protocols compiled into gpsd. If your receiver doesn'tsupport NMEA and we don't have a special driver for the chipset, talkto us. But it'll probably just work.
Assuming the receiver has a USB interface, do a web search to seeif someone has tried it with linux already, eg. 'NavCorp NX666linux
'. Search for the product and 'driver install' to findinstructions on installing Windows drivers for the product - theseoften hint at which bridge chip is used, if the specifications don'tsay so.
A GPS receiver claiming Macintosh compatibility is usually based onone of the common bridge chips from FTDI, Prolific or SiliconLaboratories. These will just work.
Yes, Android 4.0 and later versions use gpsd to interpret the datastream from the onboard GPS. No, the battery drain is not actuallydue to a GPSD bug or design error.
You probably have a badly-written or buggy app installed that isrunning in background, keeping gpsd awake by keeping a client sessionto it constantly open; this can happen if the app is using 'FineLocation' rather than computing its location the cheaper way usingcell-tower signal strengths ('Coarse Location'). What you need todo is identify that app, and decide if you wish to remove it.
On the Samsung Galaxy SIII, vendor firmware provides a 'RemoteLocation' service with a similar bug. You can disable this throughSettings. See thisblog post for a fix.
Garmin binary protocol is weird enough that it can't be handledthrough the regular serial-device layer of Linux - you couldn't tellwhere the packet boundaries are. To deal with it, you need a specialloadable kernel module called 'garmin_gps'.
The most common cause of problems with these devices is that themodule is failing to load as it should when the Garmin USB ID isrecognized. Here is a typical resolution:
After several more days of effort I did eventually get it to work[under Ubuntu 12.4]. It turned out that garmin_gps was on the blacklist and this needed to be commented out. I then had to 'sudo apt-getinstall gps-clients gpsbabel' and a 'sudo modprobe garmin_gps' and allwas working.
On the BSDs and Mac OS X, you're out of luck. As of April 2013 wedon't know of any shim that makes USB Garmins work on these.
The Raspberry Pi has no real-time clock. Without this, the GPS maynot return sufficient information to for GPSD to pin down which GPSclock rollover period you are in. If you set the system clock tosome date in the current year before launching gpsd youwill see correct time reports.
Note: Because we have been informed that some people are insaneabout this, we shall state the obvious: we welcome security-relatedbug reports and will not sue people who send them to us. Ifyour report includes sensitive information or discloses an exploit,please email a maintainer rather than letting it all hang out onthe public bugtracker. We will fix such bugs promptly.
When you have a problem with gpsd, here are some steps you can take tohelp get your bug resolved as quickly as possible.
1. Read this whole FAQ first
First, read this whole FAQ before reporting apparent misbehavior as abug. You may find a solution here.
2. Make sure it's not a problem with your toolchain or OS
See our page on upstream bugs.
3. Make sure it's not a problem in your client software
Make sure it is a real gpsd bug and not a problem withyour client software. A good way to do this is to run your client anda gpsd test client (cgps or xgps) side by side. If the gpsd test clientseems to report good numbers but your client does not, you have a clientproblem. If cgps or xgps reports the same sort of bad numbers as yourclient, you have a real gpsd
bug.
4. Check the latest version of gpsd
for the bug.
If you are using an old version of gpsd
, it ispossible your bug has already been fixed. Download the latest publicversion from the download page and test it.To be really helpful, check out git headand test that. We don't mind getting reports that say 'I sawversion foo had the following bug, but you've fixed it.'
5. Capture a log that triggers the problem
If we can reproduce your gpsd problem, we can usually fix it veryrapidly. If we can't reproduce it, you might get lucky or you mightnot — and we try hard, but all too often the result is 'not'.
Therefore the most important step you can take is to capture a logof some receiver output that reproduces the bug; gpscat
or gpspipe -R -n 100
will help you.
6. Trim the capture log that reproduces the problem
Your next step should be to feed the log you just captured to agpsd
instance through gpsfake
to verify thatthe log does in fact reproduce the bug.
Once you have the log, trim it to the smallest span of data thatreproduces the bug. A systematic way to do this is to cut the log inhalf at the middle and test each half. If one half doesn't reproducethe bug but the other does, throw away the half that doesn't. Repeatthis procedure on each half that tickles the bug until you can't makeit any smaller. Then send us that.
If possible, use the -l option of gpsfake to pin down the sentenceor packet that produces the bug, and tell us that.
7. Look at gpsd
log output to see if it gives you a clue
You may get a better handle on your problem by running gpsd inforeground (-N option) with the -D option set to a high level (-D 5 isoften good). If the transcript has anything that looks like a cluein it, send it along with your bug report. When in doubt aboutwhether it holds a clue, send it.
One of the things this should tell you, if the chip reports it atall, is the firmware version. You will want that for your report.
8. Annotate the capture log and send us a copy
Annotating the log you send by adding a header is helpful. Yourlogfile should consist of an identifying header followed by anuntouched and unencoded dump of receiver data, whether NMEA, binary ora mixture. The header should consist of text lines beginning with # andending with LF. Here is the beginning of one log file from the gpsdregressions:
The way to fill in the Name, Submitter, and Dateheaders should be pretty obvious.
Chipset should include the name and (if possible) model and/orfirmware revision of the chipset in the GPS.
Please also include a Location header giving your city,state/province, country code, and a rough latitude/longitude.
A log file is most useful when it contains (a) some sentencesgenerated when the GPS has no fix, (b) some sentences representinga fix with the GPS stationary, and (c) some sentences representinga fix with the GPS moving.
If you have notes or comments on the logfile or the GPS, or anyadditional information you think might be helpful, add them asadditional # comments (not containing a colon) after these headers.The test machinery that interprets the headers will ignore these andany empty comment lines.
9. If it's a dual-mode GPS, see if the problem reproduces in NMEA mode
If you're using a SiRF, Evermore, iTalk or u-blox GPS in binary mode(which you can tell from the -D 4 output), switch back to NMEA modeusing the N command (or a vendor-provided tool) and see if the bug isstill reproducible.
10. If your bug core-dumps gpsd, send us a stack trace.
Though it happens seldom (we've had only 3 such reports since aboutmid-2005), badly-formed input from a device with poor standardscompliance has been known to core-dump gpsd. If your gpsd hascore-dumped, try to use gdb or whatever your local symbolic debuggeris to generate a stack trace ('bt full') of the crash, and send usthat.
Very occasionally we have also received reports of core dumps ingpsfake and gpson. A stack trace is also useful in those cases.
A good technique in all such cases is to try to reproduce the bugby feeding a log with the bad packet in it to gpsdecode. This utilityexercises the same packet decoders as gpsd/gpsfake/gpsmon but withoutinvolving nearly as much other code. If you can send a test log thatcrashes gpsdecode, you can expect the bug to be fixed very quickly.
11. Try to determine what release introduced the bug
If you have upgraded from a previous version of gpsd
,and the upgrade broke something that was working previously, themost useful thing you can do is pin down the release in which thebug was introduced.
How efficiently you can do this depends on whether or not you havea client for the git version control system. If you don't, allyou can do is download and test named releases. If you do, you canpin down the exact change that introduced the bug. The latter isfar more helpful to us and will get your bug fixed faster, so we'lldescribe that procedure here.
Follow these instructions to clonea copy of the source repository.
Use git bisect to locate the exact revision that introduced your bug.This will happen very quickly, as the number of tests required will bethe log to the base 2 of the number of revisions in your originalspan. Even if there are (say) 500 revisions in the span you shouldonly require 9 tests to nail down the exact change inquestion.
12. Include the vendor, mode, and firmware version in your report.
Always include with your bug report the receiver vendor and model. Tryto include the firmware version as well. This should be in your xgpsdisplay if your device makes it available; in a form field before2.35, or as the window title in 2.35 and later. If the ID string istoo long to fit, let the daemon run for a few minutes and issue an 'I'command to it. Alternatively, running the daemon at -D 4 may revealthe version.
In 3.10 and newer versions, running gpsctrl with your GPS's devicepath as an argument will produce a report that includes both the GPStype and subtype, if that information is available at all.
13. Report it on the GPSD bugtracker
There is a GPSD bug tracker. Use that.If your bug narrative does not fit the tracker template well andyou've done these means a big shift relative to the bandwidth of the signal.)
If you have a recent almanac and you know the date/time and location, thenyou can compute the Doppler and look in the right frequency and find thesatellites quickly. In this context, 'find' means hearing a signal at anexpected frequency. If you don't hear anything where you expect it, then youget to check nearby frequencies. If you don't find anything nearby, you getto give up and start searching the whole Doppler range. This is the differencebetween warm start and cold start.
Once you do see one or more satellites, you can figure out thedate/time and location and after a while get a new almanac. This willbe stored in non-volatile memory in your devices and make subsequentsatellite acquisitions faster, until it gets stale.
Warm start on a modern GPS with a good skyview (4 or more satsvisible) normally takes about 30 seconds. (Vendor spec sheets fib byquoting this time only, leaving out the cold-start lag to fetchalmanac.) If it's taking longer, the first thing to suspect is thatyour skyview is poor. Especially if you're indoors.
The best advice is: go outside and be patient for a few minutes.
Your GPS may have dropped its leap-second offset. You can tell youhave this problem if your sentence timestamps look wrong at startup.Wait 20 minutes or so; the lag should go away, as the almanac is updated.
GPS satellites broadcast time using a clock without a leap-secondcorrection. They broadcast a leap-second correction once each completereporting cycle along with the satellite almanac; it's up to theGPS firmware to add that correction to the time it puts in reports.If your GPS has forgotten the current correction, you'll have to waituntil an updated almanac is downloaded (should be less than 20 minutes).
GPSes are supposed to retain the leap-second correction along withthe last fix in NVRAM when they power down, but we've observed thatmany seem prone to occasionally drop this information. All you can dois wait for the problem to resolve itself.
SiRF-based GPSes have a more specific timelag problem. 4800 is justa bit too slow for SiRF binary at full flood; the device can actuallyfail to ship all its reports before the next once-per-second fix,producing an accumulating stall. The symptom of this is sentence times thatlook right at startup but gradually fall behind clock time. To fixthis, bump your speed to 9600 or higher.
This can happen if (a) there has been a recent leap-secondadjustment, (b) you have a version of GPSD that was built beforethe adjustment, and (c) your GPS doesn't ship the current leap-secondoffset in a form GPSD can see. If this happens, GPSD will fall backto a compiled-in default that is off by one
Some SiRFs have a particularly insidious version of this. They aresupposed to ship a MID52 sentence (which GPSD knows how to interpret)containing the current leap-second offset. But there is at least onefirmware revision that ships a damaged version of MID52 with a garbledstart sequence or a zero length field. GPSD cannot handle this.
The bad revision is 2.3.2-GSW2-2.05.024-C1Prod1.1; there may beothers. Suspect this if you have persistent off-by-one errors. If youare able to identify other bad firmware versions, please let usknow about it.
If your problem is wildly fluctuating speed reports on a SiRF,switch on static navigation mode using the M
command ingpsmon
. Static navigation mode will freeze your positionif your speed is below 1.2 m/s for three seconds, and will beginupdating your position again when speed exceeds 1.4 m/s. Thisprevents multipath, weak signals, or poor constellation geometryfrom dragging your solutions around too much. Other receivers maysuffer the same problem and may have a similar solution.
Use an external antenna, and place the sensor (and/or antenna) properly.
A good antenna can help, especially if you're using PPS as a timereference. It should be particularly helpful for reducing timingjitter.
One common error is to place the GPS or antenna as high aspossible. This will increase multipath effects due to signal bounce from the ground or water,which can cause the GPS to mistake its position and the time signal.The correct location for a boat GPS antenna is on the gunwale rail orpushpit rail, close to the water and as far from the mast as possible(to reduce signal bounce from the mast). If you're outside or in afixed location, put the GPS antenna as far from buildings as possible,and on the ground. If you're in a car, don't put the GPS antenna onthe roof, put it on the towbar, far forward on the dashboard, or somesimilar location.
If you're driving in a heavily built up area, you're going to getsignal bounce off buildings and reduced accuracy. That's just howthe physics works. Note, however, that as your velocity goes up itbecomes easier for the convergence filters in your GPS to spotand discard delayed signal, so multipath effects are proportionallyless important in fast-moving vehicles.
If you're using gpsd
with software that plots yourposition on a map, and you seem to be getting latitude/longitude thatis at a fixed offset from reality, it is possible the base datum ofthe map is something other than the WGS84 GPS uses. Afrequently-occurring case of this is older maps in the United Statesbased on NAD27 (e.g., USGS topo maps); you may see a displacement ofas much as 100-150m with respect to WGS84. While modern datums (e.g.,NAD83) are almost all very close to WGS84, typically each area ofworld has an older datum that only agrees at the 100m level.
All the measures you'd take to improve fixaccuracy will help. Time referencing at accuracies below0.01sec has its own set of issues related to latency in yoursensor and computer.
There is now a GPSD TimeService HOWTO that gives detailed setup instructions.
The earliest SBAS systems were WAAS (North America) and EGNOS(Europe). Multiple such systems exist, covering Japan (MSAS),India (GAGAN), etc, with more being deployed.
In your skyview, look for GPS sats with numbers 120 and above;those are the Space Based Augmentation System (SBAS) birds. For U.S.users 138 is the most likely PRN to show up.If your GPS receiver can see them at all, it can probably use themfor correction when you're within the coverage area of aSBAS. But you can't be sure of this unlessthey're marked as part of the satellite set for a fix. On the otherhand, some receivers may use them without marking the SBASsatellites as part of the fix set. Vendor documentation in this areatends to be murky or nonexistent.
If your receiver emits the NMEA GGA sentence, look at field 6 rightafter the E or W qualifier for the latitude. This is the GPS fixquality indicator field. 2 indicates that the receiver is getting andusing differential-GPS corrections. On a consumer-grade GPS thisusually means SBAS is in use.
Unfortunately, the mere presence of 'WAAS' in your receiver'sfeature list is not a guarantee that WAAS is actually supported. Thisfeature causes significant additional power usage, and OEMs sometimescondition it out of their firmware builds without documenting thatfact.
It has been found that while SiRF-II chips generally had WAASworking, SiRF-III support varies by firmware level.
Sadly, no. There are both hardware and software barriers to this.
Using AGPS would requires picking up and interpreting informationbroadcast by cellphone towers, so it would at minimum need anotherreceiver (separate from the GPS mouse) operating in those frequencybands. Of course, a cellphone has one of those built in. StandaloneGPS sensors don't.
There's another level of the problem, too. Supposing we had theright sort of receiver, AGPS systems are carrier-dependent. As far aswe know there aren't any published standards for the format of thecorrections. So even if we had the signals, GPSD couldn't know what todo with them.
This is a gpsdrive bug, as you can verify by runningxgps
alongside it.
Your Kismet configuration has to include the setting'gps=true' This is a surprisingly easy detail to forget.
The gpsd
code is designed to be autoconfiguring for bothstatic and hot-plugged devices. The gpsd
command lineoptions are only for problem solving or odd configurations.
One common problem is GNSS receivers that operate over Bluetooth.Changing the speed of these is difficult to impossible. Some gocatatonic if you try to change the serial port speed rate, which iswhy we have a -b option that prevents gpsd
from trying toconfigure the GPSes it talks to.
Another problem is that some systems may have long autobaud detectiontimes, or be set to impossible to detect framing, like 8O1.On most systems, simply set the speed and framing before callinggpsd
and gpsd
will try those settings first.This works for both devices specified on the gpsd
commandline and those hot-plugged with gpsdctl
.
Accordingly, you can short-circuit the autobaud if you use stty(1) to setthe bit rate just before starting gpsd. For example, suppose you know thatyour GPS is on serial port 0 and operates at a fixed bps of 54600. Youcan set that up like this:
If you have a Trimble that needs 115200 and 8O1, do this:
If you only have one device connected to gpsd
andthat device is specified on the command line, then you can insteadspecify the speed with the -s [SPEED] option and/or the framingwith the -f [FRAMING] option.
For more details and discussion about autobaud refer to theHacker's Guide.
Most USB devices have a defined device class -mass storage, video, hub, and human interface device are three of themore common ones. Using GPSD will never interfere with such devices,nor will they interfere with GPSD.
Unfortunately, there is no device class for USB GPSes. Nor is therea device class for USB-to-serial adapter chips. Both are assigned thecatch-all class 0xFF, 'Vendor Specific'. Almost every USB GPS we've ever seenconsists of a GPS module with TTL-level RS232 outputs connected to anRS232-to-USB adapter chip, and presents the class ID 0xFF to your USBsubsystem. The only exceptions we know of are some u-blox modules thatpretend to be USB modems.
When you install GPSD, it puts in place rules that watch forhotplug activation events from devices that might be GPSes. When sucha hotplug event happens, a gpsd
instance is started (ifone is not already running) and puts a copy of the device path in aninternal stash list. Later, if a client application requests GPS data,gpsd
will try to read from the device, and discard itfrom the stash list if it is not emitting data that gpsd
recognizes.
GPSD's notion of 'might be a GPS' depends on the fact that all USBGPSes are made with one of a small number of USB-to-serial adapterchips, the most common of which is the Prolific Logic 2303. GPSD'shotplug rules expect that anything exhibiting the USB vendor:productID pair of one of these chips will be a GPS.
A problem can arise if you have other devices connected to yoursystem through one of these specific adaptor chips. When theseactivate, the GPSD hotplug rules will believe they are GPSes, andgpsd
will try to read from them when a GPS-ware clientapplication requests data. We've had reports of this happening withUSB modems and various microcontroller kits. It's not a problem we cansolve with clever programming, the devices simply don't yieldenough information about themselves to avoid conflicts.
Under Linux, gpsd
at 3.1 and later versions checkseach serial and USB device after opening it to see if any otherprocess has that device open; if so, it's dropped. This should atleast keep GPSD from usurping data sources belonging to other servicedaemons.
Note that GPSD never tries to configure USB devices until it hasidentified them as sensors of a known type. Also, it tries to open withTIOCEXCL and thus will not open devices that another process alreadyhas open. So the worst case is a race between GPSD and another processto open a device not in use, in which the other process's open fails.
If this sort of conflict becomes a problem, you can work aroundit by disabling the GPSD hotplug rules. Unfortunately, this meansyou will have to start gpsd
manually with a device-pathargument when you want to use a GPS.
The daemon, gpsd
, is designed to run light so it can beused in low-power embedded-systems deployments. Data throughput from GPSesand other navigational sensors is low and tends to be concentrated in burstsat about one-second intervals; accordingly, gpsd
spends mostof its time simply waiting in select(2) at effectively zero CPU cost. Evenwith a client session and a GPS active, we have measured gpsd's CPU loadat steadily less than 1% on a low-power, low-speed ARM SBC.
Occasionally we get a bug report from a user who says a USB portlocks up or becomes unavailable after gpsd
has closed it.Such problems may persist until the USB port is unplugged andreplugged, or until all devices in that root hub are unplugged andreplugged, or even until a reboot.
This is not a GPSD bug. Bugs in the serial-device layer of youroperating system, tickled by gpsd's unusual autobauding loop andserial-parameter changes, can cause problems like this. They may bedriver-specific bugs, or they may be due to bad interactions betweenioctl() and select() in the kernel's generic tty code. Bugs in the USBchipset on your motherboard or in a hub can do it, too.
Here are some possible fixes:
- 1. Suppress the autobauding loop
- The autobauding hunt loop in
gpsd
stresses chipsets anddrivers in unusual ways, which is why these sorts of bugs show up moreoften undergpsd
than most other USB-using software. The firstthing to try is to suppress the autobauding loop. - 2. Upgrade your kernel
- Upgrading your kernel may help. Obscure tty-layer kernel bugs popup relatively often and are usually fixed pretty quickly.
- 3. Try a different USB-to-serial chip
- Another thing to try is a GPS with a different USB-to-serial chip.You probably do not have a a chip-specific problem if you're usinga PL23203, as those drivers have been tested a lot. But we've seenreports that were definitely chip-specific on less common chipsetssuch as FTDI. The CP210x chips are also known to be problematic,mainly because the vendor refused to release enough programminginformation to allow a decent open-source driver to be written.
- 4. Replace your USB hub
- Some USB hubs are flaky. You may need to replace yours.
When you have had such a problem with gpsd
, and areable to work around it or fix it, please inform us so we canimprove this FAQ.
At one point in the development of gpsd
we got areport of the daemon ceasing to respond to queries when run formore than a day or so; the user, quite reasonably, suspected some sortof resource leak in the daemon. On the other hand, other users reportedgood operation over much longer periods with the same version ofthe software. That suggests a bug at the level of the user's operatingsystem or local site configuration.
Nevertheless, the possibility of a resource-leak bug alarmed usenough that after 2.26 one of us (ESR) built an entire test frameworkfor auditing the code's dynamic behavior and used it to apply Valgrind. You can look at theresulting script, valgrind-audit, in the source distribution. Thisturned up a couple of minor leaks, but nothing sufficient to explainthe report.
One of our senior developers, Rob Janssen, has seengpsd
interact badly with overnight backups, pushing thesystem load average through the roof. He says: 'when you copy manygigabytes of data from disk to disk, the [Linux] kernel's buffermanagement goes completely haywire. [...] I think this is caused bothby allocation of many buffers for reading files, and by accumulationof many dirty buffers that still have to be written. At some point,programs like gpsd (but also all interactive programs and the Xdisplay manager) come to a complete standstill while the system isswapping like mad.'
If Rob's analysis is correct, gpsd
is a canary in acoal mine. If your gpsd
locks up after a long period ofoperation, you should look at your logs and see if you can connect thepoint at which it stopped responding to some kind of resource crisisbrought on by lots of I/O activity.
Another thing to try is running gpsd
under Valgrind overnightand seeing if it reports any leaks.
Some applications that use gpsd
start raw modeand parse the NMEA directly. This is not a good idea.
One problem with raw mode is that NMEA is a poorly specifiedstandard. There are, for example, two different and incompatiblevariants of GPVTG. Another issue is that implementations vary as towhether they leave fields they don't supply empty or fill them in witha special value such as 0.0. Interpretation of the different NMEAstatus fields is a black art.
It is all too easy to write an NMEA parser that works well on onevariant but breaks on another, delivering subtly incorrect results oreven crashing your application. Because gpsd
specializesin the job, we collect knowledge on all variants and do parsing thatis much less likely to get tripped up.
Another issue is that some of the reports your application wouldlike to have are not generated by all GPSes. Estimated position errorin meters is the most obvious example; climb/sink is another. When a GPSdoesn't supply these, gpsd
can fill them in using thesame sorts of computation that more capable GPSes use.
The gpsd
package provides two ways for C code to getdata from a GPS or AIS receiver. Both go through the libgps.a library,which supports two sets of entry points. The low-level interface talks directly to the GPS.The high-level interface communicates withan instance of gpsd
, which uses its own copy of libgps.ato talk to the device.
A third way would be to open a socket to gpsd
andinterpret gpsd
protocol or raw NMEA in your application.Before 2.0, all gpsd
-aware applications had to do thisbecause libgps.a didn't exist. Now that it does, the exercise israther pointless. Using libgps.a will probably simplify your code alot.
You will almost always want to use the high-level interface and gothrough the daemon; among other things, this means more than oneapplication will be able to query the GPS without causing confusion.The only exception will be in very space-constrained single-userscenarios, perhaps on embedded systems or PDAs. On those it may beappropriate to use the low-level interface directly, probably with abuild from source that conditions out all but one of the drivers.
For Python programmers, there is a gps.py module the high-levelinterface. It exports a class that encapsulates a GPS session.
Sorry, there's no easy way to do these things through GPSD yet.The reason is that there is no consistent way to make GPS receiversreport this information.
Many don't ship it at all. Others (including some but not alldevices shipping SiRF binary packets) ship it occasionally in SUBFRAMEinformation, but you have to know exactly how to grovel through theSUBFRAME fields to get it and the documentation of those inIS-GPS-200E (the over-the-air protocol used by GPS satellites) isextremely obscure. Still others report varying subsets ofalmanac/ephemeris/pseudorange data in reasonably straightforward ways,but in vendor-proprietary sentences that are extremely specific toindividual receiver types, poorly documented or undocumented, andoften needing to be activated by control sequences that are equallyspecific and even worse documented.
We'd like to do a better job of extracting this information, buthandling all the potential variations would be an extremely difficultand messy job. It's hard to know what to do, and even harder to knowhow to test the correctness of the extraction code once you think youhave it. The spectacularly bad design and documentation of mostvendor-specific GPS reporting protocols is at its abysmal worst inthis exact area.
On a SiRF-based device you might be able to get some use out ofthe SUBFRAME JSON. If you succeed in extractingalmanac/ephemeris/pseudorange data from those raw fields, we saluteyou - and please share that code with us!
The Bluetooth stack returns 0 for a read from a missing device,rather than -1, and doesn't set errno. This is wrong and needs to befixed at OS level.
This is not a GPSD problem, but a result of the way Linux handlesUSB serial devices. In a default Linux configuration, USB serialdevice name do not depend on which physical port you plug theUSB/serial adaptor, but on what order you plug devices in: 1st devicegets /dev/ttyUSB0, 2nd gets /dev/ttyUSB1, etc....
Best Usb Devices
This collides with what happens during a suspend/resume. If yoususpend while gpsd
has a device active, it will hold thedevice open while your laptop is asleep - but, meanwhile, the suspendlogic is shutting down hotpluggable devices to be recreated atresume time. On resume, Linux will see that the old device is openand recreate one with a different name, leaving gpsd
looking at a bad file descriptor.
A.p. Van Den Berg Usb Devices Driver Download For Windows 10 Free
There is a solution to this problem: create a stable gps-usb devicethat is actually a symlink which gets modified by hotplug events, andgive gpsd
that device when you invoke it. You'll need these replacement udev rules,and the experience required to patch them so the vendor ID in the lastone matches your GPS hardware (look in your lsusb output).