mirror of
https://gitee.com/qpy-solutions/tracker-v2.git
synced 2025-05-19 02:58:25 +08:00
update: 1. QuecThing timeout; 2. api doc; delete: alert.py
This commit is contained in:
parent
7ec375141e
commit
9f9fdb9f28
@ -1,30 +0,0 @@
|
|||||||
|
|
||||||
from usr import settings
|
|
||||||
from usr.logging import getLogger
|
|
||||||
from usr.common import Singleton
|
|
||||||
|
|
||||||
log = getLogger(__name__)
|
|
||||||
|
|
||||||
|
|
||||||
class AlertMonitor(Singleton):
|
|
||||||
'''
|
|
||||||
Recv alert signals and process them
|
|
||||||
'''
|
|
||||||
def __init__(self, alert_read_cb=None):
|
|
||||||
self.alert_read_cb = alert_read_cb
|
|
||||||
|
|
||||||
def post_alert(self, alert_code, alert_info):
|
|
||||||
if settings.ALERTCODE.get(alert_code):
|
|
||||||
current_settings = settings.settings.get()
|
|
||||||
alert_status = current_settings.get('app', {}).get('sw_' + settings.ALERTCODE.get(alert_code))
|
|
||||||
if alert_status:
|
|
||||||
if self.alert_read_cb:
|
|
||||||
return self.alert_read_cb(settings.ALERTCODE.get(alert_code), alert_info)
|
|
||||||
else:
|
|
||||||
log.warn('Alert callback is not defined.')
|
|
||||||
else:
|
|
||||||
log.warn('%s status is %s' % (settings.ALERTCODE.get(alert_code), alert_status))
|
|
||||||
else:
|
|
||||||
log.error('altercode (%s) is not exists. alert info: %s' % (alert_code, alert_info))
|
|
||||||
|
|
||||||
return False
|
|
@ -1,7 +1,10 @@
|
|||||||
import utime
|
import utime
|
||||||
|
import osTimer
|
||||||
import quecIot
|
import quecIot
|
||||||
# from queue import Queue
|
from misc import Power
|
||||||
|
from queue import Queue
|
||||||
from usr.logging import getLogger
|
from usr.logging import getLogger
|
||||||
|
from usr.settings import settings
|
||||||
|
|
||||||
DATA_NON_LOCA = 0x0
|
DATA_NON_LOCA = 0x0
|
||||||
DATA_LOCA_NON_GPS = 0x1
|
DATA_LOCA_NON_GPS = 0x1
|
||||||
@ -51,8 +54,8 @@ object_model_code = {i[1][0]: i[0] for i in object_model}
|
|||||||
class QuecThing(object):
|
class QuecThing(object):
|
||||||
def __init__(self, pk, ps, dk, ds, downlink_queue):
|
def __init__(self, pk, ps, dk, ds, downlink_queue):
|
||||||
self.downlink_queue = downlink_queue
|
self.downlink_queue = downlink_queue
|
||||||
# self.post_result_wait_queue = Queue(maxsize=16)
|
self.post_result_wait_queue = Queue(maxsize=16)
|
||||||
self.post_result = []
|
self.quec_timer = osTimer()
|
||||||
|
|
||||||
quecIot.init()
|
quecIot.init()
|
||||||
quecIot.setEventCB(self.eventCB)
|
quecIot.setEventCB(self.eventCB)
|
||||||
@ -61,27 +64,21 @@ class QuecThing(object):
|
|||||||
quecIot.setServer(1, "iot-south.quectel.com:2883")
|
quecIot.setServer(1, "iot-south.quectel.com:2883")
|
||||||
quecIot.setConnmode(1)
|
quecIot.setConnmode(1)
|
||||||
|
|
||||||
|
def quec_start_timer(self):
|
||||||
|
current_settings = settings.get()
|
||||||
|
self.quec_timer.start(current_settings['sys']['quecIot_timeout'] * 1000, 2, self.quec_timer_callback)
|
||||||
|
|
||||||
|
def quec_timer_callback(self):
|
||||||
|
current_settings = settings.get()
|
||||||
|
utime.sleep(current_settings['sys']['quecIot_timeout'])
|
||||||
|
Power.powerRestart()
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def rm_empty_data(data):
|
def rm_empty_data(data):
|
||||||
for k, v in data.items():
|
for k, v in data.items():
|
||||||
if not v:
|
if not v:
|
||||||
del data[k]
|
del data[k]
|
||||||
|
|
||||||
def get_post_result(self):
|
|
||||||
res = True
|
|
||||||
count = 0
|
|
||||||
while count < 10:
|
|
||||||
if self.post_result:
|
|
||||||
res = self.post_result.pop()
|
|
||||||
break
|
|
||||||
count += 1
|
|
||||||
utime.sleep(1)
|
|
||||||
|
|
||||||
return res
|
|
||||||
|
|
||||||
def put_post_result(self, res):
|
|
||||||
self.post_result.append(res)
|
|
||||||
|
|
||||||
def post_data(self, data_type, data):
|
def post_data(self, data_type, data):
|
||||||
if data_type == DATA_NON_LOCA:
|
if data_type == DATA_NON_LOCA:
|
||||||
for k, v in data.items():
|
for k, v in data.items():
|
||||||
@ -91,8 +88,9 @@ class QuecThing(object):
|
|||||||
v = {object_model_code.get(ik) if object_model_code.get(ik) else ik: iv for ik, iv in v.items()}
|
v = {object_model_code.get(ik) if object_model_code.get(ik) else ik: iv for ik, iv in v.items()}
|
||||||
phymodelReport_res = quecIot.phymodelReport(1, {object_model_code.get(k): v})
|
phymodelReport_res = quecIot.phymodelReport(1, {object_model_code.get(k): v})
|
||||||
if phymodelReport_res:
|
if phymodelReport_res:
|
||||||
# res = self.post_result_wait_queue.get()
|
self.quec_start_timer()
|
||||||
res = self.get_post_result()
|
res = self.post_result_wait_queue.get()
|
||||||
|
self.quec_timer.stop()
|
||||||
if res:
|
if res:
|
||||||
v = {}
|
v = {}
|
||||||
continue
|
continue
|
||||||
@ -107,15 +105,17 @@ class QuecThing(object):
|
|||||||
elif data_type == DATA_LOCA_GPS:
|
elif data_type == DATA_LOCA_GPS:
|
||||||
locReportOutside_res = quecIot.locReportOutside(data)
|
locReportOutside_res = quecIot.locReportOutside(data)
|
||||||
if locReportOutside_res:
|
if locReportOutside_res:
|
||||||
# return self.post_result_wait_queue.get()
|
self.quec_start_timer()
|
||||||
return self.get_post_result()
|
return self.post_result_wait_queue.get()
|
||||||
|
self.quec_timer.stop()
|
||||||
else:
|
else:
|
||||||
return False
|
return False
|
||||||
elif data_type == DATA_LOCA_NON_GPS:
|
elif data_type == DATA_LOCA_NON_GPS:
|
||||||
locReportInside_res = quecIot.locReportInside(data)
|
locReportInside_res = quecIot.locReportInside(data)
|
||||||
if locReportInside_res:
|
if locReportInside_res:
|
||||||
# return self.post_result_wait_queue.get()
|
self.quec_start_timer()
|
||||||
return self.get_post_result()
|
return self.post_result_wait_queue.get()
|
||||||
|
self.quec_timer.stop()
|
||||||
else:
|
else:
|
||||||
return False
|
return False
|
||||||
else:
|
else:
|
||||||
@ -145,28 +145,22 @@ class QuecThing(object):
|
|||||||
elif event == 4:
|
elif event == 4:
|
||||||
if errcode == 10200:
|
if errcode == 10200:
|
||||||
log.info('Data sending succeeded.')
|
log.info('Data sending succeeded.')
|
||||||
# self.post_result_wait_queue.put(True)
|
self.post_result_wait_queue.put(True)
|
||||||
self.put_post_result(True)
|
|
||||||
elif errcode == 10210:
|
elif errcode == 10210:
|
||||||
log.info('Object model data sending succeeded.')
|
log.info('Object model data sending succeeded.')
|
||||||
# self.post_result_wait_queue.put(True)
|
self.post_result_wait_queue.put(True)
|
||||||
self.put_post_result(True)
|
|
||||||
elif errcode == 10220:
|
elif errcode == 10220:
|
||||||
log.info('Location data sending succeeded.')
|
log.info('Location data sending succeeded.')
|
||||||
# self.post_result_wait_queue.put(True)
|
self.post_result_wait_queue.put(True)
|
||||||
self.put_post_result(True)
|
|
||||||
elif errcode == 10300:
|
elif errcode == 10300:
|
||||||
log.info('Data sending failed.')
|
log.info('Data sending failed.')
|
||||||
# self.post_result_wait_queue.put(False)
|
self.post_result_wait_queue.put(False)
|
||||||
self.put_post_result(False)
|
|
||||||
elif errcode == 10310:
|
elif errcode == 10310:
|
||||||
log.error('Object model data sending failed.')
|
log.error('Object model data sending failed.')
|
||||||
# self.post_result_wait_queue.put(False)
|
self.post_result_wait_queue.put(False)
|
||||||
self.put_post_result(False)
|
|
||||||
elif errcode == 10320:
|
elif errcode == 10320:
|
||||||
log.error('Location data sending failed.')
|
log.error('Location data sending failed.')
|
||||||
# self.post_result_wait_queue.put(False)
|
self.post_result_wait_queue.put(False)
|
||||||
self.put_post_result(False)
|
|
||||||
elif event == 5:
|
elif event == 5:
|
||||||
if errcode == 10200:
|
if errcode == 10200:
|
||||||
log.info('Recving raw data.')
|
log.info('Recving raw data.')
|
||||||
|
@ -243,7 +243,6 @@ class Remote(Singleton):
|
|||||||
self.remote_read_cb = remote_read_cb
|
self.remote_read_cb = remote_read_cb
|
||||||
self.downlink_queue = Queue(maxsize=64)
|
self.downlink_queue = Queue(maxsize=64)
|
||||||
self.uplink_queue = Queue(maxsize=64)
|
self.uplink_queue = Queue(maxsize=64)
|
||||||
self.block_io = True
|
|
||||||
current_settings = settings.settings.get()
|
current_settings = settings.settings.get()
|
||||||
cloud_init_params = current_settings['sys']['cloud_init_params']
|
cloud_init_params = current_settings['sys']['cloud_init_params']
|
||||||
if current_settings['sys']['cloud'] == settings.default_values_sys._cloud.quecIot:
|
if current_settings['sys']['cloud'] == settings.default_values_sys._cloud.quecIot:
|
||||||
@ -329,15 +328,15 @@ class Remote(Singleton):
|
|||||||
def clean_history(self):
|
def clean_history(self):
|
||||||
uos.remove(self._history)
|
uos.remove(self._history)
|
||||||
|
|
||||||
def _post_data(self, data):
|
def _post_data(self, data_type, data):
|
||||||
if data[0] == self.DATA_NON_LOCA or data[0] == self.DATA_LOCA_NON_GPS or data[0] == self.DATA_LOCA_GPS:
|
if data_type == self.DATA_NON_LOCA or data_type == self.DATA_LOCA_NON_GPS or data_type == self.DATA_LOCA_GPS:
|
||||||
if not self.cloud.post_data(data[0], data[1]):
|
if not self.cloud.post_data(data_type, data):
|
||||||
self.add_history(data[0], data[1])
|
self.add_history(data_type, data)
|
||||||
return False
|
return False
|
||||||
else:
|
else:
|
||||||
return True
|
return True
|
||||||
else:
|
else:
|
||||||
raise RemoteError('Post data format is wrong. data: %s' % data)
|
raise RemoteError('data_type %s is wrong.' % data_type)
|
||||||
|
|
||||||
'''
|
'''
|
||||||
Data format to post:
|
Data format to post:
|
||||||
@ -355,19 +354,12 @@ class Remote(Singleton):
|
|||||||
['$GPRMCx,x,x,x', '$GPGGAx,x,x,x']
|
['$GPRMCx,x,x,x', '$GPGGAx,x,x,x']
|
||||||
|
|
||||||
'''
|
'''
|
||||||
def post_data(self, data_type, data):
|
def post_data(self, data_type, data, bio=False):
|
||||||
if self.block_io is True:
|
if bio is False:
|
||||||
return self._post_data((data_type, data))
|
|
||||||
else:
|
|
||||||
self.uplink_queue.put((data_type, data))
|
self.uplink_queue.put((data_type, data))
|
||||||
return True
|
return True
|
||||||
|
else:
|
||||||
def set_block_io(self, val):
|
return self._post_data(data_type, data)
|
||||||
try:
|
|
||||||
self.block_io = val
|
|
||||||
return True
|
|
||||||
except:
|
|
||||||
return False
|
|
||||||
|
|
||||||
def check_ota(self):
|
def check_ota(self):
|
||||||
current_settings = settings.settings.get()
|
current_settings = settings.settings.get()
|
||||||
|
@ -105,7 +105,7 @@ class default_values_app(object):
|
|||||||
|
|
||||||
loc_mode = _loc_mode.cycle
|
loc_mode = _loc_mode.cycle
|
||||||
|
|
||||||
loc_cycle_period = 5
|
loc_cycle_period = 1
|
||||||
|
|
||||||
low_power_alert_threshold = 20
|
low_power_alert_threshold = 20
|
||||||
|
|
||||||
@ -175,6 +175,8 @@ class default_values_sys(object):
|
|||||||
|
|
||||||
cloud_init_params = {}
|
cloud_init_params = {}
|
||||||
|
|
||||||
|
quecIot_timeout = 180
|
||||||
|
|
||||||
_quecIot = {
|
_quecIot = {
|
||||||
'PK': 'p11275',
|
'PK': 'p11275',
|
||||||
'PS': 'Q0ZQQndaN3pCUFd6',
|
'PS': 'Q0ZQQndaN3pCUFd6',
|
||||||
|
@ -70,7 +70,7 @@ class TrackerTimer(Singleton):
|
|||||||
self.tracker.alert_report(30002, {'local_time': utime.mktime(utime.localtime())})
|
self.tracker.alert_report(30002, {'local_time': utime.mktime(utime.localtime())})
|
||||||
self.tracker.machine_info_report()
|
self.tracker.machine_info_report()
|
||||||
if energy <= current_settings['app']['low_power_shutdown_threshold']:
|
if energy <= current_settings['app']['low_power_shutdown_threshold']:
|
||||||
self.tracker.machine_info_report(power_switch=False, block_io=True)
|
self.tracker.machine_info_report(power_switch=False)
|
||||||
self.tracker.energy_led.period = None
|
self.tracker.energy_led.period = None
|
||||||
self.tracker.energy_led.switch(0)
|
self.tracker.energy_led.switch(0)
|
||||||
self.tracker.running_led.period = None
|
self.tracker.running_led.period = None
|
||||||
|
@ -47,15 +47,7 @@ class Tracker(Singleton):
|
|||||||
|
|
||||||
def loc_report(self):
|
def loc_report(self):
|
||||||
post_data_res = False
|
post_data_res = False
|
||||||
data = None
|
data = self.locator.read()
|
||||||
retry = 0
|
|
||||||
while retry < 3:
|
|
||||||
data = self.locator.read()
|
|
||||||
if data:
|
|
||||||
break
|
|
||||||
else:
|
|
||||||
retry += 1
|
|
||||||
utime.sleep(1)
|
|
||||||
|
|
||||||
if data:
|
if data:
|
||||||
loc_method = data[0]
|
loc_method = data[0]
|
||||||
@ -65,13 +57,6 @@ class Tracker(Singleton):
|
|||||||
else:
|
else:
|
||||||
data_type = self.remote.DATA_LOCA_NON_GPS
|
data_type = self.remote.DATA_LOCA_NON_GPS
|
||||||
|
|
||||||
current_settings = settings.settings.get()
|
|
||||||
if current_settings['sys']['cloud'] == settings.default_values_sys._cloud.quecIot:
|
|
||||||
if loc_method == settings.default_values_app._loc_method.cell:
|
|
||||||
loc_data = ['LBS']
|
|
||||||
elif loc_method == settings.default_values_app._loc_method.wifi:
|
|
||||||
loc_data = []
|
|
||||||
|
|
||||||
post_data_res = self.remote.post_data(data_type, loc_data)
|
post_data_res = self.remote.post_data(data_type, loc_data)
|
||||||
else:
|
else:
|
||||||
log.warn('Location data is not ready.')
|
log.warn('Location data is not ready.')
|
||||||
@ -87,7 +72,7 @@ class Tracker(Singleton):
|
|||||||
alert_data = {settings.ALERTCODE.get(alert_code): alert_info}
|
alert_data = {settings.ALERTCODE.get(alert_code): alert_info}
|
||||||
return self.remote.post_data(data_type, alert_data)
|
return self.remote.post_data(data_type, alert_data)
|
||||||
else:
|
else:
|
||||||
log.warn('%s status is %s' % (settings.ALERTCODE.get(alert_code), alert_status))
|
log.warn('%s switch is %s' % (settings.ALERTCODE.get(alert_code), alert_status))
|
||||||
else:
|
else:
|
||||||
log.error('altercode (%s) is not exists. alert info: %s' % (alert_code, alert_info))
|
log.error('altercode (%s) is not exists. alert info: %s' % (alert_code, alert_info))
|
||||||
|
|
||||||
|
@ -82,12 +82,14 @@ location_info = tracker.locator.read()
|
|||||||
|
|
||||||
```python
|
```python
|
||||||
import utime
|
import utime
|
||||||
|
data_type = tracker.remote.DATA_NON_LOCA
|
||||||
data = {
|
data = {
|
||||||
'power_switch': True,
|
'power_switch': True,
|
||||||
'energy': tracker.battery.energy(),
|
'energy': tracker.battery.energy(),
|
||||||
'local_time': utime.mktime(utime.localtime())
|
'local_time': utime.mktime(utime.localtime())
|
||||||
}
|
}
|
||||||
tracker.remote.post_data(tracker.remote.DATA_NON_LOCA, data)
|
bio = False
|
||||||
|
tracker.remote.post_data(data_type, data, bio=bio)
|
||||||
```
|
```
|
||||||
|
|
||||||
- 参数:
|
- 参数:
|
||||||
@ -96,6 +98,7 @@ tracker.remote.post_data(tracker.remote.DATA_NON_LOCA, data)
|
|||||||
|:---|---|---|
|
|:---|---|---|
|
||||||
|data_type|int|数据类型|
|
|data_type|int|数据类型|
|
||||||
|data|dict|数据信息|
|
|data|dict|数据信息|
|
||||||
|
|bio|boll|是否阻塞发送(True阻塞;False非阻塞),默认False|
|
||||||
|
|
||||||
- data_type 枚举值
|
- data_type 枚举值
|
||||||
|
|
||||||
@ -152,26 +155,6 @@ tracker.remote.post_data(tracker.remote.DATA_NON_LOCA, data)
|
|||||||
|
|
||||||
返回`bool`类型数据, `True`成功, `False`失败。
|
返回`bool`类型数据, `True`成功, `False`失败。
|
||||||
|
|
||||||
#### `set_block_io` 设置消息发送为阻塞或非阻塞方式。
|
|
||||||
|
|
||||||
>`tracker.remote.set_block_io`
|
|
||||||
|
|
||||||
- 例:
|
|
||||||
|
|
||||||
```python
|
|
||||||
res = tracker.remote.set_block_io(False)
|
|
||||||
```
|
|
||||||
|
|
||||||
- 参数:
|
|
||||||
|
|
||||||
|参数|参数类型|参数说明|
|
|
||||||
|:---|---|---|
|
|
||||||
|val|bool|是否阻塞发送消息(True:阻塞;False:非阻塞), 默认True。|
|
|
||||||
|
|
||||||
- 返回值:
|
|
||||||
|
|
||||||
返回`bool`类型数据, `True`成功, `False`失败。
|
|
||||||
|
|
||||||
### alert_report 告警功能
|
### alert_report 告警功能
|
||||||
|
|
||||||
该功能提供`alert_report`方法, 将定义好的报警编码与报警信息上报到云端。
|
该功能提供`alert_report`方法, 将定义好的报警编码与报警信息上报到云端。
|
||||||
|
Loading…
x
Reference in New Issue
Block a user