Differences

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

Link to this comparison view

sdk:gps-udp-broadcast [2017/10/11 18:34] (current)
fachet created
Line 1: Line 1:
 +====== 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) 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>​