diff --git a/ali_cloud_module.json b/ali_cloud_module.json index 765aa66..f1757b1 100644 --- a/ali_cloud_module.json +++ b/ali_cloud_module.json @@ -289,8 +289,8 @@ } }, { - "identifier": "sw_sim_out_alert", - "name": "拔卡报警功能开关", + "identifier": "sw_sim_abnormal_alert", + "name": "SIM卡异常报警功能开关", "accessMode": "rw", "required": false, "dataType": { @@ -382,7 +382,9 @@ "20001": "net_error", "20002": "gps_error", "20003": "temp_sensor_error", - "20004": "light_sensor_error" + "20004": "light_sensor_error", + "20005": "move_sensor_error", + "20006": "mike_error" } } }, @@ -690,8 +692,8 @@ } }, { - "identifier": "sw_sim_out_alert", - "name": "拔卡报警功能开关", + "identifier": "sw_sim_abnormal_alert", + "name": "SIM卡异常报警功能开关", "dataType": { "type": "bool", "specs": { @@ -769,7 +771,9 @@ "20001": "net_error", "20002": "gps_error", "20003": "temp_sensor_error", - "20004": "light_sensor_error" + "20004": "light_sensor_error", + "20005": "move_sensor_error", + "20006": "mike_error" } } }, @@ -831,14 +835,12 @@ "identifier": "fault_code", "name": "故障代码", "dataType": { - "type": "enum", + "type": "array", "specs": { - "20001": "net_error", - "20002": "gps_error", - "20003": "temp_sensor_error", - "20004": "light_sensor_error", - "20005": "move_sensor_error", - "20006": "mike_error" + "size": "10", + "item": { + "type": "int" + } } } } @@ -868,11 +870,11 @@ ] }, { - "identifier": "sim_out_alert", - "name": "拔卡报警", + "identifier": "sim_abnormal_alert", + "name": "SIM卡异常报警", "type": "alert", "required": false, - "method": "thing.event.sim_out_alert.post", + "method": "thing.event.sim_abnormal_alert.post", "outputData": [] }, { @@ -1085,8 +1087,8 @@ } }, { - "identifier": "sw_sim_out_alert", - "name": "拔卡报警功能开关", + "identifier": "sw_sim_abnormal_alert", + "name": "SIM卡异常报警功能开关", "dataType": { "type": "bool", "specs": { @@ -1181,7 +1183,7 @@ "sw_fault_alert", "sw_low_power_alert", "sw_over_speed_alert", - "sw_sim_out_alert", + "sw_sim_abnormal_alert", "sw_disassemble_alert", "sw_drive_behavior_alert", "drive_behavior_code", @@ -1443,8 +1445,8 @@ } }, { - "identifier": "sw_sim_out_alert", - "name": "拔卡报警功能开关", + "identifier": "sw_sim_abnormal_alert", + "name": "SIM卡异常报警功能开关", "dataType": { "type": "bool", "specs": { @@ -1522,7 +1524,9 @@ "20001": "net_error", "20002": "gps_error", "20003": "temp_sensor_error", - "20004": "light_sensor_error" + "20004": "light_sensor_error", + "20005": "move_sensor_error", + "20006": "mike_error" } } }, diff --git a/code/aliyunIot.py b/code/aliyunIot.py index 6cf8413..cb8b4ce 100644 --- a/code/aliyunIot.py +++ b/code/aliyunIot.py @@ -36,7 +36,7 @@ object_model = { 'sos_alert', 'fault_alert', 'low_power_alert', - 'sim_out_alert', + 'sim_abnormal_alert', 'disassemble_alert', 'drive_behavior_alert', 'over_speed_alert', @@ -58,7 +58,7 @@ object_model = { 'sw_fault_alert', 'sw_low_power_alert', 'sw_over_speed_alert', - 'sw_sim_out_alert', + 'sw_sim_abnormal_alert', 'sw_disassemble_alert', 'sw_drive_behavior_alert', 'drive_behavior_code', diff --git a/code/location.py b/code/location.py index 8af183b..85fec6d 100644 --- a/code/location.py +++ b/code/location.py @@ -84,25 +84,27 @@ class GPS(Singleton): def uart_read(self): global gps_data_retrieve_queue + while self.break_flag == 0: - self.gps_timer.start(200, 1, self.gps_timer_callback) + self.gps_timer.start(50, 1, self.gps_timer_callback) nread = gps_data_retrieve_queue.get() data = self.uart_obj.read(nread).decode() self.gps_timer.stop() + data = '' + rmc_data = '' + gga_data = '' + vtg_data = '' while True: nread = gps_data_retrieve_queue.get() - data = self.uart_obj.read(nread).decode() - rmc_data = self.read_location_GxRMC(data) - if not rmc_data: - continue - gga_data = self.read_location_GxGGA(data) - if not gga_data: - continue - vtg_data = self.read_location_GxVTG(data) - if not vtg_data: - continue - break + udata = self.uart_obj.read(nread).decode() + rmc_data = self.read_location_GxRMC(udata) + gga_data = self.read_location_GxGGA(udata) + vtg_data = self.read_location_GxVTG(udata) + if rmc_data or gga_data or vtg_data: + data += udata + if rmc_data and gga_data and vtg_data: + break self.break_flag = 0 return data @@ -112,23 +114,24 @@ class GPS(Singleton): quecgnss.gnssEnable(1) while self.break_flag == 0: - self.gps_timer.start(200, 1, self.gps_timer_callback) + self.gps_timer.start(50, 1, self.gps_timer_callback) data = quecgnss.read(4096) self.gps_timer.stop() + data = '' + rmc_data = '' + gga_data = '' + vtg_data = '' while True: gnss_data = quecgnss.read(4096) - data = gnss_data[1].decode() - rmc_data = self.read_location_GxRMC(data) - if not rmc_data: - continue - gga_data = self.read_location_GxGGA(data) - if not gga_data: - continue - vtg_data = self.read_location_GxVTG(data) - if not vtg_data: - continue - break + udata = gnss_data[1].decode() if len(gnss_data) > 1 and gnss_data[1] else '' + rmc_data = self.read_location_GxRMC(udata) + gga_data = self.read_location_GxGGA(udata) + vtg_data = self.read_location_GxVTG(udata) + if rmc_data or gga_data or vtg_data: + data += udata + if rmc_data and gga_data and vtg_data: + break self.break_flag = 0 return data diff --git a/code/mpower.py b/code/mpower.py index cf7b507..4a58d1e 100644 --- a/code/mpower.py +++ b/code/mpower.py @@ -24,7 +24,6 @@ from usr.common import Singleton from usr.logging import getLogger from usr.settings import settings from usr.settings import LOWENERGYMAP -from usr.settings import SettingsError from usr.settings import default_values_app try: @@ -80,50 +79,51 @@ class PowerManage(Singleton): if self.low_energy_method == 'PM': self.low_energy_queue.put('wakelock_unlock') elif self.low_energy_method == 'PSM': - pass + self.low_energy_queue.put('psm') elif self.low_energy_method == 'POWERDOWN': self.low_energy_queue.put('power_dwon') + elif self.low_energy_method is None: + self.low_energy_queue.put('cycle_report') def get_low_energy_method(self): current_settings = settings.get() device_model = modem.getDevModel() - support_methds = LOWENERGYMAP.get(device_model) - if not support_methds: - raise SettingsError('This Model %s Not Set LOWENERGYMAP.' % device_model) - - if self.period >= current_settings['sys']['work_mode_timeline']: - if "PSM" in support_methds: - self.low_energy_method = "PSM" - elif "POWERDOWN" in support_methds: - self.low_energy_method = "POWERDOWN" - elif "PM" in support_methds: - self.low_energy_method = "PM" - self.low_energy_method = "PM" - else: - if "PM" in support_methds: - self.low_energy_method = "PM" + support_methds = LOWENERGYMAP.get(device_model, []) + if support_methds: + if self.period >= current_settings['sys']['work_mode_timeline']: + if "PSM" in support_methds: + self.low_energy_method = "PSM" + elif "POWERDOWN" in support_methds: + self.low_energy_method = "POWERDOWN" + elif "PM" in support_methds: + self.low_energy_method = "PM" + else: + if "PM" in support_methds: + self.low_energy_method = "PM" return self.low_energy_method def low_energy_init(self): - if self.low_energy_method == 'POWERDOWN': - pass - elif self.low_energy_method == 'PM': - _thread.start_new_thread(self.low_energy_work, ()) - self.lpm_fd = pm.create_wakelock("tracker_lock", len("tracker_lock")) + if self.low_energy_method == 'PM': + _thread.start_new_thread(self.low_energy_work, (True,)) + self.lpm_fd = pm.create_wakelock("lowenergy_lock", len("lowenergy_lock")) pm.autosleep(1) elif self.low_energy_method == 'PSM': - # TODO: PSM LOW ENERGY pass + elif self.low_energy_method == 'POWERDOWN': + pass + elif self.low_energy_method is None: + _thread.start_new_thread(self.low_energy_work, (False,)) - def low_energy_work(self): + def low_energy_work(self, lowenergy_tag): while True: data = self.low_energy_queue.get() if data: - if self.lpm_fd is None: - self.lpm_fd = pm.create_wakelock("tracker_lock", len("tracker_lock")) - pm.autosleep(1) - pm.wakelock_lock(self.lpm_fd) + if lowenergy_tag: + if self.lpm_fd is None: + self.lpm_fd = pm.create_wakelock("lowenergy_lock", len("lowenergy_lock")) + pm.autosleep(1) + pm.wakelock_lock(self.lpm_fd) over_speed_check_res = self.tracker.get_over_speed_check() self.tracker.device_data_report(event_data=over_speed_check_res, msg=data) diff --git a/code/quecthing.py b/code/quecthing.py index 630d7a6..dcdc49b 100644 --- a/code/quecthing.py +++ b/code/quecthing.py @@ -41,7 +41,7 @@ object_model = [ (27, ('sw_fault_alert', 'rw')), (28, ('sw_low_power_alert', 'rw')), (29, ('sw_over_speed_alert', 'rw')), - (30, ('sw_sim_out_alert', 'rw')), + (30, ('sw_sim_abnormal_alert', 'rw')), (31, ('sw_disassemble_alert', 'rw')), (32, ('sw_drive_behavior_alert', 'rw')), (21, ('drive_behavior_code', 'r')), @@ -56,7 +56,7 @@ object_model = [ (6, ('sos_alert', 'r')), (14, ('fault_alert', 'r')), (17, ('low_power_alert', 'r')), - (18, ('sim_out_alert', 'r')), + (18, ('sim_abnormal_alert', 'r')), (20, ('disassemble_alert', 'r')), (22, ('drive_behavior_alert', 'r')), (35, ('over_speed_alert', 'r')), diff --git a/code/remote.py b/code/remote.py index 787c196..338d831 100644 --- a/code/remote.py +++ b/code/remote.py @@ -249,7 +249,7 @@ class Remote(Singleton): def read_history(self): ''' { - "non_loca": [ + "hist_data": [ { 'switch': True, 'energy': 100 @@ -257,18 +257,10 @@ class Remote(Singleton): { 'switch': True, 'energy': 100 - } + }, + 'gps': ['$GPRMCx,x,x,x', '$GPGGAx,x,x,x'], + 'non_gps': ['LBS'], ], - - "loca_non_gps": [ - (117.1138, 31.82279, 550), - (117.1138, 31.82279, 550) - ], - - "loca_gps": [ - ['$GPRMCx,x,x,x', '$GPGGAx,x,x,x'], - ['$GPRMCx,x,x,x', '$GPGGAx,x,x,x'] - ] } ''' if ql_fs.path_exists(self._history): diff --git a/code/settings.py b/code/settings.py index a9bc36d..2f12dd7 100644 --- a/code/settings.py +++ b/code/settings.py @@ -33,7 +33,7 @@ ALERTCODE = { 20000: 'fault_alert', 30002: 'low_power_alert', 30003: 'over_speed_alert', - 30004: 'sim_out_alert', + 30004: 'sim_abnormal_alert', 30005: 'disassemble_alert', 40000: 'drive_behavior_alert', 50001: 'sos_alert', @@ -157,7 +157,7 @@ class default_values_app(object): sw_over_speed_alert = True - sw_sim_out_alert = True + sw_sim_abnormal_alert = True sw_disassemble_alert = True @@ -379,7 +379,7 @@ class Settings(Singleton): elif opt in ( 'sw_ota', 'sw_ota_auto_upgrade', 'sw_voice_listen', 'sw_voice_record', 'sw_fault_alert', 'sw_low_power_alert', 'sw_over_speed_alert', - 'sw_sim_out_alert', 'sw_disassemble_alert', 'sw_drive_behavior_alert'): + 'sw_sim_abnormal_alert', 'sw_disassemble_alert', 'sw_drive_behavior_alert'): if not isinstance(val, bool): return False self.current_settings['app'][opt] = val diff --git a/code/tracker.py b/code/tracker.py index 74fcfcd..d42b5f5 100644 --- a/code/tracker.py +++ b/code/tracker.py @@ -110,10 +110,12 @@ class Tracker(Singleton): 'ota_status': current_settings['sys']['ota_status'], }) device_data.update(current_settings['app']) + return device_data def get_device_check(self): - alert_data = [] + alert_data = {} + fault_code = [] alert_code = 20000 net_check_res = self.check.net_check() @@ -127,21 +129,17 @@ class Tracker(Singleton): self.running_led.period = 0.5 if net_check_res != (3, 1): self.net_enable = False - fault_code = 20001 - alert_info = {'fault_code': fault_code, 'local_time': utime.mktime(utime.localtime())} - alert_data_res = self.get_alert_data(alert_code, alert_info) - if alert_data_res: - alert_data.append(alert_data_res) + fault_code.append(20001) if not gps_check_res: - fault_code = 20002 - alert_info = {'fault_code': fault_code, 'local_time': utime.mktime(utime.localtime())} - alert_data_res = self.get_alert_data(alert_code, alert_info) - if alert_data_res: - alert_data.append(alert_data_res) + fault_code.append(20002) if not sensor_check_res: # TODO: Need To Check What Sensor Error To Report. pass + if fault_code: + alert_info = {'fault_code': fault_code, 'local_time': utime.mktime(utime.localtime())} + alert_data = self.get_alert_data(alert_code, alert_info) + return alert_data def get_over_speed_check(self): @@ -193,12 +191,15 @@ class Tracker(Singleton): sys_bus.subscribe(topic, self.data_report_cb) self.remote.post_data(topic, device_data) + # OTA Status RST + current_settings = settings.settings.get() + if current_settings['sys']['ota_status'] in (3, 4): + settings.settings.set('ota_status', 0) + settings.settings.save() + def device_check(self): device_check_res = self.get_device_check() - if device_check_res: - [self.device_data_report(event_data=device_check) for device_check in device_check_res] - else: - self.device_data_report() + self.device_data_report(event_data=device_check_res) def energy_led_show(self, energy): current_settings = settings.settings.get() @@ -234,7 +235,7 @@ class Tracker(Singleton): net_check_res = self.check.net_check() if args[1] != 1: self.net_enable = False - if net_check_res == (1, 0): + if net_check_res != (1, 1): alert_code = 30004 alert_info = {'local_time': utime.mktime(utime.localtime())} alert_data = self.get_alert_data(alert_code, alert_info) diff --git a/docs/tracker公版方案用户指导手册.md b/docs/tracker公版方案用户指导手册.md index 7ee8539..c3d8246 100644 --- a/docs/tracker公版方案用户指导手册.md +++ b/docs/tracker公版方案用户指导手册.md @@ -51,9 +51,10 @@ - 上报设备定位信息,电量,开关机状态,定位方式,电话号码等信息; - 默认上报设备信息的场景: - 1. 报警发生时 - 2. 语音监听时 - 3. 录音时 + 1. 周期性定时 + 2. 报警发生时 + 3. 语音监听时 + 4. 录音时 - 根据不同的应用场景,上报工作模式分别有以下三种: 1. 周期性模式 -- 周期性上报设备信息,上报完成后进入低功耗模式 2. 智能模式 -- 开启GPS定位时,运动上报,上报完成后进入低功耗模式,静止不上报直接进入低功耗模式 @@ -71,7 +72,7 @@ - 功能开启的状态下,可由云端或手机APP配置是否自动升级。默认开启自动升级。 #### 远程配置或控制 -- 远程配置:电话号码、远程配置定位器工作模式、定位使用的技术手段、语音监听、自动录音上报、固件升级及自动升级、故障报警、低电报警、超速报警、拔卡报警、拆卸报警、振动报警和驾驶行为监测功能的开关。 +- 远程配置:电话号码、远程配置定位器工作模式、定位使用的技术手段、语音监听、自动录音上报、固件升级及自动升级、故障报警、低电报警、超速报警、SIM卡异常报警、拆卸报警、振动报警和驾驶行为监测功能的开关。 - 远程控制:远程控制固件升级的流程。 ### 设备报警功能 @@ -95,7 +96,7 @@ - 功能的开启,超速阈值,可由云端或手机APP控制。默认关闭该功能。 - 报警代码:30003 -#### 拔卡报警 +#### SIM卡异常报警 - SIM卡拔出时报警,此时网络不通,按照网络不通的逻辑处理。 - 功能的开启,可由云端或手机APP控制。默认开启该功能。 @@ -250,7 +251,7 @@ tracker.remote.post_data(topic, data) |故障报警功能开关|`sw_fault_alert`|`bool`|`True`:开启,`False`:关闭||读写| |低电报警功能开关|`sw_low_power_alert`|`bool`|`True`:开启,`False`:关闭||读写| |超速报警功能开关|`sw_over_speed_alert`|`bool`|`True`:开启,`False`:关闭||读写| -|拔卡报警功能开关|`sw_sim_out_alert`|`bool`|`True`:开启,`False`:关闭||读写| +|SIM卡异常报警功能开关|`sw_sim_abnormal_alert`|`bool`|`True`:开启,`False`:关闭||读写| |拆卸报警功能开关|`sw_disassemble_alert`|`bool`|`True`:开启,`False`:关闭||读写| |驾驶行为报警功能开关|`sw_drive_behavior_alert`|`bool`|`True`:开启,`False`:关闭||读写| |驾驶行为代码|`drive_behavior_code`|`int`|取值范围:40001 ~ 40004|40001: quick_start;40002: quick_stop;40003: quick_turn_left;40004: quick_turn_right|只读| @@ -268,7 +269,7 @@ tracker.remote.post_data(topic, data) |SOS报警|`sos_alert`|`{'local_time': xxx}`| |故障报警|`fault_alert`|`{'local_time': xxx, 'fault_code': 20001}`| |低电报警|`low_power_alert`|`{'local_time': xxx, 'energy': 20}`| -|拔卡报警|`sim_out_alert`|`{'local_time': xxx}`| +|SIM卡异常报警|`sim_abnormal_alert`|`{'local_time': xxx}`| |驾驶行为报警|`drive_behavior_alert`|`{'local_time': xxx, 'drive_behavior_code': 40001}`| |拆卸报警|`disassemble_alert`|`{'local_time': xxx}`| |超速报警|`over_speed_alert`|`{'local_time': xxx}`| @@ -319,7 +320,7 @@ res = tracker.get_alert_data(alert_code, alert_info) |-|20006|`mike_error`|麦克风异常| |30002|-|`low_power_alert`|低电量报警| |30003|-|`over_speed_alert`|超速报警| -|30004|-|`sim_out_alert`|拔卡报警| +|30004|-|`sim_abnormal_alert`|SIM卡异常报警| |30005|-|`disassemble_alert`|拆卸报警| |40000|-|`drive_behavior_alert`|驾驶行为监测报警| |-|40001|`quick_start`|急起| @@ -460,7 +461,7 @@ current_settings = settings.get() "sw_low_power_alert": true, "sw_voice_record": false, "sw_voice_listen": false, - "sw_sim_out_alert": true, + "sw_sim_abnormal_alert": true, "gps_mode": 2, "sw_drive_behavior_alert": true, "sw_ota": true, diff --git a/quec_cloud_module.json b/quec_cloud_module.json index 1594d7f..5bceb26 100644 --- a/quec_cloud_module.json +++ b/quec_cloud_module.json @@ -2,7 +2,7 @@ "profile":{ "tslVersion":"1.1.0", "productKey":"p11275", - "version":"20220324132257527" + "version":"20220325114956585" }, "properties":[ { @@ -319,9 +319,9 @@ "value":"false" } ], - "code":"sw_sim_out_alert", + "code":"sw_sim_abnormal_alert", "dataType":"BOOL", - "name":"拔卡报警功能开关", + "name":"SIM卡异常报警功能开关", "subType":"RW", "id":30, "sort":16, @@ -428,13 +428,11 @@ }, { "specs":{ - "unit":"", - "min":"20001", - "max":"29999", - "step":"1" + "size":"10", + "dataType":"INT" }, "code":"fault_code", - "dataType":"INT", + "dataType":"ARRAY", "name":"故障代码", "subType":"R", "id":36, @@ -555,8 +553,8 @@ "$ref":"#/properties/id/19" } ], - "code":"sim_out_alert", - "name":"拔卡报警", + "code":"sim_abnormal_alert", + "name":"SIM卡异常报警", "subType":"WARN", "id":18, "sort":23,