This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision Last revision Both sides next revision | ||
sdk:scripts:gps-udp-client [2017/10/11 16:13] fachet |
sdk:scripts:gps-udp-client [2019/07/08 12:47] fachet |
||
---|---|---|---|
Line 86: | Line 86: | ||
} | } | ||
} else { | } else { | ||
+ | | ||
+ | /* Convert message $GN to $GP */ | ||
+ | /* if (strstr(data,"$GNGGA")==0) { | ||
+ | * a_arr = explode(data); | ||
+ | * a_arr[2]="P"; | ||
+ | * data = implode(a_arr); | ||
+ | * } | ||
+ | */ | ||
+ | /* skip all messages different from GPGGA */ | ||
+ | /* if (strstr(data,"$GPGGA")==()) | ||
+ | * continue; | ||
+ | */ | ||
sent = sendto(server, data, SERVER, PORT); | sent = sendto(server, data, SERVER, PORT); | ||
if (sent != len) { | if (sent != len) { | ||
Line 100: | Line 112: | ||
</code> | </code> | ||
- | ====== SDK Script gps-udp-broadcast.are ====== | ||
- | <code c gps-udp-broadcast.are> | ||
- | /* DESC: This script sends the local GPS NMEA via UDP broadcast to multiple ports | ||
- | * selected by NMEA type. | ||
- | * Copyright (C) 2013-2017 NetModule AG, Switzerland | ||
- | */ | ||
- | BroadcastIP = "192.168.1.255"; | ||
- | |||
- | // Connect to GPS Deamon | ||
- | int connect_gpsd() { | ||
- | nb_syslog("Connecting to GPS daemon."); | ||
- | sock = -1; | ||
- | while(true) | ||
- | { | ||
- | sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); | ||
- | if (sock < 0) | ||
- | { | ||
- | nb_syslog("Unable to open TCP socket. Retrying in 5 seconds"); | ||
- | sleep(5); | ||
- | continue; | ||
- | } | ||
- | |||
- | if (connect(sock, "127.0.0.1", 2947) < 0) | ||
- | { | ||
- | nb_syslog("Could not connect to GPS daemon. Retrying in 5 seconds"); | ||
- | close(sock); | ||
- | sleep(5); | ||
- | continue; | ||
- | } | ||
- | nb_syslog("GPS daemon connected."); | ||
- | return(sock); | ||
- | break; | ||
- | } | ||
- | } | ||
- | |||
- | |||
- | |||
- | gpsd = connect_gpsd(); | ||
- | |||
- | /* open UDP server socket */ | ||
- | server = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); | ||
- | if (server < 0) { | ||
- | nb_syslog("Unable to open server socket."); | ||
- | close(gpsd); | ||
- | exit(-1); | ||
- | } | ||
- | setsockopt(server, SOL_SOCKET, SO_BROADCAST, 1); | ||
- | |||
- | nb_syslog("GPS Broadcast to %s", BroadcastIP); | ||
- | // process NMEA stream | ||
- | |||
- | nb_syslog("Processing NMEA data"); | ||
- | |||
- | while (true) { | ||
- | /* wait for socket data */ | ||
- | rv = select(gpsd, 3); | ||
- | if (rv > 0) { | ||
- | data = recv(gpsd); | ||
- | len = strlen(data); | ||
- | } else if (rv < 0) { | ||
- | nb_syslog("select failed"); | ||
- | len = -1; | ||
- | } else { // nothing received | ||
- | continue; | ||
- | } | ||
- | if (len <= 0) { | ||
- | nb_syslog("Receive failed, re-connecting to GPS daemon"); | ||
- | close(gpsd); | ||
- | gpsd = connect_gpsd(); | ||
- | if (gpsd < 0) | ||
- | exit(-2); | ||
- | } else { | ||
- | // printf("got >>>%s<<<\n", data); | ||
- | while(true) //handle CR /LF problems and separate data into singel $Gxxx frames | ||
- | { | ||
- | newlinepos = strstr(data, "\r\n"); | ||
- | seplen = 0; | ||
- | if (newlinepos != ()) { | ||
- | seplen = 2; | ||
- | } else { | ||
- | newlinepos = strstr(data, "\n"); | ||
- | if (newlinepos != ()) { | ||
- | seplen = 1; | ||
- | } | ||
- | } | ||
- | | ||
- | if (seplen != 0) { | ||
- | frame = strcat(left(data, newlinepos), "\r\n"); | ||
- | // printf("frame >>>%s<<<\n", frame); | ||
- | if (left(frame, 6) == "$GPRMC") { | ||
- | sendto(server, frame, BroadcastIP, 5125); | ||
- | sendto(server, frame, BroadcastIP, 5126); | ||
- | sendto(server, frame, BroadcastIP, 6060); | ||
- | } | ||
- | if (left(frame, 6) == "$GPGGA") { | ||
- | sendto(server, frame, BroadcastIP, 5126); | ||
- | } | ||
- | if (left(frame, 6) == "$GPGSA") { | ||
- | sendto(server, frame, BroadcastIP, 5126); | ||
- | } | ||
- | data = substr(data, newlinepos + seplen); | ||
- | } | ||
- | else | ||
- | break; | ||
- | | ||
- | } | ||
- | } | ||
- | } | ||
- | exit(-3); | ||
- | </code> | ||