示例#1
0
def Parse(data):
  """Unpack a TAG Block line or return None.

  Makes sure that the line matches the regex and the checksum matches.

  Args:
    data: Line of text or a dict from at TAG_BLOCK_RE.

  Returns:
    A NMEA TAG Block dict or None if the line would not parse or has
    an invalid checksum.
  """
  if isinstance(data, str):
    try:
      result = TAG_BLOCK_RE.search(data).groupdict()
    except AttributeError:
      return
  elif isinstance(data, dict):
    result = data
  else:
    return

  result.update({k: util.MaybeToNumber(v)
                 for k, v in six.iteritems(result) if k in NUMERIC_FIELDS})

  actual = nmea.Checksum(result['metadata'])
  expected = result['tag_checksum'].upper()
  if actual != expected:
    return

  return result
示例#2
0
 def testChecksum(self):
     self.assertEqual(nmea.Checksum('$NVXDR,G,142983,,WPTTTG*00'), '00')
     self.assertEqual(nmea.Checksum('$GPHDT,143.59,T*0F'), '0F')
     self.assertEqual(nmea.Checksum('$INHDT,89.4,T*10'), '10')
     self.assertEqual(nmea.Checksum('$INROT,0,A*3F'), '3F')
     self.assertEqual(
         nmea.Checksum('!AIVDM,1,1,,B,14Qle<001mDoOKD`v:`Rc2;R1d00,0*00'),
         '00')
     self.assertEqual(
         nmea.Checksum(r'\n:121650,s:r17MHOP1,c:1425327399*1D'), '1D')
     self.assertEqual(nmea.Checksum(r'\g:2-2-223509,n:453068*26'), '26')
示例#3
0
def Parse(data):
    """Unpack a NMEA VDM AIS message line(s)."""

    if not isinstance(data, six.string_types):
        raise NotImplementedError

    try:
        result = VDM_RE.search(data).groupdict()
    except AttributeError:
        return

    result.update({
        k: util.MaybeToNumber(v)
        for k, v in six.iteritems(result) if k in NUMERIC_FIELDS
    })

    actual = nmea.Checksum(result['vdm'])
    expected = result['checksum']
    if actual != expected:
        return

    return result