This is an old revision of the document!


GPS NMEA Frames via Serial

The built-in GPS Function is TCP/IP only. If you want to retrieve the GPS NMEA frames over the serial interface of a Netmodule Router you can use this SDK script.

Script Summary

This Script connects to the GPS server via tcp. T

The default serial parameters for GPS are 4800 8N1 (8 databit, no parity, 1 stop bit, no flow controll). This parameter can be configured at the begining of the script. Please use if possible a higher data rate e.g. 115200.

Pre Requierments

To use this script you need to enable the GNSS Interface on the Router to your needs. Please use the “raw-mode” with this SDK script.

Also assign the serial interface to the SDK

Installation

Detailed step by step instructions how to install a sdk script can be found on this wiki page

Please combine this script with the “system-startup” trigger to a job

This script does not need any configuration, but you can define the serial parameter to your needs:

/* Serial Baud Rate 4800, 9600, 19200, 38400, 57600, 115200 */
SER_SPEED=4800;
/*  number of data bits (5, 6, 7, 8) */
SER_DATABIT=8;
/*  number of stop bits (1, 2) */
SER_STOPBIT=1;
/* parity (0=no parity, 1=odd parity, 2=even parity) */
SER_PARITY=0;
/*  flow control (0=none, 1=xon/xoff, 2=hardware) */
SER_FLOW=0;
/*  name of the Serial Interface (Only changed if your device has more then one serial Interface (NB3710) */
DEV = "SERIAL1";

Testing

To be sure the script is running you can take a look on the System Log and watch for outputs like:

Apr 23 00:53:41 NB2700 user.info sdkhost[2283]: testrun: starting serial
Apr 23 00:53:42 NB2700 user.info sdkhost[2283]: testrun: Connecting to GPS daemon
Apr 23 00:53:42 NB2700 user.info sdkhost[2283]: testrun: Requesting raw NMEA stream
Apr 23 00:53:42 NB2700 user.info sdkhost[2283]: testrun: Successfully connected to GPS daemon
Apr 23 00:53:42 NB2700 user.info sdkhost[2283]: testrun: Processing NMEA data
Apr 23 00:53:42 NB2700 user.info sdkhost[2283]: testrun: Unable to send message to via Serial
Apr 23 00:54:08 NB2700 user.info sdkhost[2283]: testrun: starting serial
Apr 23 00:54:09 NB2700 user.info sdkhost[2283]: testrun: Connecting to GPS daemon
Apr 23 00:54:09 NB2700 user.info sdkhost[2283]: testrun: Requesting raw NMEA stream
Apr 23 00:54:09 NB2700 user.info sdkhost[2283]: testrun: Successfully connected to GPS daemon
Apr 23 00:54:09 NB2700 user.info sdkhost[2283]: testrun: Processing NMEA data

The Script

gps-to-serial.are
 
/* DESC: This script sends the local GPS NMEA stream (incl. serial/checksum) to a remote UDP server.
 * Copyright (C) 2013-2015 NetModule AG, Switzerland
 */
 
/* Options to configure by user*/
SER_SPEED = 4800;	/* Serial Baud Rate 4800, 9600, 19200, 38400, 57600, 115200 */
SER_DATABIT = 8;	/*  number of data bits (5, 6, 7, 8) */
SER_STOPBIT = 1;	/*  number of stop bits (1, 2) */	
SER_PARITY = 0;		/* parity (0=no parity, 1=odd parity, 2=even parity) */
SER_FLOW = 0;		/*  flow control (0=none, 1=xon/xoff, 2=hardware) */
DEV = "SERIAL1";	/*  name of the Serial Interface */
 
/* GPS Deamon Parameters */
HOST = "127.0.0.1";	/* local host */
PORT = nb_config_get("gpsd.0.port");
 
void usage() 
{
    nb_syslog("Usage: gps2serial.are");
    exit(1);
}
 
int start_serial() {
    /* set attributes */
    if ((rc = nb_serial_setattr(DEV, SER_SPEED, SER_DATABIT, SER_STOPBIT, SER_PARITY, SER_FLOW)) != 0) {
        nb_syslog("ERROR: unable to set serial attributes (rc %d) to %s", rc, DEV);
        return -1;
    }
    /* open serial port */
    if ((fd = nb_serial_open(DEV)) < 0) {
        nb_syslog("ERROR: can't open serial port %s", DEV);
        return -1;
    return fd;
}
 
int connect_gpsd()	/* tries infinetively to connect to gpsd - socket returned */
{
    while (1) {
        sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
        if (sock < 0)
            nb_syslog("Unable to create socket");
        else if (connect(sock, HOST, PORT) < 0){
            nb_syslog("Could not connect to GPS daemon");
            close(sock);
        } else {
            nb_syslog("Successfully connected to GPS daemon");
            return sock;
        }
      	sleep(10);
    }
    /* no return */
}
 
 
nb_syslog("starting serial");
serial_fd = start_serial();
if (serial_fd < 0 ) {
    nb_syslog("Could not start serial, exiting");
    exit(1);
}
gpsd = connect_gpsd();
nb_syslog("Processing NMEA data");
 
while (1) {
    /* wait for socket data  */
    if ((rv = select(gpsd, 3)) == 0)
      	continue;
    if (rv < 0) {
        nb_syslog("Receive failed, re-connecting to GPS daemon");
        if ((gpsd = connect_gpsd()) < 0)
            exit(3);	/* can't connect */
        continue;
    }
    data = recv(gpsd);
    len = strlen(data);
    if (write(serial_fd, data, len) != len)
       nb_syslog("Unable to send message via Serial, data %s, len: %i", data, len);
}
 
close(gpsd);
close(serial_fd);
exit(4);