Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
Last revision Both sides next revision
sdk:gps-udp-client-gnsstogps [2019/07/08 14:13]
fachet
sdk:gps-udp-client-gnsstogps [2020/12/10 16:13]
juraschek [SDK Script gps-udp-client-GNSStoGPS.are]
Line 1: Line 1:
 +====== Background ======
 +GPS was the first Global Navigation Satellite System (GNSS) and the term GPS is often used as a synonym for GNSS.
 +
 +Older software often only checks for NMEA 0183 sentences starting with <​nowiki>"​$GP"</​nowiki>​ (= GPS only) instead of looking for  all GNSS systems.
 +
 +Newer GNSS receivers often use multiple GNSS systems and therefore <​nowiki>"​$GN"</​nowiki>​ is used (<​nowiki>"​$GNRMC..."</​nowiki>​) if it recives a combination of GPS, Galileo and GLONASS signals.
 +
 +It would be better to us instead of <​nowiki>"​$GPRMC"</​nowiki>​ either <​nowiki>"​$G.RMC"</​nowiki>​ ("​."​ = anychar) for using GPS, Galileo and/or GLONASS (GNSS) or even <​nowiki>"​$..RMC"</​nowiki>​ which means any source.
 +
 +<​code>​
 +NMEA 0183 sentence "​$XXYYY..."​ explanation:​
 +
 +"​$"​ = Start 
 +"​XX"​ = Source device (https://​de.wikipedia.org/​wiki/​NMEA_0183#​Ger%C3%A4te-IDs)
 + BD = Beidu
 + GA = Galileo
 + GL = GLONASS
 + GP = GPS
 + GN = GNSS position fix from more than one constellation (eg. GPS + GLONASS)
 +"​YYY"​ = Record
 + RMC = Recommended Minimum Sentence C (used in most cases)
 + GGA = Global Positioning System Fix Data
 + GNS = GNSS fixed data
 + GLL = Geographic Position - Latitude/​Longitude
 + ...
 +
 +Source: https://​de.wikipedia.org/​wiki/​NMEA_0183
 +</​code>​
 +
 ====== SDK Script gps-udp-client-GNSStoGPS.are ====== ====== SDK Script gps-udp-client-GNSStoGPS.are ======
 <code c gps-udp-client-gnsstogps.are>​ <code c gps-udp-client-gnsstogps.are>​
Line 23: Line 52:
  
  nb_config_set("​gpsd.0.status=0"​);​  nb_config_set("​gpsd.0.status=0"​);​
- sleep(3);+                do { 
 +                                ​sleep(3); 
 +                } while ( nb_config_done != 0) 
 +     
  nb_config_set("​gpsd.0.status=1"​);​  nb_config_set("​gpsd.0.status=1"​);​
- sleep(5); +                do { 
 +                 ​sleep(5); 
 +                } while ( nb_config_done != 0)
  return 0;  return 0;
 } }
- 
 int gpsd_connect () int gpsd_connect ()
 { {
Line 39: Line 71:
  exit(-1);  exit(-1);
  }  }
- for (attempt = 0; attempt <= 5; attempt++) { + for (attempt = 0; attempt <= 15; attempt++) { 
- sleep(3);+ sleep(15);
  
  if (connect(gpsd,​ local_ip, local_port) < 0) {  if (connect(gpsd,​ local_ip, local_port) < 0) {
  nb_syslog("​Could not connect to daemon"​);​  nb_syslog("​Could not connect to daemon"​);​
- if (attempt == 3) {+ if (attempt == 12) {
  nb_syslog("​Unable to connect, restarting daemon"​);​  nb_syslog("​Unable to connect, restarting daemon"​);​
  gpsd_restart();​  gpsd_restart();​
Line 58: Line 90:
  
  return gpsd;  return gpsd;
 +}
 +
 +string checksum(string s)
 +{
 + pos = strchr(s, "​*"​);​
 +
 +  if (is_void(pos))
 + return s; /* no checksum to correct */
 +
 + cs = 0;
 + chars = explode(s);
 +        for (i = 1; i < pos; i++) { /* skip $ and *XX */ 
 +     c = ord(chars[i]);​
 +            cs ^= c;
 +        }
 +        r = sprintf("​%s%02X%s",​ substr(s, 0, pos + 1), cs, substr(s, pos + 3));
 + return r;
 } }
  
Line 126: Line 175:
  a_arr = explode(data);​  a_arr = explode(data);​
  a_arr[2] = "​P";​  a_arr[2] = "​P";​
- data = implode(a_arr);​+ data = checksum(implode(a_arr));
  }  }
  /* skip all messages different from GPGGA   /* skip all messages different from GPGGA