def _parseBody(self): """ Parses body of the packet @protected """ super(ImePacketData, self)._parseBody() self._params = {} sensors = {} parts = self._data.decode().split("|") gprmc = parts[0].split(',') if len(gprmc) > 8: # lets get packet time self._params['time'] = datetime.strptime( gprmc[8] + ',' + gprmc[0], '%d%m%y,%H%M%S.%f') # and coordinates sensors['latitude'] = Geo.getLatitude(gprmc[2] + gprmc[3]) sensors['longitude'] = Geo.getLongitude(gprmc[4] + gprmc[5]) # and other params sensors['speed'] = float(gprmc[6] or 0) * 1.85200 sensors['azimuth'] = int(float(gprmc[7] or 0)) sensors['hdop'] = float(parts[1] or 0) sensors['altitude'] = int(float(parts[2] or 0)) else: self._params['time'] = datetime.now() sensors['hdop'] = 1 # fake hdop sensors['sat_count'] = 10 # fake sat_count self._params['sensors'] = sensors.copy() # old fashioned params for key in ['latitude', 'longitude', 'speed', 'altitude', 'azimuth', 'hdop']: if key in sensors: self._params[key] = sensors[key] if 'sat_count' in sensors: self._params['satellitescount'] = sensors['sat_count']
def translate(self, data): """ Translate gps-tracker data to observer pipe format @param data: dict() data from gps-tracker """ packet = {} sensor = {} for char in data: value = data[char] # IMEI / UID if char == "S": packet['uid'] = value # TIME elif char == "B": try: dt = datetime.strptime(value, '%d%m%y,%H%M%S') except: dt = datetime.strptime('00', '%y') packet['time'] = dt.strftime('%Y-%m-%dT%H:%M:%S.%f') # COORD elif char in ("d1", "d2", "d3"): packet['longitude'] = Geo.getLongitude(value) elif char in ("d6", "d7", "d8"): packet['latitude'] = Geo.getLatitude(value) # ALTITUDE elif char == "G": packet['altitude'] = int(round(float(value))) # SPEED (knots) elif char == "H": packet['speed'] = 1.852 * float(value) # SPEED (km/hr) elif char == "I": packet['speed'] = value # SPEED (mile/hr) elif char == "J": packet['speed'] = 1.609344 * float(value) # Satellites count elif char == "L": packet['satellitescount'] = int(value) sensor['sat_count'] = int(value) # Azimuth - driving direction elif char == "K": packet['azimuth'] = int(round(float(value))) # HDOP (Horizontal Dilution of Precision) elif char == "M": packet['hdop'] = float(value) # Report Mode elif char == "A": if int(value) == 5: sensor['sos'] = 1 self.setPacketSensors(packet, sensor) return packet