예제 #1
0
    def form_frlin(self, force_imei=True):
        """
        Form the $FRLIN sentence, assuming the SELF values are valid:
        * self.server_major_version
        * self.server_minor_version
        * self.client_name_version

        The return is wrapped with the NMEA checksum

        :return:
        :rtype: str
        """

        if not force_imei and self.client_username is not None:
            # we prefer the username - when set!
            if not isinstance(self.client_username, str):
                raise ValueError("FRLIN Error: user name is not string")
            if not isinstance(self.client_password, str):
                raise ValueError("FRLIN Error: password is not string")
            sentence = "FRLIN,,{0},{1}".format(
                self.client_username,
                self._encrypt_password(self.client_password))
        else:
            if not isinstance(self.client_imei, str):
                raise ValueError("FRLIN Error: IMEI is not string")
            sentence = "FRLIN,IMEI,{0},".format(self.client_imei)
        sentence = gps_nmea.wrap_sentence(sentence)
        return sentence
예제 #2
0
    def form_frcmd_reset(self):
        """
        $FRCMD,IMEI,_DeviceReset

        The return is wrapped with the NMEA checksum

        :return:
        :rtype: str
        """
        return gps_nmea.wrap_sentence(self.get_frcmd_id("_Device_Reset"))
예제 #3
0
    def test_checksum(self):

        tests = [
            ("$GPGGA,222227.0,4500.819061,N,09320.092805,W,1,10,0.8,281." +
             "3,M,-33.0,M,,*6F\r\n",
             "GPGGA,222227.0,4500.819061,N,09320.092805,W,1,10,0.8,281." +
             "3,M,-33.0,M,,", 0x6F),
            ("$GPRMC,222227.0,A,4500.819061,N,09320.092805,W,0.0,353.2," +
             "020516,0.0,E,A*1D\r\n",
             "GPRMC,222227.0,A,4500.819061,N,09320.092805,W,0.0,353.2," +
             "020516,0.0,E,A", 0x1D),
            ("$GPVTG,353.2,T,353.2,M,0.0,N,0.0,K,A*23\r\n",
             "GPVTG,353.2,T,353.2,M,0.0,N,0.0,K,A", 0x23),
            ("$PCPTI,IBR1100-702,222227,222227*33\r\n",
             "PCPTI,IBR1100-702,222227,222227", 0x33),
            ("$GPGGA,222237.0,4500.819061,N,09320.092805,W,1,09,0.8,281.3" +
             ",M,-33.0,M,,*66\r\n",
             "GPGGA,222237.0,4500.819061,N,09320.092805,W,1,09,0.8,281.3" +
             ",M,-33.0,M,,", 0x66),
            ("$GPRMC,222237.0,A,4500.819061,N,09320.092805,W,0.0,353.2" +
             ",020516,0.0,E,A*1C\r\n",
             "GPRMC,222237.0,A,4500.819061,N,09320.092805,W,0.0,353.2" +
             ",020516,0.0,E,A", 0x1C),

            # some bad tests
            (None, TypeError, 0),
            ("", IndexError, 0),
        ]

        for test in tests:
            full = test[0]
            base = test[1]
            csum = test[2]

            if base == TypeError:
                with self.assertRaises(TypeError):
                    nmea.calc_checksum(full)

            elif base == IndexError:
                with self.assertRaises(IndexError):
                    nmea.calc_checksum(full)

            else:
                self.assertEqual(nmea.calc_checksum(full), csum)
                self.assertTrue(nmea.validate_checksum(full))
                self.assertEqual(nmea.calc_checksum(base), csum)
                self.assertEqual(nmea.wrap_sentence(base), full)

        return
예제 #4
0
    def form_frret_imei(self):
        """
        Form the $FRRET,IMEI response for server

        The return is wrapped with the NMEA checksum

        :return:
        :rtype: str
        """
        sentence = self.get_frret_id("_GprsSettings") + ",,{0},{1},{2}".format(
            self.DEF_TRACKER_NAME, self.client_name, self.client_version)

        if self.OPT_USE_ONLY_TCP:
            sentence += ",tcp"
        sentence = gps_nmea.wrap_sentence(sentence)
        return sentence
예제 #5
0
    def form_frcmd_imei(self, gps: dict):
        """
        <-- TrackerOne to GpsGate Server GPRS or SMS
        $FRCMD,IMEI,_SendMessage,,latitude,hemi,longitude,hemi,alt,
        speed,heading,date,time,valid

        The return is wrapped with the NMEA checksum

        :return:
        :rtype: str
        """
        if not isinstance(gps, dict):
            raise TypeError("Invalid GPS INFO type")

        sentence = self.get_frcmd_id("_SendMessage")

        try:
            lat = float(gps[gps_nmea.NmeaStatus.LATITUDE])
            if lat < 0.0:
                lat_h = 'S'
            else:
                lat_h = 'N'

            long = float(gps[gps_nmea.NmeaStatus.LONGITUDE])
            if long < 0.0:
                long_h = 'W'
            else:
                long_h = 'E'

            sentence += "%f,%s,%f,%s," % (lat, lat_h, long, long_h)

        except KeyError:
            raise ValueError()

        # these are optional
        alt = gps.get(gps_nmea.NmeaStatus.ALTITUDE, 0.0)
        speed = gps.get(gps_nmea.NmeaStatus.SPEED_KNOTS, 0.0)
        heading = gps.get(gps_nmea.NmeaStatus.COURSE_TRUE, "")
        raw_date = gps.get(gps_nmea.NmeaStatus.RAW_DATE, "")
        raw_time = gps.get(gps_nmea.NmeaStatus.RAW_TIME, "")
        sentence += "%f,%f,%s,%s,%s" % (alt, speed, heading, raw_date,
                                        raw_time)

        sentence = gps_nmea.wrap_sentence(sentence)
        return sentence
예제 #6
0
    def form_frver(self):
        """
        Form the $FRVER sentence, assuming the SELF values are valid:
        * self.server_major_version
        * self.server_minor_version
        * self.client_name_version

        The return is wrapped with the NMEA checksum

        :return:
        :rtype: str
        """
        sentence = "FRVER,{0},{1},{2} {3}".format(self.server_major_version,
                                                  self.server_minor_version,
                                                  self.client_name,
                                                  self.client_version)
        sentence = gps_nmea.wrap_sentence(sentence)
        return sentence