This Azure IoT Edge module parses NMEA messages from multiple ports and outputs them as events. This module is an IoT Edge implementation of this nmea library.
This module parses incoming NMEA messages like GSV, GGA, GSA, GLL, GMC, VTG and TXT. Incoming NMEA messages which are splitted up in multiple messages like GSA and GSV are combined.
Messages from multiple ports are not combined but splitted in multiple outputs.
This module is available in Docker Hub.
Use it in your IoT device with tag:
svelde/iot-edge-nmea:1.0.0-amd64
Messages are received on input 'input1'.
This is the Input format:
{
[JsonProperty("data")]
public string Data { get; set; }
[JsonProperty("port")]
public string Port { get; set; }
[JsonProperty("timestampUtc")]
public DateTime TimestampUtc { get; set; }
}
Parsed messages are send over an output with the same name as the port which submitted the NMEA messages.
So the parsed version of a NMEA message coming from 'ttyS0' will be available on output 'ttyS0'.
The Output format is depending on the specific parsed message. See the supported NMEA parser classes for the specific messages.
An example is:
public abstract class GsaMessage : NmeaMessage
{
[JsonProperty(PropertyName = "autoSelection")]
public string AutoSelection{ get; private set; }
[JsonProperty(PropertyName = "fix3D")]
public string Fix3D { get; private set; }
[JsonProperty(PropertyName = "percentDop")]
public decimal PercentDop { get; private set; }
[JsonProperty(PropertyName = "horizontalDop")]
public decimal HorizontalDop { get; private set; }
[JsonProperty(PropertyName = "verticalDop")]
public decimal VerticalDop { get; private set; }
[JsonProperty(PropertyName = "prnsOfSatellitesUsedForFix")]
public List<int> PrnsOfSatellitesUsedForFix { get; private set; }
}
The NmeaMessage looks like this:
public abstract class NmeaMessage
{
[JsonProperty(PropertyName = "type")]
public string Type {get; set;}
[JsonProperty(PropertyName = "port")]
public string Port { get; set; }
[JsonProperty(PropertyName = "timestampUtc")]
public DateTime TimestampUtc { get; set; }
[JsonProperty(PropertyName = "mandatoryChecksum")]
public string MandatoryChecksum { get; set; }
}
This message contains a user-defined property "content-type" with value "application/edge-nmea-json".
In case a message can not be parsed or another excpetion occurs, a message will be put on output 'Exception'.
This is the Exception format:
public class ExceptionMessage
{
[JsonProperty("message")]
public string Message { get; set; }
}
This message contains a user-defined property "content-type" with value "application/edge-nmea-exception".
Here is an example of how to use routes:
{
"routes": {
"serialToNmea": "FROM /messages/modules/serial/outputs/ttyACM0 INTO BrokeredEndpoint(\"/modules/nmea/inputs/input1\")",
"nmeaToEcho": "FROM /messages/modules/nmea/outputs/Exception INTO BrokeredEndpoint(\"/modules/echo/inputs/input1\")",
"route": "FROM /messages/modules/nmea/outputs/ttyACM0 INTO $upstream"
}
}
The parser can be limited in the types of messages to be parsed.
Provide this 'filter' desired property to limit all parsers:
"desired": {
"filter": "GPGSV,GLGSV,GNGSV,GPGSA,GNGSA,GNGLL,GNRMC,GNVTG,"
}
The following devices are used to test the parser:
- BEITIAN USB GNSS GPS Receiver BN-85U (U-Blox UBX-M8030)
- Webio GRB-288 Bluetooth GPS mouse
- GSpace GS-R238 GPS mouse (SiRFstarIII)
Note: If you want to have your GPS device tested and officially supported here, please send me a DM on github or twitter @svelde
The routing image is produced with the IoT Edge Module Flow generator.
The code of this logic is open source and licenced under the MIT license.
Want to contribute? Throw me a pull request....
Want to know more about me? Check out my blog.