def test_frver(self):
        global base_app

        print("")  # skip paste '.' on line
        base_app.logger.info("TEST FRVER")

        obj = protocol.GpsGate(base_app.logger)

        # a simple encryption test using sample in the spec
        expect = '$FRVER,1,1,Cradlepoint 1.0*27\r\n'
        result = obj.form_frver()
        self.assertEqual(result, expect)

        return
    def test_frret_imei(self):
        global base_app

        print("")  # skip paste '.' on line
        base_app.logger.info("TEST FRRET IMEI")

        obj = protocol.GpsGate(base_app.logger)
        self.assertEqual(obj.tracker_name, obj.DEF_TRACKER_NAME)
        self.assertEqual(obj.client_name, obj.DEF_CLIENT_NAME)
        self.assertEqual(obj.client_version, obj.DEF_CLIENT_VERSION)

        # a simple encryption test using sample in the spec
        expect = '$FRRET,Cradlepoint,_GprsSettings,,GpsGate TrackerOne,' +\
                 'Cradlepoint,1.0*7B\r\n'
        result = obj.form_frret_imei()
        self.assertEqual(result, expect)

        return
    def test_frlin(self):
        global base_app

        print("")  # skip paste '.' on line
        base_app.logger.info("TEST FRLIN")

        obj = protocol.GpsGate(base_app.logger)
        self.assertIsNone(obj.client_username)
        self.assertIsNone(obj.client_password)
        self.assertIsNone(obj.client_imei)

        # a simple encryption test using sample in the spec
        expect = "HHVMOLLX"
        result = obj._encrypt_password("coolness")
        self.assertEqual(result, expect)

        with self.assertRaises(ValueError):
            # since user name is None
            obj.form_frlin()

        obj.set_username("cradlepoint")
        with self.assertRaises(ValueError):
            # since password is None
            obj.form_frlin()

        obj.set_password("Billy6Boy")
        result = obj.form_frlin()
        expect = '$FRLIN,,cradlepoint,BLy3BOORy*2F\r\n'
        self.assertEqual(result, expect)

        with self.assertRaises(ValueError):
            # since imei is None
            obj.form_frlin(force_imei=True)

        obj.set_imei("353547060660845")
        result = obj.form_frlin()
        expect = '$FRLIN,,cradlepoint,BLy3BOORy*2F\r\n'
        self.assertEqual(result, expect)

        result = obj.form_frlin(force_imei=True)
        expect = '$FRLIN,IMEI,353547060660845,*47\r\n'
        self.assertEqual(result, expect)

        return
    def test_parse_frval(self):
        global base_app

        print("")  # skip paste '.' on line
        base_app.logger.info("TEST FRVAL")

        obj = protocol.GpsGate(base_app.logger)

        self.assertIsNone(obj.nmea.distance_filter)
        source = "$FRVAL,DistanceFilter,500.0*67"
        obj.parse_message(source)
        self.assertEqual(obj.nmea.distance_filter, 500.0)

        source = "$FRVAL,DistanceFilter,200.0"
        obj.parse_message(source)
        self.assertEqual(obj.nmea.distance_filter, 200.0)

        source = "FRVAL,DistanceFilter,100.0"
        obj.parse_message(source)
        self.assertEqual(obj.nmea.distance_filter, 100.0)

        self.assertIsNone(obj.nmea.time_filter)
        source = "$FRVAL,TimeFilter,60.0*42"
        obj.parse_message(source)
        self.assertEqual(obj.nmea.time_filter, 60.0)

        self.assertIsNone(obj.nmea.direction_filter)
        source = "$FRVAL,DirectionFilter,40.0*30"
        obj.parse_message(source)
        self.assertEqual(obj.nmea.direction_filter, 40.0)

        self.assertIsNone(obj.nmea.direction_threshold)
        source = "$FRVAL,DirectionThreshold,10.0*42"
        obj.parse_message(source)
        self.assertEqual(obj.nmea.direction_threshold, 10.0)

        self.assertIsNone(obj.nmea.speed_filter)
        source = "$FRVAL,SpeedFilter,25.0*31"
        obj.parse_message(source)
        self.assertEqual(obj.nmea.speed_filter, 25.0)

        return
    def test_sets(self):
        global base_app

        print("")  # skip paste '.' on line

        base_app.logger.info("TEST set of client details")

        tests = [
            {'inp': '', 'out': ''},
            {'inp': 'User1', 'out': 'User1'},
            {'inp': '  User2 ', 'out': 'User2'},
            {'inp': '\"User3\"', 'out': 'User3'},
            {'inp': '\'User4\'', 'out': 'User4'},
            {'inp': b'', 'out': ''},
            {'inp': b'User1', 'out': 'User1'},
            {'inp': b'  User2 ', 'out': 'User2'},
            {'inp': b'\"User3\"', 'out': 'User3'},
            {'inp': b'\'User4\'', 'out': 'User4'},
            {'inp': None, 'out': TypeError},
            {'inp': 10, 'out': TypeError},
            {'inp': 100.998, 'out': TypeError},
        ]

        obj = protocol.GpsGate(base_app.logger)
        self.assertIsNone(obj.client_username)
        self.assertIsNone(obj.client_password)
        self.assertIsNone(obj.client_imei)

        for test in tests:

            if test['out'] == TypeError:
                with self.assertRaises(TypeError):
                    obj.set_username(test['inp'])
                with self.assertRaises(TypeError):
                    obj.set_password(test['inp'])
                with self.assertRaises(TypeError):
                    obj.set_imei(test['inp'])

            else:
                obj.set_username(test['inp'])
                self.assertEqual(obj.client_username, test['out'])
                obj.set_password(test['inp'])
                self.assertEqual(obj.client_password, test['out'])
                obj.set_imei(test['inp'])
                self.assertEqual(obj.client_imei, test['out'])

        base_app.logger.info("TEST set of client name")
        tests = [
            {'name_in': 'My Tools', 'ver_in': '9.3',
             'name_out': 'My Tools', 'ver_out': '9.3'},
            {'name_in': 'My Toes', 'ver_in': 7.8,
             'name_out': 'My Toes', 'ver_out': '7.8'},
            {'name_in': 'My Nose', 'ver_in': 14,
             'name_out': 'My Nose', 'ver_out': '14.0'},
            {'name_in': 'Boss', 'ver_in': 13.25,
             'name_out': 'Boss', 'ver_out': '13.25'},
            {'name_in': 'Tammy Gears 7.2', 'ver_in': None,
             'name_out': 'Tammy Gears', 'ver_out': '7.2'},
            {'name_in': 'Ziggy', 'ver_in': None,
             'name_out': 'Ziggy', 'ver_out': '1.0'},
            {'name_in': 'Tammy Gears 9 8.1', 'ver_in': None,
             'name_out': 'Tammy Gears 9', 'ver_out': '8.1'},
            {'name_in': 'Tammy Gears two 4.3', 'ver_in': None,
             'name_out': 'Tammy Gears two', 'ver_out': '4.3'},
            {'name_in': 'Tammy Gears two', 'ver_in': None,
             'name_out': 'Tammy Gears two', 'ver_out': '1.0'},
        ]

        # start with defaults
        self.assertEqual(obj.client_name, obj.DEF_CLIENT_NAME)
        self.assertEqual(obj.client_version, obj.DEF_CLIENT_VERSION)

        for test in tests:
            obj.set_client_name(test['name_in'], test['ver_in'])
            self.assertEqual(obj.client_name, test['name_out'])
            self.assertEqual(obj.client_version, test['ver_out'])

        base_app.logger.info("TEST set of server URL, Port, and Transport")
        tests = [
            {'in': 'gps.linse.org', 'out': 'gps.linse.org'},
            {'in': '\"web.linse.org\"', 'out': 'web.linse.org'},
        ]

        # start with defaults
        self.assertEqual(obj.gps_gate_url, obj.DEF_GPS_GATE_URL)

        for test in tests:
            obj.set_server_url(test['in'])
            self.assertEqual(obj.gps_gate_url, test['out'])

        tests = [
            {'in': '9999', 'out': 9999},
            {'in': 8824, 'out': 8824},
        ]

        # start with defaults
        self.assertEqual(obj.gps_gate_port, obj.DEF_GPS_GATE_PORT)

        for test in tests:
            obj.set_server_port(test['in'])
            self.assertEqual(obj.gps_gate_port, test['out'])

        tests = [
            {'in': 'tcp', 'out': 'tcp'},
            {'in': 'TCP', 'out': 'tcp'},
            {'in': 'Tcp', 'out': 'tcp'},
            {'in': 'silly', 'out': ValueError},
            {'in': 'xml', 'out': NotImplementedError},
        ]

        # start with defaults
        self.assertEqual(obj.gps_gate_transport, obj.DEF_GPS_GATE_TRANSPORT)

        for test in tests:
            if test['out'] == ValueError:
                with self.assertRaises(ValueError):
                    obj.set_server_transport(test['in'])
            elif test['out'] == NotImplementedError:
                with self.assertRaises(NotImplementedError):
                    obj.set_server_transport(test['in'])
            else:
                obj.set_server_transport(test['in'])
                self.assertEqual(obj.gps_gate_transport, test['out'])

        return
    def test_state_machine(self):
        global base_app

        print("")  # skip paste '.' on line
        base_app.logger.info("TEST server state machine")

        obj = protocol.GpsGate(base_app.logger)
        obj.set_imei("353547060660845")

        self.assertEqual(obj.state, obj.STATE_OFFLINE)

        expect = "$FRLIN,IMEI,353547060660845,*47\r\n"
        message = obj.get_next_client_2_server()
        self.assertEqual(obj.state, obj.STATE_TRY_LOGIN)
        self.assertEqual(message, expect)

        # repeat, is okay but get warning
        expect = "$FRLIN,IMEI,353547060660845,*47\r\n"
        message = obj.get_next_client_2_server()
        self.assertEqual(obj.state, obj.STATE_TRY_LOGIN)
        self.assertEqual(message, expect)

        server_response = "$FRSES,1221640*4F"
        result = obj.parse_message(server_response)
        self.assertEqual(obj.state, obj.STATE_HAVE_SESSION)
        self.assertTrue(result)

        # repeat, is okay but get warning
        result = obj.parse_message(server_response)
        self.assertEqual(obj.state, obj.STATE_HAVE_SESSION)
        self.assertTrue(result)

        expect = "$FRVER,1,1,Cradlepoint 1.0*27\r\n"
        message = obj.get_next_client_2_server()
        self.assertEqual(obj.state, obj.STATE_WAIT_SERVER_VERSION)
        self.assertEqual(message, expect)

        # repeat, is okay but get warning
        message = obj.get_next_client_2_server()
        self.assertEqual(obj.state, obj.STATE_WAIT_SERVER_VERSION)
        self.assertEqual(message, expect)

        server_response = "$FRVER,1,1,GpsGate Server 1.1.0.360*04"
        result = obj.parse_message(server_response)
        self.assertEqual(obj.state, obj.STATE_HAVE_SERVER_VERSION)
        self.assertTrue(result)

        # repeat, is okay but get warning
        server_response = "$FRVER,1,1,GpsGate Server 1.1.0.360*04"
        result = obj.parse_message(server_response)
        self.assertEqual(obj.state, obj.STATE_HAVE_SERVER_VERSION)
        self.assertTrue(result)

        obj.set_server_version("0.3")
        self.assertEqual(obj.server_major_version, 0)
        self.assertEqual(obj.server_minor_version, 3)

        server_response = "$FRVER,1,1,GpsGate Server 1.1.0.360*04"
        result = obj.parse_message(server_response)
        self.assertEqual(obj.state, obj.STATE_HAVE_SERVER_VERSION)
        self.assertTrue(result)

        expect = "$FRCMD,,_getupdaterules,Inline*1E"
        message = obj.get_next_client_2_server()
        self.assertEqual(obj.state, obj.STATE_ASK_UPDATE)
        self.assertEqual(message, expect)

        server_response = "$FRRET,User1,_getupdaterules,Nmea,2*07"
        result = obj.parse_message(server_response)
        self.assertEqual(obj.state, obj.STATE_FORWARD_READY)
        self.assertTrue(result)

        server_response = "$FRVAL,DistanceFilter,500.0*67"
        result = obj.parse_message(server_response)
        self.assertEqual(obj.state, obj.STATE_FORWARD_READY)
        self.assertTrue(result)

        server_response = "$FRVAL,TimeFilter,60.0*42"
        result = obj.parse_message(server_response)
        self.assertEqual(obj.state, obj.STATE_FORWARD_READY)
        self.assertTrue(result)

        expect = "$FRWDT,NMEA*78"
        message = obj.get_next_client_2_server()
        self.assertEqual(obj.state, obj.STATE_FORWARDING)
        self.assertEqual(message, expect)

        return
