update: 1. QuecThing timeout; 2. api doc; delete: alert.py

This commit is contained in:
JackSun-qc 2022-03-17 16:44:47 +08:00
parent 7ec375141e
commit 9f9fdb9f28
7 changed files with 49 additions and 123 deletions

View File

@ -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

View File

@ -1,7 +1,10 @@
import utime
import osTimer
import quecIot
# from queue import Queue
from misc import Power
from queue import Queue
from usr.logging import getLogger
from usr.settings import settings
DATA_NON_LOCA = 0x0
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):
def __init__(self, pk, ps, dk, ds, downlink_queue):
self.downlink_queue = downlink_queue
# self.post_result_wait_queue = Queue(maxsize=16)
self.post_result = []
self.post_result_wait_queue = Queue(maxsize=16)
self.quec_timer = osTimer()
quecIot.init()
quecIot.setEventCB(self.eventCB)
@ -61,27 +64,21 @@ class QuecThing(object):
quecIot.setServer(1, "iot-south.quectel.com:2883")
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
def rm_empty_data(data):
for k, v in data.items():
if not v:
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):
if data_type == DATA_NON_LOCA:
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()}
phymodelReport_res = quecIot.phymodelReport(1, {object_model_code.get(k): v})
if phymodelReport_res:
# res = self.post_result_wait_queue.get()
res = self.get_post_result()
self.quec_start_timer()
res = self.post_result_wait_queue.get()
self.quec_timer.stop()
if res:
v = {}
continue
@ -107,15 +105,17 @@ class QuecThing(object):
elif data_type == DATA_LOCA_GPS:
locReportOutside_res = quecIot.locReportOutside(data)
if locReportOutside_res:
# return self.post_result_wait_queue.get()
return self.get_post_result()
self.quec_start_timer()
return self.post_result_wait_queue.get()
self.quec_timer.stop()
else:
return False
elif data_type == DATA_LOCA_NON_GPS:
locReportInside_res = quecIot.locReportInside(data)
if locReportInside_res:
# return self.post_result_wait_queue.get()
return self.get_post_result()
self.quec_start_timer()
return self.post_result_wait_queue.get()
self.quec_timer.stop()
else:
return False
else:
@ -145,28 +145,22 @@ class QuecThing(object):
elif event == 4:
if errcode == 10200:
log.info('Data sending succeeded.')
# self.post_result_wait_queue.put(True)
self.put_post_result(True)
self.post_result_wait_queue.put(True)
elif errcode == 10210:
log.info('Object model data sending succeeded.')
# self.post_result_wait_queue.put(True)
self.put_post_result(True)
self.post_result_wait_queue.put(True)
elif errcode == 10220:
log.info('Location data sending succeeded.')
# self.post_result_wait_queue.put(True)
self.put_post_result(True)
self.post_result_wait_queue.put(True)
elif errcode == 10300:
log.info('Data sending failed.')
# self.post_result_wait_queue.put(False)
self.put_post_result(False)
self.post_result_wait_queue.put(False)
elif errcode == 10310:
log.error('Object model data sending failed.')
# self.post_result_wait_queue.put(False)
self.put_post_result(False)
self.post_result_wait_queue.put(False)
elif errcode == 10320:
log.error('Location data sending failed.')
# self.post_result_wait_queue.put(False)
self.put_post_result(False)
self.post_result_wait_queue.put(False)
elif event == 5:
if errcode == 10200:
log.info('Recving raw data.')

View File

@ -243,7 +243,6 @@ class Remote(Singleton):
self.remote_read_cb = remote_read_cb
self.downlink_queue = Queue(maxsize=64)
self.uplink_queue = Queue(maxsize=64)
self.block_io = True
current_settings = settings.settings.get()
cloud_init_params = current_settings['sys']['cloud_init_params']
if current_settings['sys']['cloud'] == settings.default_values_sys._cloud.quecIot:
@ -329,15 +328,15 @@ class Remote(Singleton):
def clean_history(self):
uos.remove(self._history)
def _post_data(self, data):
if data[0] == self.DATA_NON_LOCA or data[0] == self.DATA_LOCA_NON_GPS or data[0] == self.DATA_LOCA_GPS:
if not self.cloud.post_data(data[0], data[1]):
self.add_history(data[0], data[1])
def _post_data(self, data_type, data):
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_type, data):
self.add_history(data_type, data)
return False
else:
return True
else:
raise RemoteError('Post data format is wrong. data: %s' % data)
raise RemoteError('data_type %s is wrong.' % data_type)
'''
Data format to post:
@ -355,19 +354,12 @@ class Remote(Singleton):
['$GPRMCx,x,x,x', '$GPGGAx,x,x,x']
'''
def post_data(self, data_type, data):
if self.block_io is True:
return self._post_data((data_type, data))
else:
def post_data(self, data_type, data, bio=False):
if bio is False:
self.uplink_queue.put((data_type, data))
return True
def set_block_io(self, val):
try:
self.block_io = val
return True
except:
return False
else:
return self._post_data(data_type, data)
def check_ota(self):
current_settings = settings.settings.get()

View File

@ -105,7 +105,7 @@ class default_values_app(object):
loc_mode = _loc_mode.cycle
loc_cycle_period = 5
loc_cycle_period = 1
low_power_alert_threshold = 20
@ -175,6 +175,8 @@ class default_values_sys(object):
cloud_init_params = {}
quecIot_timeout = 180
_quecIot = {
'PK': 'p11275',
'PS': 'Q0ZQQndaN3pCUFd6',

View File

@ -70,7 +70,7 @@ class TrackerTimer(Singleton):
self.tracker.alert_report(30002, {'local_time': utime.mktime(utime.localtime())})
self.tracker.machine_info_report()
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.switch(0)
self.tracker.running_led.period = None

View File

@ -47,15 +47,7 @@ class Tracker(Singleton):
def loc_report(self):
post_data_res = False
data = None
retry = 0
while retry < 3:
data = self.locator.read()
if data:
break
else:
retry += 1
utime.sleep(1)
if data:
loc_method = data[0]
@ -65,13 +57,6 @@ class Tracker(Singleton):
else:
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)
else:
log.warn('Location data is not ready.')
@ -87,7 +72,7 @@ class Tracker(Singleton):
alert_data = {settings.ALERTCODE.get(alert_code): alert_info}
return self.remote.post_data(data_type, alert_data)
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:
log.error('altercode (%s) is not exists. alert info: %s' % (alert_code, alert_info))

View File

@ -82,12 +82,14 @@ location_info = tracker.locator.read()
```python
import utime
data_type = tracker.remote.DATA_NON_LOCA
data = {
'power_switch': True,
'energy': tracker.battery.energy(),
'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|dict|数据信息|
|bio|boll|是否阻塞发送(True阻塞;False非阻塞)默认False|
- data_type 枚举值
@ -152,26 +155,6 @@ tracker.remote.post_data(tracker.remote.DATA_NON_LOCA, data)
返回`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`方法, 将定义好的报警编码与报警信息上报到云端。