Esempio n. 7
0
def run_client():
    global base_app

    obj = protocol.GpsGate(base_app.logger)

    # base_app.logger.debug("sets:{}".format(base_app.settings))

    # set a few defaults
    imei = "353547060660845"
    gps_gate_url = "64.46.40.178"
    gps_gate_port = 30175

    if "gps_gate" in base_app.settings:
        # then we do have a customer config
        temp = base_app.settings["gps_gate"]

        # check on our localhost port (not used, but to test)
        config = GpsConfig(base_app)
        host_ip, host_port = config.get_client_info()
        if "host_ip" in temp:
            # then OVER-RIDE what the router told us
            base_app.logger.warning("Settings OVER-RIDE router host_ip")
            value = clean_string(temp["host_ip"])
            base_app.logger.warning("was:{} now:{}".format(host_ip, value))
            host_ip = value

        if "host_port" in temp:
            # then OVER-RIDE what the router told us
            base_app.logger.warning("Settings OVER-RIDE router host_port")
            value = parse_integer(temp["host_port"])
            base_app.logger.warning("was:{} now:{}".format(host_port, value))
            host_port = value

        base_app.logger.debug("GPS source:({}:{})".format(host_ip, host_port))
        del config

        # check on our cellular details
        config = ActiveWan(base_app)
        imei = config.get_imei()
        if "imei" in temp:
            # then OVER-RIDE what the router told us
            base_app.logger.warning("Settings OVER-RIDE router IMEI")
            value = clean_string(temp["imei"])
            base_app.logger.warning("was:{} now:{}".format(imei, value))
            imei = value
        del config

        if "gps_gate_url" in temp:
            # load the settings.ini value
            gps_gate_url = clean_string(temp["gps_gate_url"])

        if "gps_gate_port" in temp:
            # load the settings.ini value
            gps_gate_port = parse_integer(temp["gps_gate_port"])

    obj.set_imei(imei)
    obj.set_server_url(gps_gate_url)
    obj.set_server_port(gps_gate_port)

    # we never need these!
    # obj.set_username('Admin')
    # obj.set_password(':Vm78!!')

    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)
    sock.settimeout(2.0)
    address = (obj.gps_gate_url, obj.gps_gate_port)

    base_app.logger.info(
        "Preparing to connect on TCP socket {}".format(address))

    # attempt to actually lock the resource, which may fail if unavailable
    #   (see CONNECT ERROR note)
    try:
        sock.connect(address)
    except OSError as msg:
        base_app.logger.error("socket.connect() failed - {}".format(msg))

        return -1

    # first test - try our user name:
    # Req = $FRLIN,, Admin,12Ne*14\r\n
    # Rsp = $FRERR,AuthError,Wrong username or password*56\r\n

    # second test - try our IMEI:
    # Req = $FRLIN,IMEI,353547060660845,*47\r\n
    # Rsp = $FRSES,75*7F\r\n

    # expect Req = $FRLIN,IMEI,353547060660845,*47\r\n
    request = obj.get_next_client_2_server()
    base_app.logger.debug("Req({})".format(request))
    sock.send(request)

    # expect Rsp = $FRSES,75*7F\r\n
    try:
        response = sock.recv(1024)
        base_app.logger.debug("Rsp({})".format(response))
        result = obj.parse_message(response)
        if not result:
            base_app.logger.debug("parse result({})".format(result))
    except socket.timeout:
        base_app.logger.error("No response - one was expected!")
        return -1

    # expect Req = $FRVER,1,1,Cradlepoint 1.0*27\r\n
    request = obj.get_next_client_2_server()
    base_app.logger.debug("Req({})".format(request))
    sock.send(request)

    # expect Rsp = $FRVER,1,1,GpsGate Server 3.0.0.2583*3E\r\n
    try:
        response = sock.recv(1024)
        base_app.logger.debug("Rsp({})".format(response))
        result = obj.parse_message(response)
        if not result:
            base_app.logger.debug("parse result({})".format(result))
    except socket.timeout:
        base_app.logger.error("No response - one was expected!")
        return -1

    # expect Req = $FRCMD,,_getupdaterules,Inline*1E
    request = obj.get_next_client_2_server()
    base_app.logger.debug("Req({})".format(request))
    sock.send(request)

    # expect Rsp = $FRRET,User1,_getupdaterules,Nmea,2*07
    try:
        response = sock.recv(1024)
        base_app.logger.debug("Rsp({})".format(response))
        result = obj.parse_message(response)
        if not result:
            base_app.logger.debug("parse result({})".format(result))
    except socket.timeout:
        base_app.logger.error("No response - one was expected!")
        return -1

    # now we LOOP and process the rules!
    while True:
        # expect Rsp = $FRVAL,DistanceFilter,500.0*67
        try:
            response = sock.recv(1024)
            base_app.logger.debug("Rsp({})".format(response))
            result = obj.parse_message(response)
            if not result:
                base_app.logger.debug("parse result({})".format(result))
        except socket.timeout:
            base_app.logger.error("No response - jump from loop!")
            break

    # expect Req = b"$FRWDT,NMEA*78"
    request = obj.get_next_client_2_server()
    base_app.logger.debug("Req({})".format(request))
    sock.send(request)
    # this message has NO response!

    # our fake data, time-fixed to me NOW
    request = fix_time_sentence("$GPGGA,094013.0,4334.784909,N,11612.7664" +
                                "48,W,1,09,0.9,830.6,M,-11.0,M,,*60")
    request = request.encode()
    base_app.logger.debug("Req({})".format(request))
    sock.send(request)

    # this message has NO response!
    time.sleep(2.0)

    sock.close()

    return 0