From: azao <821478748@qq.com> Date: Thu, 8 Jan 2026 04:14:58 +0000 (+0800) Subject: 改为iot3连接 X-Git-Url: http://git.snicker.com.cn/css/static/gitweb.css?a=commitdiff_plain;h=92221b46d7af9aa2ee6dc3e6e458349203a65f2e;p=mirrors%2FASR1603_G5.git 改为iot3连接 --- diff --git a/2.sdk/project/K8/sdk/services/microPython/ports/quectel/core/protocol.py b/2.sdk/project/K8/sdk/services/microPython/ports/quectel/core/protocol.py index ec148093..d23df450 100644 --- a/2.sdk/project/K8/sdk/services/microPython/ports/quectel/core/protocol.py +++ b/2.sdk/project/K8/sdk/services/microPython/ports/quectel/core/protocol.py @@ -1,3887 +1,3904 @@ -import ujson -import utime -import EventMesh -import constants -from common import Abstract -import uhashlib -import ubinascii -from misc import Power -import audio -from machine import Pin -import ujson -import ql_fs -import dataCall -import checkNet -import net -import usocket -import osTimer - -import machine -import urandom -import _thread -import usys -import request -import umqtt -import modem -import versions -SHA256 = uhashlib.sha256 -import SecureData -import log -import ustruct - -def server_init(server_type = None): - #服务器选择1,防走丢,2大锤,3三基同创,4童信,5云米,6荣为 8:ds未知 dey.hinwatch. com:9968 9:183.62.239.121:31869 10:183.62.239.121:33461 - if server_type == None: - server_type = 2 - #EventMesh.debug_log("server_init:server_type:{}".format(server_type)) - - d_server_addr = "api.xcloudtech.com" - d_server_port = 9000 - d_md5_key = "bZld0ALsZTt15tKEZhOlLPgbsO75BLTP" - d_PID = "SZKW" - if server_type == 1: - pass - - elif server_type == 2: - # test.iot.socket.thisiot.com:9999 - # iot.socket .thisiot.com:9999 - # d_server_addr = "test.iot.socket.thisiot.com" - # d_server_port = 9999 - # d_md5_key = "3JyCjsw4ryXKzjzudayY" - # d_PID = "qAELPTKmFanR4RHe" - - d_server_addr = "iot.socket.thisiot.com" - d_server_port = 9999 - d_md5_key = "SZYhyGhroQ3xFKFWZq1g" - d_PID = "oxLwDqcwJCtiPSRu" - - elif server_type == 3: - d_server_addr = "tcp.zhihuixuexiao.com" - d_server_port = 2346 - d_md5_key = "" - d_PID = "3G" - elif server_type == 4: - d_server_addr = "tcp.tx.kidxin.com" - d_server_port = 20500 - elif server_type == 5: - d_server_addr = "device.miwitracker.com" - d_server_port = 8505 - d_md5_key = "" - d_PID = "3G" - elif server_type == 6: - d_server_addr = "120.26.104.21" - d_server_port = 9968 - d_md5_key = "bZld0ALsZTt15tKEZhOlLPgbsO75BLTP" - d_PID = "SZKW" - elif server_type == 7: - d_server_addr = "8.134.68.15" - d_server_port = 30346 - d_PID="KnHnj1Cd5VxcO3Ft" - d_md5_key = "evxThVhMBmRNiQ1Twigw" - elif server_type == 99: - d_server_addr = "lab.xcloudtech.com" - d_server_port = 9000 - elif server_type == 8: - d_server_addr = "dev.hxinwatch.com" - d_server_port = 9968 - elif server_type == 9: - d_server_addr = "183.62.239.121" - d_server_port = 31869 - elif server_type == 10: - d_server_addr = "183.62.239.121" - d_server_port = 33461 - - return [d_server_addr,d_server_port,d_md5_key,d_PID] -from queue import Queue -def unicode_to_utf8(src): - ref = 0xe08080 - result = ref - - #取最后六位 - a = src & 0x3f - - #将最后六位放在ref最后六位的空位置 - result = result | a - src = src >> 6 - - #取接下来的六位 - a = src & 0x3f - - #放在ref对应的六个位置 - result = result | (a << 8) - - #保留最后四位 - src = src >> 6 - - #放在ref对应的四个位置 - result = result | (src << 16) - return result - -def UnicodeHexStr_To_Utf8Str(str): - odata = 0 - - result = bytes() - su =str.upper() - - i = 0 - for c in su: - tmp=ord(c) - if tmp <= ord('9') : - odata = odata << 4 - odata += tmp - ord('0') - - elif ord('A') <= tmp <= ord('F'): - odata = odata << 4 - odata += tmp - ord('A') + 10 - if(i%4==3): #每2字节获取一个int,拿到转换后的unicode int - #print(odata.to_bytes(2, 'big')) - #result.append(odata) - if odata > 255: - tmp = unicode_to_utf8(odata)#拿到转换后的utf8 int - tmp2 = tmp.to_bytes(3, 'big') #转bytes - else : - tmp2 = odata.to_bytes(1, 'big') - #print("tmp2:{}".format(tmp2)) - result = result + tmp2 - odata = 0 - i+=1 - return result.decode('utf-8') #返回utf8的str - -def gewu_init(): - productKey = "cu1shld45y4hjr1L" - return productKey -mqtt_state = 0 -def mqttsub_cb(topic, msg): - global mqtt_state - print("Subscribe Recv: Topic={},Msg={}".format(topic.decode(), msg.decode())) - jsload_data = ujson.loads(msg.decode()) - print("jsload_data-{} type:{}".format(jsload_data,type(msg.decode()))) - # jsload_data = {'data':'111','protocolType':'', 'host':'device.miwitracker.com', 'secretKey': 'bZld0ALsZTt15tKEZhOlLPgbsO75BLTP', 'port':8505, 'bid': '3G', 'extJsonStr': ''} - # ujson.loads(c) - # $sys/cu1shld45y4hjr1L/866610001011658/ext/regist - #data = {"messageId":"25","params":{"deviceSecret":"C1D75A63C0338978438E9197372FC698""}} - if "params" in jsload_data: - params_str = jsload_data["params"] - if "deviceSecret" in params_str: - str_tmp = params_str["deviceSecret"] - print(str_tmp) - EventMesh.publish("set_deviceSecret",str_tmp) - mqtt_state = 1 -def mqtterr_cb(error): - ''' - 接收umqtt线程内异常的回调函数 - ''' - print("error!!!!!!!!!!!".format(error)) - -def HMAC(k, m): - SHA1_BLOCK_SIZE = 64 - KEY_BLOCK = k + (b'\0' * (SHA1_BLOCK_SIZE - len(k))) - KEY_INNER = bytes((x ^ 0x36) for x in KEY_BLOCK) - KEY_OUTER = bytes((x ^ 0x5C) for x in KEY_BLOCK) - inner_message = KEY_INNER + m - outer_message = KEY_OUTER + SHA256(inner_message).digest() - return SHA256(outer_message) - - -def get_hmac_sha256(k, m): - data = HMAC(k, m).digest() - # print("HMAC(k, m).digest():", data) - # print("HMAC(k, m).digest():", ubinascii.hexlify(data)) - hex_data = ubinascii.hexlify(data) - hex_data = hex_data.decode('ascii') - return hex_data - -def mqtt_client_pro_init():#一型一密 - client = 0 - - # 创建一个mqtt实例 -# - # {"productKey":"cu1r1rjjrjdhz0lx","deviceKey":"DD86000000001","deviceSecret":"93FEEC6D16D30E2B90FE0DBC2FFCDB14"} 设备基本信息 - # hmac_sha256(deviceIddeviceKeyproductKey,deviceSecret) mqttclientId - deviceId = ""#"bOOSGN5FlXEjt15" - deviceKey = ''#"bOOSGN5FlXEjt15" - imei = EventMesh.publish(constants.EVENT.GET_IMEI) - deviceId = str(imei) - deviceKey = str(imei) - productKey = gewu_init() - - EventMesh.publish("set_product_key",productKey) - data = "{}{}{}".format(deviceId,deviceKey,productKey)#需要用户定义产品是提供数据 - # data = b"The data to encrypt" - # 密钥 - productSecret = b"765fc66242616852209d1c57e51b0744" #765fc66242616852209d1c57e51b0744 ,productSecret - - # {"productKey":"cu1shld45y4hjr1L","deviceKey":"bOOSGN5FlXEjt15","deviceSecret":"9234577490038E0949B800C243BF4321"} - checkpassword = get_hmac_sha256(productSecret,data) - # print(checkpassword) - # {deviceId}|{productKey}|{signMethod}|{authType}|{operator};连接id格式 - - Client_id = "{}|{}|0|1|0".format(deviceId,productKey) # - # print(Client_id) - server = "dmp-mqtts.cuiot.cn"#"dmp-mqtt.cuiot.cn" - port = 8883 - # {deviceKey}|{productKey} mqttUsername - userName = "{}|{}".format(deviceKey,productKey) - userpassword = checkpassword - # print(userName) - # print(userpassword) - # client = umqtt.MQTTClient("866610001011658|cu1shld45y4hjr1L|0|1|0","dmp-mqtt.cuiot.cn", 1883, "866610001011658|cu1shld45y4hjr1L","675f6fbfb15a729bbc280273632ce3a96f8b38d4736fbaf888fe8a48fd7aee09") - # client = umqtt.MQTTClient("lxRXQayZ4poQz8G|cujg06l29iav591b|0|0|0","dmp-mqtt.cuiot.cn", 1883, "lxRXQayZ4poQz8G|cujg06l29iav591b","1f8c69d29afca0505d967066b39d84a5eb1e54302b87e337b405f99d029a9242") - client = umqtt.MQTTClient(Client_id,server, port, userName,"{}".format(userpassword),reconn=False,ssl=True) - # client = MqttClient(Client_id, server, port, userName,"{}".format(userpassword)) - # 设置消息回调 - client.set_callback(mqttsub_cb) - # 设置异常回调 - client.error_register_cb(mqtterr_cb) - return client - -def mqtt_client_dev_init():#一机一密 - client = 0 - - # 创建一个mqtt实例 -# - # {"productKey":"cu1r1rjjrjdhz0lx","deviceKey":"DD86000000001","deviceSecret":"93FEEC6D16D30E2B90FE0DBC2FFCDB14"} 设备基本信息 - # hmac_sha256(deviceIddeviceKeyproductKey,deviceSecret) mqttclientId - deviceId = '' #"bOOSGN5FlXEjt15" - deviceKey = ''#"bOOSGN5FlXEjt15" - imei = EventMesh.publish(constants.EVENT.GET_IMEI) - deviceId = str(imei) - deviceKey = str(imei) - productKey = gewu_init() - data = "{}{}{}".format(deviceId,deviceKey,productKey)#需要用户定义产品是提供数据 - # data = b"The data to encrypt" - # 密钥 - deviceSecret_tmp = EventMesh.publish("get_deviceSecret") - subscribe_msg = deviceSecret_tmp.encode('ascii') - deviceSecret = subscribe_msg #765fc66242616852209d1c57e51b0744 ,productSecret - print(deviceSecret) - - checkpassword = get_hmac_sha256(deviceSecret,data) - print(checkpassword) - # {deviceId}|{productKey}|{signMethod}|{authType}|{operator};连接id格式 - Client_id = "{}|{}|0|0|0".format(deviceId,productKey) # 860132060346475|cu1shld45y4hjr1L|0|0|0 - server = "dmp-mqtts.cuiot.cn"#"dmp-mqtt.cuiot.cn" - port = 8883 - # {deviceKey}|{productKey} mqttUsername - userName = "{}|{}".format(deviceKey,productKey) - userpassword = checkpassword - - client = umqtt.MQTTClient(Client_id,server, port, userName,"{}".format(userpassword),reconn=False,ssl=True) - # client = MqttClient(Client_id, server, port, userName,"{}".format(userpassword)) - # 设置消息回调 - client.set_callback(mqttsub_cb) - # 设置异常回调 - client.error_register_cb(mqtterr_cb) - return client - - - -import uwebsocket -import sim - -class WEB_CMD_ENUM: - POST_DEVICE_STATE_R_CMD = "post_device_state_R" - POST_DEVICE_STATE_S_CMD = "post_device_state_S" - - POST_DEVICE_INFOR_R_CMD = "POST_DEVICE_INFOR_R_CMD" - POST_DEVICE_INFOR_S_CMD = "POST_DEVICE_INFOR_S_CMD" - - POST_ALARM_R_CMD = "post_alarm_R" - POST_ALARM_S_CMD = "post_alarm_S" - - FIND_DEVCE_R_CMD = "find_device_R" - FIND_DEVCE_S_CMD = "find_device_S" - - ALARM_CONFIG_R_CMD = "alarm_config_R" - ALARM_CONFIG_S_CMD = "alarm_config_S" - - ALARM_LIST_R_CMD = "alarm_list_R" - ALARM_LIST_S_CMD = "alarm_list_S" - - UNBIND_DEV_R="unbind_dev_R" - UNBIND_DEV_S="unbind_dev_S" - - DEVICE_SHAKE_STATE_R_CMD = "device_shake_state_R" - DEVICE_SHAKE_STATE_S_CMD = "device_shake_state_S" - -class IOT_socket_SendCmdManager(Abstract): - # - def __init__(self): - self.send_data = "" - self.time_tmp = 0 - def post_processor_after_instantiation(self): - EventMesh.subscribe("GET_IOT_SEND_CMD", self.get_iot_send_cmd) - print("IOTSendCmdManager") - #调用:device_state=EventMesh.publish("GET_IOT_SEND_CMD",WEB_CMD_ENUM.POST_DEVICE_INFOR_S_CMD) - # print("device_state{}".format(device_state)) - def get_iot_send_cmd(self, event, msg):#获取准备发送的值 - date_tmp = utime.localtime() - self.time_tmp = utime.mktime(date_tmp) - if msg == WEB_CMD_ENUM.POST_DEVICE_STATE_S_CMD:#设备VC状态 - self.send_data = self.device_report_state_send_data() - return self.send_data - elif msg == WEB_CMD_ENUM.POST_DEVICE_INFOR_S_CMD:#设备信息 - self.send_data = self.device_information_send_data() - return self.send_data - elif msg == WEB_CMD_ENUM.POST_DEVICE_INFOR_S_CMD:#聊天内容 - self.send_data = self.device_information_send_data() - return self.send_data - - # 设备对话内容上报数据格式 - def device_talk_send_data(self): - print("device_talk_send_data") - infor_send_data = { - "cmd":"chat_text", - "data": - { - "device_id":modem.getDevImei(),#设备号 - "type":"req:请求说的话;res:响应的内容", - "text":"用户说话内容", - "createTime":"时间戳" - } - } - return infor_send_data - - # 设备信息上报数据格式 - def device_information_send_data(self): - print("device_information_send_data") - battery_state = (EventMesh.publish("screen_get_battery"))[0] - battery = (EventMesh.publish("screen_get_battery"))[1] - if battery >= 100 or battery == None: - battery = 100 - VC_TTS_volume = EventMesh.publish("get_storage_config","VC_TTS_volume")#音量配置 - if VC_TTS_volume == None: - VC_TTS_volume =100 - sourceVersion =versions.Build_Time - Timeversion ="JSWM-"+sourceVersion - infor_send_data = { - "data":{ - "version":Timeversion,#版本号 - "charge":battery_state,#0表示未充电,1表示充电中 - "current_role_name":"",#当前音色的name - "volume":str(VC_TTS_volume),#百分比数值 - "wifi_rssi":str(net.csqQueryPoll()//6),#wifi强弱:0,1,2,3,4,5。转成这几个梯度 - "battery":str(battery),#电量 - "device_id":modem.getDevImei(),#设备号 - }, - "cmd":"device_info" - } - return infor_send_data - - #设备上报VC状态 - def device_report_state_send_data(self): - ai_status = EventMesh.publish("screen_get_ai") - if EventMesh.publish("get_VC_satrt_flag") == 1:#获取vc是否在运行 - if ai_status < 6 : - target_status = "listening" - elif ai_status == 6: - target_status = "thinking" - elif ai_status >= 8: - target_status = "speaking" - else: - target_status = "idle" - - device_report_data ={ - "data":{ - "device_id":modem.getDevImei(), - "state":target_status - }, - "cmd":"chat_state" - } - return device_report_data -def extract_target_number(json_str): - # 查找"target":"的起始位置 - start_key = '"target":"' - start_idx = json_str.find(start_key) - if start_idx == -1: - print("未找到 target 字段") - return None # 未找到目标字段 - - # 计算数字的起始位置(跳过"target":") - num_start = start_idx + len(start_key) - - # 从数字起始位置开始,查找结束的双引号(") - num_end = json_str.find('"', num_start) - if num_end == -1: - print("未找到数字的结束位置") - return None # 格式异常 - - # 截取数字字符串(从num_start到num_end) - number_str = json_str[num_start:num_end] - - # 转换为整数(如果需要浮点数,可改为float(number_str)) - try: - return int(number_str) - except ValueError: - print("截取的内容不是有效数字") - return None - -def playload_data(data): - print("data = {}".format(data)) - if isinstance(data, bytes) == 0 : - print("data类型错误") - return - - if data[0] != 0xff or data[1] !=0xfe: - print("data格式错误,重新登录") - EventMesh.publish("login_IOT")#登录IOT - return - payload_len_bytes = data [3:5] - payload_len = ustruct.unpack ('H', payload_len_bytes)[0] - # print ("解析到 Payload 长度:{} 字节".format(payload_len)) - - payload = data [5 : 5+ payload_len] - try: - json_str = payload.decode ('utf-8') - except UnicodeDecodeError: - try: - json_str = payload.decode ('gbk') - print ("提示:Payload 使用 GBK 编码") - except UnicodeDecodeError: - print ("Payload 解码失败") - return - # json_str = "\"" + json_str + "\"" - if type(json_str) is str and len(json_str)>5: - print ("解析出的 JSON 字符串:{}".format(json_str) + "-"*50) - if "get_device_state" in json_str: - EventMesh.publish("send_device_information")#发送设备信息 - EventMesh.publish("send_device_VC_state")#上传VC状态 - print("get_device_state") - elif "find_device" in json_str: - EventMesh.publish("play_tts_single","我在这呀,我在这呀") - print("find_device") - elif "renew_device" in json_str:#更新对话模式 重启 - EventMesh.publish("play_tts_single","更新配置中,设备将自动重启") - print("renew_device") - utime.sleep_ms(3000) - EventMesh.publish("Power_off") - elif "switch_volume" in json_str: - volume = int(extract_target_number(json_str)) - print("switch_volume = {}".format(volume)) - EventMesh.publish("update_volume",volume) - elif "switch_brightness" in json_str: - light = int(extract_target_number(json_str))//10 - print("switch_brightness") - EventMesh.publish("set_brightness_level",light) - elif "setup_role" in json_str: - EventMesh.publish("play_tts_open","角色正在切换") - print("setup_role") - EventMesh.publish("load_screen", {"screen": "UI_ai"})#ai画面 - - - # data_dict = ujson.loads(json_str) - # if isinstance(data_dict, dict): - # #下面做小程序下发指令类型判断 - # data = data_dict["cmd"] - # if data is "get_device_state": - # EventMesh.publish("send_device_information")#发送设备信息 - # print("get_device_state") - # elif data is "find_device": - # EventMesh.publish("play_tts_single","我在这呀,我在这呀") - # print("find_device") - # else: - # print("JSON数据不是字典类型") - - - -date_tmp = utime.localtime() -time_tmp = utime.mktime(date_tmp) -MAGIC = (0xfffe).to_bytes(2,"big") -VERSION = (0x01).to_bytes(1,"big")#"03".encode('utf-8') -TYPE = (0x03).to_bytes(1,"big") -DATA_LEN = (0x00000000).to_bytes(4,"big") -#magic+version+type+playload_len+playload -def protocol_send_total_data(data): - MAGIC = (0xfffe).to_bytes(2,"big") - VERSION = (0x01).to_bytes(1,"big")#"03".encode('utf-8') - TYPE = (0x03).to_bytes(1,"big") - HR_JSON = ujson.dumps(data) - GPS_JSON_b = HR_JSON.encode('utf-8') - DATA_LEN = (len(HR_JSON)).to_bytes(4,"big") - heards_infor = b'' - heards_infor = MAGIC+VERSION+TYPE+DATA_LEN+GPS_JSON_b - return heards_infor - -DEFIEN_HR_REPORT_TIME = 5*60 -DEFINE_TIME_COUNT = 5 -DEFIEN_LOCATION_REPORT_TIME = 5 -WEB_CONNECT_MAX_COUNT = 10 #默认重连次数 - -PROJECT_NAME = "JSWM" -PROJECT_VERSION = "1.0.0" -checknet = checkNet.CheckNetwork(PROJECT_NAME, PROJECT_VERSION) -# 设置日志输出级别 -log.basicConfig(level=log.INFO) -socket_log = log.getLogger("SOCKET") -class SockMangager(Abstract): - def __init__(self): - self.thread_buf_size = 8*1024 - self.iot_soc_send_queue = Queue(100) - self.iot_protoclo_recv_id=None - self.connect_timer = osTimer() - self.connect_timer_count = 0 - self.hr_report_timer = osTimer() - self.resolver = None - self.send_device_time = 0 - self.vbat_buf = [] - self.network_state = 0 - self.socket_send_queue_id = None - self.bat_count = 0 - self.reconnect_count = 0 #连续重连次数 默认十次 不过就不重连了 等下一个心跳重连 - self._20S_timer = osTimer() - self._1scnt = 0 - self._5M_timer = osTimer() - self._10Stimer = osTimer() - self.timer_id = 0 - self.start_voice_flag = 0 - self.IOT_sock = None - self.login_statu = 0#登陆状态 - self.sock_lock = _thread.allocate_lock() # 初始化锁 - #对话状态,一秒检查一次 - self.last_data = None # 保存上一次的数据状态 - self.current_data = None # 当前数据 - EventMesh.subscribe("REPORT_ALARM_TO_IOT",self.report_alarm_to_iot) - - def report_alarm_to_iot(self,event,msg): - EventMesh.publish(WEB_CMD_ENUM.POST_ALARM_S_CMD,msg) - pass - def usb_event_cb(self, state): - status = state - def post_processor_after_instantiation(self): - EventMesh.subscribe("CHANNEL_IOT_SEND",self.user_send)#发送数据的函数!!重要 - EventMesh.subscribe("GET_IOT_PROTOCOL_CILENT",self.get_IOT_sock) - EventMesh.subscribe("close_socket_timer",self.close_socket_timer) - EventMesh.subscribe("connect_iot_socket",self.connect_iot_socket_cb)#使用socket连接iot平台 - EventMesh.subscribe("login_IOT",self.login_IOT)#登录iot平台 - EventMesh.subscribe("heart_IOT",self.heart_IOt)#心跳包 - EventMesh.subscribe("send_device_information",self.send_device_information)#上报设备信息 - EventMesh.subscribe("send_device_VC_state",self.send_device_VC_state)#上报VC状态 - EventMesh.subscribe("send_unbind_dev_to_iot",self.send_unbind_dev_to_iot)#心跳包定时器开启 - self.reconnect_count = 0 - self.deviceReadState = "" - - # self.connect_timer.start(2000,0,self.iot_connect_timerCb) - - def send_device_information(self,event,msg): - EventMesh.publish("publish_AI_btnInfo",{"func":self.send_packet_iot,"data":WEB_CMD_ENUM.POST_DEVICE_INFOR_S_CMD})#上报设备信息 - def send_device_VC_state(self,event,msg): - EventMesh.publish("publish_AI_btnInfo",{"func":self.send_packet_iot,"data":WEB_CMD_ENUM.POST_DEVICE_STATE_S_CMD})#上报VC状态 - - def send_unbind_dev_to_iot(self,event,msg): - self._5M_timer.start(60000*5,1,self._5M_timer_cb)#更新信息 - self._20S_timer.start(20000,1,self._20S_timer_cb)#重连 - # self._10Stimer.start(50000,1,self._10S_timer_cb) - def _5M_timer_cb(self,*argc): - EventMesh.publish("heart_IOT")#开启IOT心跳包 - EventMesh.publish("send_device_information")#发送设备信息 - pass - - def initialization(self, *args): - pass - def connect_iot_socket_cb(self,event,msg): - self.connect_iot_socket() - def add_support_resolver(self, resolver): - self.resolver = resolver - def hr_report_event(self, *args, **kwargs): - EventMesh.publish("publish_AI_btnInfo",{"func":self.hr_report_event_cb}) #self.connect_iot_websocket() - def hr_report_event_cb(self): - """电池平均值""" - temp = Power.getVbatt() - if self.bat_count < 10: - self.vbat_buf.append(temp) - self.bat_count += 1 - else: - for i in range(9): - self.vbat_buf[i] = self.vbat_buf[i+1] - self.vbat_buf[9] = temp - curr_count = len(self.vbat_buf) - bat_total_value = 0 - for i in range(curr_count): - bat_total_value += self.vbat_buf[i] - bat_total_value = bat_total_value//curr_count#一分钟更新一次电量 10个平均值 - EventMesh.publish("AI_alarm_start") #检查是否有闹钟需要提醒 - # self.alarm_test() - EventMesh.publish("set_curr_battery_level",bat_total_value) - # EventMesh.publish("publish_AI_btnInfo",{"func":self.hr_report_publish_event,"data":0}) - if self.send_device_time < DEFIEN_LOCATION_REPORT_TIME : - self.send_device_time+=DEFINE_TIME_COUNT - else: - device_state=EventMesh.publish("GET_IOT_SEND_CMD",WEB_CMD_ENUM.POST_DEVICE_INFOR_S_CMD) - print("device_information{}".format(device_state)) - # EventMesh.publish(WEB_CMD_ENUM.POST_DEVICE_INFOR_S_CMD,device_state) #上报设备信息 - EventMesh.publish("publish_AI_btnInfo",{"func":self.send_packet_iot,"data":WEB_CMD_ENUM.POST_DEVICE_INFOR_S_CMD})#上报设备信息 - - def iot_connect_timerCb(self,*argc): - self.connect_iot_socket() - - def connect_iot_socket(self): - if EventMesh.publish("get_voice_record_flag") == 1: - EventMesh.publish("stop_voice_record") - print("connect_iot_socket !!!!") - - stagecode, subcode = checknet.wait_network_connected(30) - if stagecode == 3 and subcode == 1: - socket_log.info('Network connection successful!') - - if sim.getStatus() != 1 or self.start_voice_flag == 1:#网络正常 - return - - if self.reconnect_count >= WEB_CONNECT_MAX_COUNT: #重连次数大于10次不在进重连只有下发心跳才重新连接 - return - token = EventMesh.publish("get_dev_token") - # token = "9548860f973bffe39e1679db3110e223cb" - print("token:{}".format(token)) - if self.IOT_sock is not None: - print("socket已连接") - return - try: - if token != None: - self.connect_timer_count = 0 - #创建一个socket实例 - self.IOT_sock = usocket.socket(usocket.AF_INET, usocket.SOCK_STREAM) - try: - #建立连接 - self.IOT_sock.connect(('iot.socket.thisiot.com', 7777)) - #设置为阻塞 - self.IOT_sock.setblocking(True) - socket_log.info("IOT 连接建立") - except Exception as e: - print("再次连接") - self.IOT_sock.connect(('iot.socket.thisiot.com', 7777)) - #设置为非阻塞 - self.IOT_sock.setblocking(False) - self.reconnect_count = 0 - # print("self.socket_send_queue_id = {} , self.iot_protoclo_recv_id = {}".format(self.socket_send_queue_id,self.iot_protoclo_recv_id)) - if self.socket_send_queue_id == None: - _thread.stack_size(self.thread_buf_size+8*1024) #_thread.stack_size(16*1024) - self.socket_send_queue_id = _thread.start_new_thread(self.socket_send_queue_thread, ()) - _thread.stack_size(8*1024) - if self.iot_protoclo_recv_id == None: - _thread.stack_size(self.thread_buf_size+8*1024) - self.iot_protoclo_recv_id = _thread.start_new_thread(self.iot_protocol_recv, ()) - _thread.stack_size(8*1024) - - socket_log.info("self.IOT_sock thread init!!!!!!!!!") - - - if self.IOT_sock is not None: - self.start_voice_flag = 1 - else: - self.start_voice_flag = 0 - - print("self.IOT_sock {} self.start_voice_flag:{}".format(self.IOT_sock,self.start_voice_flag)) - if self.IOT_sock != None: - if self.timer_id == 0: - # self.hr_report_timer.start(DEFINE_TIME_COUNT*1000, 1, self.hr_report_event) - self.timer_id=1 - else: - print("没有token!!!!!!!!!!") - self.connect_timer_count+=1 - if self.connect_timer_count <= 10: - print("IOT重连定时器开启") - self.connect_timer.start(5000,0,self.iot_connect_timerCb) - pass - except Exception as e: - self.IOT_sock = None - print("connect_iot_socket error") - def heart_IOt(self,event,msg): - print("heart_IOT.....") - #Header - header = ustruct.pack('>H', 0xFFFE) # 使用大端模式 - #Type - packet_type = ustruct.pack('B', 0x02) - #拼接 - heart_packet = header + packet_type - EventMesh.publish("CHANNEL_IOT_SEND", heart_packet) - # print("心跳发送数据包:{}".format(heart_packet)) - - def send_packet_iot(self,data):#发送数据给iot,data为接口json数据 - if sim.getStatus() != 1 or self.start_voice_flag == 1:#网络正常 - return - #Header - header = ustruct.pack('>H', 0xFFFE) # 使用大端模式 - #Type - packet_type = ustruct.pack('B', 0x03) - #字典转为json字符串 - json_str = EventMesh.publish("GET_IOT_SEND_CMD", data) - json_str = ujson.dumps(json_str) - #字符串转为二进制数据Payload - payload = json_str.encode('utf-8') - #PayloadLen - payloadLen = ustruct.pack('H', len(payload)) - #CRC16(2字节,基于pay字段计算) - crc = self.crc16(payload) - print("crc的长度为{}".format(len(crc))) - #拼接 - full_packet = header + packet_type + payloadLen + payload+ crc - EventMesh.publish("CHANNEL_IOT_SEND", full_packet) - print("发送更新数据包:{}".format(full_packet)) - - def login_IOT(self,event,msg): - print("登录中") - #Header - header = ustruct.pack('>H', 0xFFFE) # 使用大端模式 - #Type - packet_type = ustruct.pack('B', 0x00) - #设备ID - device_id_bytes = modem.getDevImei().encode('utf-8')[:20] # 转为字节并截断到20字节 - device_id = bytes_ljust(device_id_bytes, 20, b'\x00') - #令牌 - token_bytes = EventMesh.publish("get_dev_token").encode('utf-8')[:36] # 转为字节并截断 - token_padded = bytes_ljust(token_bytes, 36, b'\x00') - #拼接 - body = header + packet_type + device_id + token_padded - #CRC16(2字节,基于上述所有字段计算) - crc = self.crc16(body) - # 完整数据包 - full_packet = body + crc - EventMesh.publish("CHANNEL_IOT_SEND", full_packet) - print("登录发送数据包:{}".format(full_packet)) - - - def crc16(self, data): - """计算CRC16校验值(MODBUS RTU模式)""" - crc = 0xFFFF - for byte in data: - crc ^= byte - for _ in range(8): - if crc & 0x0001: - crc >>= 1 - crc ^= 0xA001 - else: - crc >>= 1 - # 返回2字节小端模式 - return ustruct.pack('5: - if self.IOT_sock is not None: - if self.IOT_sock.getsocketsta() != 4: - print("iot断线重连") - self.login_statu = 0 - self.iot_close_therad() - EventMesh.publish("publish_AI_btnInfo",{"func":self.connect_iot_socket}) - EventMesh.publish("login_IOT")#登录IOT - else: - if self.login_statu == 0: - EventMesh.publish("login_IOT")#登录IOT - self._1scnt = 0 - - - def _10S_timer_cb(self,*argc): - print("主动断线") - self.IOT_sock.close() - - def socket_send_queue_thread(self): - while True: - # with self.sock_lock: # 操作Socket前加锁 - data = self.iot_soc_send_queue.get() - if data != None: - try: - if self.IOT_sock is not None: - self.IOT_sock.send(data) - # EventMesh.debug_log("发送线程") - self.reconnect_count = 0 - else: - EventMesh.publish("publish_AI_btnInfo",{"func":self.connect_iot_socket}) - print("socket关闭退出send线程") - return - EventMesh.debug_log("socket:send data2 len:{}".format(len(data),self.IOT_sock)) - except Exception as e: - EventMesh.debug_log("socket:send error") - EventMesh.publish("publish_AI_btnInfo",{"func":self.connect_iot_socket}) - break - - - def iot_protocol_recv(self): - # 配置超时参数,单位:秒 - RECV_TIMEOUT = 30*1000 # 30秒未收到数据则重连 - last_recv_time = utime.time() # 初始化最后一次收到数据的时间 - while True: - # 死循环接收数据 - # with self.sock_lock: # 警告:不能加锁,不然会导致线程超长延时 - try: - data = self.IOT_sock.recv(256) - if isinstance(data, bytes) and len(data)>10: - playload_data(data) - #fffe00010001xxxx - if isinstance(data, bytes) and len(data) == 8:#登录成功 - target_bytes = b'\xff\xfe\x00\x01\x00\x01' - if data[:6] == target_bytes: - self.login_statu = 1#登录成功标志位修改 - socket_log.info("IOT_recv = {} ,len = {}".format(self.bytes_to_hex(data),len(data))) - #检查socket是否已关闭 - if self.IOT_sock == None: - print("socket关闭开启重连") - EventMesh.publish("publish_AI_btnInfo",{"func":self.connect_iot_socket}) - return - #超时检查:如果超过设定时间未收到数据,触发重连 - # print("接收时间差 = {}".format(utime.time() - last_recv_time)) - if utime.time() - last_recv_time > RECV_TIMEOUT: - print("超过{}秒未收到数据,触发重连".format(RECV_TIMEOUT)) - # 先关闭现有连接 - if self.IOT_sock: - self.IOT_sock.close() - # 触发重连 - EventMesh.publish("publish_AI_btnInfo", {"func": self.connect_iot_socket}) - # 重连后短暂延迟再继续循环 - utime.sleep(1) - # 重置超时计时器 - last_recv_time = utime.time() - except Exception as e: - print("cli break") - print("异常是:{}".format(e)) - # EventMesh.publish("connect_iot_websocket_cb") - last_recv_time = utime.time() - EventMesh.publish("publish_AI_btnInfo",{"func":self.connect_iot_socket}) - break - self.iot_protoclo_recv_id =None - def decode_with_multiple_encodings(self, data): - #尝试多种常见编码格式解码,返回第一个成功的结果 - # 常见编码格式列表(按优先级排序,根据实际场景调整) - encodings = ['utf-8', 'gbk', 'latin-1', 'utf-16', 'gb2312'] - - for encoding in encodings: - try: - # 尝试用当前编码解码,errors='strict'严格模式(确保无乱码) - return data.decode(encoding, errors='strict') - except UnicodeDecodeError: - continue # 解码失败,尝试下一种编码 - return None # 所有编码都失败 - - # bytes转十六进制字符串 - def bytes_to_hex(self, data): - #将bytes类型转换为十六进制字符串(如b'\x03\x01' -> '0301') - hex_chars = '0123456789abcdef' - hex_str = '' - for b in data: - # 处理每个字节的高4位和低4位 - hex_str += hex_chars[(b >> 4) & 0x0F] # 高4位 - hex_str += hex_chars[b & 0x0F] # 低4位 - return hex_str - - def iot_send_queue_close(self): - if self.socket_send_queue_id != None: - - if self.iot_soc_send_queue.empty()!=True: - self.iot_soc_send_queue.clear() - try: - _thread.stop_thread(self.socket_send_queue_id) - except Exception as e: - print("iot_send_queue_close !!!!!!!!") - print("iot_send_queue_close 1111!!!!!!!!") - self.socket_send_queue_id = None - - def iot_protoclo_recv_close_therad(self): - if self.iot_protoclo_recv_id != None: - try: - _thread.stop_thread(self.iot_protoclo_recv_id) - except Exception as e: - print("iot_protoclo_recv_close_therad !!!!!!!!") - self.iot_protoclo_recv_id = None - if self.IOT_sock != None: - try: - print("关闭socket") - self.IOT_sock.close() - except Exception as e: - print("关闭socket失败") - self.IOT_sock = None - - - - def iot_close_therad(self): - try: - self.iot_send_queue_close() - except Exception as e: - print("iot_send_queue_close error!!!!!!!!") - - try: - self.iot_protoclo_recv_close_therad() - except Exception as e: - print("iot_protoclo_recv_close_therad error!!!!!!!!") - self.start_voice_flag = 0 - print("iot_close_therad") - - def get_IOT_sock(self,event,msg): - return self.IOT_sock - def user_send(self,event,data): - # EventMesh.debug_log("TCP:send data:{}".format(msg)) - # EventMesh.debug_log("TCP:send data:{}".format(msg)) - sim_state = sim.getStatus() - if sim.getStatus() != 1:#网络不正常 - print("无 sim卡") - return - else : - try: - if self.start_voice_flag == 0: #如果关闭了就需要重新再连接 - EventMesh.publish("publish_AI_btnInfo",{"func":self.connect_iot_socket}) - return - if data != None: - if len(data) != 0: - self.iot_soc_send_queue.put(data) - # EventMesh.debug_log("self.socket_send_queue.put:success:{}".format(len(data))) - except Exception as e: - EventMesh.debug_log("self.socket_send_queue.put:ERROR:") - usys.print_exception(e) - - return - sim_state = sim.getStatus() - if sim_state != 1 or self.network_state == 0: #没sim,则不发送 ,没联网 - return - else : - try: - if self.IOT_sock != None: - EventMesh.publish("publish_AI_btnInfo",{"func":self.iot_protocol_send_cb,"data":data}) - else: - print("reconnect1 {}".format(data)) - EventMesh.publish("publish_AI_btnInfo",{"func":self.connect_iot_socket}) - - except Exception as e: - print("senc data err reconnect{}".format(data)) - EventMesh.publish("publish_AI_btnInfo",{"func":self.connect_iot_socket}) - - def iot_protocol_send_cb(self,data): - try: - if data != None: - print("socket connect success:{} self.IOT_sock:{}".format(data,self.IOT_sock)) - if self.IOT_sock != None: - self.IOT_sock.send(data) - self.reconnect_count = 0 - print("socket send success") - else: - print("reconnect2 {}".format(data)) - # EventMesh.publish("connect_iot_socket_cb") - EventMesh.publish("publish_AI_btnInfo",{"func":self.connect_iot_socket}) - except Exception as e: - print("发送失败 重新连接") - self.reconnect_count+=1 - # EventMesh.publish("connect_iot_socket_cb") - EventMesh.publish("publish_AI_btnInfo",{"func":self.connect_iot_socket}) - -def bytes_ljust(data, length, fill_byte=b'\x00'): - """ - 手动实现bytes的ljust功能:将字节流填充到指定长度,不足部分用fill_byte在右侧填充 - :param data: 原始字节流(bytes) - :param length: 目标长度(int) - :param fill_byte: 填充字节(默认空字节b'\x00') - :return: 填充后的字节流(bytes) - """ - if len(data) >= length: - # 若原始长度已超过目标长度,直接截断到指定长度 - return data[:length] - else: - # 计算需要填充的长度,用fill_byte补齐 - padding = fill_byte * (length - len(data)) - return data + padding - -class NetManager(Abstract): - THRESHOLD = 10 - - def __init__(self): - self.__data_call = dataCall - self.__net = net - self.check_net = checkNet.CheckNetwork("QuecPython_Helios_Framework", "this latest version") - EventMesh.subscribe("get_network_state", self.get_network_state) - self.network_state = 0 - - def post_processor_after_instantiation(self, *args, **kwargs): - count = 0 - while True: - count += 1 - if count > 5 : - return - data = dataCall.getInfo(1, 0) - EventMesh.debug_log("data call INFO {}".format(data)) - if data[2][0]: - self.network_state = 1 - break - utime.sleep(1) - self.__data_call.start(2, 0, "", "", "", 0) - self.__data_call.setCallback(self.__datacall_cb) - - def __datacall_cb(self, args): - pdp = args[0] - nw_sta = args[1] - if nw_sta == 1: - self.network_state = 1 - EventMesh.debug_log("*** network %d connected! ***" % pdp) - - else: - self.network_state = 0 - EventMesh.debug_log("*** network %d not connected! ***" % pdp) - - def get_network_state(self, topic, msg): - return self.network_state - -class ProtoCol(Abstract): - TYPE = "" - HEADER = "#@{}@#;" - SEPARATOR = ";" - END = ";" + chr(0x01) - #PID = "SZKW" - #PID = "qAELPTKmFanR4RHe" - md5_key = '' - PID = '' - - def __init__(self): - self.content = None - self.check_sum = None - self.password = EventMesh.publish(constants.EVENT.GET_PASSWORD) - self.imei = EventMesh.publish(constants.EVENT.GET_IMEI) - self.cid = EventMesh.publish(constants.EVENT.GET_CID) - self.imsi = EventMesh.publish(constants.EVENT.GET_IMSI) - self.key = EventMesh.publish(constants.EVENT.GET_KEY) - self.HEADER = self.HEADER.format(self.TYPE) - - self.md5_key = '' - self.PID = '' - server_data = EventMesh.publish("get_new_key_pid")#获取pid和key - if server_data == None: - server_data = server_init()#如果获取的数据是None,就用默认的大锤key和pid - self.md5_key = server_data[2] - self.PID = server_data[3] - else: - self.md5_key = server_data[0] - self.PID = server_data[1] - - # EventMesh.debug_log("md5_key:--",self.md5_key,self.PID) - # ip_infor = {} - # ip_infor = EventMesh.publish("get_new_ip_com") - # if ip_infor != None: - # self.md5_key = ip_infor[2] - # EventMesh.debug_log("md5_key",self.md5_key) - - def initialization(self, *args, **kwargs): - EventMesh.subscribe(self.TYPE + "_SEND", self.handler) - EventMesh.subscribe(self.TYPE + "_RECV", self.handler) - #EventMesh.debug_log("ProtoCol:{}".format(self.TYPE + "_SEND")) - - def handler(self, event, msg): - #EventMesh.debug_log("ProtoCol:handler:{}".format(event)) - self.password = EventMesh.publish(constants.EVENT.GET_PASSWORD) - self.imei = EventMesh.publish(constants.EVENT.GET_IMEI)#"867387060319166"#EventMesh.publish(constants.EVENT.GET_IMEI)#"867387060319166" #EventMesh.publish(constants.EVENT.GET_IMEI)#"867387060319166"#EventMesh.publish(constants.EVENT.GET_IMEI) #"867387060319166"#EventMesh.publish(constants.EVENT.GET_IMEI) #"867387060319166"#"867387060319188"#"867387060319177"#"867387060319166"#"860132060004322"#"867387060319166"#"860132060004322"#EventMesh.publish(constants.EVENT.GET_IMEI) - self.cid = EventMesh.publish(constants.EVENT.GET_CID) - self.imsi = EventMesh.publish(constants.EVENT.GET_IMSI) - self.key = EventMesh.publish(constants.EVENT.GET_KEY) - if event.endswith("_SEND"): - self.send(event, msg) - else: - self.recv(event, msg) - - def send(self, event, msg): - pass - - def recv(self, event, msg): - pass - - @staticmethod - def get_date(): - return "{:04d}-{:02d}-{:02d}".format(*utime.localtime()[0:3]) - - @staticmethod - def get_time(): - return "{:02d}:{:02d}:{:02d}".format(*utime.localtime()[3:6]) - - def calc_crc(self): - data = self.content - if not isinstance(data, bytes): - data = data.encode() - count = 0 - for x in data: - count += x - self.check_sum = 100 - count % 100 - - def pack(self): - self.calc_crc() - return self.HEADER.encode() + self.content.encode() + self.SEPARATOR.encode() + int(self.check_sum).to_bytes(1,'little') + self.END.encode() - - def pack_MD5_head(self,data): - #key = "bZld0ALsZTt15tKEZhOlLPgbsO75BLTP" - self.md5_key=EventMesh.publish("get_new_key") - if self.md5_key == None: - self.md5_key = server_init[2] - - if(self.md5_key == ""): - return "" - MD5_head = "" - hash_obj = uhashlib.md5(data+self.md5_key) - res = hash_obj.digest() - - # 转成十六进制表示 - MD5_head = ubinascii.hexlify(res) - MD5_head = MD5_head.decode('ascii') - #EventMesh.debug_log("data+self.md5_key:{}".format(data+self.md5_key)) - #EventMesh.debug_log(res) - #EventMesh.debug_log(MD5_head) - return MD5_head -#查找设备 -class IOT_FindDeviceProtoCol(ProtoCol): - """find_device""" - TYPE = "find_device" - - def send(self, event, msg): - # print("send locafind_devicetion{}".format(msg)) - # 通过websocket发送到服务器端 - date_tmp = utime.localtime() - time_tmp = utime.mktime(date_tmp) - find_device = { - "cmd":"dispatch_rest", - "ts":time_tmp, - "msg":"消息收到响应", - "data":{ - "cmd":"find_device", - "rest":"success", - "msg":"收到查找设备指令" - } - } - send_data = b'' - send_data = protocol_send_total_data(find_device) - print("send_data find_device{}".format(send_data)) - EventMesh.publish("CHANNEL_IOT_SEND", send_data) - - def recv(self, event, msg): - """ - - @param event:定位信息下发 - @param msg: 接收到的下行数据 - """ - alarm_TTS_str="在这呢" - base_sentence = "{}".format(alarm_TTS_str) - repeat_sentence = (base_sentence + ",") * 3 # 重复5次并加逗号分隔 - final_sentence = repeat_sentence.rstrip(",") - - EventMesh.publish("play_tts",[final_sentence,1]) #播放tts闹钟文本内容 - print("recv find_device{}".format(msg)) - EventMesh.publish(WEB_CMD_ENUM.FIND_DEVCE_S_CMD) - -#上报设备VC状态 -class IOT_post_device_stateProtoCol(ProtoCol): - """post_device_state""" - TYPE = "post_device_state" - - def send(self, event, msg): - print("send post_device_state{}".format(msg)) - # 通过websocket发送到服务器端 - - send_data = b'' - send_data = protocol_send_total_data(msg) - EventMesh.publish("CHANNEL_IOT_SEND",send_data) - - def recv(self, event, msg): - """ - - @param event:mpost_device_state - @param msg: 接收到的下行数据 - """ - # locate_now = { - # "cmd":"locate_duration", - # "ts":1738283829, - # "msg":"下发定位周期", - # "data":300,0表示关 - # } - print("send post_device_state{}".format(msg)) -class LK_ProtoCol(ProtoCol): - """链路保持""" - TYPE = "LK" - - def send(self, event, msg): - #[SZKW*334588000000156*0002*LK] - #EventMesh.debug_log('self.imei:%s'%(self.imei)) - send_data = EventMesh.publish("get_new_pid")+"*%s*0002*LK"%(self.imei) - MD5_SIGN = self.pack_MD5_head(send_data) - data = "[%s%s]"%(str(MD5_SIGN),send_data) - # EventMesh.debug_log("LK_ProtoCol:send:%s"%(data)) - - - # 通过socket发送到服务器端 - EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) - - def recv(self, event, msg): - """ - - @param event: LK成功 - @param msg: 接收到的下行数据 - """ - EventMesh.debug_log("LK_ProtoCol:recv:%s"%(msg)) - EventMesh.publish(constants.PROTOCOL.PING_SEND) - EventMesh.publish(constants.PROTOCOL.KA_SEND) - EventMesh.publish(constants.PROTOCOL.TIME_SEND) - - EventMesh.publish(constants.EVENT.START_LOCATION,constants.PROTOCOL.UD_SEND) #开始UD定位 - EventMesh.publish(constants.EVENT.START_LOCATION,constants.PROTOCOL.WT_SEND) #开始WT定位 - if EventMesh.model == 'D15': - EventMesh.publish(constants.PROTOCOL.MEMBERS_SEND) - -class PING_ProtoCol(ProtoCol): - """获取绑定状态""" - TYPE = "PING" - - def send(self, event, msg): - #[SZKWT*YYYYYYYYYYYYYYY*LEN*PING] - send_data = EventMesh.publish("get_new_pid")+"*%s*0004*PING"%(self.imei) - MD5_SIGN = self.pack_MD5_head(send_data) - data = "[%s%s]"%(str(MD5_SIGN),send_data) - #EventMesh.debug_log("PING_ProtoCol:send:%s"%(data)) - # 通过socket发送到服务器端 - EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) - - def recv(self, event, msg): - """ - - @param event: PING - @param msg: 接收到的下行数据 - """ - #EventMesh.debug_log("PING_ProtoCol:recv:%s"%(msg)) - data_tmp = msg.decode('ascii') - data_tmp = data_tmp.split(']')[0] #去掉] - EventMesh.publish(constants.EVENT.SET_PING, data_tmp.split(',')[1]) - if EventMesh.model == 'D15': - EventMesh.publish(constants.PROTOCOL.JPREG_SEND) - EventMesh.publish(constants.PROTOCOL.MEMBERS_SEND) - -class KA_ProtoCol(ProtoCol): - """心跳""" - TYPE = "KA" - count = 0 - roll_count = 0 - def send(self, event, msg): - #"{:04d}-{:02d}-{:02d}".format(*utime.localtime()[0:3]) - #[XT*YYYYYYYYYYYYYYY*LEN*KA,日期,步数,翻滚次数,电量百分数,车载里程数(km)] 实例:[XT*334588000000156*0014*KA,120414,50,100,100,100.12] - date = "{:04d}{:02d}{:02d}".format(*utime.localtime()[0:3]) - date = date[2:] - #EventMesh.debug_log("date:",date) - #步数 - old_step = 0 - step = 0 - step = EventMesh.publish("get_old_step_value") - if step != None: - if step != 0: - read_data = EventMesh.publish("get_storage_config","old_step_new") - if read_data != None: - old_step = read_data - - if old_step != step: - # EventMesh.debug_log("old_step:send:%d %d"%(old_step,step)) - EventMesh.publish("set_storage_config",["old_step_new",step+10]) - EventMesh.publish("set_storage_config",["old_step_new",step]) - - old_step = step - # step = EventMesh.publish(constants.EVENT.GET_STEP)[0] - # 电池电量百分比 - - bat_tmp = EventMesh.publish("screen_get_battery") - sleep_time = EventMesh.publish("get_storage_config","sleep_time") - if sleep_time != None: - if len(sleep_time) != 0: - hour = utime.localtime()[3] - min = utime.localtime()[4] - cur_time = hour*60+min - start_hour = int(sleep_time["start_hour"]) - start_min = int(sleep_time["start_min"]) - start_total = start_hour*60+start_min - - end_hour = int(sleep_time["end_hour"]) - end_min = int(sleep_time["end_min"]) - end_total = end_hour*60+end_min - # EventMesh.debug_log("ka roll_:",hour,min,cur_time,start_total,end_total) - if cur_time >= start_total and cur_time <= end_total: - self.roll_count = int(hour) - if self.roll_count == 0: - self.roll_count+=1 - else: - self.roll_count = 0 - else: - self.roll_count = 0 - else: - self.roll_count = 0 - hour = utime.localtime()[3] - min = utime.localtime()[4] - EventMesh.txt_log("ka step:{} hour:{} min:{}".format(step,hour,min)) - - battery_caption = bat_tmp[1] - send_data = "KA,%s,%d,%d,%d"%(date,step,self.roll_count,battery_caption) - send_len = len(send_data) - - send_data = EventMesh.publish("get_new_pid")+"*%s*%04X*%s"%(self.imei,send_len,send_data) - MD5_head_data = EventMesh.publish("get_new_pid")+"*%s*%04X*%s"%(self.imei,send_len,"KA") - - MD5_SIGN = self.pack_MD5_head(MD5_head_data) - data = "[%s%s]"%(str(MD5_SIGN),send_data) - #EventMesh.debug_log("KA_ProtoCol:send:%s"%(data)) - - - # 通过socket发送到服务器端 - EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) - - def recv(self, event, msg): - """ - - @param event: PING - @param msg: 接收到的下行数据 - """ - #EventMesh.debug_log("KA_ProtoCol:recv:%s"%(msg)) - -class UD_ProtoCol(ProtoCol): - """位置信息""" - TYPE = "UD" - UD_count = 0#每6次定位获取一次天气数据 - def send(self, event, msg): - #EventMesh.debug_log("UD:send:%s"%(msg)) - #"{:04d}-{:02d}-{:02d}".format(*utime.localtime()[0:3]) - #[6f62cfc40fc50173f9a7b21e87be3424IS*861217001020120*00f6*UD,220726,211210,A,22.649529,N,114.119165,E,0.28,137.4,100.0,8,24,63,119,0,00000000,2,1,460,11,30472,125667122,24,30472,218944048,19,4, - # wifi0,34:93:44:01:28:b9,-74,wifi1,34:20:03:96:35:ad,-78,wifi2,ea:b5:7b:e8:56:54,-80,wifi3,c4:49:bb:d4:d9:78,-88] - - - self.UD_count+=1 - #每6次定位获取一次天气数据 - if self.UD_count>=6: - self.UD_count = 0 - EventMesh.publish(constants.PROTOCOL.WT_SEND,msg) - - send_data ="UD,"+msg - send_len = len(send_data) - #wt_data = "%s"%(send_data) - send_data = EventMesh.publish("get_new_pid")+"*%s*%04X*%s"%(self.imei,send_len,send_data) - MD5_head_data = EventMesh.publish("get_new_pid")+"*%s*%04X*%s"%(self.imei,send_len,"UD") - - MD5_SIGN = self.pack_MD5_head(MD5_head_data) - data = "[%s%s]"%(str(MD5_SIGN),send_data) - # EventMesh.debug_log("{}".format(data)) - # wt_data = EventMesh.publish("get_weather_data") - # # #如果没有天气数据,则获取天气数据 - # if wt_data != None or wt_data[0] == None : - # - EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) - if EventMesh.platform == "gewu": - if(msg != ""): - client = EventMesh.publish("get_mqtt_dev_connect_state") - if client != 0: - mqtt_connect = -1 - try: - mqtt_connect = client.connect() - except Exception as e: - print(e) - mqtt_connect = -1 - print("mqtt_connect:{}".format(mqtt_connect)) - if mqtt_connect == 0: - # 订阅主题 - get_device_id = EventMesh.publish(constants.EVENT.GET_IMEI) - get_deviceKey = EventMesh.publish(constants.EVENT.GET_IMEI) - get_productKey = gewu_init() - #$sys/{productKey}/{deviceKey}/ext/regist - event_msg = "$sys/{}/{}/event/pub_reply".format(get_productKey,get_deviceKey) - # client_msg = "$sys/cu1shld45y4hjr1L/866610001011658/ext/regist" - subscribe_msg = event_msg.encode('ascii') - - client.subscribe(subscribe_msg,0)#订阅事件消息消息主题 - print("Connected to dmp-mqtt.cuiot.cn, subscribed to /public/TEST/quecpython topic") - msg_tmp = msg.decode('ascii') - msg_tmp = msg_tmp.split(',') - longitude = float(msg_tmp[3]) - latitude = float(msg_tmp[5]) - date_tmp = utime.localtime() - time_tmp = utime.mktime(date_tmp)#需要转换成毫秒级别 - updataTime = "{}".format(time_tmp*1000) - data_info = { - "messageId":"0", - "params": { - "key":"location", - "info": [ - { - "key":"longitude", - "value":longitude - }, - { - "key":"latitude", - "value":latitude - }, - { - "key":"UpdateTime", - "value":updataTime - } - ] - } - } - data_json = ujson.dumps(data_info) - event_pub_msg = "$sys/{}/{}/event/pub".format(get_productKey,get_deviceKey) - pub_msg = event_pub_msg.encode('ascii') - client.publish(pub_msg,data_json,0)#publis主题内容 - - print("Publish topic: /public/TEST/quecpython758, msg: my name is Quecpython") - - - - def recv(self, event, msg): - pass - # EventMesh.debug_log("UD_ProtoCol:recv:%s"%(msg)) - -class CR_ProtoCol(ProtoCol): - """立即定位""" - TYPE = "CR" - - def send(self, event, msg): - #[SZKWT*YYYYYYYYYYYYYYY*LEN*PING] - send_data = EventMesh.publish("get_new_pid")+"*%s*0002*CR"%(self.imei) - MD5_SIGN = self.pack_MD5_head(send_data) - data = "[%s%s]"%(str(MD5_SIGN),send_data) - #EventMesh.debug_log("CR_ProtoCol:send:%s"%(data)) - # 通过socket发送到服务器端 - EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) - - def recv(self, event, msg): - """ - - @param event: PING - @param msg: 接收到的下行数据 - """ - EventMesh.publish(constants.PROTOCOL.CR_SEND) - EventMesh.publish(constants.EVENT.START_LOCATION,constants.PROTOCOL.UD_SEND) #开始ud定位 - #EventMesh.debug_log("CR_ProtoCol:recv:%s"%(msg)) - -class AL_ProtoCol(ProtoCol): - """报警数据上报""" - TYPE = "AL" - timer_repetition_send = None - repetition_queue = None - - def send(self, event, msg): - if EventMesh.platform != "gewu": - if self.timer_repetition_send == None: - self.timer_repetition_send = osTimer() - if self.repetition_queue == None: - self.repetition_queue = Queue(100) - - - send_data ="AL,"+msg - send_len = len(send_data) - #wt_data = "%s"%(send_data) - send_data = EventMesh.publish("get_new_pid")+"*%s*%04X*%s"%(self.imei,send_len,send_data) - MD5_head_data = EventMesh.publish("get_new_pid")+"*%s*%04X*%s"%(self.imei,send_len,"AL") - - MD5_SIGN = self.pack_MD5_head(MD5_head_data) - data = "[%s%s]"%(str(MD5_SIGN),send_data) - # EventMesh.debug_log("AL_ProtoCol:send:{}".format(data)) - # 通过socket发送到服务器端 - EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) - if EventMesh.platform != "gewu": - self.repetition_queue.put(data)#发送入队 - self.timer_repetition_send.start(10000, 1, self.repetition_timer_cb) - EventMesh.publish("set_dev_state",0) - def recv(self, event, msg): - """ - - @param event: PING - @param msg: 接收到的下行数据 - """ - #EventMesh.publish(constants.PROTOCOL.CR_SEND) - #EventMesh.publish(constants.EVENT.START_LOCATION,constants.PROTOCOL.UD_SEND) #开始ud定位 - # print("报警数据上报:recv:%s"%(msg)) - EventMesh.debug_log("报警数据上报:recv:{}".format(msg)) - # - if EventMesh.platform != "gewu": - if self.repetition_queue.empty() == False: - self.repetition_queue.get()#出队 - else: - self.timer_repetition_send.stop() - - def repetition_timer_cb(self, *args, **kwargs):#每隔10秒发送一次 - if self.repetition_queue.empty() == False: - data = self.repetition_queue.get()#出队 - self.repetition_queue.put(data)#发送入队 - EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) - else: - self.timer_repetition_send.stop() - -class FIND_ProtoCol(ProtoCol): - """查找设备""" - TYPE = "FIND" - - def send(self, event, msg): - #[SZKWT*YYYYYYYYYYYYYYY*LEN*PING] - send_data = EventMesh.publish("get_new_pid")+"*%s*0004*FIND"%(self.imei) - MD5_SIGN = self.pack_MD5_head(send_data) - data = "[%s%s]"%(str(MD5_SIGN),send_data) - #EventMesh.debug_log("FIND_ProtoCol:send:%s"%(data)) - # 通过socket发送到服务器端 - EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) - - def recv(self, event, msg): - """ - - @param event: FIND,播放铃声 - @param msg: 接收到的下行数据 - """ - EventMesh.publish(constants.PROTOCOL.FIND_SEND) - # a = audio.Audio(0) - # a.set_pa(Pin.GPIO29) - # a.setVolume(10) - # a.play(1, 1, 'E:/audio_find_haixiu.mp3') #文件名前面要加上路径 - - # EventMesh.publish("load_screen", {"screen": "FIND"}) - EventMesh.publish("OPEN_FIND_WATCH")# - #EventMesh.debug_log("FIND_ProtoCol:recv:%s"%(msg)) - -class POWEROFF_ProtoCol(ProtoCol): - """关机""" - TYPE = "POWEROFF" - - def send(self, event, msg): - # [SZKW*867387060319491*0008*POWEROFF] - send_data = EventMesh.publish("get_new_pid")+"*%s*0008*POWEROFF"%(self.imei) - MD5_SIGN = self.pack_MD5_head(send_data) - data = "[%s%s]"%(str(MD5_SIGN),send_data) - #EventMesh.debug_log("POWEROFF_ProtoCol:send:%s"%(data)) - # 通过socket发送到服务器端 - EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) - - def recv(self, event, msg): - """ - - @param event: POWEROFF关机 - @param msg: 接收到的下行数据 - """ - EventMesh.publish(constants.PROTOCOL.POWEROFF_SEND) - #EventMesh.debug_log("POWEROFF_ProtoCol:recv:%s"%(msg)) - battery = EventMesh.publish("screen_get_battery") - if battery != None: - if battery[0] != "1": - EventMesh.publish("open_power_on", 2)# #远程关机 - -class PHL_ProtoCol(ProtoCol): - """电话本同步""" - TYPE = "PHL" - - - def send(self, event, msg): - # [SZKW*867387060319491*0008*PHL] - send_data = EventMesh.publish("get_new_pid")+"*%s*0003*PHL"%(self.imei) - MD5_SIGN = self.pack_MD5_head(send_data) - data = "[%s%s]"%(str(MD5_SIGN),send_data) - #EventMesh.debug_log("POWEROFF_ProtoCol:send:%s"%(data)) - # 通过socket发送到服务器端 - EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) - - def recv(self, event, msg): - """ - - @param event: 电话本同步 - @param msg: 接收到的下行数据 - """ - msg = msg[1:-1] - # EventMesh.debug_log("phonebook:msg:%s\r\n"%msg) - msg_tmp = msg.decode('ascii') - msg_tmp = msg_tmp.split(',') - # EventMesh.debug_log("phonebook:len:{}\r\n data:{}".format(len(msg_tmp),msg_tmp)) - - phonebook = {} - msg_tmp = msg_tmp[1:] - - j = 0 - i = 0 - phonebook_oldtmp = {} - # 0 1 2 3 - for phonebook_tmp in msg_tmp: - j+=1 - # EventMesh.debug_log("phonebook_tmp:{} len:{}".format(phonebook_tmp,len(phonebook_tmp))) - - if (j%2) == 0: - i+=1 - if len(phonebook_tmp) != 0: - phonebook_name = UnicodeHexStr_To_Utf8Str(phonebook_tmp) - phonebook_name = "{}:{}".format("%03d"%i,phonebook_name) - phonebook[phonebook_name] = phonebook_oldtmp - - phonebook_oldtmp = phonebook_tmp - # EventMesh.debug_log("phonebook_oldtmp!!!:{}".format(str(phonebook_oldtmp))) - # EventMesh.debug_log("phonebook!!!:{}".format(str(phonebook))) - with open("/usr/static/storage_file/phonebook.json","w",encoding="utf-8") as fd: - ujson.dump(phonebook,fd) - EventMesh.debug_log("创建电话簿") - - EventMesh.publish(constants.PROTOCOL.PHL_SEND) - EventMesh.publish("set_phonebook_list",[1,phonebook]) - EventMesh.publish("contact_updata_list_show") - - -class WT_ProtoCol(ProtoCol): - """天气数据""" - TYPE = "WT" - WT_T = 0 - - def send(self, event, msg): - # [SZKW*867387060319491*0008*WT] - # if self.WT_T != 0: - # tmp_WT = - if(msg != ""): - msg_tmp = "WT," + msg - data_len = len(msg_tmp) - MD5_head_data = EventMesh.publish("get_new_pid")+"*%s*%04X*WT"%(self.imei,data_len) - MD5_SIGN = self.pack_MD5_head(MD5_head_data) - send_data = EventMesh.publish("get_new_pid")+"*%s*%04X*%s"%(self.imei,data_len,msg_tmp) - data = "[%s%s]"%(str(MD5_SIGN),send_data) - EventMesh.debug_log("WT_ProtoCol:send:%s"%(data)) - # 通过socket发送到服务器端 - EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) - - def recv(self, event, msg): - """ - - @param event: T天气温度数据下发 - @param msg: 接收到的下行数据 - """ - # b'SZKW*860132060004322*0035*WT,23-04-06,14:41:06,b6e0d4c6,1,27,-1,40,6DF157335E02' - msg = msg[1:-1] - msg_tmp = msg.decode('ascii') - msg_tmp = msg_tmp.split('WT,') - # EventMesh.debug_log("phonebook:len:{}\r\n data:{}".format(len(msg_tmp),msg_tmp)) - msg_tmp = str(msg_tmp[1]) - - # EventMesh.debug_log("msg_tmp :%s"%(msg_tmp)) - - msg_date = msg_tmp.split(',')[0] - - msg_time = msg_tmp.split(',')[1] - msg_weather_content = msg_tmp.split(',')[2] - msg_type = msg_tmp.split(',')[3] - msg_temp = msg_tmp.split(',')[4] - msg_min_temp = msg_tmp.split(',')[5] - msg_max_temp = msg_tmp.split(',')[6] - msg_city = msg_tmp.split(',')[7] - - msg_city = UnicodeHexStr_To_Utf8Str(msg_city) - msg_weather_content = UnicodeHexStr_To_Utf8Str(msg_weather_content) - # EventMesh.debug_log("msg_date:{} msg_time:{} msg_weather_content:{} msg_type:{} msg_temp:{} msg_min_temp:{} msg_max_temp:{} msg_city:{}".format(msg_date,msg_time,\ - # msg_weather_content,msg_type,msg_temp,msg_min_temp,msg_max_temp,msg_city)) - EventMesh.debug_log("WT_ProtoCol RECV msg:%s"%(msg)) - - EventMesh.publish("set_weather_data",[msg_date,msg_time,msg_weather_content,msg_type,msg_temp,msg_min_temp,msg_max_temp,msg_city,1]) - EventMesh.publish("updata_weather_show") -class REMIND_ProtoCol(ProtoCol):#普通闹钟 - """ - - 平台发送: - [XT*YYYYYYYYYYYYYYY*LEN*REMIND,,时间1-开关,时间2-开关,周几] - 实例:[XT*334588000000156*0008*REMIND,,时间1-开关,时间2-开关,周几] - 终端回复: - [XT*YYYYYYYYYYYYYYY*LEN*REMIND] - """ - TYPE = "REMIND" - - def send(self, event, msg): - send_data = EventMesh.publish("get_new_pid")+"*%s*0006*REMIND"%(self.imei) - MD5_SIGN = self.pack_MD5_head(send_data) - data = "[%s%s]"%(str(MD5_SIGN),send_data) - #Wechat_log("POWEROFF_ProtoCol:send:%s"%(data)) - # 通过socket发送到服务器端 - EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) - - def recv(self, event, msg): - # SZKW*860132060346475*0013*REMIND_CH_MEDICINE2,4-1 - msg = msg[1:-1] - msg_tmp = msg.decode('ascii') - msg_tmp_new = str(msg_tmp.split('REMIND,')[1]) - msg_tmp_data = str(msg_tmp.split('REMIND')[1]) - count = 0 - for i in str(msg_tmp_data): - # print("i",i) - if i == ",": - count+=1 - - normal_alarm_save = [] - # # ("handler -> b'[SZKW*860132060346475*001C*REMIND,08:00-1-1,,]'",) - # b'[SZKW*860132060346475*001B*REMIND,08:00-1-1,,]'",) - # medicine_alarmday = str(msg_data[4]) - # alarmday=[] - alarm_day = [] - alarm_switch = 0 - - print("count",count,msg_tmp_new) - if count >= 3: - count = 3 - for i in range(0,count):#默认是三个时间多了也不保存 - alarm_day = [] - alarm_data = str(msg_tmp_new.split(',')[i]) - # print("i",i,sleep_data) - if len(alarm_data) != 0: - b = alarm_data.find('-') - if b != -1: - alarm_time = alarm_data.split('-')[0]#-作为分隔符 - alarm_switch = int(alarm_data.split('-')[1])#开关 - alarm_repeat = int(alarm_data.split('-')[2])#是单次还是每天 还是自定义 - - alarm_hour = int(alarm_time.split(":")[0])#时间 - alarm_min = int(alarm_time.split(":")[1])#冒号分隔时间 时 分 - - - if alarm_repeat == 2:#每一天 - alarm_day = [0,1,2,3,4,5,6] - elif alarm_repeat == 3:#自定义 - alarm_day_tmp = alarm_data.split('-')[3]#-作为分隔符 - if len(str(alarm_day_tmp)) != 0: - for i in range(0,7): - if alarm_day_tmp[i] != '0': - alarm_day.append(i) - else:#单次 1 - alarm_day=[] - if alarm_switch != 0: - normal_alarm_save.append({"hour":alarm_hour,"min":alarm_min,"day":alarm_day,"enable":alarm_switch}) - - EventMesh.publish("set_storage_config",["normal_alarm",normal_alarm_save]) - # normal_alarm = EventMesh.publish("get_storage_config","normal_alarm") - - # EventMesh.debug_log("recv REMIND_SEND:{} normal_alarm ;{}".format(msg,normal_alarm)) - - EventMesh.publish(constants.PROTOCOL.REMIND_SEND) - EventMesh.publish("clear_normal_alarm") - -class HRSTART_ProtoCol(ProtoCol): - """心率频率数据""" - TYPE = "hrtstart" - - - def send(self, event, msg): - # [SZKW*867387060319491*0008*hrtstart] - send_data = EventMesh.publish("get_new_pid")+"*%s*0008*hrtstart"%(self.imei) - MD5_SIGN = self.pack_MD5_head(send_data) - data = "[%s%s]"%(str(MD5_SIGN),send_data) - # EventMesh.debug_log("HRSTART_ProtoCol:send:%s"%(data)) - # 通过socket发送到服务器端 - EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) - - def recv(self, event, msg): - """ - @param event: 心率数据下发 - @param msg: 接收到的下行数据 - """ - # b'SZKW*860132060004322*0035*REMIND,23-04-06,14:41:06,b6e0d4c6,1,27,-1,40,6DF157335E02' - # EventMesh.debug_log("REMIND_ProtoCol RECV msg:%s"%(msg)) - # HRSTART_ProtoCol RECV msg:b'SZKW*860132060004322*000D*hrtstart,7200' msg_:7200 - msg = msg[1:-1] - msg_tmp = msg.decode('ascii') - msg_tmp = msg_tmp.split(',') - msg_tmp = msg_tmp[1] - EventMesh.debug_log("HRSTART_ProtoCol RECV msg:{} msg_:{}".format(msg,msg_tmp)) - hrTotal = int(msg_tmp) - if hrTotal == 1:#单次测量 - EventMesh.debug_log("HRSTART_ 2".format(hrTotal)) - get_hr_state = EventMesh.publish("get_hr_state") - get_spo2_state = EventMesh.publish("get_spo2_state") - get_bp_state = EventMesh.publish("get_bp_state") - get_bg_state = EventMesh.publish("get_bg_state") - # if (get_hr_state == 3 ) or (get_spo2_state == 0 and get_hr_state == 0):#只要两个不在测量 单次优先级最低 - if (get_spo2_state == 0 and get_hr_state == 0 and get_bg_state == 0 and get_bp_state == 0): - battery = EventMesh.publish("screen_get_battery") - if battery != None: - if battery[0] != "1": - EventMesh.publish("set_hr_state",3)#3代表单次测量 - pass - else: - if hrTotal > 0 and hrTotal <= 300: - hrTotal = 300 - elif hrTotal >= 65536: - hrTotal = 65536 - EventMesh.debug_log("HRSTART_ 3".format(hrTotal)) - on = 0 - if hrTotal != 0: - on = 1 - EventMesh.publish("set_time_hr",[on,hrTotal]) - - - EventMesh.publish(constants.PROTOCOL.HRTSTART_SEND) - -class HEART_ProtoCol(ProtoCol): - """心率数据""" - TYPE = "heart" - - - def send(self, event, msg): - # [SZKW*334588000000156*len*heart,x] - # EventMesh.debug_log("HEART:send:{}".format(msg)) - len_size = len(str(msg))+len("heart,") - send_data = EventMesh.publish("get_new_pid")+"*%s*%04X*heart"%(self.imei,len_size) - MD5_head_data = EventMesh.publish("get_new_pid")+"*%s*%04X*%s"%(self.imei,len_size,"heart") - MD5_SIGN = self.pack_MD5_head(MD5_head_data) - data = "[%s%s,%d]"%(str(MD5_SIGN),send_data,msg) - # EventMesh.debug_log("HEART_ProtoCol:data:%s"%(data)) - # 通过socket发送到服务器端 - EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) - - def recv(self, event, msg): - """ - @param event: 心率数据下发 - @param msg: 接收到的下行数据 - """ - # EventMesh.debug_log("HRSTART_ProtoCol RECV msg:") - #EventMesh.publish(constants.PROTOCOL.HEART_SEND) -class OXYGEN_ProtoCol(ProtoCol): - """上传血氧测试数据""" - TYPE = "oxygen" - def send(self, event, msg): - # [SZKW*334588000000156*len*heart,x] - # EventMesh.debug_log("oxstart:send:{}".format(msg)) - len_size = len(str(msg))+len("oxygen,") - send_data = EventMesh.publish("get_new_pid")+"*%s*%04X*oxygen"%(self.imei,len_size) - MD5_head_data = EventMesh.publish("get_new_pid")+"*%s*%04X*%s"%(self.imei,len_size,"oxygen") - MD5_SIGN = self.pack_MD5_head(MD5_head_data) - data = "[%s%s,%d]"%(str(MD5_SIGN),send_data,msg) - # EventMesh.debug_log("HEART_ProtoCol:data:%s"%(data)) - # 通过socket发送到服务器端 - EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) - - def recv(self, event, msg): - """ - @param event: 心率数据下发 - @param msg: 接收到的下行数据 - """ - # EventMesh.debug_log("HRSTART_ProtoCol RECV msg:") - #EventMesh.publish(constants.PROTOCOL.OXYGEN_SEND) - -class OXYGEN_One_ProtoCol(ProtoCol):#单次测量 - """上传单次测量测试数据""" - TYPE = "oxstart" - -# 终端发送[XT*YYYYYYYYYYYYYYY*LEN*oxygen,x] -# x 表示血氧饱和度 -# 示例[XT*334588000000156*0009*oxygen,15] -# 平台回复:handler -> b'[SZKW*860132060004322*0009*oxstart,1]' -# [XT*334588000000156*0006*oxygen] - def send(self, event, msg): - # [SZKW*334588000000156*len*heart,x] - EventMesh.debug_log("oxstart:") - send_data = EventMesh.publish("get_new_pid")+"*%s*0007*oxstart"%(self.imei) - MD5_SIGN = self.pack_MD5_head(send_data) - data = "[%s%s]"%(str(MD5_SIGN),send_data) - # EventMesh.debug_log("HEART_ProtoCol:data:%s"%(data)) - # 通过socket发送到服务器端 - EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) - - def recv(self, event, msg): - """ - @param event: 血氧单次测量下发 - @param msg: 接收到的下行数据 - """ - EventMesh.debug_log("oxstart:{}".format(msg)) - msg = msg[1:-1] - msg_tmp = msg.decode('ascii') - msg_tmp = msg_tmp.split(',') - msg_tmp = msg_tmp[1] - - oxstartTotal = int(msg_tmp) - # oxstartTotal = 300 - print("oxstartTotal:{}".format(oxstartTotal)) - if oxstartTotal == 1:#单次测量 - get_bp_state = EventMesh.publish("get_bp_state") - get_hr_state = EventMesh.publish("get_hr_state") - get_spo2_state = EventMesh.publish("get_spo2_state") - get_bg_state = EventMesh.publish("get_bp_state") - print("get_bp_state:{}".format(get_bp_state)) - if get_bp_state == 0 and get_hr_state == 0 and get_spo2_state == 0 and get_bg_state == 0:#只要两个不在测量 单次优先级最低 - battery = EventMesh.publish("screen_get_battery") - if battery != None: - if battery[0] != "1": - EventMesh.publish("set_spo2_state",3)#3代表单次测量 - else: - if oxstartTotal > 0 and oxstartTotal <= 300: - oxstartTotal = 300 - elif oxstartTotal >= 65536: - oxstartTotal = 65536 - - # if oxstartTotal == 0:#关闭自动测量 - # EventMesh.debug_log("bpSTART_ 1") - # EventMesh.publish("set_spo2_time",[0,0]) - # else: - on = 0 - if oxstartTotal != 0: - on = 1 - EventMesh.publish("set_spo2_time",[on,oxstartTotal]) - - EventMesh.publish(constants.PROTOCOL.OXSTART_SEND) - -class TEMP_ProtoCol(ProtoCol): - """上传体温测试数据""" - TYPE = "temp" - def send(self, event, msg): - # [SZKW*334588000000156*len*heart,x] - # EventMesh.debug_log("temp:send:{}".format(msg)) - len_size = len(str(msg[0]))+len("temp,")+1+len(str(msg[1])) - EventMesh.debug_log("temp:send:{} len:{}".format(msg,len_size)) - # 实例:[XT*334588000000156*0009*temp,36.2] - # 代表终端的温度为:36.2 - # 平台回复: - # [XT*334588000000156*0004*temp] - send_data = EventMesh.publish("get_new_pid")+"*%s*%04X*temp"%(self.imei,len_size) - MD5_head_data = EventMesh.publish("get_new_pid")+"*%s*%04X*%s"%(self.imei,len_size,"temp") - MD5_SIGN = self.pack_MD5_head(MD5_head_data) - data = "[%s%s,%d.%d]"%(str(MD5_SIGN),send_data,msg[0],msg[1]) - # EventMesh.debug_log("temp:data:%s"%(data)) - # 通过socket发送到服务器端 - EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) - - def recv(self, event, msg): - """ - @param event: - @param msg: 接收到的下行数据 - """ - # EventMesh.debug_log("HRSTART_ProtoCol RECV msg:") - #EventMesh.publish(constants.PROTOCOL.TEMP_SEND) - -class WDSTART_ProtoCol(ProtoCol): - """上传体温频率""" - TYPE = "wdstart" - def send(self, event, msg): - #[XT*334588000000156*len*wdstart,300] - send_data = EventMesh.publish("get_new_pid")+"*%s*0007*wdstart"%(self.imei) - MD5_SIGN = self.pack_MD5_head(send_data) - data = "[%s%s]"%(str(MD5_SIGN),send_data) - # EventMesh.debug_log("temp:data:%s"%(data)) - # 通过socket发送到服务器端 - EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) - - def recv(self, event, msg): - """ - @param event: 体温下发频率数据 - @param msg: 接收到的下行数据 - """ - # EventMesh.debug_log("WDSTART_ProtoCol RECV msg:") - EventMesh.debug_log("wdstart:{}".format(msg)) - msg = msg[1:-1] - msg_tmp = msg.decode('ascii') - msg_tmp = msg_tmp.split(',') - msg_tmp = msg_tmp[1] - - tempTotal = int(msg_tmp) - EventMesh.debug_log("tempTotal:{}".format(tempTotal)) - if tempTotal == 1:#单次测量 - get_temp_state = EventMesh.publish("get_temp_state") - EventMesh.debug_log("get_temp_state:{}".format(get_temp_state)) - if get_temp_state == 0:#只要两个不在测量 单次优先级最低 - battery = EventMesh.publish("screen_get_battery") - if battery != None: - if battery[0] != "1": - EventMesh.publish("set_temp_state",3)#3代表单次测量 - else: - if tempTotal > 0 and tempTotal <= 300: - tempTotal = 300 - elif tempTotal >= 65536: - tempTotal = 65536 - - EventMesh.publish("set_temp_time",tempTotal) - - - - EventMesh.publish(constants.PROTOCOL.WDSTART_SEND) -#解绑 -# 设置血压上传频率 -# 平台发送[XT*YYYYYYYYYYYYYYY*LEN*bldstart,x] -# x为上传间隔时间,单位秒,连续上传时最小时间不小于300秒,最大不超过65535. -# 示例[XT*334588000000156*0008*bldstart,300] -# 终端回复: -# [XT*334588000000156*0005*bldstart] -# x为1则代表终端单次上传。 -# x为0则代表终端上传关闭。 -class bldstart_ProtoCol(ProtoCol): - """app下发血压测试频率""" - TYPE = "bldstart" - def send(self, event, msg): - #[XT*334588000000156*len*wdstart,300] - send_data = EventMesh.publish("get_new_pid")+"*%s*0008*bldstart"%(self.imei) - MD5_SIGN = self.pack_MD5_head(send_data) - data = "[%s%s]"%(str(MD5_SIGN),send_data) - # print("temp:data:%s"%(data)) - # 通过socket发送到服务器端 - EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) - - def recv(self, event, msg): - """ - @param event: 体温下发频率数据 - @param msg: 接收到的下行数据 - """ - # print("WDSTART_ProtoCol RECV msg:") - print("bldstart:{}".format(msg)) - msg = msg[1:-1] - msg_tmp = msg.decode('ascii') - msg_tmp = msg_tmp.split(',') - msg_tmp = msg_tmp[1] - - bldstartTotal = int(msg_tmp) - # bldstartTotal = 300 - print("bldstartTotal:{}".format(bldstartTotal)) - if bldstartTotal == 1:#单次测量 - get_bp_state = EventMesh.publish("get_bp_state") - get_hr_state = EventMesh.publish("get_hr_state") - get_spo2_state = EventMesh.publish("get_spo2_state") - get_bg_state = EventMesh.publish("get_bg_state") - print("get_bp_state:{}".format(get_bp_state)) - if get_bp_state == 0 and get_hr_state == 0 and get_spo2_state == 0 and get_bg_state == 0:#只要两个不在测量 单次优先级最低 - battery = EventMesh.publish("screen_get_battery") - if battery != None: - if battery[0] != "1": - EventMesh.publish("set_bp_state",3)#3代表单次测量 - else: - if bldstartTotal > 0 and bldstartTotal <= 300: - bldstartTotal = 300 - elif bldstartTotal >= 65536: - bldstartTotal = 65536 - - on = 0 - if bldstartTotal != 0:#关闭自动测量 - on = 1 - print("on:{} bldstartTotal:{} ".format(on,bldstartTotal)) - EventMesh.publish("set_bp_time",[on,bldstartTotal]) - - EventMesh.publish(constants.PROTOCOL.BLDSTART_SEND) - - -# 注:回复完后开始测量血压并上传(一般测一次90秒,app端会提醒用户两分钟后刷新页面查看) -# 上传血压数据 -# 终端发送[XT*YYYYYYYYYYYYYYY*LEN*blood,x,y] -# x 是收缩压(高压) -# y 是舒张压(低压) -# 示例[XT*334588000000156*000C*blood,150,70] -# 平台回复: -# [XT*334588000000156*0005*blood] -class blood_ProtoCol(ProtoCol): - """上传血压测试数据""" - TYPE = "blood" - def send(self, event, msg): - len_size = len(str(msg[0]))+len("blood,")+1+len(str(msg[1])) - print("blood:send:{} len:{}".format(msg,len_size)) - # 实例:[XT*334588000000156*0009*blood,36,2] - # 代表终端的 - # 平台回复: - # [XT*334588000000156*0004*blood] - send_data = EventMesh.publish("get_new_pid")+"*%s*%04X*blood"%(self.imei,len_size) - MD5_head_data = EventMesh.publish("get_new_pid")+"*%s*%04X*%s"%(self.imei,len_size,"blood") - MD5_SIGN = self.pack_MD5_head(MD5_head_data) - data = "[%s%s,%d,%d]"%(str(MD5_SIGN),send_data,msg[0],msg[1]) - print("blood:data:%s"%(data)) - # 通过socket发送到服务器端 - EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) - - def recv(self, event, msg): - """ - @param event: - @param msg: 接收到的下行数据 - """ - # print("HRSTART_ProtoCol RECV msg:") - #EventMesh.publish(constants.PROTOCOL.TEMP_SEND) - - - - -# 设置血糖上传频率 -# 平台发送: -# [XT*334588000000156*len*bgstart,x] -# x为上传间隔时间,单位秒,连续上传时最小时间不小于300秒,最大不超过65535. -# 实例:[XT*334588000000156*len*bgstart,300] -# 终端会每隔300秒检测一次 - -# x为1则代表终端单次上传。 -# x为0则代表终端上传关闭。 -class bgstart_ProtoCol(ProtoCol): - """app下发血糖测试频率""" - TYPE = "bgstart" - def send(self, event, msg): - #[XT*334588000000156*len*wdstart,300] - send_data = EventMesh.publish("get_new_pid")+"*%s*0007*bgstart"%(self.imei) - MD5_SIGN = self.pack_MD5_head(send_data) - data = "[%s%s]"%(str(MD5_SIGN),send_data) - # print("temp:data:%s"%(data)) - # 通过socket发送到服务器端 - EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) - - def recv(self, event, msg): - """ - @param event: 体温下发频率数据 - @param msg: 接收到的下行数据 - """ - # print("WDSTART_ProtoCol RECV msg:") - print("bgstart:{}".format(msg)) - msg = msg[1:-1] - msg_tmp = msg.decode('ascii') - msg_tmp = msg_tmp.split(',') - msg_tmp = msg_tmp[1] - - bgstartTotal = int(msg_tmp) - print("bgstartTotal:{}".format(bgstartTotal)) - if bgstartTotal == 1:#单次测量 - get_bp_state = EventMesh.publish("get_bp_state") - get_hr_state = EventMesh.publish("get_hr_state") - get_spo2_state = EventMesh.publish("get_spo2_state") - get_bg_state = EventMesh.publish("get_bg_state") - print("get_bg_state:{}".format(get_bg_state)) - if get_bp_state == 0 and get_hr_state == 0 and get_spo2_state == 0 and get_bg_state == 0:#只要两个不在测量 单次优先级最低 - battery = EventMesh.publish("screen_get_battery") - if battery != None: - if battery[0] != "1": - EventMesh.publish("set_bg_state",3)#3代表单次测量 - else: - if bgstartTotal > 0 and bgstartTotal <= 300: - bgstartTotal = 300 - elif bgstartTotal >= 65536: - bgstartTotal = 65536 - - # if bgstartTotal == 0:#关闭自动测量 - # EventMesh.debug_log("bgSTART_ 1") - # EventMesh.publish("set_bgauto_time",[0,0]) - # else: - on = 0 - if bgstartTotal != 0: - on = 1 - EventMesh.publish("set_bgauto_time",[on,bgstartTotal]) - - EventMesh.publish(constants.PROTOCOL.BGSTART_SEND) - -# 上传血糖数据 -# 终端发送[XT*YYYYYYYYYYYYYYY*LEN*bloodglucose,x] -# x 表示血糖,单位mmol/L -# 示例[XT*334588000000156*0010*bloodglucose,6.1] -# 平台回复: -# [XT*334588000000156*000B*bloodglucose] -class bloodglucose_ProtoCol(ProtoCol): - """上传血糖测试数据""" - TYPE = "bloodglucose" - def send(self, event, msg): - len_size = len("bloodglucose,")+1+len(str(msg)) - print("bloodglucose:send:{} len:{}".format(msg,len_size)) - # 实例:[XT*334588000000156*0009*blood,36,2] - # 代表终端的 - # 平台回复: - # [XT*334588000000156*0004*blood] - send_data = EventMesh.publish("get_new_pid")+"*%s*%04X*bloodglucose"%(self.imei,len_size) - MD5_head_data = EventMesh.publish("get_new_pid")+"*%s*%04X*%s"%(self.imei,len_size,"bloodglucose") - MD5_SIGN = self.pack_MD5_head(MD5_head_data) - data = "[%s%s,%s]"%(str(MD5_SIGN),send_data,msg) - print("bloodglucose:data:%s"%(data)) - # 通过socket发送到服务器端 - EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) - - def recv(self, event, msg): - """ - @param event: - @param msg: 接收到的下行数据 - """ - # print("HRSTART_ProtoCol RECV msg:") - #EventMesh.publish(constants.PROTOCOL.TEMP_SEND) - -# [XT*334588000000156*0003*DLT] -def reset_factory(msg): - if msg == 1: - Power.powerRestart() -class DLT_ProtoCol(ProtoCol): - """解绑数据""" - TYPE = "DLT" - def send(self, event, msg): - # [XT*334588000000156*0004*temp] - send_data = EventMesh.publish("get_new_pid")+"*%s*0003*DLT"%(self.imei) - MD5_SIGN = self.pack_MD5_head(send_data) - data = "[%s%s]"%(str(MD5_SIGN),send_data) - EventMesh.debug_log("temp:data:%s"%(data)) - # 通过socket发送到服务器端 - EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) - - def recv(self, event, msg): - """ - @param event: - @param msg: 接收到的下行数据 - """ - # EventMesh.debug_log("DLT_ProtoCol RECV msg:") - - -#定位频率 -class UPLOAD_ProtoCol(ProtoCol): - """定位频率数据""" - TYPE = "UPLOAD" - def send(self, event, msg): - # [XT*334588000000156*0004*temp] - send_data = EventMesh.publish("get_new_pid")+"*%s*0006*UPLOAD"%(self.imei) - MD5_SIGN = self.pack_MD5_head(send_data) - data = "[%s%s]"%(str(MD5_SIGN),send_data) - - # 通过socket发送到服务器端 - EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) - - def recv(self, event, msg): - """ - @param event: - @param msg: 接收到的下行数据 - """ - # b'[SZKW*867387060319166*000A*UPLOAD,600]' - # EventMesh.debug_log("DLT_ProtoCol RECV msg:".format(msg)) - msg = msg[1:-1] - msg_tmp = msg.decode('ascii') - msg_tmp = msg_tmp.split(',') - msg_tmp = msg_tmp[1] - upload_time = int(msg_tmp) - EventMesh.publish("set_storage_config",["upload_time",upload_time]) - - EventMesh.publish("set_upload_data", upload_time) - EventMesh.publish(constants.PROTOCOL.UPLOAD_SEND) - -#设置快捷号码 -class CENTER_ProtoCol(ProtoCol): - """设置快捷号码""" - TYPE = "CENTER" - def send(self, event, msg): - # [XT*334588000000156*0004*temp] - send_data = EventMesh.publish("get_new_pid")+"*%s*0006*CENTER"%(self.imei) - MD5_SIGN = self.pack_MD5_head(send_data) - data = "[%s%s]"%(str(MD5_SIGN),send_data) - EventMesh.debug_log("UPLOAD:data:%s"%(data)) - # 通过socket发送到服务器端 - EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) - - def recv(self, event, msg): - """ - @param event: - @param msg: 接收到的下行数据 - """ - # b'[SZKW*867387060319166*000A*UPLOAD,600]' - # EventMesh.debug_log("DLT_ProtoCol RECV msg:".format(msg)) - msg = msg[1:-1] - msg_tmp = msg.decode('ascii') - msg_tmp = msg_tmp.split(',') - msg_tmp = msg_tmp[1] - EventMesh.debug_log("CENTER_ProtoCol RECV msg:{} msg_:{}".format(msg,msg_tmp)) - center_dial = str(msg_tmp) - EventMesh.publish("set_storage_config",["center_dial",center_dial]) - EventMesh.publish(constants.PROTOCOL.CENTER_SEND) - -#呼叫快捷电话号码 -import voiceCall -class MONITOR_ProtoCol(ProtoCol): - """呼叫快捷号码""" - TYPE = "MONITOR" - def send(self, event, msg): - # [XT*334588000000156*0004*MONITOR] - send_data = EventMesh.publish("get_new_pid")+"*%s*0007*MONITOR"%(self.imei) - MD5_SIGN = self.pack_MD5_head(send_data) - data = "[%s%s]"%(str(MD5_SIGN),send_data) - EventMesh.debug_log("MONITOR:data:%s"%(data)) - # 通过socket发送到服务器端 - EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) - - def recv(self, event, msg): - """ - @param event: - @param msg: 接收到的下行数据 - """ - # b'[SZKW*867387060319166*000A*MONITOR]' - msg = msg[1:-1] - msg_tmp = msg.decode('ascii') - msg_tmp = msg_tmp.split('MONITOR') - msg_tmp = msg_tmp[1] - EventMesh.debug_log("MONITOR_ProtoCol RECV msg:{} msg_:{}".format(msg,len(msg_tmp))) - if len(msg_tmp) != 0: - EventMesh.publish("save_phonename", contact) - EventMesh.publish("save_phonenum", contact) - EventMesh.publish("dial_out_call_center_cb",contact)#电话拨出去 - else: - read_data = EventMesh.publish("get_storage_config","center_dial") - EventMesh.debug_log("MONITOR:data:%s"%(read_data)) - if read_data != None: - contact = read_data - if len(contact) > 0: - EventMesh.debug_log("MONITOR RECV msg:{} {}".format(contact,type(contact))) - EventMesh.publish("save_phonename", contact) - EventMesh.publish("save_phonenum", contact) - EventMesh.publish("dial_out_call_center_cb",contact)#电话拨出去 - EventMesh.publish(constants.PROTOCOL.MONITOR_SEND) - -#定时开关机 -class bootoff_ProtoCol(ProtoCol): - """定时开关机""" - TYPE = "BOOTOFF" - def send(self, event, msg): - # [XT*334588000000156*0004*MONITOR] - send_data = EventMesh.publish("get_new_pid")+"*%s*0007*BOOTOFF"%(self.imei) - MD5_SIGN = self.pack_MD5_head(send_data) - data = "[%s%s]"%(str(MD5_SIGN),send_data) - EventMesh.debug_log("BOOTOFF:data:%s"%(data)) - # 通过socket发送到服务器端 - EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) - def recv(self, event, msg): - """ - @param event: - @param msg: 接收到的下行数据 - """ - # b'[SZKW*867387060319166*000A*SOS_SEND]' - msg = msg[1:-1] - msg_tmp = msg.decode('ascii') - msg_tmp = msg_tmp.split(',') - on_bt = int(msg_tmp[1]) - start_hour = int(str(msg_tmp[2]).split(":")[0]) - start_min = int(str(msg_tmp[2]).split(":")[1]) - - end_hour = int(str(msg_tmp[3]).split(":")[0]) - end_min = int(str(msg_tmp[3]).split(":")[1]) - - EventMesh.debug_log("BOOTOFF:send data:",on_bt,start_hour,start_min,end_hour,end_min) - poweroff = [] - poweroff.append({"poweroff_on":on_bt,"start_hour":start_hour,"start_min":start_min,"end_hour":end_hour,"end_min":end_min}) - #b'[SZKW*860132060006970*0015*BOOTOFF,1,06:00,23:59]' - EventMesh.publish("set_boot_off_time",poweroff)#设置关机时间 - - EventMesh.publish(constants.PROTOCOL.BOOTOFF_SEND) - - -#sos家庭号码 -class sosHome_dial_ProtoCol(ProtoCol): - """sos家庭号码""" - TYPE = "SOS" - def send(self, event, msg): - # [XT*334588000000156*0004*MONITOR] - send_data = EventMesh.publish("get_new_pid")+"*%s*0003*SOS"%(self.imei) - MD5_SIGN = self.pack_MD5_head(send_data) - data = "[%s%s]"%(str(MD5_SIGN),send_data) - print("sosHome_dial_ProtoCol:data:%s"%(data)) - # 通过socket发送到服务器端 - EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) - - def recv(self, event, msg): - """ - @param event: - @param msg: 接收到的下行数据 - """ - - # b'[SZKW*867387060319166*000A*SOS_SEND]' - msg = msg[1:-1] - msg_tmp = msg.decode('ascii') - msg_tmp = msg_tmp.split(',') - - # print("sosHome_dial_ProtoCol:send data :{} {}".format(len(msg_tmp),msg_tmp)) - #b'[SZKW*860132060006970*0015*sosHome_dial_ProtoCol,15521469561,10086,15521469561]' - i = 0 - num = 0 - count = 0 - print("sos msg_tmp",msg_tmp) - if len(msg_tmp) > 4: - num = 3 - else: - num = len(msg_tmp)-1 - data = [] - for i in range(num): - # print("sos:send data :{}".format(msg_tmp[i+1])) - if len(msg_tmp[i+1]) != 0: - EventMesh.publish("set_storage_config",["SOS_NUMBER{}".format(i+1),msg_tmp[i+1]]) - data.append(str(msg_tmp[i+1])) - count+=1 - print("data:{}".format(data)) - EventMesh.publish("set_dial_sos_number",data) - - EventMesh.publish(constants.PROTOCOL.SOS_SEND) - - -# 低电提醒 -#[XT*334588000000156*0008*LOWBAT,1] -class LOWBAT_ProtoCol(ProtoCol): - """低电提醒""" - TYPE = "LOWBAT" - def send(self, event, msg): - # [XT*334588000000156*0006*LOWBAT] - send_data = EventMesh.publish("get_new_pid")+"*%s*0006*LOWBAT"%(self.imei) - MD5_SIGN = self.pack_MD5_head(send_data) - data = "[%s%s]"%(str(MD5_SIGN),send_data) - EventMesh.debug_log("LOWBAT:data:%s"%(data)) - # 通过socket发送到服务器端 - EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) - - def recv(self, event, msg): - """ - @param event: - @param msg: 接收到的下行数据 - """ - # b'[SZKW*867387060319166*000A*LOWBAT]' - - msg = msg[1:-1] - msg_tmp = msg.decode('ascii') - msg_tmp = msg_tmp.split(',') - on_bt = msg_tmp[1] - EventMesh.debug_log("LOWBAT:send data:{}".format(on_bt)) - #b'[SZKW*860132060006970*0015*LOWBAT,1,06:00,23:59]' - EventMesh.publish("set_low_bat_btn",on_bt) - EventMesh.publish(constants.PROTOCOL.LOWBAT_SEND) - -# 设置系统时间 -# -class Time_ProtoCol(ProtoCol): - """设置系统时间""" - TYPE = "Time" - def send(self, event, msg): - # - send_data = EventMesh.publish("get_new_pid")+"*%s*0004*Time"%(self.imei) - MD5_SIGN = self.pack_MD5_head(send_data) - data = "[%s%s]"%(str(MD5_SIGN),send_data) - EventMesh.debug_log("Time:data:%s"%(data)) - # 通过socket发送到服务器端 - EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) - - def recv(self, event, msg): - """ - @param event: - @param msg: 接收到的下行数据 - """ - # rtc = RTC() - msg = msg[1:-1] - msg_tmp = msg.decode('ascii') - msg_data = msg_tmp.split(',') - - timeSecond = int(msg_data[1]) - #EventMesh.debug_log("type {} timeSecond {}".format((msg_data[1]),timeSecond)) - # timeSecond = 1703001360 - next_alarm_time = utime.localtime(timeSecond) - #EventMesh.debug_log("next_alarm_time",next_alarm_time) - #EventMesh.debug_log("local time",msg) - # machine.RTC().datetime((tm[0], tm[1], tm[2], tm[6], tm[3], tm[4], tm[5], 0)) - - machine.RTC().datetime((next_alarm_time[0],next_alarm_time[1],next_alarm_time[2],next_alarm_time[6],next_alarm_time[3],next_alarm_time[4],next_alarm_time[5],0)) - #next_alarm_time = utime.localtime(old_Timesec)#年月日时分秒星期365中的第几天 - EventMesh.publish("set_rtc_alarm") - #EventMesh.publish(constants.PROTOCOL.TIME_SEND) - - - - -#免打扰 -class SILENCETIME2_ProtoCol(ProtoCol): - """免打扰""" - TYPE = "SILENCETIME2" - def send(self, event, msg): - # [XT*334588000000156*0006*SILENCETIME2] - send_data = EventMesh.publish("get_new_pid")+"*%s*000C*SILENCETIME2"%(self.imei) - MD5_SIGN = self.pack_MD5_head(send_data) - data = "[%s%s]"%(str(MD5_SIGN),send_data) - # EventMesh.debug_log("KEYBRD:data:%s"%(data)) - # EventMesh.debug_log("SILENCETIME2!!!!!!!!!!!!!",msg) - # 通过socket发送到服务器端 - EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) - - def recv(self, event, msg): - """ - @param event: - @param msg: 接收到的下行数据 - """ - # b'[SZKW*867387060319166*000A*KEYBRD]' - # EventMesh.debug_log("SILENCETIME2!!!!!!!!!!!!!",msg) - EventMesh.publish(constants.PROTOCOL.SILENCETIME2_SEND) - -#键盘开关 -class KEYBRD_ProtoCol(ProtoCol): - """免打扰""" - TYPE = "KEYBRD" - def send(self, event, msg): - # [XT*334588000000156*0006*SILENCETIME2] - send_data = EventMesh.publish("get_new_pid")+"*%s*0006*KEYBRD"%(self.imei) - MD5_SIGN = self.pack_MD5_head(send_data) - data = "[%s%s]"%(str(MD5_SIGN),send_data) - # EventMesh.debug_log("KEYBRD:data:%s"%(data)) - # EventMesh.debug_log("KEYBRD!!!!!!!!!!!!!",msg) - # 通过socket发送到服务器端 - EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) - - def recv(self, event, msg): - """ - @param event: - @param msg: 接收到的下行数据 - """ - # b'[SZKW*867387060319166*000A*KEYBRD]' - # EventMesh.debug_log("KEYBRD!!!!!!!!!!!!!",msg) - EventMesh.publish(constants.PROTOCOL.KEYBRD_SEND) - -class TK_ProtoCol(ProtoCol): - """微聊""" - TYPE = "TK" - - - def send(self, event, msg): - EventMesh.debug_log("TK send:") - if len(str(msg)) == 1: - - len_size = len(str(msg))+len("TK,") - # 实例:[XT*334588000000156*0009*TK,1] - send_data = EventMesh.publish("get_new_pid")+"*%s*%04X*TK"%(self.imei,len_size) - MD5_head_data = EventMesh.publish("get_new_pid")+"*%s*%04X*%s"%(self.imei,len_size,"TK") - MD5_SIGN = self.pack_MD5_head(MD5_head_data) - data = "[%s%s,%d]"%(str(MD5_SIGN),send_data,msg) - EventMesh.debug_log("TK:data:%s"%(data)) - # 通过socket发送到服务器端 - EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) - else: - # [SZKW*YYYYYYYYYYYYYYY*LEN*TK,AMR 格式音频数据] - #[XT*YYYYYYYYYYYYYYY*LEN*TKS,秒数(十进制),AMR 格式音频数据] - arm_data = msg - # arm_sec = msg[0] - # EventMesh.debug_log("TK_ProtoCol:msgtype:{} arm_sec:{}".format(len(msg[1]),arm_sec)) - - arm = bytearray() - for i in range(len(arm_data)): - if arm_data[i] == 0x7d: - arm.extend(b'\x7d\x01') - elif arm_data[i] == 0x5b : - arm.extend(b'\x7d\x02') - elif arm_data[i] == 0x5d : - arm.extend(b'\x7d\x03') - elif arm_data[i] == 0x2c : - arm.extend(b'\x7d\x04') - elif arm_data[i] == 0x2a : - arm.extend(b'\x7d\x05') - else : - arm.append(arm_data[i]) - - datalen = len(arm) + len("TK,")+1 - #Wechat_log("len(str(arm_sec)):{}".format(len(str(arm_sec))+1)) - send_data = bytearray(EventMesh.publish("get_new_pid")+"*%s*%04X*TK,"%(self.imei,datalen)) - send_data.extend(arm) - MD5_head_data = EventMesh.publish("get_new_pid")+"*%s*%04X*%s"%(self.imei,datalen,"TK") - MD5_SIGN = self.pack_MD5_head(MD5_head_data) - data = bytearray('[') - data.extend(MD5_SIGN) - data.extend(send_data) - data.extend(']') - # EventMesh.debug_log("TK:send data:%s MD5_head_data:%s"%(data,MD5_head_data)) - EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) - - - def recv(self, event, msg): - """ - - ("TK_ProtoCol:datalen:{} {} {}".format(wechat_num,MXA_MSG,wechat_recode_list)) - @param event: 微聊 - @param msg: 接收到的下行数据 - [SZKW*860132060004322*20BD*TK,#!AMR...] - """ - #Wechat_log("K_ProtoCol:recv:data:{}".format(msg)) - - msg_tmp = msg.decode('ascii') - str = msg_tmp.split('TK,') - # Wechat_log("TK_ProtoCol:recv:len:{} {} {}".format(len(msg),len(str),msg_tmp.find("#!AMR"))) - - read_AMR_flag = msg_tmp.find("#!AMR") - #EventMesh.debug_log("TK recv:read_AMR_flag:{} ,{}".format(read_AMR_flag,EventMesh.publish("get_wechat_record_flag"))) - # if EventMesh.publish("get_wechat_record_flag") != 1 and read_AMR_flag != -1: #是否是服务器下发音频数据 - if read_AMR_flag != -1: #是否是服务器下发音频数据 - # Wechat_log("TK_ProtoCol:recv:datalen{}".format(len(msg))) - arm_data = bytearray(str[1])#获取amr输出 - get_wechat_data = EventMesh.publish("get_wechat_data") - MXA_MSG = get_wechat_data[0] - wechat_recode_list = get_wechat_data[1] - wechat_num = int(wechat_recode_list["num"]) - # Wechat_log("TK_ProtoCol:datalen:{} {} {}".format(wechat_num,MXA_MSG,wechat_recode_list)) - - if wechat_num >= MXA_MSG: - wechat_num = 0 - if wechat_num == 0: - wechat_num += 1 - elif wechat_num > 0: - wechat_num += 1 - - - EventMesh.debug_log("num_total:datalen:{} {}".format(MXA_MSG,wechat_recode_list)) - wechat_recode_list["%02d"%(wechat_num)] = "read:1" - wechat_recode_list['num'] = wechat_num - EventMesh.publish("set_wechat_data",[MXA_MSG,wechat_recode_list]) - #写语音文件数据 - - # path = "/usr/static/storage_file/wechat.amr" - path = "/usr/static/storage_file/{}.amr".format(wechat_num) - with open(path,"w") as fd: - arm = bytearray() - j = 0 - for i in range(len(arm_data)): - if arm_data[j] == 0x7d and arm_data[j+1] == 0x01: - arm.extend(b'\x7d') - j+=1 - elif arm_data[j] == 0x7d and arm_data[j+1] == 0x02: - arm.extend(b'\x5b') - j+=1 - elif arm_data[j] == 0x7d and arm_data[j+1] == 0x03: - arm.extend(b'\x5d') - j+=1 - elif arm_data[j] == 0x7d and arm_data[j+1] == 0x04: - arm.extend(b'\x2c') - j+=1 - elif arm_data[j] == 0x7d and arm_data[j+1] == 0x05: - arm.extend(b'\x2a') - j+=1 - else : - arm.append(arm_data[j]) - j+=1 - if j >= len(arm_data): - break - fd.write(arm) - EventMesh.publish("recv_wechat_audio")# - EventMesh.publish(constants.PROTOCOL.TK_SEND,1) - EventMesh.debug_log("constants.PROTOCOL.TK_SEND1!!!") - else : - if read_AMR_flag != -1: - EventMesh.publish(constants.PROTOCOL.TK_SEND,0) - -class TKS_ProtoCol(ProtoCol): - """微聊""" - TYPE = "TKS" - - - def send(self, event, msg): - EventMesh.debug_log("TKS send:") - if len(str(msg)) == 1: - len_size = len(str(msg))+len("TKS,") - # 实例:[XT*334588000000156*0009*TK,1] - send_data = EventMesh.publish("get_new_pid")+"*%s*%04X*TKS"%(self.imei,len_size) - MD5_head_data = EventMesh.publish("get_new_pid")+"*%s*%04X*%s"%(self.imei,len_size,"TKS") - MD5_SIGN = self.pack_MD5_head(MD5_head_data) - data = "[%s%s,%d]"%(str(MD5_SIGN),send_data,msg) - EventMesh.debug_log("TKS:data:%s"%(data)) - # 通过socket发送到服务器端 - EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) - else: - # [SZKW*YYYYYYYYYYYYYYY*LEN*TK,AMR 格式音频数据] - #[XT*YYYYYYYYYYYYYYY*LEN*TKS,秒数(十进制),AMR 格式音频数据] - arm_data = msg[1] - arm_sec = msg[0] - EventMesh.debug_log("TK_ProtoCol:msgtype:{} arm_sec:{}".format(len(msg[1]),arm_sec)) - - arm = bytearray() - for i in range(len(arm_data)): - if arm_data[i] == 0x7d: - arm.extend(b'\x7d\x01') - elif arm_data[i] == 0x5b : - arm.extend(b'\x7d\x02') - elif arm_data[i] == 0x5d : - arm.extend(b'\x7d\x03') - elif arm_data[i] == 0x2c : - arm.extend(b'\x7d\x04') - elif arm_data[i] == 0x2a : - arm.extend(b'\x7d\x05') - else : - arm.append(arm_data[i]) - - datalen = len(arm) + len("TKS,")+len(str(arm_sec))+1 - #Wechat_log("len(str(arm_sec)):{}".format(len(str(arm_sec))+1)) - send_data = bytearray(EventMesh.publish("get_new_pid")+"*%s*%04X*TKS,%d,"%(self.imei,datalen,arm_sec)) - send_data.extend(arm) - MD5_head_data = EventMesh.publish("get_new_pid")+"*%s*%04X*%s"%(self.imei,datalen,"TKS") - MD5_SIGN = self.pack_MD5_head(MD5_head_data) - data = bytearray('[') - data.extend(MD5_SIGN) - data.extend(send_data) - data.extend(']') - # EventMesh.debug_log("TK:send data:%s MD5_head_data:%s"%(data,MD5_head_data)) - EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) - - - def recv(self, event, msg): - """ - - ("TK_ProtoCol:datalen:{} {} {}".format(wechat_num,MXA_MSG,wechat_recode_list)) - @param event: 微聊 - @param msg: 接收到的下行数据 - [SZKW*860132060004322*20BD*TK,#!AMR...] - """ - #Wechat_log("K_ProtoCol:recv:data:{}".format(msg)) - # EventMesh.debug_log("TK recv:{}".format(msg)) - msg_tmp = msg.decode('ascii') - str = msg_tmp.split('TKS,') - # Wechat_log("TK_ProtoCol:recv:len:{} {} {}".format(len(msg),len(str),msg_tmp.find("#!AMR"))) - read_AMR_flag = msg_tmp.find("#!AMR") - # if EventMesh.publish("get_wechat_record_flag") != 1 and read_AMR_flag != -1: #是否是服务器下发音频数据 - if read_AMR_flag != -1: #是否是服务器下发音频数据 - # Wechat_log("TK_ProtoCol:recv:datalen{}".format(len(msg))) - arm_data = bytearray(str[1])#获取amr输出 - get_wechat_data = EventMesh.publish("get_wechat_data") - MXA_MSG = get_wechat_data[0] - wechat_recode_list = get_wechat_data[1] - wechat_num = int(wechat_recode_list["num"]) - # Wechat_log("TK_ProtoCol:datalen:{} {} {}".format(wechat_num,MXA_MSG,wechat_recode_list)) - - if wechat_num >= MXA_MSG: - wechat_num = 0 - if wechat_num == 0: - wechat_num += 1 - elif wechat_num > 0: - wechat_num += 1 - - - EventMesh.debug_log("num_total:datalen:{} {}".format(MXA_MSG,wechat_recode_list)) - wechat_recode_list["%02d"%(wechat_num)] = "read:1" - wechat_recode_list['num'] = wechat_num - EventMesh.publish("set_wechat_data",[MXA_MSG,wechat_recode_list]) - #写语音文件数据 - - # path = "/usr/static/storage_file/wechat.amr" - path = "/usr/static/storage_file/{}.amr".format(wechat_num) - with open(path,"w") as fd: - arm = bytearray() - j = 0 - for i in range(len(arm_data)): - if arm_data[j] == 0x7d and arm_data[j+1] == 0x01: - arm.extend(b'\x7d') - j+=1 - elif arm_data[j] == 0x7d and arm_data[j+1] == 0x02: - arm.extend(b'\x5b') - j+=1 - elif arm_data[j] == 0x7d and arm_data[j+1] == 0x03: - arm.extend(b'\x5d') - j+=1 - elif arm_data[j] == 0x7d and arm_data[j+1] == 0x04: - arm.extend(b'\x2c') - j+=1 - elif arm_data[j] == 0x7d and arm_data[j+1] == 0x05: - arm.extend(b'\x2a') - j+=1 - else : - arm.append(arm_data[j]) - j+=1 - if j >= len(arm_data): - break - fd.write(arm) - EventMesh.publish("recv_wechat_audio")# - EventMesh.publish(constants.PROTOCOL.TKS_SEND,1)#返回接收成功 - else : - if read_AMR_flag != -1 : - EventMesh.publish(constants.PROTOCOL.TKS_SEND,0)#返回接收失败 - - - - - - - -class MESSAGE_ProtoCol(ProtoCol): - """微聊""" - TYPE = "MESSAGE" - - - def send(self, event, msg): - #[XT*334588000000156*0007*MESSAGE] - send_data = EventMesh.publish("get_new_pid")+"*%s*0007*MESSAGE"%(self.imei) - MD5_SIGN = self.pack_MD5_head(send_data) - data = "[%s%s]"%(str(MD5_SIGN),send_data) - #Wechat_log("POWEROFF_ProtoCol:send:%s"%(data)) - # 通过socket发送到服务器端 - EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) - - def recv(self, event, msg): - """ - - @param event: 微聊文字 - @param msg: 接收到的下行数据 - """ - # msg = msg[1:-1] - - # msg_s = msg.decode('ascii') - # msg_s = msg_s.split(',') - # msg_s = msg_s[1] - # # Wechat_log("msg_tmp:len:{}\r\n data:{}".format(len(msg_s),msg_s)) - - - # get_wechat_data = EventMesh.publish("get_wechat_data") - - # MXA_MSG = get_wechat_data[0] - # wechat_recode_list = get_wechat_data[1] - # wechat_num = wechat_recode_list["num"] - # # Wechat_log("TK_ProtoCol:datalen:{} {} {}".format(wechat_num,MXA_MSG,wechat_recode_list)) - - # if wechat_num >= MXA_MSG: - # wechat_num = 0 - # if wechat_num == 0: - # wechat_num += 1 - # elif wechat_num > 0: - # wechat_num += 1 - # msg_txt = {} - # # 0 1 2 3 - # Wechat_log("wechat_num:init {}".format(wechat_num)) - # msg_txt = UnicodeHexStr_To_Utf8Str(msg_s) - # # Wechat_log("msg_txt:{}".format(msg_txt)) - # wechat_recode_list["%02d"%(wechat_num)] = "T:{}".format(msg_txt) - # wechat_recode_list['num'] = wechat_num - # EventMesh.publish("set_wechat_data",[MXA_MSG,wechat_recode_list]) - # # Wechat_log("wechat_recode_list:len data:{}".format(wechat_recode_list)) - - # screen_NAME = EventMesh.publish("get_screen_NAME") - # get_lcd_state = EventMesh.publish("get_lcd_state") - # if screen_NAME != "wechat" or get_lcd_state == 0: - # EventMesh.publish("load_screen", {"screen": "wechat_popup"}) - # else: - # EventMesh.publish("wechat_updata_list_show") - EventMesh.publish(constants.PROTOCOL.MESSAGE_SEND) - # EventMesh.publish("recv_wechat_audio")# - -class FALLDOWN_ProtoCol(ProtoCol): - """ - 跌倒提醒开关 - 服务器下发跌倒报警设置命令 - [XT*334588000000156*LEN*FALLDOWN,ONOFF] - ONOFF: 1:开启,0:关闭。 - 终端回复 - [XT*334588000000156*LEN*FALLDOWN] - """ - TYPE = "FALLDOWN" - - def send(self, event, msg): - - #[XT*334588000000156*LEN*FALLDOWN] - send_data = EventMesh.publish("get_new_pid")+"*%s*0008*FALLDOWN"%(self.imei) - MD5_SIGN = self.pack_MD5_head(send_data) - data = "[%s%s]"%(str(MD5_SIGN),send_data) - #Wechat_log("POWEROFF_ProtoCol:send:%s"%(data)) - # 通过socket发送到服务器端 - EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) - - def recv(self, event, msg): - """ - [SZKW*860132060341484*000A*FALLDOWN,1] - """ - msg = msg[1:-1] - msg_tmp = msg.decode('ascii') - msg_data = msg_tmp.split(',') - - Falldowm = msg_data[1] - EventMesh.debug_log("FALLDOWN:{}".format(Falldowm)) - EventMesh.publish("set_storage_config",["fall_sw",Falldowm]) - - EventMesh.publish(constants.PROTOCOL.FALLDOWN_SEND) - -class REMOVE_ProtoCol(ProtoCol): - """ - 取下手环报警开关 - 平台发送: - [XT*YYYYYYYYYYYYYYY*LEN*REMOVE,0或者1] - 实例:[XT*334588000000156*0008*REMOVE,1] - 终端回复: - [XT*YYYYYYYYYYYYYYY*LEN*REMOVE] - """ - TYPE = "REMOVE" - - def send(self, event, msg): - send_data = EventMesh.publish("get_new_pid")+"*%s*0006*REMOVE"%(self.imei) - MD5_SIGN = self.pack_MD5_head(send_data) - data = "[%s%s]"%(str(MD5_SIGN),send_data) - #Wechat_log("POWEROFF_ProtoCol:send:%s"%(data)) - # 通过socket发送到服务器端 - EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) - - def recv(self, event, msg): - msg = msg[1:-1] - msg_tmp = msg.decode('ascii') - msg_data = msg_tmp.split(',') - Falldowm = msg_data[1] - EventMesh.debug_log("REMOVE:{}".format(Falldowm)) - EventMesh.publish("set_storage_config",["remove_sw",Falldowm]) - EventMesh.publish(constants.PROTOCOL.REMOVE_SEND) - -class HELP_ProtoCol(ProtoCol): - """ -一键报警 - [XT*YYYYYYYYYYYYYYY*LEN*HELP,状态] - 状态值为整数:60或不带默认是普通报警,61光电式感烟火灾报警,62检测环境温度(高温报警,温度变化报警), - 63人体活动检测报警,64电池欠压提醒功能,65设备脱落提醒功能,66离线报警,67测试报警,123气感报警, - 124烟感报警,125水浸报警 - 实例: - [XT*334588000000156*0004*HELP,60] - """ - TYPE = "HELP" - - def send(self, event, msg): - #[XT*334588000000156*LEN*FALLDOWN] - send_data = EventMesh.publish("get_new_pid")+"*%s*0008*HELP,%d"%(self.imei,msg) - MD5_SIGN = self.pack_MD5_head(send_data) - data = "[%s%s]"%(str(MD5_SIGN),send_data) - #Wechat_log("POWEROFF_ProtoCol:send:%s"%(data)) - # 通过socket发送到服务器端 - EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) - - def recv(self, event, msg): - """ - [XT*334588000000156*0004*HELP,60] - """ - - pass - - -#喝水闹钟提示 -# 喝水闹钟设置指令 -# 平台发送: -# [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_DRINK,时间间隔(小时),开关(0为关,1为开)] -# 实例: -# [XT*334588000000156*0026*REMIND_CH_DRINK,4,0] -# 终端回复: -# [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_DRINK] -# 实例:[XT*334588000000156*000E*REMIND_CH_DRINK] -class REMIND_CHDRINK_ProtoCol(ProtoCol): - """ - - 平台发送: - [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_DRINK,时间间隔(小时),开关(0为关,1为开)] - 实例:[XT*334588000000156*0008*REMIND_CH_DRINK,时间间隔(小时),开关(0为关,1为开)] - 终端回复: - [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_DRINK] - """ - TYPE = "REMIND_CH_DRINK" - - def send(self, event, msg): - send_data = EventMesh.publish("get_new_pid")+"*%s*000F*REMIND_CH_DRINK"%(self.imei) - MD5_SIGN = self.pack_MD5_head(send_data) - data = "[%s%s]"%(str(MD5_SIGN),send_data) - #Wechat_log("POWEROFF_ProtoCol:send:%s"%(data)) - # 通过socket发送到服务器端 - EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) - - def recv(self, event, msg): - # SZKW*860132060346475*0013*REMIND_CH_DRINK,4-1 - msg = msg[1:-1] - msg_tmp = msg.decode('ascii') - msg_data = msg_tmp.split(',') - data = str(msg_data[1]) - hour = int(data.split('-')[0]) - btn_on = int(data.split('-')[1]) - - EventMesh.debug_log("recv REMIND_CH_DRINK:{}-{}-{}".format(hour,btn_on,msg)) - EventMesh.publish("set_storage_config",["drink_on",btn_on]) - EventMesh.publish("set_storage_config",["drink_time",hour]) - EventMesh.publish(constants.PROTOCOL.REMIND_CH_DRINK_SEND) - -# 自定义服药闹钟设置指令 -# 平台发送: -# [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_MEDICINE2,时间1-开关,时间2-开关,周几] -# 实例: -# [XT*334588000000156*0026*REMIND_CH_MEDICINE2,08:10-0,09:10-0,1000001] -# 终端回复: -# [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_MEDICINE2] -# 实例:[XT*334588000000156*000E*REMIND_CH_MEDICINE2] -# 说明:闹铃格式为:时间-开关(0/1),周几(周六到周日) - -#REMIND_CH_MEDICINE2,09:00-1,14:00-0,18:00-0,1111111]'",) -class REMIND_CHMEDICINE2_ProtoCol(ProtoCol):#吃药提醒 - """ - - 平台发送: - [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_MEDICINE2,,时间1-开关,时间2-开关,周几] - 实例:[XT*334588000000156*0008*REMIND_CH_MEDICINE2,,时间1-开关,时间2-开关,周几] - 终端回复: - [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_MEDICINE2] - """ - TYPE = "REMIND_CH_MEDICINE2" - - def send(self, event, msg): - send_data = EventMesh.publish("get_new_pid")+"*%s*0013*REMIND_CH_MEDICINE2"%(self.imei) - MD5_SIGN = self.pack_MD5_head(send_data) - data = "[%s%s]"%(str(MD5_SIGN),send_data) - #Wechat_log("POWEROFF_ProtoCol:send:%s"%(data)) - # 通过socket发送到服务器端 - EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) - - def recv(self, event, msg): - # SZKW*860132060346475*0013*REMIND_CH_MEDICINE2,4-1 - msg = msg[1:-1] - msg_tmp = msg.decode('ascii') - - msg_data = str(msg_tmp.split('REMIND_CH_MEDICINE2,')[1]) - msg_data_tmp = str(msg_tmp.split('REMIND_CH_MEDICINE2')[1]) - - medicin_data = [] - alarmday=[] - count = 0 - for i in str(msg_data_tmp): - # print("i",i) - if i == ",": - count+=1 - - if count >= 3: - count = 3 - medicine_alarmday = [] - for i in range(0,count):#默认是三个时间多了也不保存 - medicine_alarmday = str(msg_data.split(",")[count]) - # print("i",i) - medicine_alarm = str(msg_data.split(",")[i]) - if str(medicine_alarm).find("-") != -1: - on = int(medicine_alarm.split('-')[1]) - if on != 0: - alarmday = [] - data = str(medicine_alarm.split('-')[0]) - hour = int(data.split(":")[0]) - min = int(data.split(":")[1]) - for i in range(0,7): - # print("medicine_alarmday",medicine_alarmday,medicine_alarmday[i]) - if medicine_alarmday[i] != '0': - alarmday.append(i) - enable = 1 - medicin_data.append({"hour":hour,"min":min,"day":alarmday,"enable":enable}) - - EventMesh.publish("set_storage_config",["medicine",medicin_data]) - EventMesh.debug_log("recv REMIND_CH_MEDICINE2:{} medicin_data ;{}".format(msg,medicin_data)) - - EventMesh.publish(constants.PROTOCOL.REMIND_CH_MEDICINE2_SEND) - EventMesh.publish("clear_medicine_alarm") - -# 回家闹钟设置指令 -# 可设置闹钟的提醒文字 -# 平台发送: -# [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_HOME,闹钟1,闹钟2,闹钟3] -# 实例: -# [XT*334588000000156*0018*REMIND_CH_HOME,08:10,12:10] -# 终端回复: -# [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_HOME] -# 实例:[XT*334588000000156*0006*REMIND_CH_HOME] -# 说明:闹钟为时间点; -class REMIND_CH_HOME_ProtoCol(ProtoCol):#回家提醒 - """ - - 平台发送: - [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_HOME,,时间1-开关,时间2-开关,周几] - 实例:[XT*334588000000156*0008*REMIND_CH_HOME,,时间1-开关,时间2-开关,周几] - 终端回复: - [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_HOME] - """ - TYPE = "REMIND_CH_HOME" - - def send(self, event, msg): - send_data = EventMesh.publish("get_new_pid")+"*%s*000E*REMIND_CH_HOME"%(self.imei) - MD5_SIGN = self.pack_MD5_head(send_data) - data = "[%s%s]"%(str(MD5_SIGN),send_data) - #Wechat_log("POWEROFF_ProtoCol:send:%s"%(data)) - # 通过socket发送到服务器端 - EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) - - def recv(self, event, msg): - # SZKW*860132060346475*0013*REMIND_CH_MEDICINE2,4-1 - msg = msg[1:-1] - msg_tmp = msg.decode('ascii') - msg_data = msg_tmp.split(',') - - # [SZKW*860132060346475*0014*REMIND_CH_HOME,00:00',) - home_data = str(msg_data[1]) - - EventMesh.debug_log("recv REMIND_CH_HOME:{} medicin_data ;{}".format(msg,home_data)) - if len(home_data) != 0: - EventMesh.publish("set_storage_config",["home_alarm",home_data]) - EventMesh.publish("clear_home_alarm") - EventMesh.publish(constants.PROTOCOL.REMIND_CH_HOME_SEND) -# 起床闹钟设置指令 -# 平台发送: -# [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_WAKEUP,闹钟1,闹钟2] -# 实例: -# [XT*334588000000156*0026*REMIND_CH_WAKEUP,08:10-0-3-1000001,09:10-0-3-1000001] -# 闹钟格式为:时间-开关-频率(1:一次;2:每天;3:自定义) -# 08:10-1-1:闹钟时间8:10,打开,响铃一次 -# 08:10-1-2:闹钟时间8:10,打开,每天响铃 -# 08:10-1-3-0111110:闹钟时间8:10,打开,自定义周一至周五打开 -# 最左边是周日,最右边是周六,即0111110的顺序是:周日,周一,周二,周三,周四,周五,周六(1为打开,0为关闭),其中周一至周五打开闹钟 -# 终端回复: -# [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_WAKEUP] -# 实例:[XT*334588000000156*000E*REMIND_CH_WAKEUP] -# 说明:闹铃格式为:时间-开关-周几(周六到周日) -class REMIND_CH_WAKEUP_ProtoCol(ProtoCol):#该起床了 - """ - - 平台发送: - [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_WAKEUP,,时间1-开关,时间2-开关,周几] - 实例:[XT*334588000000156*0008*REMIND_CH_WAKEUP,,时间1-开关,时间2-开关,周几] - 终端回复: - [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_WAKEUP] - """ - TYPE = "REMIND_CH_WAKEUP" - - def send(self, event, msg): - send_data = EventMesh.publish("get_new_pid")+"*%s*0011*REMIND_CH_WAKEUP"%(self.imei) - MD5_SIGN = self.pack_MD5_head(send_data) - data = "[%s%s]"%(str(MD5_SIGN),send_data) - #Wechat_log("POWEROFF_ProtoCol:send:%s"%(data)) - # 通过socket发送到服务器端 - EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) - - def recv(self, event, msg): - # SZKW*860132060346475*0013*REMIND_CH_MEDICINE2,4-1 - msg = msg[1:-1] - msg_tmp = msg.decode('ascii') - msg_tmp_new = str(msg_tmp.split('REMIND_CH_WAKEUP,')[1]) - msg_tmp_data = str(msg_tmp.split('REMIND_CH_WAKEUP')[1]) - count = 0 - for i in str(msg_tmp_data): - # print("i",i) - if i == ",": - count+=1 - wakeup_data_save = [] - # # ("handler -> b'[SZKW*860132060346475*001C*REMIND_CH_WAKEUP,08:00-1-1,,]'",) - # medicine_alarmday = str(msg_data[4]) - # alarmday=[] - wakeup_day = [] - wakeup_switch = 0 - - print("count",count) - if count >= 3: - count = 3 - for i in range(0,count):#默认是三个时间多了也不保存 - wakeup_day = [] - wakeup_data = str(msg_tmp_new.split(',')[i]) - # print("i",i,wakeup_data) - if len(wakeup_data) != 0: - b = wakeup_data.find('-') - if b != -1: - wakeup_time = wakeup_data.split('-')[0]#-作为分隔符 - wakeup_switch = int(wakeup_data.split('-')[1])#开关 - wakeup_repeat = int(wakeup_data.split('-')[2])#是单次还是每天 还是自定义 - - wakeup_hour = int(wakeup_time.split(":")[0])#时间 - wakeup_min = int(wakeup_time.split(":")[1])#冒号分隔时间 时 分 - - - if wakeup_repeat == 2:#每一天 - wakeup_day = [0,1,2,3,4,5,6] - elif wakeup_repeat == 3:#自定义 - wakeup_day_tmp = wakeup_data.split('-')[3]#-作为分隔符 - for i in range(0,7): - if wakeup_day_tmp[i] != '0': - wakeup_day.append(i) - else:#单次 1 - wakeup_day=[] - if wakeup_switch != 0: - wakeup_data_save.append({"hour":wakeup_hour,"min":wakeup_min,"day":wakeup_day,"enable":wakeup_switch}) - - EventMesh.publish("set_storage_config",["wakeup_alarm",wakeup_data_save]) - wakeup = EventMesh.publish("get_storage_config","wakeup_alarm") - - EventMesh.debug_log("recv REMIND_CH_WAKEUP:{} wakeup ;{}".format(msg,wakeup)) - - EventMesh.publish(constants.PROTOCOL.REMIND_CH_WAKEUP_SEND) - - EventMesh.publish("clear_wakeup_alarm") - - - -# 睡觉闹钟设置指令 -# 平台发送: -# [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_SLEEP,闹钟1,闹钟2] -# 实例: -# [XT*334588000000156*0026*REMIND_CH_SLEEP,08:10-0-3-1000001,09:10-0-3-1000001] -# 闹钟格式为:时间-开关-频率(1:一次;2:每天;3:自定义) -# 08:10-1-1:闹钟时间8:10,打开,响铃一次 -# 08:10-1-2:闹钟时间8:10,打开,每天响铃 -# 08:10-1-3-0111110:闹钟时间8:10,打开,自定义周一至周五打开 -# 最左边是周日,最右边是周六,即0111110的顺序是:周日,周一,周二,周三,周四,周五,周六(1为打开,0为关闭),其中周一至周五打开闹钟 -# 终端回复: -# [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_SLEEP] -# 实例:[XT*334588000000156*000E*REMIND_CH_SLEEP] -# 说明:闹铃格式为:时间-开关-周几(周六到周日) -class REMIND_CH_SLEEP_ProtoCol(ProtoCol):#该睡觉了 - """ - - 平台发送: - [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_SLEEP,,时间1-开关,时间2-开关,周几] - 实例:[XT*334588000000156*0008*REMIND_CH_SLEEP,,时间1-开关,时间2-开关,周几] - 终端回复: - [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_SLEEP] - """ - TYPE = "REMIND_CH_SLEEP" - - def send(self, event, msg): - send_data = EventMesh.publish("get_new_pid")+"*%s*0011*REMIND_CH_SLEEP"%(self.imei) - MD5_SIGN = self.pack_MD5_head(send_data) - data = "[%s%s]"%(str(MD5_SIGN),send_data) - #Wechat_log("POWEROFF_ProtoCol:send:%s"%(data)) - # 通过socket发送到服务器端 - EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) - - def recv(self, event, msg): - # SZKW*860132060346475*0013*REMIND_CH_MEDICINE2,4-1 - msg = msg[1:-1] - msg_tmp = msg.decode('ascii') - msg_tmp_new = str(msg_tmp.split('REMIND_CH_SLEEP,')[1]) - msg_tmp_data = str(msg_tmp.split('REMIND_CH_SLEEP')[1]) - count = 0 - for i in str(msg_tmp_data): - # print("i",i) - if i == ",": - count+=1 - - sleep_data_save = [] - # # ("handler -> b'[SZKW*860132060346475*001C*REMIND_CH_SLEEP,08:00-1-1,,]'",) - # b'[SZKW*860132060346475*001B*REMIND_CH_SLEEP,08:00-1-1,,]'",) - # medicine_alarmday = str(msg_data[4]) - # alarmday=[] - sleep_day = [] - sleep_switch = 0 - - print("count",count) - if count >= 3: - count = 3 - for i in range(0,count):#默认是三个时间多了也不保存 - sleep_day = [] - sleep_data = str(msg_tmp_new.split(',')[i]) - # print("i",i,sleep_data) - if len(sleep_data) != 0: - b = sleep_data.find('-') - if b != -1: - sleep_time = sleep_data.split('-')[0]#-作为分隔符 - sleep_switch = int(sleep_data.split('-')[1])#开关 - sleep_repeat = int(sleep_data.split('-')[2])#是单次还是每天 还是自定义 - - sleep_hour = int(sleep_time.split(":")[0])#时间 - sleep_min = int(sleep_time.split(":")[1])#冒号分隔时间 时 分 - - - if sleep_repeat == 2:#每一天 - sleep_day = [0,1,2,3,4,5,6] - elif sleep_repeat == 3:#自定义 - sleep_day_tmp = sleep_data.split('-')[3]#-作为分隔符 - for i in range(0,7): - if sleep_day_tmp[i] != '0': - sleep_day.append(i) - else:#单次 1 - sleep_day=[] - if sleep_switch != 0: - sleep_data_save.append({"hour":sleep_hour,"min":sleep_min,"day":sleep_day,"enable":sleep_switch}) - - EventMesh.publish("set_storage_config",["sleep_alarm",sleep_data_save]) - # sleep = EventMesh.publish("get_storage_config","sleep_alarm") - - # EventMesh.debug_log("recv REMIND_CH_SLEEP_SEND:{} sleep ;{}".format(msg,sleep)) - - EventMesh.publish(constants.PROTOCOL.REMIND_CH_SLEEP_SEND) - EventMesh.publish("clear_sleep_alarm") - - -# 可设置闹钟的提醒文字 -# 平台发送: -# [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_REST,时间间隔1,时间间隔2,时间间隔3] -# 实例: -# [XT*334588000000156*0026*REMIND_CH_REST,08:10-10:00,12:10-15:00] -# 终端回复: -# [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_REST] -# 实例:[XT*334588000000156*000E*REMIND_CH_REST] -# 说明:时间间隔 【起始-结束】,起始为开始休息,结束为休息结束 - -class REMIND_CH_REST_ProtoCol(ProtoCol):#该休息了 - """ - - 平台发送: - [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_REST,,时间1-开关,时间2-开关,周几] - 实例:[XT*334588000000156*0008*REMIND_CH_REST,,时间1-开关,时间2-开关,周几] - 终端回复: - [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_REST] - """ - TYPE = "REMIND_CH_REST" - - def send(self, event, msg): - send_data = EventMesh.publish("get_new_pid")+"*%s*000E*REMIND_CH_REST"%(self.imei) - MD5_SIGN = self.pack_MD5_head(send_data) - data = "[%s%s]"%(str(MD5_SIGN),send_data) - #Wechat_log("POWEROFF_ProtoCol:send:%s"%(data)) - # 通过socket发送到服务器端 - EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) - - def recv(self, event, msg): - # SZKW*860132060346475*0013*REMIND_CH_REST,4-1 - msg = msg[1:-1] - msg_tmp = msg.decode('ascii') - msg_data = str(msg_tmp.split('REMIND_CH_REST,')[1]) - msg_data_new = str(msg_tmp.split('REMIND_CH_REST')[1]) - print("REMIND_CH_REST",len(msg_data),msg_data) - - reset_data_save = [] - count = 0 - for i in str(msg_data_new): - # print("i",i) - if i == ",": - count+=1 - - if count >= 2: - count = 2 - - for i in range(0,count):#默认是三个时间多了也不保存 - reset_data = str(msg_data.split(',')[i]) - print("i",i,reset_data) - if len(reset_data) != 0: - b = reset_data.find('-') - if b != -1: - start_time = reset_data.split('-')[0]#-作为分隔符 - end_time = reset_data.split('-')[1]#-作为分隔符 - - start_hour = int(start_time.split(":")[0]) - start_min = int(start_time.split(":")[1]) - - end_hour = int(end_time.split(":")[0]) - end_min = int(end_time.split(":")[1]) - - reset_data_save.append({"start_hour":start_hour,"start_min":start_min,"end_hour":end_hour,"end_min":end_min}) - - EventMesh.publish("set_storage_config",["reset_alarm",reset_data_save]) - # reset = EventMesh.publish("get_storage_config","reset_alarm") - - # EventMesh.debug_log("recv REMIND_CH_REST:{} reset ;{}".format(msg,reset)) - - EventMesh.publish(constants.PROTOCOL.REMIND_CH_REST_SEND) - EventMesh.publish("clear_reset_alarm") - - - -class WLKEY_ProtoCol(ProtoCol):#白名单开关 - """ - 白名单开关 - [XT*YYYYYYYYYYYYYYY*LEN*WLKEY,ONOFF] ONOFF: 1:开启,0:关闭,2:30秒后自动接听。 - 实例:[XT*334588000000156*0008*WLKEY,1] - 终端回复 - [XT*YYYYYYYYYYYYYYY*LEN*WLKEY] - 实例:[XT*334588000000156*0006*WLKEY] - """ - TYPE = "WLKEY" - - def send(self, event, msg): - send_data = EventMesh.publish("get_new_pid")+"*%s*00006*WLKEY"%(self.imei) - MD5_SIGN = self.pack_MD5_head(send_data) - data = "[%s%s]"%(str(MD5_SIGN),send_data) - #Wechat_log("POWEROFF_ProtoCol:send:%s"%(data)) - # 通过socket发送到服务器端 - EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) - - def recv(self, event, msg): - - msg = msg[1:-1] - msg_tmp = msg.decode('ascii') - msg_data = msg_tmp.split(',') - EventMesh.debug_log("WLKEY_ProtoCol".format(msg_data[1])) - EventMesh.publish("set_storage_config",["WLKEY",msg_data[1]]) - - - EventMesh.publish(constants.PROTOCOL.WLKEY_SEND) -# 终端发送: -# [XT*YYYYYYYYYYYYYYY*LEN*SLEEP_DATA,清醒时间(分钟),浅睡时间(分钟),深睡时间(分钟),日期(年月日)] -# 实例: [XT*334588000000156*0004*SLEEP_DATA,120,240,360,20221008] -# 实例表示:上传睡眠数据 -#[XT*334588000000156*0010*SleepReport,2022-02-09,80,2,532,164,164,25,25,25,25,21:45-0-164-155-3,22:00-1-162-155-0,22:15-2-162-155-0] -class SLEEP_DATA_ProtoCol(ProtoCol):#睡眠时间 - """ - 白名单开关 - [XT*YYYYYYYYYYYYYYY*LEN*WLKEY,ONOFF] ONOFF: 1:开启,0:关闭,2:30秒后自动接听。 - 实例:[XT*334588000000156*0008*WLKEY,1] - 终端回复 - [XT*YYYYYYYYYYYYYYY*LEN*WLKEY] - 实例:[XT*334588000000156*0006*WLKEY] - """ - TYPE = "SleepReport" - - def send(self, event, msg): - send_data = EventMesh.publish("get_new_pid")+"*%s*0000b*SleepReport"%(self.imei) - MD5_SIGN = self.pack_MD5_head(send_data) - data = "[%s%s,%s]"%(str(MD5_SIGN),send_data,msg) - EventMesh.debug_log("SLEEP_DATA:send:%s"%(data)) - # 通过socket发送到服务器端 - EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) - - def recv(self, event, msg): - - EventMesh.debug_log("SLEEP_DATA!!!!!!!!!") - # msg = msg[1:-1] - # msg_tmp = msg.decode('ascii') - # msg_data = msg_tmp.split(',') - # EventMesh.debug_log("WLKEY_ProtoCol".format(msg_data[1])) - # EventMesh.publish("set_storage_config",["WLKEY",msg_data[1]]) - - - # EventMesh.publish(constants.PROTOCOL.WLKEY_SEND) - -class SLEEPTIME_ProtoCol(ProtoCol):#睡眠时间 - """ - """ - TYPE = "SLEEPTIME" - - def send(self, event, msg): - send_data = EventMesh.publish("get_new_pid")+"*%s*00009*SLEEPTIME"%(self.imei) - MD5_SIGN = self.pack_MD5_head(send_data) - data = "[%s%s]"%(str(MD5_SIGN),send_data) - EventMesh.debug_log("SLEEPTIME:send:%s"%(data)) - # 通过socket发送到服务器端 - EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) - - def recv(self, event, msg): - # 实例:[XT*5678901234*0014*SLEEPTIME,23:30-7:30] - EventMesh.debug_log("SLEEPTIME!!!!!!!!!") - msg = msg[1:-1] - msg_tmp = msg.decode('ascii') - msg_data = str(msg_tmp.split(',')[1]) - data = {} - if len(msg_data) == 0: - EventMesh.publish("set_storage_config",["sleep_time",data]) - pass - else: - sleep_start = msg_data.split("-")[0] - sleep_end = msg_data.split("-")[1] - start_hour = int(sleep_start.split(":")[0]) - start_min = int(sleep_start.split(":")[1]) - - end_hour = int(sleep_end.split(":")[0]) - end_min = int(sleep_end.split(":")[1]) - - data = {"start_hour":start_hour,"start_min":start_min,"end_hour":end_hour,"end_min":end_min} - # EventMesh.debug_log("SLEEPTIME".format(data)) - EventMesh.publish("set_storage_config",["sleep_time",data]) - # sleep_time = EventMesh.publish("get_storage_config","sleep_time") - # EventMesh.debug_log("sleep_time:{}".format(sleep_time)) - - EventMesh.publish(constants.PROTOCOL.SLEEPTIME_SEND) - -# 平台发送: -# [XT*YYYYYYYYYYYYYYY*LEN*FACTORY] -# 实例:[XT*334588000000156*0007*FACTORY] -# 终端回复: -# [XT*YYYYYYYYYYYYYYY*LEN*FACTORY] -# 实例:[XT*334588000000156*0007*FACTORY] -# 说明:终端恢复出厂设置,里面设置的号码都将清空 -class FACTORY_ProtoCol(ProtoCol):#睡眠时间 - """ - 实例:[XT*334588000000156*0008*FACTORY] - 终端回复 - [XT*YYYYYYYYYYYYYYY*LEN*WLKEY] - 实例:[XT*334588000000156*0006*FACTORY] - """ - TYPE = "FACTORY" - - def send(self, event, msg): - send_data = EventMesh.publish("get_new_pid")+"*%s*0007*FACTORY"%(self.imei) - MD5_SIGN = self.pack_MD5_head(send_data) - data = "[%s%s]"%(str(MD5_SIGN),send_data) - EventMesh.debug_log("FACTORY:send:%s"%(data)) - # 通过socket发送到服务器端 - EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) - - def recv(self, event, msg): - - EventMesh.debug_log("FACTORY!!!!!!!!!") - # msg = msg[1:-1] - # msg_tmp = msg.decode('ascii') - # msg_data = msg_tmp.split(',') - # EventMesh.debug_log("WLKEY_ProtoCol".format(msg_data[1])) - # EventMesh.publish("set_storage_config",["WLKEY",msg_data[1]]) - - EventMesh.publish(constants.PROTOCOL.FACTORY_SEND) - EventMesh.publish("app_factory",None)#app恢复出厂 - -# 平台发送: -# [3G*YYYYYYYYYY*LEN*RESET] -# 实例:[3g*5678901234*0005*RESET] -# 终端回复: -# [3G*YYYYYYYYYY*LEN*RESET] -class RESET_ProtoCol(ProtoCol):#重启 - """ - 实例:[XT*334588000000156*0008*RESET] - 终端回复 - [XT*YYYYYYYYYYYYYYY*LEN*RESET] - 实例:[XT*334588000000156*0006*RESET] - """ - TYPE = "RESET" - - def send(self, event, msg): - send_data = EventMesh.publish("get_new_pid")+"*%s*0005*RESET"%(self.imei) - MD5_SIGN = self.pack_MD5_head(send_data) - data = "[%s%s]"%(str(MD5_SIGN),send_data) - EventMesh.debug_log("RESET:send:%s"%(data)) - # 通过socket发送到服务器端 - EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) - - def recv(self, event, msg): - - EventMesh.debug_log("RESET!!!!!!!!!") - # msg = msg[1:-1] - # msg_tmp = msg.decode('ascii') - # msg_data = msg_tmp.split(',') - # EventMesh.debug_log("WLKEY_ProtoCol".format(msg_data[1])) - # EventMesh.publish("set_storage_config",["WLKEY",msg_data[1]]) - - EventMesh.publish(constants.PROTOCOL.RESET_SEND) - Power.powerRestart() - -# 平台发送: -# [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_SIT,时间间隔(分钟),总开关(0为关,1为开),午间休息时段,晚间休息时段] -# 午间/晚间休息时段格式为:开始时间(hh:mm)-结束时间(hh:mm)-开关(0为关,1为开),例如 12:00-15:00-1。 -# 久坐默认值为20分钟。 -# 午间和晚间默认值,午间12:00-14:00,晚上20:00-07:00。 -# 实例: -# [XT*334588000000156*0026*REMIND_CH_SIT,20,0,12:00-15:00-1,20:00-07:00-1] -# 终端回复: -# [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_SIT] -# 实例:[XT*334588000000156*000E*REMIND_CH_SIT] -class REMIND_CH_SIT_ProtoCol(ProtoCol):#久坐提醒 - """ - 实例:[XT*334588000000156*0008*REMIND_CH_SIT] - 终端回复 - [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_SIT] - 实例:[XT*334588000000156*0006*REMIND_CH_SIT] - """ - TYPE = "REMIND_CH_SIT" - - def send(self, event, msg): - send_data = EventMesh.publish("get_new_pid")+"*%s*000d*REMIND_CH_SIT"%(self.imei) - MD5_SIGN = self.pack_MD5_head(send_data) - data = "[%s%s]"%(str(MD5_SIGN),send_data) - EventMesh.debug_log("REMIND_CH_SIT:send:%s"%(data)) - # 通过socket发送到服务器端 - EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) - - def recv(self, event, msg): - - EventMesh.debug_log("REMIND_CH_SIT!!!!!!!!!") - # msg = msg[1:-1] - # msg_tmp = msg.decode('ascii') - # msg_data = msg_tmp.split(',') - # EventMesh.debug_log("WLKEY_ProtoCol".format(msg_data[1])) - # EventMesh.publish("set_storage_config",["WLKEY",msg_data[1]]) - - EventMesh.publish(constants.PROTOCOL.REMIND_CH_SIT_SEND) - -# 平台发送: -# [XT*YYYYYYYYYYYYYYY*LEN*SCREEN_SHOW,参数内容] -# 实例:[XT*334588000000156*0016*SCREEN_SHOW,00000000000] -# 参数内容用 unicode 编码呈现,设备收到后需解码。 -# 解码后的参数内容可能有多个参数,不同参数用逗号分隔,设备自己决定如何在屏幕中显示这些参数。比如 "SCREEN_SHOW,深圳第一中学,三年1班、张三" -# 终端回复: -# [XT*YYYYYYYYYYYYYYY*LEN*SCREEN_SHOW] -# 实例:[XT*334588000000156*000B*SCREEN_SHOW] - -class SCREEN_SHOWProtoCol(ProtoCol): - """开屏显示""" - TYPE = "SCREEN_SHOW" - def send(self, event, msg): - # [XT*334588000000156*0006*SILENCETIME2] - send_data = EventMesh.publish("get_new_pid")+"*%s*000B*SCREEN_SHOW"%(self.imei) - MD5_SIGN = self.pack_MD5_head(send_data) - data = "[%s%s]"%(str(MD5_SIGN),send_data) - # print("KEYBRD:data:%s"%(data)) - # print("KEYBRD!!!!!!!!!!!!!",msg) - # 通过socket发送到服务器端 - EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) - - def recv(self, event, msg): - """ - @param event: - @param msg: 接收到的下行数据 - """ - msg = msg[1:-1] - msg_tmp = msg.decode('ascii') - msg_tmp = msg_tmp.split(',') - msg_tmp = msg_tmp[1:] - msg_tmp = msg_tmp[0] - print("screen_school_data msg",msg) - - j = 0 - i = 0 - videobook_old = {} - videobook_name_tmp = UnicodeHexStr_To_Utf8Str(msg_tmp) - lst = videobook_name_tmp.split(",") - print("lst data",lst) - - # 0 1 2 3 - screen_school_data = ""#学校 - screen_class_data = ""#班级 - screen_fullname_data = ""#姓名 - if len(lst) != 0: - count = len(lst) - if count > 3: - count = 3 - for i in range(count): - if i == 0: - screen_school_data = lst[0] - EventMesh.publish("set_schoolname", screen_school_data)# - elif i == 1: - screen_class_data = lst[1] - EventMesh.publish("set_classname", screen_class_data)# - else: - screen_fullname_data= lst[2] - EventMesh.publish("set_fullname", screen_fullname_data)# - - # EventMesh.publish("update_screen_show")#更新开屏显示 - - print("screen_school_data!!!:",screen_school_data,screen_class_data,screen_fullname_data) - - EventMesh.publish(constants.PROTOCOL.SCREEN_SHOW_SEND) - -# #小见平台视频通话 -# # [XT*YYYYYYYYYYYYYYY*LEN*JPREG] -# # 实例: -# # [XT*334588000000156*0004*JPREG] -# # 平台回复: -# # [XT*设备ID*LEN*JPREG,账号(整型)] -# # 实例:[XT*334588000000156*0010*JPREG,1087654321] -class JPREG_ProtoCol(ProtoCol):#登入注册 - """""" - TYPE = "JPREG" - def send(self, event, msg): - - # [XT*334588000000156*0005*WLKEY] - send_data = EventMesh.publish("get_new_pid")+"*%s*0005*JPREG"%(self.imei) - MD5_SIGN = self.pack_MD5_head(send_data) - data = "[%s%s]"%(str(MD5_SIGN),send_data) - # print("WLKEY:data:%s"%(data)) - # print("WLKEY!!!!!!!!!!!!!") - # 通过socket发送到服务器端 - EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) - - def recv(self, event, msg): - """ - @param event: - @param msg: 接收到的下行数据 - """ - # b'[SZKW*867387060319166*000A*KEYBRD]' - print("JPREG!!!!!!!!!!!!!",msg,EventMesh.publish("get_new_pid")) - # EventMesh.publish(constants.PROTOCOL.JPREG_SEND) - -# # (声网,佰锐的账号是整型) -# # [XT*YYYYYYYYYYYYYYY*LEN*MEMBERS] -# # 实例:[XT*334588000000156*0007*MEMBERS] -# # 平台回复:[XT*设备ID*LEN*MEMBERS,账号1,昵称1,电话1,账号2,昵称2,电话2.....] -# # 实例: -# # [XT*334588000000156*003F*MEMBERS,d3e2f759f9d5af3858f3530,爸爸,13662313580,妈妈,555] -# # 以上数据部分使用Unicode编码,最终上面示例传到服务端将是: - -class MEMBERS_ProtoCol(ProtoCol):#获取账号列表 - """""" - TYPE = "MEMBERS" - def send(self, event, msg): - - # [XT*334588000000156*0005*WLKEY] - send_data = EventMesh.publish("get_new_pid")+"*%s*0007*MEMBERS"%(self.imei) - MD5_SIGN = self.pack_MD5_head(send_data) - data = "[%s%s]"%(str(MD5_SIGN),send_data) - print("MEMBERS SEND:data:%s"%(data)) - # print("WLKEY!!!!!!!!!!!!!") - # 通过socket发送到服务器端 - EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) - - def recv(self, event, msg): - """ - @param event: - @param msg: 接收到的下行数据 - """ - # b'[SZKW*876226002021444*0048*MEMBERS,0036003900350031003800330032002C563F563FD83CDF410020D83CDF42002C]' - print("MEMBERS!!!!!!!!!!!!!",msg,EventMesh.publish("get_new_pid")) - msg = msg[1:-1] - msg_tmp = msg.decode('ascii') - msg_tmp = msg_tmp.split(',') - - videobook = {} - msg_tmp = msg_tmp[1:] - msg_tmp = msg_tmp[0] - - j = 0 - i = 0 - videobook_old = {} - videobook_name_tmp = UnicodeHexStr_To_Utf8Str(msg_tmp) - lst = videobook_name_tmp.split(",") - - print("msg_tmp:{} phonebook_oldtmp:{} type:{}".format(msg_tmp,videobook_name_tmp,lst)) - # 0 1 2 3 - for vediobook_tmp in lst: - - if (j % 3) == 0:#账号 - videobook_old = vediobook_tmp - elif (j % 3) == 1:#名称 - i+=1 - videobook_name_cont= "{}:{}".format("%03d"%(i),videobook_old) - videobook[videobook_name_cont] = vediobook_tmp - j+=1 - print("videobook!!!:{}".format(str(videobook))) - # print("phonebook!!!:{}".format(str(phonebook))) - with open("/usr/static/storage_file/videobook.json","w",encoding="utf-8") as fd: - ujson.dump(videobook,fd) - print("创建视频通话账号") - - EventMesh.publish("set_videobook_list",[1,videobook]) - # EventMesh.publish("video_updata_list_show") - # EventMesh.publish(constants.PROTOCOL.MEMBERS_SEND) - -# # [X*Y*LEN*CALLING,呼叫者id,会议id,通话类型,Token] - -# # 设备回复 -# # [X*Y*LEN*CALLING,音视频状态] -# # 音视频状态:为0表示正常可通讯状态,否则填上用音视频返回的状态码,比如200,如果未获取到返回状态码,则填1 -class CALLING_ProtoCol(ProtoCol):#app发起视频通话 - """""" - TYPE = "CALLING" - def send(self, event, msg): - - # [XT*334588000000156*0005*WLKEY] - send_data = EventMesh.publish("get_new_pid")+"*%s*0007*CALLING"%(self.imei) - MD5_SIGN = self.pack_MD5_head(send_data) - data = "[%s%s,%d]"%(str(MD5_SIGN),send_data,msg) - # print("CALLING:send data:%s"%(data)) - # print("WLKEY!!!!!!!!!!!!!") - # 通过socket发送到服务器端 - EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) - - def recv(self, event, msg): - """ - @param event: - @param msg: 接收到的下行数据 - """ - # b'[SZKW*867387060319166*000A*CALLING]' - print("CALLING!!!!!!!!!!!!!",msg) - if EventMesh.model == "D10":#D10没有视频通话 - EventMesh.publish(constants.PROTOCOL.CALLING_SEND,1) - return - msg = msg[1:-1] - msg_tmp = msg.decode('ascii') - msg_tmp_d = msg_tmp.split(',') - call_id = msg_tmp_d[1]#id - meet_id = msg_tmp_d[2]#会议id - call_type = int(msg_tmp_d[3])#会议id# 0音频 1视频 - tokens_data = msg_tmp_d[4]#tokens - EventMesh.publish("set_vedio_call_id", call_id)# - EventMesh.publish("set_vedio_meet_id", meet_id)# - EventMesh.publish("set_vedio_call_type", call_type)# - EventMesh.publish("set_vedio_tokens_data", tokens_data)# - - flag = EventMesh.publish("get_call_state") - fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识 - usb_state = EventMesh.publish("get_usb")# - video_state = EventMesh.publish("get_video_state") - sos_dialing = EventMesh.publish("get_sos_state_out")#正在拨打sos电话 - if flag != 0 or fall_down != 0 or video_state != 0 or sos_dialing != 0: #电话在打入或者 在充电不允许视频通话 - EventMesh.publish(constants.PROTOCOL.CALLING_SEND,1) - else: - EventMesh.publish(constants.PROTOCOL.CALLING_SEND,0) - EventMesh.publish("set_video_state", 6) - EventMesh.publish("set_dev_app_mode", 2)# - EventMesh.publish("close_hr_sop2")# - EventMesh.publish("video_call_in_event",call_type) - -# # [XT*YYYYYYYYYYYYYYY*LEN*RCALLING,呼叫者id,会议id/声网频道名(没有则留空,但位置保留),音频还是视频(0为音频,1为视频)] -# # 实例: -# # [XT*334588000000156*0007*RCALLING,d3e2f759f9d5af3858f3530b,,0] -# # 终端回复: -# # [XT*设备ID*LEN*RCALLING] -# # 实例:[XT*334588000000156*0009*RCALLING] -# # -class RCALLING_ProtoCol(ProtoCol):#设备拒接接听 - """""" - TYPE = "RCALLING" - def send(self, event, msg): - - # [XT*334588000000156*0005*WLKEY] - send_data = EventMesh.publish("get_new_pid")+"*%s*0008*RCALLING"%(self.imei) - MD5_SIGN = self.pack_MD5_head(send_data) - data = "[%s%s,%s,%s,%d]"%(str(MD5_SIGN),send_data,msg[0],msg[1],msg[2]) - # print("RCALLING:send data:%s"%(data)) - # print("WLKEY!!!!!!!!!!!!!") - # 通过socket发送到服务器端 - EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) - # print("RCALLING:send data end:%s"%(data)) - - def recv(self, event, msg): - """ - @param event: - @param msg: 接收到的下行数据 - """ - # b'[SZKW*867387060319166*000A*RCALLING]' - print("RCALLING!!!!!!!!!!!!!") - -class AGTALK_ProtoCol(ProtoCol):#设备发起视频通话与app接听视频通话 - """""" - TYPE = "AGTALK" - def send(self, event, msg): - - # [XT*334588000000156*0005*WLKEY] - send_data = EventMesh.publish("get_new_pid")+"*%s*0006*AGTALK"%(self.imei) - MD5_SIGN = self.pack_MD5_head(send_data) - data = "[%s%s,%d,%s]"%(str(MD5_SIGN),send_data,msg[0],msg[1]) - print("AGTALK:send data:%s"%(data)) - # print("WLKEY!!!!!!!!!!!!!") - # 通过socket发送到服务器端 - EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) - - def recv(self, event, msg): - """ - @param event: - @param msg: 接收到的下行数据 - """ - # b'[SZKW*876226002021444*007B*AGTALK,0,01lqlyqzzQHpfwv5g7jFVC2H6Ha2tHFpMlfSm5sd2uo7o55JEcc=OVxewje6MjP0NgEODwsLDwkJCwkLCA0NDQ==,8762260020214441701226895]' - # print("AGTALK!!!!!!!!!!!!!") - msg = msg[1:-1] - msg_tmp = msg.decode('ascii') - msg_tmp_d = msg_tmp.split(',') - call_state = int(msg_tmp_d[1])#返回是否可以视频通话 - if call_state == 0:#可正常通话 - if EventMesh.publish("get_video_state") != 0: - # print("AGTALK!!!!!!!!!!!!!answer") - tokens_data = msg_tmp_d[2]#会议id - meet_id = msg_tmp_d[3]#会议id - EventMesh.publish("set_vedio_meet_id", meet_id)# - EventMesh.publish("set_vedio_tokens_data", tokens_data)# - EventMesh.publish("open_vedio_infor") - - else: - #不能视频通话 - tokens_data = msg_tmp_d[2]#token数据 - meet_id = msg_tmp_d[3]#会议id - EventMesh.publish("set_vedio_meet_id", meet_id)# - EventMesh.publish("set_vedio_tokens_data", tokens_data)# - EventMesh.publish("video_newwork_reject_cb",None)#挂断视频通话 - # print("AGTALK no!!!!!!!!!!!!!") - - print("AGTALK!!!!!!!!!!!!!") - - -class RTALK_ProtoCol(ProtoCol):#app拒接视频通话 - """""" - TYPE = "RTALK" - def send(self, event, msg): - - # [XT*334588000000156*0005*WLKEY] - send_data = EventMesh.publish("get_new_pid")+"*%s*0005*RTALK"%(self.imei) - MD5_SIGN = self.pack_MD5_head(send_data) - data = "[%s%s,%d,%s]"%(str(MD5_SIGN),send_data,msg[0],msg[1]) - # print("AGTALK:send data:%s"%(data)) - # print("WLKEY!!!!!!!!!!!!!") - # 通过socket发送到服务器端 - EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) - - def recv(self, event, msg): - """ - @param event: - @param msg: 接收到的下行数据 - """ - # b'[SZKW*867387060319166*000A*RTALK]' - print("RTALK!!!!!!!!!!!!!") - # [SZKW*876226002021444*003A*RTALK,3ef20e64f3abb84b27f7d764,8762260020214441701226522,1]' - msg = msg[1:-1] - msg_tmp = msg.decode('ascii') - msg_tmp_d = msg_tmp.split(',') - EventMesh.publish("app_rtalk_cb",1) - - - - -class ProtoColResolver(object): - def __init__(self): - self.protocol_list = [] - - def add_support(self, prot): - self.protocol_list.append(prot) - prot.initialization() - - def handler(self, data): - # 这里接收数据 - - EventMesh.debug_log("handler -> {}".format(data)) - # if data.startswith('Init;'): - # data = data[5:] - # EventMesh.publish(constants.EVENT.SET_KEY, {"value": ujson.loads(data)['KEY']}) - - # elif data.startswith("Update;"): - # data = data[7:] - # EventMesh.publish(constants.PROTOCOL.H04_RECV, data) - try: - if len(data) > 0: - #EventMesh.debug_log("handler:{}".format(len(data))) - playload_data(data) - except Exception as e: - EventMesh.debug_log("handler:ERROR:") - usys.print_exception(e) - EventMesh.debug_log("handler:error data:{}".format(len(data))) +import ujson +import utime +import EventMesh +import constants +from common import Abstract +import uhashlib +import ubinascii +from misc import Power +import audio +from machine import Pin +import ujson +import ql_fs +import dataCall +import checkNet +import net +import usocket +import osTimer + +import machine +import urandom +import _thread +import usys +import request +import umqtt +import modem +import versions +SHA256 = uhashlib.sha256 +import SecureData +import log +import ustruct + +def server_init(server_type = None): + #服务器选择1,防走丢,2大锤,3三基同创,4童信,5云米,6荣为 8:ds未知 dey.hinwatch. com:9968 9:183.62.239.121:31869 10:183.62.239.121:33461 + if server_type == None: + server_type = 2 + #EventMesh.debug_log("server_init:server_type:{}".format(server_type)) + + d_server_addr = "api.xcloudtech.com" + d_server_port = 9000 + d_md5_key = "bZld0ALsZTt15tKEZhOlLPgbsO75BLTP" + d_PID = "SZKW" + if server_type == 1: + pass + + elif server_type == 2: + # test.iot.socket.thisiot.com:9999 + # iot.socket .thisiot.com:9999 + # d_server_addr = "test.iot.socket.thisiot.com" + # d_server_port = 9999 + # d_md5_key = "3JyCjsw4ryXKzjzudayY" + # d_PID = "qAELPTKmFanR4RHe" + + d_server_addr = "iot.socket.thisiot.com" + d_server_port = 9999 + d_md5_key = "SZYhyGhroQ3xFKFWZq1g" + d_PID = "oxLwDqcwJCtiPSRu" + + elif server_type == 3: + d_server_addr = "tcp.zhihuixuexiao.com" + d_server_port = 2346 + d_md5_key = "" + d_PID = "3G" + elif server_type == 4: + d_server_addr = "tcp.tx.kidxin.com" + d_server_port = 20500 + elif server_type == 5: + d_server_addr = "device.miwitracker.com" + d_server_port = 8505 + d_md5_key = "" + d_PID = "3G" + elif server_type == 6: + d_server_addr = "120.26.104.21" + d_server_port = 9968 + d_md5_key = "bZld0ALsZTt15tKEZhOlLPgbsO75BLTP" + d_PID = "SZKW" + elif server_type == 7: + d_server_addr = "8.134.68.15" + d_server_port = 30346 + d_PID="KnHnj1Cd5VxcO3Ft" + d_md5_key = "evxThVhMBmRNiQ1Twigw" + elif server_type == 99: + d_server_addr = "lab.xcloudtech.com" + d_server_port = 9000 + elif server_type == 8: + d_server_addr = "dev.hxinwatch.com" + d_server_port = 9968 + elif server_type == 9: + d_server_addr = "183.62.239.121" + d_server_port = 31869 + elif server_type == 10: + d_server_addr = "183.62.239.121" + d_server_port = 33461 + + return [d_server_addr,d_server_port,d_md5_key,d_PID] +from queue import Queue +def unicode_to_utf8(src): + ref = 0xe08080 + result = ref + + #取最后六位 + a = src & 0x3f + + #将最后六位放在ref最后六位的空位置 + result = result | a + src = src >> 6 + + #取接下来的六位 + a = src & 0x3f + + #放在ref对应的六个位置 + result = result | (a << 8) + + #保留最后四位 + src = src >> 6 + + #放在ref对应的四个位置 + result = result | (src << 16) + return result + +def UnicodeHexStr_To_Utf8Str(str): + odata = 0 + + result = bytes() + su =str.upper() + + i = 0 + for c in su: + tmp=ord(c) + if tmp <= ord('9') : + odata = odata << 4 + odata += tmp - ord('0') + + elif ord('A') <= tmp <= ord('F'): + odata = odata << 4 + odata += tmp - ord('A') + 10 + if(i%4==3): #每2字节获取一个int,拿到转换后的unicode int + #print(odata.to_bytes(2, 'big')) + #result.append(odata) + if odata > 255: + tmp = unicode_to_utf8(odata)#拿到转换后的utf8 int + tmp2 = tmp.to_bytes(3, 'big') #转bytes + else : + tmp2 = odata.to_bytes(1, 'big') + #print("tmp2:{}".format(tmp2)) + result = result + tmp2 + odata = 0 + i+=1 + return result.decode('utf-8') #返回utf8的str + +def gewu_init(): + productKey = "cu1shld45y4hjr1L" + return productKey +mqtt_state = 0 +def mqttsub_cb(topic, msg): + global mqtt_state + print("Subscribe Recv: Topic={},Msg={}".format(topic.decode(), msg.decode())) + jsload_data = ujson.loads(msg.decode()) + print("jsload_data-{} type:{}".format(jsload_data,type(msg.decode()))) + # jsload_data = {'data':'111','protocolType':'', 'host':'device.miwitracker.com', 'secretKey': 'bZld0ALsZTt15tKEZhOlLPgbsO75BLTP', 'port':8505, 'bid': '3G', 'extJsonStr': ''} + # ujson.loads(c) + # $sys/cu1shld45y4hjr1L/866610001011658/ext/regist + #data = {"messageId":"25","params":{"deviceSecret":"C1D75A63C0338978438E9197372FC698""}} + if "params" in jsload_data: + params_str = jsload_data["params"] + if "deviceSecret" in params_str: + str_tmp = params_str["deviceSecret"] + print(str_tmp) + EventMesh.publish("set_deviceSecret",str_tmp) + mqtt_state = 1 +def mqtterr_cb(error): + ''' + 接收umqtt线程内异常的回调函数 + ''' + print("error!!!!!!!!!!!".format(error)) + +def HMAC(k, m): + SHA1_BLOCK_SIZE = 64 + KEY_BLOCK = k + (b'\0' * (SHA1_BLOCK_SIZE - len(k))) + KEY_INNER = bytes((x ^ 0x36) for x in KEY_BLOCK) + KEY_OUTER = bytes((x ^ 0x5C) for x in KEY_BLOCK) + inner_message = KEY_INNER + m + outer_message = KEY_OUTER + SHA256(inner_message).digest() + return SHA256(outer_message) + + +def get_hmac_sha256(k, m): + data = HMAC(k, m).digest() + # print("HMAC(k, m).digest():", data) + # print("HMAC(k, m).digest():", ubinascii.hexlify(data)) + hex_data = ubinascii.hexlify(data) + hex_data = hex_data.decode('ascii') + return hex_data + +def mqtt_client_pro_init():#一型一密 + client = 0 + + # 创建一个mqtt实例 +# + # {"productKey":"cu1r1rjjrjdhz0lx","deviceKey":"DD86000000001","deviceSecret":"93FEEC6D16D30E2B90FE0DBC2FFCDB14"} 设备基本信息 + # hmac_sha256(deviceIddeviceKeyproductKey,deviceSecret) mqttclientId + deviceId = ""#"bOOSGN5FlXEjt15" + deviceKey = ''#"bOOSGN5FlXEjt15" + imei = EventMesh.publish(constants.EVENT.GET_IMEI) + deviceId = str(imei) + deviceKey = str(imei) + productKey = gewu_init() + + EventMesh.publish("set_product_key",productKey) + data = "{}{}{}".format(deviceId,deviceKey,productKey)#需要用户定义产品是提供数据 + # data = b"The data to encrypt" + # 密钥 + productSecret = b"765fc66242616852209d1c57e51b0744" #765fc66242616852209d1c57e51b0744 ,productSecret + + # {"productKey":"cu1shld45y4hjr1L","deviceKey":"bOOSGN5FlXEjt15","deviceSecret":"9234577490038E0949B800C243BF4321"} + checkpassword = get_hmac_sha256(productSecret,data) + # print(checkpassword) + # {deviceId}|{productKey}|{signMethod}|{authType}|{operator};连接id格式 + + Client_id = "{}|{}|0|1|0".format(deviceId,productKey) # + # print(Client_id) + server = "dmp-mqtts.cuiot.cn"#"dmp-mqtt.cuiot.cn" + port = 8883 + # {deviceKey}|{productKey} mqttUsername + userName = "{}|{}".format(deviceKey,productKey) + userpassword = checkpassword + # print(userName) + # print(userpassword) + # client = umqtt.MQTTClient("866610001011658|cu1shld45y4hjr1L|0|1|0","dmp-mqtt.cuiot.cn", 1883, "866610001011658|cu1shld45y4hjr1L","675f6fbfb15a729bbc280273632ce3a96f8b38d4736fbaf888fe8a48fd7aee09") + # client = umqtt.MQTTClient("lxRXQayZ4poQz8G|cujg06l29iav591b|0|0|0","dmp-mqtt.cuiot.cn", 1883, "lxRXQayZ4poQz8G|cujg06l29iav591b","1f8c69d29afca0505d967066b39d84a5eb1e54302b87e337b405f99d029a9242") + client = umqtt.MQTTClient(Client_id,server, port, userName,"{}".format(userpassword),reconn=False,ssl=True) + # client = MqttClient(Client_id, server, port, userName,"{}".format(userpassword)) + # 设置消息回调 + client.set_callback(mqttsub_cb) + # 设置异常回调 + client.error_register_cb(mqtterr_cb) + return client + +def mqtt_client_dev_init():#一机一密 + client = 0 + + # 创建一个mqtt实例 +# + # {"productKey":"cu1r1rjjrjdhz0lx","deviceKey":"DD86000000001","deviceSecret":"93FEEC6D16D30E2B90FE0DBC2FFCDB14"} 设备基本信息 + # hmac_sha256(deviceIddeviceKeyproductKey,deviceSecret) mqttclientId + deviceId = '' #"bOOSGN5FlXEjt15" + deviceKey = ''#"bOOSGN5FlXEjt15" + imei = EventMesh.publish(constants.EVENT.GET_IMEI) + deviceId = str(imei) + deviceKey = str(imei) + productKey = gewu_init() + data = "{}{}{}".format(deviceId,deviceKey,productKey)#需要用户定义产品是提供数据 + # data = b"The data to encrypt" + # 密钥 + deviceSecret_tmp = EventMesh.publish("get_deviceSecret") + subscribe_msg = deviceSecret_tmp.encode('ascii') + deviceSecret = subscribe_msg #765fc66242616852209d1c57e51b0744 ,productSecret + print(deviceSecret) + + checkpassword = get_hmac_sha256(deviceSecret,data) + print(checkpassword) + # {deviceId}|{productKey}|{signMethod}|{authType}|{operator};连接id格式 + Client_id = "{}|{}|0|0|0".format(deviceId,productKey) # 860132060346475|cu1shld45y4hjr1L|0|0|0 + server = "dmp-mqtts.cuiot.cn"#"dmp-mqtt.cuiot.cn" + port = 8883 + # {deviceKey}|{productKey} mqttUsername + userName = "{}|{}".format(deviceKey,productKey) + userpassword = checkpassword + + client = umqtt.MQTTClient(Client_id,server, port, userName,"{}".format(userpassword),reconn=False,ssl=True) + # client = MqttClient(Client_id, server, port, userName,"{}".format(userpassword)) + # 设置消息回调 + client.set_callback(mqttsub_cb) + # 设置异常回调 + client.error_register_cb(mqtterr_cb) + return client + + + +import uwebsocket +import sim + +class WEB_CMD_ENUM: + POST_DEVICE_STATE_R_CMD = "post_device_state_R" + POST_DEVICE_STATE_S_CMD = "post_device_state_S" + + POST_DEVICE_INFOR_R_CMD = "POST_DEVICE_INFOR_R_CMD" + POST_DEVICE_INFOR_S_CMD = "POST_DEVICE_INFOR_S_CMD" + + POST_ALARM_R_CMD = "post_alarm_R" + POST_ALARM_S_CMD = "post_alarm_S" + + FIND_DEVCE_R_CMD = "find_device_R" + FIND_DEVCE_S_CMD = "find_device_S" + + ALARM_CONFIG_R_CMD = "alarm_config_R" + ALARM_CONFIG_S_CMD = "alarm_config_S" + + ALARM_LIST_R_CMD = "alarm_list_R" + ALARM_LIST_S_CMD = "alarm_list_S" + + UNBIND_DEV_R="unbind_dev_R" + UNBIND_DEV_S="unbind_dev_S" + + DEVICE_SHAKE_STATE_R_CMD = "device_shake_state_R" + DEVICE_SHAKE_STATE_S_CMD = "device_shake_state_S" + +class IOT_socket_SendCmdManager(Abstract): + # + def __init__(self): + self.send_data = "" + self.time_tmp = 0 + def post_processor_after_instantiation(self): + EventMesh.subscribe("GET_IOT_SEND_CMD", self.get_iot_send_cmd) + print("IOTSendCmdManager") + #调用:device_state=EventMesh.publish("GET_IOT_SEND_CMD",WEB_CMD_ENUM.POST_DEVICE_INFOR_S_CMD) + # print("device_state{}".format(device_state)) + def get_iot_send_cmd(self, event, msg):#获取准备发送的值 + date_tmp = utime.localtime() + self.time_tmp = utime.mktime(date_tmp) + if msg == WEB_CMD_ENUM.POST_DEVICE_STATE_S_CMD:#设备VC状态 + self.send_data = self.device_report_state_send_data() + return self.send_data + elif msg == WEB_CMD_ENUM.POST_DEVICE_INFOR_S_CMD:#设备信息 + self.send_data = self.device_information_send_data() + return self.send_data + elif msg == WEB_CMD_ENUM.POST_DEVICE_INFOR_S_CMD:#聊天内容 + self.send_data = self.device_information_send_data() + return self.send_data + + # 设备对话内容上报数据格式 + def device_talk_send_data(self): + print("device_talk_send_data") + infor_send_data = { + "cmd":"chat_text", + "data": + { + "device_id":modem.getDevImei(),#设备号 + "type":"req:请求说的话;res:响应的内容", + "text":"用户说话内容", + "createTime":"时间戳" + } + } + return infor_send_data + + # 设备信息上报数据格式 + def device_information_send_data(self): + print("device_information_send_data") + battery_state = (EventMesh.publish("screen_get_battery"))[0] + battery = (EventMesh.publish("screen_get_battery"))[1] + if battery >= 100 or battery == None: + battery = 100 + VC_TTS_volume = EventMesh.publish("get_storage_config","VC_TTS_volume")#音量配置 + if VC_TTS_volume == None: + VC_TTS_volume =100 + sourceVersion =versions.Build_Time + Timeversion ="JSWM-"+sourceVersion + infor_send_data = { + "data":{ + "version":Timeversion,#版本号 + "charge":battery_state,#0表示未充电,1表示充电中 + "current_role_name":"",#当前音色的name + "volume":str(VC_TTS_volume),#百分比数值 + "wifi_rssi":str(net.csqQueryPoll()//6),#wifi强弱:0,1,2,3,4,5。转成这几个梯度 + "battery":str(battery),#电量 + "device_id":modem.getDevImei(),#设备号 + }, + "cmd":"device_info" + } + return infor_send_data + + #设备上报VC状态 + def device_report_state_send_data(self): + ai_status = EventMesh.publish("screen_get_ai") + if EventMesh.publish("get_VC_satrt_flag") == 1:#获取vc是否在运行 + if ai_status < 6 : + target_status = "listening" + elif ai_status == 6: + target_status = "thinking" + elif ai_status >= 8: + target_status = "speaking" + else: + target_status = "idle" + + device_report_data ={ + "data":{ + "device_id":modem.getDevImei(), + "state":target_status + }, + "cmd":"chat_state" + } + return device_report_data +def extract_target_number(json_str): + # 查找"target":"的起始位置 + start_key = '"target":"' + start_idx = json_str.find(start_key) + if start_idx == -1: + print("未找到 target 字段") + return None # 未找到目标字段 + + # 计算数字的起始位置(跳过"target":") + num_start = start_idx + len(start_key) + + # 从数字起始位置开始,查找结束的双引号(") + num_end = json_str.find('"', num_start) + if num_end == -1: + print("未找到数字的结束位置") + return None # 格式异常 + + # 截取数字字符串(从num_start到num_end) + number_str = json_str[num_start:num_end] + + # 转换为整数(如果需要浮点数,可改为float(number_str)) + try: + return int(number_str) + except ValueError: + print("截取的内容不是有效数字") + return None + +def playload_data(data): + print("data = {}".format(data)) + if isinstance(data, bytes) == 0 : + print("data类型错误") + return + + if data[0] != 0xff or data[1] !=0xfe: + print("data格式错误,重新登录") + EventMesh.publish("login_IOT")#登录IOT + return + payload_len_bytes = data [3:5] + payload_len = ustruct.unpack ('H', payload_len_bytes)[0] + # print ("解析到 Payload 长度:{} 字节".format(payload_len)) + + payload = data [5 : 5+ payload_len] + try: + json_str = payload.decode ('utf-8') + except UnicodeDecodeError: + try: + json_str = payload.decode ('gbk') + print ("提示:Payload 使用 GBK 编码") + except UnicodeDecodeError: + print ("Payload 解码失败") + return + # json_str = "\"" + json_str + "\"" + if type(json_str) is str and len(json_str)>5: + print ("解析出的 JSON 字符串:{}".format(json_str) + "-"*50) + if "get_device_state" in json_str: + EventMesh.publish("send_device_information")#发送设备信息 + EventMesh.publish("send_device_VC_state")#上传VC状态 + print("get_device_state") + elif "find_device" in json_str: + EventMesh.publish("play_tts_single","我在这呀,我在这呀") + print("find_device") + elif "renew_device" in json_str:#更新对话模式 重启 + EventMesh.publish("play_tts_single","更新配置中,设备将自动重启") + print("renew_device") + utime.sleep_ms(3000) + EventMesh.publish("Power_off") + elif "switch_volume" in json_str: + volume = int(extract_target_number(json_str)) + print("switch_volume = {}".format(volume)) + EventMesh.publish("update_volume",volume) + elif "switch_brightness" in json_str: + light = int(extract_target_number(json_str))//10 + print("switch_brightness") + EventMesh.publish("set_brightness_level",light) + elif "setup_role" in json_str: + EventMesh.publish("play_tts_open","角色正在切换") + print("setup_role") + EventMesh.publish("load_screen", {"screen": "UI_ai"})#ai画面 + + + # data_dict = ujson.loads(json_str) + # if isinstance(data_dict, dict): + # #下面做小程序下发指令类型判断 + # data = data_dict["cmd"] + # if data is "get_device_state": + # EventMesh.publish("send_device_information")#发送设备信息 + # print("get_device_state") + # elif data is "find_device": + # EventMesh.publish("play_tts_single","我在这呀,我在这呀") + # print("find_device") + # else: + # print("JSON数据不是字典类型") + + + +date_tmp = utime.localtime() +time_tmp = utime.mktime(date_tmp) +MAGIC = (0xfffe).to_bytes(2,"big") +VERSION = (0x01).to_bytes(1,"big")#"03".encode('utf-8') +TYPE = (0x03).to_bytes(1,"big") +DATA_LEN = (0x00000000).to_bytes(4,"big") +#magic+version+type+playload_len+playload +def protocol_send_total_data(data): + MAGIC = (0xfffe).to_bytes(2,"big") + VERSION = (0x01).to_bytes(1,"big")#"03".encode('utf-8') + TYPE = (0x03).to_bytes(1,"big") + HR_JSON = ujson.dumps(data) + GPS_JSON_b = HR_JSON.encode('utf-8') + DATA_LEN = (len(HR_JSON)).to_bytes(4,"big") + heards_infor = b'' + heards_infor = MAGIC+VERSION+TYPE+DATA_LEN+GPS_JSON_b + return heards_infor + +DEFIEN_HR_REPORT_TIME = 5*60 +DEFINE_TIME_COUNT = 5 +DEFIEN_LOCATION_REPORT_TIME = 5 +WEB_CONNECT_MAX_COUNT = 10 #默认重连次数 + +PROJECT_NAME = "JSWM" +PROJECT_VERSION = "1.0.0" +checknet = checkNet.CheckNetwork(PROJECT_NAME, PROJECT_VERSION) +# 设置日志输出级别 +log.basicConfig(level=log.INFO) +socket_log = log.getLogger("SOCKET") +class SockMangager(Abstract): + def __init__(self): + self.thread_buf_size = 8*1024 + self.iot_soc_send_queue = Queue(100) + self.iot_protoclo_recv_id=None + self.connect_timer = osTimer() + self.connect_timer_count = 0 + self.hr_report_timer = osTimer() + self.resolver = None + self.send_device_time = 0 + self.vbat_buf = [] + self.network_state = 0 + self.socket_send_queue_id = None + self.bat_count = 0 + self.reconnect_count = 0 #连续重连次数 默认十次 不过就不重连了 等下一个心跳重连 + self._20S_timer = osTimer() + self._1scnt = 0 + self._5M_timer = osTimer() + self._10Stimer = osTimer() + self.timer_id = 0 + self.start_voice_flag = 0 + self.iot_protocol_client = None + self.login_statu = 0#登陆状态 + self.sock_lock = _thread.allocate_lock() # 初始化锁 + #对话状态,一秒检查一次 + self.last_data = None # 保存上一次的数据状态 + self.current_data = None # 当前数据 + EventMesh.subscribe("REPORT_ALARM_TO_IOT",self.report_alarm_to_iot) + + def report_alarm_to_iot(self,event,msg): + EventMesh.publish(WEB_CMD_ENUM.POST_ALARM_S_CMD,msg) + pass + def usb_event_cb(self, state): + status = state + def post_processor_after_instantiation(self): + EventMesh.subscribe("CHANNEL_IOT_SEND",self.user_send)#发送数据的函数!!重要 + EventMesh.subscribe("GET_IOT_PROTOCOL_CILENT",self.get_IOT_sock) + EventMesh.subscribe("close_socket_timer",self.close_socket_timer) + EventMesh.subscribe("connect_iot_socket",self.connect_iot_socket_cb)#使用socket连接iot平台 + EventMesh.subscribe("login_IOT",self.login_IOT)#登录iot平台 + EventMesh.subscribe("heart_IOT",self.heart_IOt)#心跳包 + EventMesh.subscribe("send_device_information",self.send_device_information)#上报设备信息 + EventMesh.subscribe("send_device_VC_state",self.send_device_VC_state)#上报VC状态 + EventMesh.subscribe("send_unbind_dev_to_iot",self.send_unbind_dev_to_iot)#心跳包定时器开启 + self.reconnect_count = 0 + self.deviceReadState = "" + + # self.connect_timer.start(2000,0,self.iot_connect_timerCb) + + def send_device_information(self,event,msg): + EventMesh.publish("publish_AI_btnInfo",{"func":self.send_packet_iot,"data":WEB_CMD_ENUM.POST_DEVICE_INFOR_S_CMD})#上报设备信息 + def send_device_VC_state(self,event,msg): + EventMesh.publish("publish_AI_btnInfo",{"func":self.send_packet_iot,"data":WEB_CMD_ENUM.POST_DEVICE_STATE_S_CMD})#上报VC状态 + + def send_unbind_dev_to_iot(self,event,msg): + self._5M_timer.start(60000*5,1,self._5M_timer_cb)#更新信息 + self._20S_timer.start(20000,1,self._20S_timer_cb)#重连 + # self._10Stimer.start(50000,1,self._10S_timer_cb) + def _5M_timer_cb(self,*argc): + EventMesh.publish("heart_IOT")#开启IOT心跳包 + EventMesh.publish("send_device_information")#发送设备信息 + pass + + def initialization(self, *args): + pass + def connect_iot_socket_cb(self,event,msg): + self.connect_iot_socket() + def add_support_resolver(self, resolver): + self.resolver = resolver + def hr_report_event(self, *args, **kwargs): + EventMesh.publish("publish_AI_btnInfo",{"func":self.hr_report_event_cb}) #self.connect_iot_websocket() + def hr_report_event_cb(self): + """电池平均值""" + temp = Power.getVbatt() + if self.bat_count < 10: + self.vbat_buf.append(temp) + self.bat_count += 1 + else: + for i in range(9): + self.vbat_buf[i] = self.vbat_buf[i+1] + self.vbat_buf[9] = temp + curr_count = len(self.vbat_buf) + bat_total_value = 0 + for i in range(curr_count): + bat_total_value += self.vbat_buf[i] + bat_total_value = bat_total_value//curr_count#一分钟更新一次电量 10个平均值 + EventMesh.publish("AI_alarm_start") #检查是否有闹钟需要提醒 + # self.alarm_test() + EventMesh.publish("set_curr_battery_level",bat_total_value) + # EventMesh.publish("publish_AI_btnInfo",{"func":self.hr_report_publish_event,"data":0}) + if self.send_device_time < DEFIEN_LOCATION_REPORT_TIME : + self.send_device_time+=DEFINE_TIME_COUNT + else: + device_state=EventMesh.publish("GET_IOT_SEND_CMD",WEB_CMD_ENUM.POST_DEVICE_INFOR_S_CMD) + print("device_information{}".format(device_state)) + # EventMesh.publish(WEB_CMD_ENUM.POST_DEVICE_INFOR_S_CMD,device_state) #上报设备信息 + EventMesh.publish("publish_AI_btnInfo",{"func":self.send_packet_iot,"data":WEB_CMD_ENUM.POST_DEVICE_INFOR_S_CMD})#上报设备信息 + + def iot_connect_timerCb(self,*argc): + self.connect_iot_socket() + + def connect_iot_socket(self): + if EventMesh.publish("get_voice_record_flag") == 1: + EventMesh.publish("stop_voice_record") + print("connect_iot_socket !!!!") + + stagecode, subcode = checknet.wait_network_connected(30) + if stagecode == 3 and subcode == 1: + socket_log.info('Network connection successful!') + + if sim.getStatus() != 1 or self.start_voice_flag == 1:#网络正常 + return + + if self.reconnect_count >= WEB_CONNECT_MAX_COUNT: #重连次数大于10次不在进重连只有下发心跳才重新连接 + return + token = EventMesh.publish("get_dev_token") + # token = "9548860f973bffe39e1679db3110e223cb" + print("token:{}".format(token)) + if self.iot_protocol_client is not None: + print("websocket已连接") + return + try: + if token != None: + self.connect_timer_count = 0 + # #创建一个socket实例 + # self.IOT_sock = usocket.socket(usocket.AF_INET, usocket.SOCK_STREAM) + # try: + # #建立连接 + # self.IOT_sock.connect(('iot.socket.thisiot.com', 7777)) + # #设置为阻塞 + # self.IOT_sock.setblocking(True) + # socket_log.info("IOT 连接建立") + # except Exception as e: + # print("再次连接") + # self.IOT_sock.connect(('iot.socket.thisiot.com', 7777)) + # #设置为非阻塞 + # self.IOT_sock.setblocking(False) + #三代iot websocket连接 + url_t = "ws://wsiot-nocdn.raisound.com/ws-hub/dev/v1?bz-dt={}".format(token) + try: + self.iot_protocol_client=uwebsocket.Client.connect(url_t, debug=True) + print("iot3连接建立") + except Exception as e: + print("再次连接") + self.reconnect_count += 1 + self.iot_protocol_client=uwebsocket.Client.connect(url_t, debug=True) + self.reconnect_count = 0 + # print("self.socket_send_queue_id = {} , self.iot_protoclo_recv_id = {}".format(self.socket_send_queue_id,self.iot_protoclo_recv_id)) + if self.socket_send_queue_id == None: + _thread.stack_size(self.thread_buf_size+8*1024) #_thread.stack_size(16*1024) + self.socket_send_queue_id = _thread.start_new_thread(self.socket_send_queue_thread, ()) + _thread.stack_size(8*1024) + + _thread.stack_size(self.thread_buf_size+8*1024) + self.iot_protoclo_recv_id = _thread.start_new_thread(self.iot_protocol_recv, ()) + _thread.stack_size(8*1024) + + socket_log.info("self.iot_protocol_client thread init!!!!!!!!!") + + + if self.iot_protocol_client is not None: + self.start_voice_flag = 1 + else: + self.start_voice_flag = 0 + + print("self.iot_protocol_client {} self.start_voice_flag:{}".format(self.iot_protocol_client,self.start_voice_flag)) + if self.iot_protocol_client != None: + if self.timer_id == 0: + # self.hr_report_timer.start(DEFINE_TIME_COUNT*1000, 1, self.hr_report_event) + self.timer_id=1 + else: + print("没有token!!!!!!!!!!") + self.connect_timer_count+=1 + if self.connect_timer_count <= 10: + print("IOT重连定时器开启") + self.connect_timer.start(5000,0,self.iot_connect_timerCb) + pass + except Exception as e: + self.iot_protocol_client = None + print("connect_iot_socket error") + def heart_IOt(self,event,msg): + print("heart_IOT.....") + #Header + header = ustruct.pack('>H', 0xFFFE) # 使用大端模式 + #Type + packet_type = ustruct.pack('B', 0x02) + #拼接 + heart_packet = header + packet_type + EventMesh.publish("CHANNEL_IOT_SEND", heart_packet) + # print("心跳发送数据包:{}".format(heart_packet)) + + def send_packet_iot(self,data):#发送数据给iot,data为接口json数据 + if sim.getStatus() != 1 or self.start_voice_flag == 1:#网络正常 + return + #Header + header = ustruct.pack('>H', 0xFFFE) # 使用大端模式 + #Type + packet_type = ustruct.pack('B', 0x03) + #字典转为json字符串 + json_str = EventMesh.publish("GET_IOT_SEND_CMD", data) + json_str = ujson.dumps(json_str) + #字符串转为二进制数据Payload + payload = json_str.encode('utf-8') + #PayloadLen + payloadLen = ustruct.pack('H', len(payload)) + #CRC16(2字节,基于pay字段计算) + crc = self.crc16(payload) + print("crc的长度为{}".format(len(crc))) + #拼接 + full_packet = header + packet_type + payloadLen + payload+ crc + EventMesh.publish("CHANNEL_IOT_SEND", full_packet) + print("发送更新数据包:{}".format(full_packet)) + + def login_IOT(self,event,msg): + print("登录中") + #Header + header = ustruct.pack('>H', 0xFFFE) # 使用大端模式 + #Type + packet_type = ustruct.pack('B', 0x00) + #设备ID + device_id_bytes = modem.getDevImei().encode('utf-8')[:20] # 转为字节并截断到20字节 + device_id = bytes_ljust(device_id_bytes, 20, b'\x00') + #令牌 + token_bytes = EventMesh.publish("get_dev_token").encode('utf-8')[:36] # 转为字节并截断 + token_padded = bytes_ljust(token_bytes, 36, b'\x00') + #拼接 + body = header + packet_type + device_id + token_padded + #CRC16(2字节,基于上述所有字段计算) + crc = self.crc16(body) + # 完整数据包 + full_packet = body + crc + EventMesh.publish("CHANNEL_IOT_SEND", full_packet) + print("登录发送数据包:{}".format(full_packet)) + + + def crc16(self, data): + """计算CRC16校验值(MODBUS RTU模式)""" + crc = 0xFFFF + for byte in data: + crc ^= byte + for _ in range(8): + if crc & 0x0001: + crc >>= 1 + crc ^= 0xA001 + else: + crc >>= 1 + # 返回2字节小端模式 + return ustruct.pack('5: + # if self.iot_protocol_client is not None: + # if self.iot_protocol_client.getsocketsta() != 4: + # print("iot断线重连") + # self.login_statu = 0 + # self.iot_close_therad() + # EventMesh.publish("publish_AI_btnInfo",{"func":self.connect_iot_socket}) + # EventMesh.publish("login_IOT")#登录IOT + # else: + # if self.login_statu == 0: + # pass + # EventMesh.publish("login_IOT")#登录IOT + if self.iot_protocol_client is not None: + print("iot断线重连") + self.login_statu = 0 + self.iot_close_therad() + EventMesh.publish("publish_AI_btnInfo",{"func":self.connect_iot_socket}) + EventMesh.publish("login_IOT")#登录IOT + + self._1scnt = 0 + + + def _10S_timer_cb(self,*argc): + print("主动断线") + self.iot_protocol_client.close() + + def socket_send_queue_thread(self): + while True: + # with self.sock_lock: # 操作Socket前加锁 + data = self.iot_soc_send_queue.get() + if data != None: + try: + if self.iot_protocol_client is not None: + self.iot_protocol_client.send(data) + # EventMesh.debug_log("发送线程") + self.reconnect_count = 0 + else: + EventMesh.publish("publish_AI_btnInfo",{"func":self.connect_iot_socket}) + print("socket关闭退出send线程") + return + EventMesh.debug_log("socket:send data2 len:{}".format(len(data),self.iot_protocol_client)) + except Exception as e: + EventMesh.debug_log("socket:send error") + EventMesh.publish("publish_AI_btnInfo",{"func":self.connect_iot_socket}) + break + + + def iot_protocol_recv(self): + # 配置超时参数,单位:秒 + RECV_TIMEOUT = 30*1000 # 30秒未收到数据则重连 + last_recv_time = utime.time() # 初始化最后一次收到数据的时间 + while True: + # 死循环接收数据 + # with self.sock_lock: # 警告:不能加锁,不然会导致线程超长延时 + try: + data = self.iot_protocol_client.recv() + if isinstance(data, bytes) and len(data)>10: + playload_data(data) + #fffe00010001xxxx + if isinstance(data, bytes) and len(data) == 8:#登录成功 + target_bytes = b'\xff\xfe\x00\x01\x00\x01' + if data[:6] == target_bytes: + self.login_statu = 1#登录成功标志位修改 + socket_log.info("IOT_recv = {} ,len = {}".format(self.bytes_to_hex(data),len(data))) + #检查socket是否已关闭 + if self.iot_protocol_client == None: + print("socket关闭开启重连") + EventMesh.publish("publish_AI_btnInfo",{"func":self.connect_iot_socket}) + return + #超时检查:如果超过设定时间未收到数据,触发重连 + # print("接收时间差 = {}".format(utime.time() - last_recv_time)) + if utime.time() - last_recv_time > RECV_TIMEOUT: + print("超过{}秒未收到数据,触发重连".format(RECV_TIMEOUT)) + # 先关闭现有连接 + if self.iot_protocol_client: + self.iot_protocol_client.close() + # 触发重连 + EventMesh.publish("publish_AI_btnInfo", {"func": self.connect_iot_socket}) + # 重连后短暂延迟再继续循环 + utime.sleep(1) + # 重置超时计时器 + last_recv_time = utime.time() + except Exception as e: + print("cli break") + print("异常是:{}".format(e)) + # EventMesh.publish("connect_iot_websocket_cb") + last_recv_time = utime.time() + EventMesh.publish("publish_AI_btnInfo",{"func":self.connect_iot_socket}) + break + self.iot_protoclo_recv_id =None + def decode_with_multiple_encodings(self, data): + #尝试多种常见编码格式解码,返回第一个成功的结果 + # 常见编码格式列表(按优先级排序,根据实际场景调整) + encodings = ['utf-8', 'gbk', 'latin-1', 'utf-16', 'gb2312'] + + for encoding in encodings: + try: + # 尝试用当前编码解码,errors='strict'严格模式(确保无乱码) + return data.decode(encoding, errors='strict') + except UnicodeDecodeError: + continue # 解码失败,尝试下一种编码 + return None # 所有编码都失败 + + # bytes转十六进制字符串 + def bytes_to_hex(self, data): + #将bytes类型转换为十六进制字符串(如b'\x03\x01' -> '0301') + hex_chars = '0123456789abcdef' + hex_str = '' + for b in data: + # 处理每个字节的高4位和低4位 + hex_str += hex_chars[(b >> 4) & 0x0F] # 高4位 + hex_str += hex_chars[b & 0x0F] # 低4位 + return hex_str + + def iot_send_queue_close(self): + if self.socket_send_queue_id != None: + + if self.iot_soc_send_queue.empty()!=True: + self.iot_soc_send_queue.clear() + try: + _thread.stop_thread(self.socket_send_queue_id) + except Exception as e: + print("iot_send_queue_close !!!!!!!!") + print("iot_send_queue_close 1111!!!!!!!!") + self.socket_send_queue_id = None + + def iot_protoclo_recv_close_therad(self): + if self.iot_protoclo_recv_id != None: + try: + _thread.stop_thread(self.iot_protoclo_recv_id) + except Exception as e: + print("iot_protoclo_recv_close_therad !!!!!!!!") + self.iot_protoclo_recv_id = None + if self.iot_protocol_client != None: + try: + print("关闭socket") + self.iot_protocol_client.close() + except Exception as e: + print("关闭socket失败") + self.iot_protocol_client = None + + + + def iot_close_therad(self): + try: + self.iot_send_queue_close() + except Exception as e: + print("iot_send_queue_close error!!!!!!!!") + + try: + self.iot_protoclo_recv_close_therad() + except Exception as e: + print("iot_protoclo_recv_close_therad error!!!!!!!!") + self.start_voice_flag = 0 + print("iot_close_therad") + + def get_IOT_sock(self,event,msg): + return self.iot_protocol_client + def user_send(self,event,data): + # EventMesh.debug_log("TCP:send data:{}".format(msg)) + # EventMesh.debug_log("TCP:send data:{}".format(msg)) + sim_state = sim.getStatus() + if sim.getStatus() != 1:#网络不正常 + print("无 sim卡") + return + else : + try: + if self.start_voice_flag == 0: #如果关闭了就需要重新再连接 + EventMesh.publish("publish_AI_btnInfo",{"func":self.connect_iot_socket}) + return + if data != None: + if len(data) != 0: + self.iot_soc_send_queue.put(data) + # EventMesh.debug_log("self.socket_send_queue.put:success:{}".format(len(data))) + except Exception as e: + EventMesh.debug_log("self.socket_send_queue.put:ERROR:") + usys.print_exception(e) + + return + sim_state = sim.getStatus() + if sim_state != 1 or self.network_state == 0: #没sim,则不发送 ,没联网 + return + else : + try: + if self.iot_protocol_client != None: + EventMesh.publish("publish_AI_btnInfo",{"func":self.iot_protocol_send_cb,"data":data}) + else: + print("reconnect1 {}".format(data)) + EventMesh.publish("publish_AI_btnInfo",{"func":self.connect_iot_socket}) + + except Exception as e: + print("senc data err reconnect{}".format(data)) + EventMesh.publish("publish_AI_btnInfo",{"func":self.connect_iot_socket}) + + def iot_protocol_send_cb(self,data): + try: + if data != None: + print("socket connect success:{} self.iot_protocol_client:{}".format(data,self.iot_protocol_client)) + if self.iot_protocol_client != None: + self.iot_protocol_client.send(data) + self.reconnect_count = 0 + print("socket send success") + else: + print("reconnect2 {}".format(data)) + # EventMesh.publish("connect_iot_socket_cb") + EventMesh.publish("publish_AI_btnInfo",{"func":self.connect_iot_socket}) + except Exception as e: + print("发送失败 重新连接") + self.reconnect_count+=1 + # EventMesh.publish("connect_iot_socket_cb") + EventMesh.publish("publish_AI_btnInfo",{"func":self.connect_iot_socket}) + +def bytes_ljust(data, length, fill_byte=b'\x00'): + """ + 手动实现bytes的ljust功能:将字节流填充到指定长度,不足部分用fill_byte在右侧填充 + :param data: 原始字节流(bytes) + :param length: 目标长度(int) + :param fill_byte: 填充字节(默认空字节b'\x00') + :return: 填充后的字节流(bytes) + """ + if len(data) >= length: + # 若原始长度已超过目标长度,直接截断到指定长度 + return data[:length] + else: + # 计算需要填充的长度,用fill_byte补齐 + padding = fill_byte * (length - len(data)) + return data + padding + +class NetManager(Abstract): + THRESHOLD = 10 + + def __init__(self): + self.__data_call = dataCall + self.__net = net + self.check_net = checkNet.CheckNetwork("QuecPython_Helios_Framework", "this latest version") + EventMesh.subscribe("get_network_state", self.get_network_state) + self.network_state = 0 + + def post_processor_after_instantiation(self, *args, **kwargs): + count = 0 + while True: + count += 1 + if count > 5 : + return + data = dataCall.getInfo(1, 0) + EventMesh.debug_log("data call INFO {}".format(data)) + if data[2][0]: + self.network_state = 1 + break + utime.sleep(1) + self.__data_call.start(2, 0, "", "", "", 0) + self.__data_call.setCallback(self.__datacall_cb) + + def __datacall_cb(self, args): + pdp = args[0] + nw_sta = args[1] + if nw_sta == 1: + self.network_state = 1 + EventMesh.debug_log("*** network %d connected! ***" % pdp) + + else: + self.network_state = 0 + EventMesh.debug_log("*** network %d not connected! ***" % pdp) + + def get_network_state(self, topic, msg): + return self.network_state + +class ProtoCol(Abstract): + TYPE = "" + HEADER = "#@{}@#;" + SEPARATOR = ";" + END = ";" + chr(0x01) + #PID = "SZKW" + #PID = "qAELPTKmFanR4RHe" + md5_key = '' + PID = '' + + def __init__(self): + self.content = None + self.check_sum = None + self.password = EventMesh.publish(constants.EVENT.GET_PASSWORD) + self.imei = EventMesh.publish(constants.EVENT.GET_IMEI) + self.cid = EventMesh.publish(constants.EVENT.GET_CID) + self.imsi = EventMesh.publish(constants.EVENT.GET_IMSI) + self.key = EventMesh.publish(constants.EVENT.GET_KEY) + self.HEADER = self.HEADER.format(self.TYPE) + + self.md5_key = '' + self.PID = '' + server_data = EventMesh.publish("get_new_key_pid")#获取pid和key + if server_data == None: + server_data = server_init()#如果获取的数据是None,就用默认的大锤key和pid + self.md5_key = server_data[2] + self.PID = server_data[3] + else: + self.md5_key = server_data[0] + self.PID = server_data[1] + + # EventMesh.debug_log("md5_key:--",self.md5_key,self.PID) + # ip_infor = {} + # ip_infor = EventMesh.publish("get_new_ip_com") + # if ip_infor != None: + # self.md5_key = ip_infor[2] + # EventMesh.debug_log("md5_key",self.md5_key) + + def initialization(self, *args, **kwargs): + EventMesh.subscribe(self.TYPE + "_SEND", self.handler) + EventMesh.subscribe(self.TYPE + "_RECV", self.handler) + #EventMesh.debug_log("ProtoCol:{}".format(self.TYPE + "_SEND")) + + def handler(self, event, msg): + #EventMesh.debug_log("ProtoCol:handler:{}".format(event)) + self.password = EventMesh.publish(constants.EVENT.GET_PASSWORD) + self.imei = EventMesh.publish(constants.EVENT.GET_IMEI)#"867387060319166"#EventMesh.publish(constants.EVENT.GET_IMEI)#"867387060319166" #EventMesh.publish(constants.EVENT.GET_IMEI)#"867387060319166"#EventMesh.publish(constants.EVENT.GET_IMEI) #"867387060319166"#EventMesh.publish(constants.EVENT.GET_IMEI) #"867387060319166"#"867387060319188"#"867387060319177"#"867387060319166"#"860132060004322"#"867387060319166"#"860132060004322"#EventMesh.publish(constants.EVENT.GET_IMEI) + self.cid = EventMesh.publish(constants.EVENT.GET_CID) + self.imsi = EventMesh.publish(constants.EVENT.GET_IMSI) + self.key = EventMesh.publish(constants.EVENT.GET_KEY) + if event.endswith("_SEND"): + self.send(event, msg) + else: + self.recv(event, msg) + + def send(self, event, msg): + pass + + def recv(self, event, msg): + pass + + @staticmethod + def get_date(): + return "{:04d}-{:02d}-{:02d}".format(*utime.localtime()[0:3]) + + @staticmethod + def get_time(): + return "{:02d}:{:02d}:{:02d}".format(*utime.localtime()[3:6]) + + def calc_crc(self): + data = self.content + if not isinstance(data, bytes): + data = data.encode() + count = 0 + for x in data: + count += x + self.check_sum = 100 - count % 100 + + def pack(self): + self.calc_crc() + return self.HEADER.encode() + self.content.encode() + self.SEPARATOR.encode() + int(self.check_sum).to_bytes(1,'little') + self.END.encode() + + def pack_MD5_head(self,data): + #key = "bZld0ALsZTt15tKEZhOlLPgbsO75BLTP" + self.md5_key=EventMesh.publish("get_new_key") + if self.md5_key == None: + self.md5_key = server_init[2] + + if(self.md5_key == ""): + return "" + MD5_head = "" + hash_obj = uhashlib.md5(data+self.md5_key) + res = hash_obj.digest() + + # 转成十六进制表示 + MD5_head = ubinascii.hexlify(res) + MD5_head = MD5_head.decode('ascii') + #EventMesh.debug_log("data+self.md5_key:{}".format(data+self.md5_key)) + #EventMesh.debug_log(res) + #EventMesh.debug_log(MD5_head) + return MD5_head +#查找设备 +class IOT_FindDeviceProtoCol(ProtoCol): + """find_device""" + TYPE = "find_device" + + def send(self, event, msg): + # print("send locafind_devicetion{}".format(msg)) + # 通过websocket发送到服务器端 + date_tmp = utime.localtime() + time_tmp = utime.mktime(date_tmp) + find_device = { + "cmd":"dispatch_rest", + "ts":time_tmp, + "msg":"消息收到响应", + "data":{ + "cmd":"find_device", + "rest":"success", + "msg":"收到查找设备指令" + } + } + send_data = b'' + send_data = protocol_send_total_data(find_device) + print("send_data find_device{}".format(send_data)) + EventMesh.publish("CHANNEL_IOT_SEND", send_data) + + def recv(self, event, msg): + """ + + @param event:定位信息下发 + @param msg: 接收到的下行数据 + """ + alarm_TTS_str="在这呢" + base_sentence = "{}".format(alarm_TTS_str) + repeat_sentence = (base_sentence + ",") * 3 # 重复5次并加逗号分隔 + final_sentence = repeat_sentence.rstrip(",") + + EventMesh.publish("play_tts",[final_sentence,1]) #播放tts闹钟文本内容 + print("recv find_device{}".format(msg)) + EventMesh.publish(WEB_CMD_ENUM.FIND_DEVCE_S_CMD) + +#上报设备VC状态 +class IOT_post_device_stateProtoCol(ProtoCol): + """post_device_state""" + TYPE = "post_device_state" + + def send(self, event, msg): + print("send post_device_state{}".format(msg)) + # 通过websocket发送到服务器端 + + send_data = b'' + send_data = protocol_send_total_data(msg) + EventMesh.publish("CHANNEL_IOT_SEND",send_data) + + def recv(self, event, msg): + """ + + @param event:mpost_device_state + @param msg: 接收到的下行数据 + """ + # locate_now = { + # "cmd":"locate_duration", + # "ts":1738283829, + # "msg":"下发定位周期", + # "data":300,0表示关 + # } + print("send post_device_state{}".format(msg)) +class LK_ProtoCol(ProtoCol): + """链路保持""" + TYPE = "LK" + + def send(self, event, msg): + #[SZKW*334588000000156*0002*LK] + #EventMesh.debug_log('self.imei:%s'%(self.imei)) + send_data = EventMesh.publish("get_new_pid")+"*%s*0002*LK"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + # EventMesh.debug_log("LK_ProtoCol:send:%s"%(data)) + + + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) + + def recv(self, event, msg): + """ + + @param event: LK成功 + @param msg: 接收到的下行数据 + """ + EventMesh.debug_log("LK_ProtoCol:recv:%s"%(msg)) + EventMesh.publish(constants.PROTOCOL.PING_SEND) + EventMesh.publish(constants.PROTOCOL.KA_SEND) + EventMesh.publish(constants.PROTOCOL.TIME_SEND) + + EventMesh.publish(constants.EVENT.START_LOCATION,constants.PROTOCOL.UD_SEND) #开始UD定位 + EventMesh.publish(constants.EVENT.START_LOCATION,constants.PROTOCOL.WT_SEND) #开始WT定位 + if EventMesh.model == 'D15': + EventMesh.publish(constants.PROTOCOL.MEMBERS_SEND) + +class PING_ProtoCol(ProtoCol): + """获取绑定状态""" + TYPE = "PING" + + def send(self, event, msg): + #[SZKWT*YYYYYYYYYYYYYYY*LEN*PING] + send_data = EventMesh.publish("get_new_pid")+"*%s*0004*PING"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + #EventMesh.debug_log("PING_ProtoCol:send:%s"%(data)) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) + + def recv(self, event, msg): + """ + + @param event: PING + @param msg: 接收到的下行数据 + """ + #EventMesh.debug_log("PING_ProtoCol:recv:%s"%(msg)) + data_tmp = msg.decode('ascii') + data_tmp = data_tmp.split(']')[0] #去掉] + EventMesh.publish(constants.EVENT.SET_PING, data_tmp.split(',')[1]) + if EventMesh.model == 'D15': + EventMesh.publish(constants.PROTOCOL.JPREG_SEND) + EventMesh.publish(constants.PROTOCOL.MEMBERS_SEND) + +class KA_ProtoCol(ProtoCol): + """心跳""" + TYPE = "KA" + count = 0 + roll_count = 0 + def send(self, event, msg): + #"{:04d}-{:02d}-{:02d}".format(*utime.localtime()[0:3]) + #[XT*YYYYYYYYYYYYYYY*LEN*KA,日期,步数,翻滚次数,电量百分数,车载里程数(km)] 实例:[XT*334588000000156*0014*KA,120414,50,100,100,100.12] + date = "{:04d}{:02d}{:02d}".format(*utime.localtime()[0:3]) + date = date[2:] + #EventMesh.debug_log("date:",date) + #步数 + old_step = 0 + step = 0 + step = EventMesh.publish("get_old_step_value") + if step != None: + if step != 0: + read_data = EventMesh.publish("get_storage_config","old_step_new") + if read_data != None: + old_step = read_data + + if old_step != step: + # EventMesh.debug_log("old_step:send:%d %d"%(old_step,step)) + EventMesh.publish("set_storage_config",["old_step_new",step+10]) + EventMesh.publish("set_storage_config",["old_step_new",step]) + + old_step = step + # step = EventMesh.publish(constants.EVENT.GET_STEP)[0] + # 电池电量百分比 + + bat_tmp = EventMesh.publish("screen_get_battery") + sleep_time = EventMesh.publish("get_storage_config","sleep_time") + if sleep_time != None: + if len(sleep_time) != 0: + hour = utime.localtime()[3] + min = utime.localtime()[4] + cur_time = hour*60+min + start_hour = int(sleep_time["start_hour"]) + start_min = int(sleep_time["start_min"]) + start_total = start_hour*60+start_min + + end_hour = int(sleep_time["end_hour"]) + end_min = int(sleep_time["end_min"]) + end_total = end_hour*60+end_min + # EventMesh.debug_log("ka roll_:",hour,min,cur_time,start_total,end_total) + if cur_time >= start_total and cur_time <= end_total: + self.roll_count = int(hour) + if self.roll_count == 0: + self.roll_count+=1 + else: + self.roll_count = 0 + else: + self.roll_count = 0 + else: + self.roll_count = 0 + hour = utime.localtime()[3] + min = utime.localtime()[4] + EventMesh.txt_log("ka step:{} hour:{} min:{}".format(step,hour,min)) + + battery_caption = bat_tmp[1] + send_data = "KA,%s,%d,%d,%d"%(date,step,self.roll_count,battery_caption) + send_len = len(send_data) + + send_data = EventMesh.publish("get_new_pid")+"*%s*%04X*%s"%(self.imei,send_len,send_data) + MD5_head_data = EventMesh.publish("get_new_pid")+"*%s*%04X*%s"%(self.imei,send_len,"KA") + + MD5_SIGN = self.pack_MD5_head(MD5_head_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + #EventMesh.debug_log("KA_ProtoCol:send:%s"%(data)) + + + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) + + def recv(self, event, msg): + """ + + @param event: PING + @param msg: 接收到的下行数据 + """ + #EventMesh.debug_log("KA_ProtoCol:recv:%s"%(msg)) + +class UD_ProtoCol(ProtoCol): + """位置信息""" + TYPE = "UD" + UD_count = 0#每6次定位获取一次天气数据 + def send(self, event, msg): + #EventMesh.debug_log("UD:send:%s"%(msg)) + #"{:04d}-{:02d}-{:02d}".format(*utime.localtime()[0:3]) + #[6f62cfc40fc50173f9a7b21e87be3424IS*861217001020120*00f6*UD,220726,211210,A,22.649529,N,114.119165,E,0.28,137.4,100.0,8,24,63,119,0,00000000,2,1,460,11,30472,125667122,24,30472,218944048,19,4, + # wifi0,34:93:44:01:28:b9,-74,wifi1,34:20:03:96:35:ad,-78,wifi2,ea:b5:7b:e8:56:54,-80,wifi3,c4:49:bb:d4:d9:78,-88] + + + self.UD_count+=1 + #每6次定位获取一次天气数据 + if self.UD_count>=6: + self.UD_count = 0 + EventMesh.publish(constants.PROTOCOL.WT_SEND,msg) + + send_data ="UD,"+msg + send_len = len(send_data) + #wt_data = "%s"%(send_data) + send_data = EventMesh.publish("get_new_pid")+"*%s*%04X*%s"%(self.imei,send_len,send_data) + MD5_head_data = EventMesh.publish("get_new_pid")+"*%s*%04X*%s"%(self.imei,send_len,"UD") + + MD5_SIGN = self.pack_MD5_head(MD5_head_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + # EventMesh.debug_log("{}".format(data)) + # wt_data = EventMesh.publish("get_weather_data") + # # #如果没有天气数据,则获取天气数据 + # if wt_data != None or wt_data[0] == None : + # + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) + if EventMesh.platform == "gewu": + if(msg != ""): + client = EventMesh.publish("get_mqtt_dev_connect_state") + if client != 0: + mqtt_connect = -1 + try: + mqtt_connect = client.connect() + except Exception as e: + print(e) + mqtt_connect = -1 + print("mqtt_connect:{}".format(mqtt_connect)) + if mqtt_connect == 0: + # 订阅主题 + get_device_id = EventMesh.publish(constants.EVENT.GET_IMEI) + get_deviceKey = EventMesh.publish(constants.EVENT.GET_IMEI) + get_productKey = gewu_init() + #$sys/{productKey}/{deviceKey}/ext/regist + event_msg = "$sys/{}/{}/event/pub_reply".format(get_productKey,get_deviceKey) + # client_msg = "$sys/cu1shld45y4hjr1L/866610001011658/ext/regist" + subscribe_msg = event_msg.encode('ascii') + + client.subscribe(subscribe_msg,0)#订阅事件消息消息主题 + print("Connected to dmp-mqtt.cuiot.cn, subscribed to /public/TEST/quecpython topic") + msg_tmp = msg.decode('ascii') + msg_tmp = msg_tmp.split(',') + longitude = float(msg_tmp[3]) + latitude = float(msg_tmp[5]) + date_tmp = utime.localtime() + time_tmp = utime.mktime(date_tmp)#需要转换成毫秒级别 + updataTime = "{}".format(time_tmp*1000) + data_info = { + "messageId":"0", + "params": { + "key":"location", + "info": [ + { + "key":"longitude", + "value":longitude + }, + { + "key":"latitude", + "value":latitude + }, + { + "key":"UpdateTime", + "value":updataTime + } + ] + } + } + data_json = ujson.dumps(data_info) + event_pub_msg = "$sys/{}/{}/event/pub".format(get_productKey,get_deviceKey) + pub_msg = event_pub_msg.encode('ascii') + client.publish(pub_msg,data_json,0)#publis主题内容 + + print("Publish topic: /public/TEST/quecpython758, msg: my name is Quecpython") + + + + def recv(self, event, msg): + pass + # EventMesh.debug_log("UD_ProtoCol:recv:%s"%(msg)) + +class CR_ProtoCol(ProtoCol): + """立即定位""" + TYPE = "CR" + + def send(self, event, msg): + #[SZKWT*YYYYYYYYYYYYYYY*LEN*PING] + send_data = EventMesh.publish("get_new_pid")+"*%s*0002*CR"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + #EventMesh.debug_log("CR_ProtoCol:send:%s"%(data)) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) + + def recv(self, event, msg): + """ + + @param event: PING + @param msg: 接收到的下行数据 + """ + EventMesh.publish(constants.PROTOCOL.CR_SEND) + EventMesh.publish(constants.EVENT.START_LOCATION,constants.PROTOCOL.UD_SEND) #开始ud定位 + #EventMesh.debug_log("CR_ProtoCol:recv:%s"%(msg)) + +class AL_ProtoCol(ProtoCol): + """报警数据上报""" + TYPE = "AL" + timer_repetition_send = None + repetition_queue = None + + def send(self, event, msg): + if EventMesh.platform != "gewu": + if self.timer_repetition_send == None: + self.timer_repetition_send = osTimer() + if self.repetition_queue == None: + self.repetition_queue = Queue(100) + + + send_data ="AL,"+msg + send_len = len(send_data) + #wt_data = "%s"%(send_data) + send_data = EventMesh.publish("get_new_pid")+"*%s*%04X*%s"%(self.imei,send_len,send_data) + MD5_head_data = EventMesh.publish("get_new_pid")+"*%s*%04X*%s"%(self.imei,send_len,"AL") + + MD5_SIGN = self.pack_MD5_head(MD5_head_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + # EventMesh.debug_log("AL_ProtoCol:send:{}".format(data)) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) + if EventMesh.platform != "gewu": + self.repetition_queue.put(data)#发送入队 + self.timer_repetition_send.start(10000, 1, self.repetition_timer_cb) + EventMesh.publish("set_dev_state",0) + def recv(self, event, msg): + """ + + @param event: PING + @param msg: 接收到的下行数据 + """ + #EventMesh.publish(constants.PROTOCOL.CR_SEND) + #EventMesh.publish(constants.EVENT.START_LOCATION,constants.PROTOCOL.UD_SEND) #开始ud定位 + # print("报警数据上报:recv:%s"%(msg)) + EventMesh.debug_log("报警数据上报:recv:{}".format(msg)) + # + if EventMesh.platform != "gewu": + if self.repetition_queue.empty() == False: + self.repetition_queue.get()#出队 + else: + self.timer_repetition_send.stop() + + def repetition_timer_cb(self, *args, **kwargs):#每隔10秒发送一次 + if self.repetition_queue.empty() == False: + data = self.repetition_queue.get()#出队 + self.repetition_queue.put(data)#发送入队 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) + else: + self.timer_repetition_send.stop() + +class FIND_ProtoCol(ProtoCol): + """查找设备""" + TYPE = "FIND" + + def send(self, event, msg): + #[SZKWT*YYYYYYYYYYYYYYY*LEN*PING] + send_data = EventMesh.publish("get_new_pid")+"*%s*0004*FIND"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + #EventMesh.debug_log("FIND_ProtoCol:send:%s"%(data)) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) + + def recv(self, event, msg): + """ + + @param event: FIND,播放铃声 + @param msg: 接收到的下行数据 + """ + EventMesh.publish(constants.PROTOCOL.FIND_SEND) + # a = audio.Audio(0) + # a.set_pa(Pin.GPIO29) + # a.setVolume(10) + # a.play(1, 1, 'E:/audio_find_haixiu.mp3') #文件名前面要加上路径 + + # EventMesh.publish("load_screen", {"screen": "FIND"}) + EventMesh.publish("OPEN_FIND_WATCH")# + #EventMesh.debug_log("FIND_ProtoCol:recv:%s"%(msg)) + +class POWEROFF_ProtoCol(ProtoCol): + """关机""" + TYPE = "POWEROFF" + + def send(self, event, msg): + # [SZKW*867387060319491*0008*POWEROFF] + send_data = EventMesh.publish("get_new_pid")+"*%s*0008*POWEROFF"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + #EventMesh.debug_log("POWEROFF_ProtoCol:send:%s"%(data)) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) + + def recv(self, event, msg): + """ + + @param event: POWEROFF关机 + @param msg: 接收到的下行数据 + """ + EventMesh.publish(constants.PROTOCOL.POWEROFF_SEND) + #EventMesh.debug_log("POWEROFF_ProtoCol:recv:%s"%(msg)) + battery = EventMesh.publish("screen_get_battery") + if battery != None: + if battery[0] != "1": + EventMesh.publish("open_power_on", 2)# #远程关机 + +class PHL_ProtoCol(ProtoCol): + """电话本同步""" + TYPE = "PHL" + + + def send(self, event, msg): + # [SZKW*867387060319491*0008*PHL] + send_data = EventMesh.publish("get_new_pid")+"*%s*0003*PHL"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + #EventMesh.debug_log("POWEROFF_ProtoCol:send:%s"%(data)) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) + + def recv(self, event, msg): + """ + + @param event: 电话本同步 + @param msg: 接收到的下行数据 + """ + msg = msg[1:-1] + # EventMesh.debug_log("phonebook:msg:%s\r\n"%msg) + msg_tmp = msg.decode('ascii') + msg_tmp = msg_tmp.split(',') + # EventMesh.debug_log("phonebook:len:{}\r\n data:{}".format(len(msg_tmp),msg_tmp)) + + phonebook = {} + msg_tmp = msg_tmp[1:] + + j = 0 + i = 0 + phonebook_oldtmp = {} + # 0 1 2 3 + for phonebook_tmp in msg_tmp: + j+=1 + # EventMesh.debug_log("phonebook_tmp:{} len:{}".format(phonebook_tmp,len(phonebook_tmp))) + + if (j%2) == 0: + i+=1 + if len(phonebook_tmp) != 0: + phonebook_name = UnicodeHexStr_To_Utf8Str(phonebook_tmp) + phonebook_name = "{}:{}".format("%03d"%i,phonebook_name) + phonebook[phonebook_name] = phonebook_oldtmp + + phonebook_oldtmp = phonebook_tmp + # EventMesh.debug_log("phonebook_oldtmp!!!:{}".format(str(phonebook_oldtmp))) + # EventMesh.debug_log("phonebook!!!:{}".format(str(phonebook))) + with open("/usr/static/storage_file/phonebook.json","w",encoding="utf-8") as fd: + ujson.dump(phonebook,fd) + EventMesh.debug_log("创建电话簿") + + EventMesh.publish(constants.PROTOCOL.PHL_SEND) + EventMesh.publish("set_phonebook_list",[1,phonebook]) + EventMesh.publish("contact_updata_list_show") + + +class WT_ProtoCol(ProtoCol): + """天气数据""" + TYPE = "WT" + WT_T = 0 + + def send(self, event, msg): + # [SZKW*867387060319491*0008*WT] + # if self.WT_T != 0: + # tmp_WT = + if(msg != ""): + msg_tmp = "WT," + msg + data_len = len(msg_tmp) + MD5_head_data = EventMesh.publish("get_new_pid")+"*%s*%04X*WT"%(self.imei,data_len) + MD5_SIGN = self.pack_MD5_head(MD5_head_data) + send_data = EventMesh.publish("get_new_pid")+"*%s*%04X*%s"%(self.imei,data_len,msg_tmp) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + EventMesh.debug_log("WT_ProtoCol:send:%s"%(data)) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) + + def recv(self, event, msg): + """ + + @param event: T天气温度数据下发 + @param msg: 接收到的下行数据 + """ + # b'SZKW*860132060004322*0035*WT,23-04-06,14:41:06,b6e0d4c6,1,27,-1,40,6DF157335E02' + msg = msg[1:-1] + msg_tmp = msg.decode('ascii') + msg_tmp = msg_tmp.split('WT,') + # EventMesh.debug_log("phonebook:len:{}\r\n data:{}".format(len(msg_tmp),msg_tmp)) + msg_tmp = str(msg_tmp[1]) + + # EventMesh.debug_log("msg_tmp :%s"%(msg_tmp)) + + msg_date = msg_tmp.split(',')[0] + + msg_time = msg_tmp.split(',')[1] + msg_weather_content = msg_tmp.split(',')[2] + msg_type = msg_tmp.split(',')[3] + msg_temp = msg_tmp.split(',')[4] + msg_min_temp = msg_tmp.split(',')[5] + msg_max_temp = msg_tmp.split(',')[6] + msg_city = msg_tmp.split(',')[7] + + msg_city = UnicodeHexStr_To_Utf8Str(msg_city) + msg_weather_content = UnicodeHexStr_To_Utf8Str(msg_weather_content) + # EventMesh.debug_log("msg_date:{} msg_time:{} msg_weather_content:{} msg_type:{} msg_temp:{} msg_min_temp:{} msg_max_temp:{} msg_city:{}".format(msg_date,msg_time,\ + # msg_weather_content,msg_type,msg_temp,msg_min_temp,msg_max_temp,msg_city)) + EventMesh.debug_log("WT_ProtoCol RECV msg:%s"%(msg)) + + EventMesh.publish("set_weather_data",[msg_date,msg_time,msg_weather_content,msg_type,msg_temp,msg_min_temp,msg_max_temp,msg_city,1]) + EventMesh.publish("updata_weather_show") +class REMIND_ProtoCol(ProtoCol):#普通闹钟 + """ + + 平台发送: + [XT*YYYYYYYYYYYYYYY*LEN*REMIND,,时间1-开关,时间2-开关,周几] + 实例:[XT*334588000000156*0008*REMIND,,时间1-开关,时间2-开关,周几] + 终端回复: + [XT*YYYYYYYYYYYYYYY*LEN*REMIND] + """ + TYPE = "REMIND" + + def send(self, event, msg): + send_data = EventMesh.publish("get_new_pid")+"*%s*0006*REMIND"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + #Wechat_log("POWEROFF_ProtoCol:send:%s"%(data)) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) + + def recv(self, event, msg): + # SZKW*860132060346475*0013*REMIND_CH_MEDICINE2,4-1 + msg = msg[1:-1] + msg_tmp = msg.decode('ascii') + msg_tmp_new = str(msg_tmp.split('REMIND,')[1]) + msg_tmp_data = str(msg_tmp.split('REMIND')[1]) + count = 0 + for i in str(msg_tmp_data): + # print("i",i) + if i == ",": + count+=1 + + normal_alarm_save = [] + # # ("handler -> b'[SZKW*860132060346475*001C*REMIND,08:00-1-1,,]'",) + # b'[SZKW*860132060346475*001B*REMIND,08:00-1-1,,]'",) + # medicine_alarmday = str(msg_data[4]) + # alarmday=[] + alarm_day = [] + alarm_switch = 0 + + print("count",count,msg_tmp_new) + if count >= 3: + count = 3 + for i in range(0,count):#默认是三个时间多了也不保存 + alarm_day = [] + alarm_data = str(msg_tmp_new.split(',')[i]) + # print("i",i,sleep_data) + if len(alarm_data) != 0: + b = alarm_data.find('-') + if b != -1: + alarm_time = alarm_data.split('-')[0]#-作为分隔符 + alarm_switch = int(alarm_data.split('-')[1])#开关 + alarm_repeat = int(alarm_data.split('-')[2])#是单次还是每天 还是自定义 + + alarm_hour = int(alarm_time.split(":")[0])#时间 + alarm_min = int(alarm_time.split(":")[1])#冒号分隔时间 时 分 + + + if alarm_repeat == 2:#每一天 + alarm_day = [0,1,2,3,4,5,6] + elif alarm_repeat == 3:#自定义 + alarm_day_tmp = alarm_data.split('-')[3]#-作为分隔符 + if len(str(alarm_day_tmp)) != 0: + for i in range(0,7): + if alarm_day_tmp[i] != '0': + alarm_day.append(i) + else:#单次 1 + alarm_day=[] + if alarm_switch != 0: + normal_alarm_save.append({"hour":alarm_hour,"min":alarm_min,"day":alarm_day,"enable":alarm_switch}) + + EventMesh.publish("set_storage_config",["normal_alarm",normal_alarm_save]) + # normal_alarm = EventMesh.publish("get_storage_config","normal_alarm") + + # EventMesh.debug_log("recv REMIND_SEND:{} normal_alarm ;{}".format(msg,normal_alarm)) + + EventMesh.publish(constants.PROTOCOL.REMIND_SEND) + EventMesh.publish("clear_normal_alarm") + +class HRSTART_ProtoCol(ProtoCol): + """心率频率数据""" + TYPE = "hrtstart" + + + def send(self, event, msg): + # [SZKW*867387060319491*0008*hrtstart] + send_data = EventMesh.publish("get_new_pid")+"*%s*0008*hrtstart"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + # EventMesh.debug_log("HRSTART_ProtoCol:send:%s"%(data)) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) + + def recv(self, event, msg): + """ + @param event: 心率数据下发 + @param msg: 接收到的下行数据 + """ + # b'SZKW*860132060004322*0035*REMIND,23-04-06,14:41:06,b6e0d4c6,1,27,-1,40,6DF157335E02' + # EventMesh.debug_log("REMIND_ProtoCol RECV msg:%s"%(msg)) + # HRSTART_ProtoCol RECV msg:b'SZKW*860132060004322*000D*hrtstart,7200' msg_:7200 + msg = msg[1:-1] + msg_tmp = msg.decode('ascii') + msg_tmp = msg_tmp.split(',') + msg_tmp = msg_tmp[1] + EventMesh.debug_log("HRSTART_ProtoCol RECV msg:{} msg_:{}".format(msg,msg_tmp)) + hrTotal = int(msg_tmp) + if hrTotal == 1:#单次测量 + EventMesh.debug_log("HRSTART_ 2".format(hrTotal)) + get_hr_state = EventMesh.publish("get_hr_state") + get_spo2_state = EventMesh.publish("get_spo2_state") + get_bp_state = EventMesh.publish("get_bp_state") + get_bg_state = EventMesh.publish("get_bg_state") + # if (get_hr_state == 3 ) or (get_spo2_state == 0 and get_hr_state == 0):#只要两个不在测量 单次优先级最低 + if (get_spo2_state == 0 and get_hr_state == 0 and get_bg_state == 0 and get_bp_state == 0): + battery = EventMesh.publish("screen_get_battery") + if battery != None: + if battery[0] != "1": + EventMesh.publish("set_hr_state",3)#3代表单次测量 + pass + else: + if hrTotal > 0 and hrTotal <= 300: + hrTotal = 300 + elif hrTotal >= 65536: + hrTotal = 65536 + EventMesh.debug_log("HRSTART_ 3".format(hrTotal)) + on = 0 + if hrTotal != 0: + on = 1 + EventMesh.publish("set_time_hr",[on,hrTotal]) + + + EventMesh.publish(constants.PROTOCOL.HRTSTART_SEND) + +class HEART_ProtoCol(ProtoCol): + """心率数据""" + TYPE = "heart" + + + def send(self, event, msg): + # [SZKW*334588000000156*len*heart,x] + # EventMesh.debug_log("HEART:send:{}".format(msg)) + len_size = len(str(msg))+len("heart,") + send_data = EventMesh.publish("get_new_pid")+"*%s*%04X*heart"%(self.imei,len_size) + MD5_head_data = EventMesh.publish("get_new_pid")+"*%s*%04X*%s"%(self.imei,len_size,"heart") + MD5_SIGN = self.pack_MD5_head(MD5_head_data) + data = "[%s%s,%d]"%(str(MD5_SIGN),send_data,msg) + # EventMesh.debug_log("HEART_ProtoCol:data:%s"%(data)) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) + + def recv(self, event, msg): + """ + @param event: 心率数据下发 + @param msg: 接收到的下行数据 + """ + # EventMesh.debug_log("HRSTART_ProtoCol RECV msg:") + #EventMesh.publish(constants.PROTOCOL.HEART_SEND) +class OXYGEN_ProtoCol(ProtoCol): + """上传血氧测试数据""" + TYPE = "oxygen" + def send(self, event, msg): + # [SZKW*334588000000156*len*heart,x] + # EventMesh.debug_log("oxstart:send:{}".format(msg)) + len_size = len(str(msg))+len("oxygen,") + send_data = EventMesh.publish("get_new_pid")+"*%s*%04X*oxygen"%(self.imei,len_size) + MD5_head_data = EventMesh.publish("get_new_pid")+"*%s*%04X*%s"%(self.imei,len_size,"oxygen") + MD5_SIGN = self.pack_MD5_head(MD5_head_data) + data = "[%s%s,%d]"%(str(MD5_SIGN),send_data,msg) + # EventMesh.debug_log("HEART_ProtoCol:data:%s"%(data)) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) + + def recv(self, event, msg): + """ + @param event: 心率数据下发 + @param msg: 接收到的下行数据 + """ + # EventMesh.debug_log("HRSTART_ProtoCol RECV msg:") + #EventMesh.publish(constants.PROTOCOL.OXYGEN_SEND) + +class OXYGEN_One_ProtoCol(ProtoCol):#单次测量 + """上传单次测量测试数据""" + TYPE = "oxstart" + +# 终端发送[XT*YYYYYYYYYYYYYYY*LEN*oxygen,x] +# x 表示血氧饱和度 +# 示例[XT*334588000000156*0009*oxygen,15] +# 平台回复:handler -> b'[SZKW*860132060004322*0009*oxstart,1]' +# [XT*334588000000156*0006*oxygen] + def send(self, event, msg): + # [SZKW*334588000000156*len*heart,x] + EventMesh.debug_log("oxstart:") + send_data = EventMesh.publish("get_new_pid")+"*%s*0007*oxstart"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + # EventMesh.debug_log("HEART_ProtoCol:data:%s"%(data)) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) + + def recv(self, event, msg): + """ + @param event: 血氧单次测量下发 + @param msg: 接收到的下行数据 + """ + EventMesh.debug_log("oxstart:{}".format(msg)) + msg = msg[1:-1] + msg_tmp = msg.decode('ascii') + msg_tmp = msg_tmp.split(',') + msg_tmp = msg_tmp[1] + + oxstartTotal = int(msg_tmp) + # oxstartTotal = 300 + print("oxstartTotal:{}".format(oxstartTotal)) + if oxstartTotal == 1:#单次测量 + get_bp_state = EventMesh.publish("get_bp_state") + get_hr_state = EventMesh.publish("get_hr_state") + get_spo2_state = EventMesh.publish("get_spo2_state") + get_bg_state = EventMesh.publish("get_bp_state") + print("get_bp_state:{}".format(get_bp_state)) + if get_bp_state == 0 and get_hr_state == 0 and get_spo2_state == 0 and get_bg_state == 0:#只要两个不在测量 单次优先级最低 + battery = EventMesh.publish("screen_get_battery") + if battery != None: + if battery[0] != "1": + EventMesh.publish("set_spo2_state",3)#3代表单次测量 + else: + if oxstartTotal > 0 and oxstartTotal <= 300: + oxstartTotal = 300 + elif oxstartTotal >= 65536: + oxstartTotal = 65536 + + # if oxstartTotal == 0:#关闭自动测量 + # EventMesh.debug_log("bpSTART_ 1") + # EventMesh.publish("set_spo2_time",[0,0]) + # else: + on = 0 + if oxstartTotal != 0: + on = 1 + EventMesh.publish("set_spo2_time",[on,oxstartTotal]) + + EventMesh.publish(constants.PROTOCOL.OXSTART_SEND) + +class TEMP_ProtoCol(ProtoCol): + """上传体温测试数据""" + TYPE = "temp" + def send(self, event, msg): + # [SZKW*334588000000156*len*heart,x] + # EventMesh.debug_log("temp:send:{}".format(msg)) + len_size = len(str(msg[0]))+len("temp,")+1+len(str(msg[1])) + EventMesh.debug_log("temp:send:{} len:{}".format(msg,len_size)) + # 实例:[XT*334588000000156*0009*temp,36.2] + # 代表终端的温度为:36.2 + # 平台回复: + # [XT*334588000000156*0004*temp] + send_data = EventMesh.publish("get_new_pid")+"*%s*%04X*temp"%(self.imei,len_size) + MD5_head_data = EventMesh.publish("get_new_pid")+"*%s*%04X*%s"%(self.imei,len_size,"temp") + MD5_SIGN = self.pack_MD5_head(MD5_head_data) + data = "[%s%s,%d.%d]"%(str(MD5_SIGN),send_data,msg[0],msg[1]) + # EventMesh.debug_log("temp:data:%s"%(data)) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) + + def recv(self, event, msg): + """ + @param event: + @param msg: 接收到的下行数据 + """ + # EventMesh.debug_log("HRSTART_ProtoCol RECV msg:") + #EventMesh.publish(constants.PROTOCOL.TEMP_SEND) + +class WDSTART_ProtoCol(ProtoCol): + """上传体温频率""" + TYPE = "wdstart" + def send(self, event, msg): + #[XT*334588000000156*len*wdstart,300] + send_data = EventMesh.publish("get_new_pid")+"*%s*0007*wdstart"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + # EventMesh.debug_log("temp:data:%s"%(data)) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) + + def recv(self, event, msg): + """ + @param event: 体温下发频率数据 + @param msg: 接收到的下行数据 + """ + # EventMesh.debug_log("WDSTART_ProtoCol RECV msg:") + EventMesh.debug_log("wdstart:{}".format(msg)) + msg = msg[1:-1] + msg_tmp = msg.decode('ascii') + msg_tmp = msg_tmp.split(',') + msg_tmp = msg_tmp[1] + + tempTotal = int(msg_tmp) + EventMesh.debug_log("tempTotal:{}".format(tempTotal)) + if tempTotal == 1:#单次测量 + get_temp_state = EventMesh.publish("get_temp_state") + EventMesh.debug_log("get_temp_state:{}".format(get_temp_state)) + if get_temp_state == 0:#只要两个不在测量 单次优先级最低 + battery = EventMesh.publish("screen_get_battery") + if battery != None: + if battery[0] != "1": + EventMesh.publish("set_temp_state",3)#3代表单次测量 + else: + if tempTotal > 0 and tempTotal <= 300: + tempTotal = 300 + elif tempTotal >= 65536: + tempTotal = 65536 + + EventMesh.publish("set_temp_time",tempTotal) + + + + EventMesh.publish(constants.PROTOCOL.WDSTART_SEND) +#解绑 +# 设置血压上传频率 +# 平台发送[XT*YYYYYYYYYYYYYYY*LEN*bldstart,x] +# x为上传间隔时间,单位秒,连续上传时最小时间不小于300秒,最大不超过65535. +# 示例[XT*334588000000156*0008*bldstart,300] +# 终端回复: +# [XT*334588000000156*0005*bldstart] +# x为1则代表终端单次上传。 +# x为0则代表终端上传关闭。 +class bldstart_ProtoCol(ProtoCol): + """app下发血压测试频率""" + TYPE = "bldstart" + def send(self, event, msg): + #[XT*334588000000156*len*wdstart,300] + send_data = EventMesh.publish("get_new_pid")+"*%s*0008*bldstart"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + # print("temp:data:%s"%(data)) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) + + def recv(self, event, msg): + """ + @param event: 体温下发频率数据 + @param msg: 接收到的下行数据 + """ + # print("WDSTART_ProtoCol RECV msg:") + print("bldstart:{}".format(msg)) + msg = msg[1:-1] + msg_tmp = msg.decode('ascii') + msg_tmp = msg_tmp.split(',') + msg_tmp = msg_tmp[1] + + bldstartTotal = int(msg_tmp) + # bldstartTotal = 300 + print("bldstartTotal:{}".format(bldstartTotal)) + if bldstartTotal == 1:#单次测量 + get_bp_state = EventMesh.publish("get_bp_state") + get_hr_state = EventMesh.publish("get_hr_state") + get_spo2_state = EventMesh.publish("get_spo2_state") + get_bg_state = EventMesh.publish("get_bg_state") + print("get_bp_state:{}".format(get_bp_state)) + if get_bp_state == 0 and get_hr_state == 0 and get_spo2_state == 0 and get_bg_state == 0:#只要两个不在测量 单次优先级最低 + battery = EventMesh.publish("screen_get_battery") + if battery != None: + if battery[0] != "1": + EventMesh.publish("set_bp_state",3)#3代表单次测量 + else: + if bldstartTotal > 0 and bldstartTotal <= 300: + bldstartTotal = 300 + elif bldstartTotal >= 65536: + bldstartTotal = 65536 + + on = 0 + if bldstartTotal != 0:#关闭自动测量 + on = 1 + print("on:{} bldstartTotal:{} ".format(on,bldstartTotal)) + EventMesh.publish("set_bp_time",[on,bldstartTotal]) + + EventMesh.publish(constants.PROTOCOL.BLDSTART_SEND) + + +# 注:回复完后开始测量血压并上传(一般测一次90秒,app端会提醒用户两分钟后刷新页面查看) +# 上传血压数据 +# 终端发送[XT*YYYYYYYYYYYYYYY*LEN*blood,x,y] +# x 是收缩压(高压) +# y 是舒张压(低压) +# 示例[XT*334588000000156*000C*blood,150,70] +# 平台回复: +# [XT*334588000000156*0005*blood] +class blood_ProtoCol(ProtoCol): + """上传血压测试数据""" + TYPE = "blood" + def send(self, event, msg): + len_size = len(str(msg[0]))+len("blood,")+1+len(str(msg[1])) + print("blood:send:{} len:{}".format(msg,len_size)) + # 实例:[XT*334588000000156*0009*blood,36,2] + # 代表终端的 + # 平台回复: + # [XT*334588000000156*0004*blood] + send_data = EventMesh.publish("get_new_pid")+"*%s*%04X*blood"%(self.imei,len_size) + MD5_head_data = EventMesh.publish("get_new_pid")+"*%s*%04X*%s"%(self.imei,len_size,"blood") + MD5_SIGN = self.pack_MD5_head(MD5_head_data) + data = "[%s%s,%d,%d]"%(str(MD5_SIGN),send_data,msg[0],msg[1]) + print("blood:data:%s"%(data)) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) + + def recv(self, event, msg): + """ + @param event: + @param msg: 接收到的下行数据 + """ + # print("HRSTART_ProtoCol RECV msg:") + #EventMesh.publish(constants.PROTOCOL.TEMP_SEND) + + + + +# 设置血糖上传频率 +# 平台发送: +# [XT*334588000000156*len*bgstart,x] +# x为上传间隔时间,单位秒,连续上传时最小时间不小于300秒,最大不超过65535. +# 实例:[XT*334588000000156*len*bgstart,300] +# 终端会每隔300秒检测一次 + +# x为1则代表终端单次上传。 +# x为0则代表终端上传关闭。 +class bgstart_ProtoCol(ProtoCol): + """app下发血糖测试频率""" + TYPE = "bgstart" + def send(self, event, msg): + #[XT*334588000000156*len*wdstart,300] + send_data = EventMesh.publish("get_new_pid")+"*%s*0007*bgstart"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + # print("temp:data:%s"%(data)) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) + + def recv(self, event, msg): + """ + @param event: 体温下发频率数据 + @param msg: 接收到的下行数据 + """ + # print("WDSTART_ProtoCol RECV msg:") + print("bgstart:{}".format(msg)) + msg = msg[1:-1] + msg_tmp = msg.decode('ascii') + msg_tmp = msg_tmp.split(',') + msg_tmp = msg_tmp[1] + + bgstartTotal = int(msg_tmp) + print("bgstartTotal:{}".format(bgstartTotal)) + if bgstartTotal == 1:#单次测量 + get_bp_state = EventMesh.publish("get_bp_state") + get_hr_state = EventMesh.publish("get_hr_state") + get_spo2_state = EventMesh.publish("get_spo2_state") + get_bg_state = EventMesh.publish("get_bg_state") + print("get_bg_state:{}".format(get_bg_state)) + if get_bp_state == 0 and get_hr_state == 0 and get_spo2_state == 0 and get_bg_state == 0:#只要两个不在测量 单次优先级最低 + battery = EventMesh.publish("screen_get_battery") + if battery != None: + if battery[0] != "1": + EventMesh.publish("set_bg_state",3)#3代表单次测量 + else: + if bgstartTotal > 0 and bgstartTotal <= 300: + bgstartTotal = 300 + elif bgstartTotal >= 65536: + bgstartTotal = 65536 + + # if bgstartTotal == 0:#关闭自动测量 + # EventMesh.debug_log("bgSTART_ 1") + # EventMesh.publish("set_bgauto_time",[0,0]) + # else: + on = 0 + if bgstartTotal != 0: + on = 1 + EventMesh.publish("set_bgauto_time",[on,bgstartTotal]) + + EventMesh.publish(constants.PROTOCOL.BGSTART_SEND) + +# 上传血糖数据 +# 终端发送[XT*YYYYYYYYYYYYYYY*LEN*bloodglucose,x] +# x 表示血糖,单位mmol/L +# 示例[XT*334588000000156*0010*bloodglucose,6.1] +# 平台回复: +# [XT*334588000000156*000B*bloodglucose] +class bloodglucose_ProtoCol(ProtoCol): + """上传血糖测试数据""" + TYPE = "bloodglucose" + def send(self, event, msg): + len_size = len("bloodglucose,")+1+len(str(msg)) + print("bloodglucose:send:{} len:{}".format(msg,len_size)) + # 实例:[XT*334588000000156*0009*blood,36,2] + # 代表终端的 + # 平台回复: + # [XT*334588000000156*0004*blood] + send_data = EventMesh.publish("get_new_pid")+"*%s*%04X*bloodglucose"%(self.imei,len_size) + MD5_head_data = EventMesh.publish("get_new_pid")+"*%s*%04X*%s"%(self.imei,len_size,"bloodglucose") + MD5_SIGN = self.pack_MD5_head(MD5_head_data) + data = "[%s%s,%s]"%(str(MD5_SIGN),send_data,msg) + print("bloodglucose:data:%s"%(data)) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) + + def recv(self, event, msg): + """ + @param event: + @param msg: 接收到的下行数据 + """ + # print("HRSTART_ProtoCol RECV msg:") + #EventMesh.publish(constants.PROTOCOL.TEMP_SEND) + +# [XT*334588000000156*0003*DLT] +def reset_factory(msg): + if msg == 1: + Power.powerRestart() +class DLT_ProtoCol(ProtoCol): + """解绑数据""" + TYPE = "DLT" + def send(self, event, msg): + # [XT*334588000000156*0004*temp] + send_data = EventMesh.publish("get_new_pid")+"*%s*0003*DLT"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + EventMesh.debug_log("temp:data:%s"%(data)) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) + + def recv(self, event, msg): + """ + @param event: + @param msg: 接收到的下行数据 + """ + # EventMesh.debug_log("DLT_ProtoCol RECV msg:") + + +#定位频率 +class UPLOAD_ProtoCol(ProtoCol): + """定位频率数据""" + TYPE = "UPLOAD" + def send(self, event, msg): + # [XT*334588000000156*0004*temp] + send_data = EventMesh.publish("get_new_pid")+"*%s*0006*UPLOAD"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) + + def recv(self, event, msg): + """ + @param event: + @param msg: 接收到的下行数据 + """ + # b'[SZKW*867387060319166*000A*UPLOAD,600]' + # EventMesh.debug_log("DLT_ProtoCol RECV msg:".format(msg)) + msg = msg[1:-1] + msg_tmp = msg.decode('ascii') + msg_tmp = msg_tmp.split(',') + msg_tmp = msg_tmp[1] + upload_time = int(msg_tmp) + EventMesh.publish("set_storage_config",["upload_time",upload_time]) + + EventMesh.publish("set_upload_data", upload_time) + EventMesh.publish(constants.PROTOCOL.UPLOAD_SEND) + +#设置快捷号码 +class CENTER_ProtoCol(ProtoCol): + """设置快捷号码""" + TYPE = "CENTER" + def send(self, event, msg): + # [XT*334588000000156*0004*temp] + send_data = EventMesh.publish("get_new_pid")+"*%s*0006*CENTER"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + EventMesh.debug_log("UPLOAD:data:%s"%(data)) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) + + def recv(self, event, msg): + """ + @param event: + @param msg: 接收到的下行数据 + """ + # b'[SZKW*867387060319166*000A*UPLOAD,600]' + # EventMesh.debug_log("DLT_ProtoCol RECV msg:".format(msg)) + msg = msg[1:-1] + msg_tmp = msg.decode('ascii') + msg_tmp = msg_tmp.split(',') + msg_tmp = msg_tmp[1] + EventMesh.debug_log("CENTER_ProtoCol RECV msg:{} msg_:{}".format(msg,msg_tmp)) + center_dial = str(msg_tmp) + EventMesh.publish("set_storage_config",["center_dial",center_dial]) + EventMesh.publish(constants.PROTOCOL.CENTER_SEND) + +#呼叫快捷电话号码 +import voiceCall +class MONITOR_ProtoCol(ProtoCol): + """呼叫快捷号码""" + TYPE = "MONITOR" + def send(self, event, msg): + # [XT*334588000000156*0004*MONITOR] + send_data = EventMesh.publish("get_new_pid")+"*%s*0007*MONITOR"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + EventMesh.debug_log("MONITOR:data:%s"%(data)) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) + + def recv(self, event, msg): + """ + @param event: + @param msg: 接收到的下行数据 + """ + # b'[SZKW*867387060319166*000A*MONITOR]' + msg = msg[1:-1] + msg_tmp = msg.decode('ascii') + msg_tmp = msg_tmp.split('MONITOR') + msg_tmp = msg_tmp[1] + EventMesh.debug_log("MONITOR_ProtoCol RECV msg:{} msg_:{}".format(msg,len(msg_tmp))) + if len(msg_tmp) != 0: + EventMesh.publish("save_phonename", contact) + EventMesh.publish("save_phonenum", contact) + EventMesh.publish("dial_out_call_center_cb",contact)#电话拨出去 + else: + read_data = EventMesh.publish("get_storage_config","center_dial") + EventMesh.debug_log("MONITOR:data:%s"%(read_data)) + if read_data != None: + contact = read_data + if len(contact) > 0: + EventMesh.debug_log("MONITOR RECV msg:{} {}".format(contact,type(contact))) + EventMesh.publish("save_phonename", contact) + EventMesh.publish("save_phonenum", contact) + EventMesh.publish("dial_out_call_center_cb",contact)#电话拨出去 + EventMesh.publish(constants.PROTOCOL.MONITOR_SEND) + +#定时开关机 +class bootoff_ProtoCol(ProtoCol): + """定时开关机""" + TYPE = "BOOTOFF" + def send(self, event, msg): + # [XT*334588000000156*0004*MONITOR] + send_data = EventMesh.publish("get_new_pid")+"*%s*0007*BOOTOFF"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + EventMesh.debug_log("BOOTOFF:data:%s"%(data)) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) + def recv(self, event, msg): + """ + @param event: + @param msg: 接收到的下行数据 + """ + # b'[SZKW*867387060319166*000A*SOS_SEND]' + msg = msg[1:-1] + msg_tmp = msg.decode('ascii') + msg_tmp = msg_tmp.split(',') + on_bt = int(msg_tmp[1]) + start_hour = int(str(msg_tmp[2]).split(":")[0]) + start_min = int(str(msg_tmp[2]).split(":")[1]) + + end_hour = int(str(msg_tmp[3]).split(":")[0]) + end_min = int(str(msg_tmp[3]).split(":")[1]) + + EventMesh.debug_log("BOOTOFF:send data:",on_bt,start_hour,start_min,end_hour,end_min) + poweroff = [] + poweroff.append({"poweroff_on":on_bt,"start_hour":start_hour,"start_min":start_min,"end_hour":end_hour,"end_min":end_min}) + #b'[SZKW*860132060006970*0015*BOOTOFF,1,06:00,23:59]' + EventMesh.publish("set_boot_off_time",poweroff)#设置关机时间 + + EventMesh.publish(constants.PROTOCOL.BOOTOFF_SEND) + + +#sos家庭号码 +class sosHome_dial_ProtoCol(ProtoCol): + """sos家庭号码""" + TYPE = "SOS" + def send(self, event, msg): + # [XT*334588000000156*0004*MONITOR] + send_data = EventMesh.publish("get_new_pid")+"*%s*0003*SOS"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + print("sosHome_dial_ProtoCol:data:%s"%(data)) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) + + def recv(self, event, msg): + """ + @param event: + @param msg: 接收到的下行数据 + """ + + # b'[SZKW*867387060319166*000A*SOS_SEND]' + msg = msg[1:-1] + msg_tmp = msg.decode('ascii') + msg_tmp = msg_tmp.split(',') + + # print("sosHome_dial_ProtoCol:send data :{} {}".format(len(msg_tmp),msg_tmp)) + #b'[SZKW*860132060006970*0015*sosHome_dial_ProtoCol,15521469561,10086,15521469561]' + i = 0 + num = 0 + count = 0 + print("sos msg_tmp",msg_tmp) + if len(msg_tmp) > 4: + num = 3 + else: + num = len(msg_tmp)-1 + data = [] + for i in range(num): + # print("sos:send data :{}".format(msg_tmp[i+1])) + if len(msg_tmp[i+1]) != 0: + EventMesh.publish("set_storage_config",["SOS_NUMBER{}".format(i+1),msg_tmp[i+1]]) + data.append(str(msg_tmp[i+1])) + count+=1 + print("data:{}".format(data)) + EventMesh.publish("set_dial_sos_number",data) + + EventMesh.publish(constants.PROTOCOL.SOS_SEND) + + +# 低电提醒 +#[XT*334588000000156*0008*LOWBAT,1] +class LOWBAT_ProtoCol(ProtoCol): + """低电提醒""" + TYPE = "LOWBAT" + def send(self, event, msg): + # [XT*334588000000156*0006*LOWBAT] + send_data = EventMesh.publish("get_new_pid")+"*%s*0006*LOWBAT"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + EventMesh.debug_log("LOWBAT:data:%s"%(data)) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) + + def recv(self, event, msg): + """ + @param event: + @param msg: 接收到的下行数据 + """ + # b'[SZKW*867387060319166*000A*LOWBAT]' + + msg = msg[1:-1] + msg_tmp = msg.decode('ascii') + msg_tmp = msg_tmp.split(',') + on_bt = msg_tmp[1] + EventMesh.debug_log("LOWBAT:send data:{}".format(on_bt)) + #b'[SZKW*860132060006970*0015*LOWBAT,1,06:00,23:59]' + EventMesh.publish("set_low_bat_btn",on_bt) + EventMesh.publish(constants.PROTOCOL.LOWBAT_SEND) + +# 设置系统时间 +# +class Time_ProtoCol(ProtoCol): + """设置系统时间""" + TYPE = "Time" + def send(self, event, msg): + # + send_data = EventMesh.publish("get_new_pid")+"*%s*0004*Time"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + EventMesh.debug_log("Time:data:%s"%(data)) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) + + def recv(self, event, msg): + """ + @param event: + @param msg: 接收到的下行数据 + """ + # rtc = RTC() + msg = msg[1:-1] + msg_tmp = msg.decode('ascii') + msg_data = msg_tmp.split(',') + + timeSecond = int(msg_data[1]) + #EventMesh.debug_log("type {} timeSecond {}".format((msg_data[1]),timeSecond)) + # timeSecond = 1703001360 + next_alarm_time = utime.localtime(timeSecond) + #EventMesh.debug_log("next_alarm_time",next_alarm_time) + #EventMesh.debug_log("local time",msg) + # machine.RTC().datetime((tm[0], tm[1], tm[2], tm[6], tm[3], tm[4], tm[5], 0)) + + machine.RTC().datetime((next_alarm_time[0],next_alarm_time[1],next_alarm_time[2],next_alarm_time[6],next_alarm_time[3],next_alarm_time[4],next_alarm_time[5],0)) + #next_alarm_time = utime.localtime(old_Timesec)#年月日时分秒星期365中的第几天 + EventMesh.publish("set_rtc_alarm") + #EventMesh.publish(constants.PROTOCOL.TIME_SEND) + + + + +#免打扰 +class SILENCETIME2_ProtoCol(ProtoCol): + """免打扰""" + TYPE = "SILENCETIME2" + def send(self, event, msg): + # [XT*334588000000156*0006*SILENCETIME2] + send_data = EventMesh.publish("get_new_pid")+"*%s*000C*SILENCETIME2"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + # EventMesh.debug_log("KEYBRD:data:%s"%(data)) + # EventMesh.debug_log("SILENCETIME2!!!!!!!!!!!!!",msg) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) + + def recv(self, event, msg): + """ + @param event: + @param msg: 接收到的下行数据 + """ + # b'[SZKW*867387060319166*000A*KEYBRD]' + # EventMesh.debug_log("SILENCETIME2!!!!!!!!!!!!!",msg) + EventMesh.publish(constants.PROTOCOL.SILENCETIME2_SEND) + +#键盘开关 +class KEYBRD_ProtoCol(ProtoCol): + """免打扰""" + TYPE = "KEYBRD" + def send(self, event, msg): + # [XT*334588000000156*0006*SILENCETIME2] + send_data = EventMesh.publish("get_new_pid")+"*%s*0006*KEYBRD"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + # EventMesh.debug_log("KEYBRD:data:%s"%(data)) + # EventMesh.debug_log("KEYBRD!!!!!!!!!!!!!",msg) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) + + def recv(self, event, msg): + """ + @param event: + @param msg: 接收到的下行数据 + """ + # b'[SZKW*867387060319166*000A*KEYBRD]' + # EventMesh.debug_log("KEYBRD!!!!!!!!!!!!!",msg) + EventMesh.publish(constants.PROTOCOL.KEYBRD_SEND) + +class TK_ProtoCol(ProtoCol): + """微聊""" + TYPE = "TK" + + + def send(self, event, msg): + EventMesh.debug_log("TK send:") + if len(str(msg)) == 1: + + len_size = len(str(msg))+len("TK,") + # 实例:[XT*334588000000156*0009*TK,1] + send_data = EventMesh.publish("get_new_pid")+"*%s*%04X*TK"%(self.imei,len_size) + MD5_head_data = EventMesh.publish("get_new_pid")+"*%s*%04X*%s"%(self.imei,len_size,"TK") + MD5_SIGN = self.pack_MD5_head(MD5_head_data) + data = "[%s%s,%d]"%(str(MD5_SIGN),send_data,msg) + EventMesh.debug_log("TK:data:%s"%(data)) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) + else: + # [SZKW*YYYYYYYYYYYYYYY*LEN*TK,AMR 格式音频数据] + #[XT*YYYYYYYYYYYYYYY*LEN*TKS,秒数(十进制),AMR 格式音频数据] + arm_data = msg + # arm_sec = msg[0] + # EventMesh.debug_log("TK_ProtoCol:msgtype:{} arm_sec:{}".format(len(msg[1]),arm_sec)) + + arm = bytearray() + for i in range(len(arm_data)): + if arm_data[i] == 0x7d: + arm.extend(b'\x7d\x01') + elif arm_data[i] == 0x5b : + arm.extend(b'\x7d\x02') + elif arm_data[i] == 0x5d : + arm.extend(b'\x7d\x03') + elif arm_data[i] == 0x2c : + arm.extend(b'\x7d\x04') + elif arm_data[i] == 0x2a : + arm.extend(b'\x7d\x05') + else : + arm.append(arm_data[i]) + + datalen = len(arm) + len("TK,")+1 + #Wechat_log("len(str(arm_sec)):{}".format(len(str(arm_sec))+1)) + send_data = bytearray(EventMesh.publish("get_new_pid")+"*%s*%04X*TK,"%(self.imei,datalen)) + send_data.extend(arm) + MD5_head_data = EventMesh.publish("get_new_pid")+"*%s*%04X*%s"%(self.imei,datalen,"TK") + MD5_SIGN = self.pack_MD5_head(MD5_head_data) + data = bytearray('[') + data.extend(MD5_SIGN) + data.extend(send_data) + data.extend(']') + # EventMesh.debug_log("TK:send data:%s MD5_head_data:%s"%(data,MD5_head_data)) + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) + + + def recv(self, event, msg): + """ + + ("TK_ProtoCol:datalen:{} {} {}".format(wechat_num,MXA_MSG,wechat_recode_list)) + @param event: 微聊 + @param msg: 接收到的下行数据 + [SZKW*860132060004322*20BD*TK,#!AMR...] + """ + #Wechat_log("K_ProtoCol:recv:data:{}".format(msg)) + + msg_tmp = msg.decode('ascii') + str = msg_tmp.split('TK,') + # Wechat_log("TK_ProtoCol:recv:len:{} {} {}".format(len(msg),len(str),msg_tmp.find("#!AMR"))) + + read_AMR_flag = msg_tmp.find("#!AMR") + #EventMesh.debug_log("TK recv:read_AMR_flag:{} ,{}".format(read_AMR_flag,EventMesh.publish("get_wechat_record_flag"))) + # if EventMesh.publish("get_wechat_record_flag") != 1 and read_AMR_flag != -1: #是否是服务器下发音频数据 + if read_AMR_flag != -1: #是否是服务器下发音频数据 + # Wechat_log("TK_ProtoCol:recv:datalen{}".format(len(msg))) + arm_data = bytearray(str[1])#获取amr输出 + get_wechat_data = EventMesh.publish("get_wechat_data") + MXA_MSG = get_wechat_data[0] + wechat_recode_list = get_wechat_data[1] + wechat_num = int(wechat_recode_list["num"]) + # Wechat_log("TK_ProtoCol:datalen:{} {} {}".format(wechat_num,MXA_MSG,wechat_recode_list)) + + if wechat_num >= MXA_MSG: + wechat_num = 0 + if wechat_num == 0: + wechat_num += 1 + elif wechat_num > 0: + wechat_num += 1 + + + EventMesh.debug_log("num_total:datalen:{} {}".format(MXA_MSG,wechat_recode_list)) + wechat_recode_list["%02d"%(wechat_num)] = "read:1" + wechat_recode_list['num'] = wechat_num + EventMesh.publish("set_wechat_data",[MXA_MSG,wechat_recode_list]) + #写语音文件数据 + + # path = "/usr/static/storage_file/wechat.amr" + path = "/usr/static/storage_file/{}.amr".format(wechat_num) + with open(path,"w") as fd: + arm = bytearray() + j = 0 + for i in range(len(arm_data)): + if arm_data[j] == 0x7d and arm_data[j+1] == 0x01: + arm.extend(b'\x7d') + j+=1 + elif arm_data[j] == 0x7d and arm_data[j+1] == 0x02: + arm.extend(b'\x5b') + j+=1 + elif arm_data[j] == 0x7d and arm_data[j+1] == 0x03: + arm.extend(b'\x5d') + j+=1 + elif arm_data[j] == 0x7d and arm_data[j+1] == 0x04: + arm.extend(b'\x2c') + j+=1 + elif arm_data[j] == 0x7d and arm_data[j+1] == 0x05: + arm.extend(b'\x2a') + j+=1 + else : + arm.append(arm_data[j]) + j+=1 + if j >= len(arm_data): + break + fd.write(arm) + EventMesh.publish("recv_wechat_audio")# + EventMesh.publish(constants.PROTOCOL.TK_SEND,1) + EventMesh.debug_log("constants.PROTOCOL.TK_SEND1!!!") + else : + if read_AMR_flag != -1: + EventMesh.publish(constants.PROTOCOL.TK_SEND,0) + +class TKS_ProtoCol(ProtoCol): + """微聊""" + TYPE = "TKS" + + + def send(self, event, msg): + EventMesh.debug_log("TKS send:") + if len(str(msg)) == 1: + len_size = len(str(msg))+len("TKS,") + # 实例:[XT*334588000000156*0009*TK,1] + send_data = EventMesh.publish("get_new_pid")+"*%s*%04X*TKS"%(self.imei,len_size) + MD5_head_data = EventMesh.publish("get_new_pid")+"*%s*%04X*%s"%(self.imei,len_size,"TKS") + MD5_SIGN = self.pack_MD5_head(MD5_head_data) + data = "[%s%s,%d]"%(str(MD5_SIGN),send_data,msg) + EventMesh.debug_log("TKS:data:%s"%(data)) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) + else: + # [SZKW*YYYYYYYYYYYYYYY*LEN*TK,AMR 格式音频数据] + #[XT*YYYYYYYYYYYYYYY*LEN*TKS,秒数(十进制),AMR 格式音频数据] + arm_data = msg[1] + arm_sec = msg[0] + EventMesh.debug_log("TK_ProtoCol:msgtype:{} arm_sec:{}".format(len(msg[1]),arm_sec)) + + arm = bytearray() + for i in range(len(arm_data)): + if arm_data[i] == 0x7d: + arm.extend(b'\x7d\x01') + elif arm_data[i] == 0x5b : + arm.extend(b'\x7d\x02') + elif arm_data[i] == 0x5d : + arm.extend(b'\x7d\x03') + elif arm_data[i] == 0x2c : + arm.extend(b'\x7d\x04') + elif arm_data[i] == 0x2a : + arm.extend(b'\x7d\x05') + else : + arm.append(arm_data[i]) + + datalen = len(arm) + len("TKS,")+len(str(arm_sec))+1 + #Wechat_log("len(str(arm_sec)):{}".format(len(str(arm_sec))+1)) + send_data = bytearray(EventMesh.publish("get_new_pid")+"*%s*%04X*TKS,%d,"%(self.imei,datalen,arm_sec)) + send_data.extend(arm) + MD5_head_data = EventMesh.publish("get_new_pid")+"*%s*%04X*%s"%(self.imei,datalen,"TKS") + MD5_SIGN = self.pack_MD5_head(MD5_head_data) + data = bytearray('[') + data.extend(MD5_SIGN) + data.extend(send_data) + data.extend(']') + # EventMesh.debug_log("TK:send data:%s MD5_head_data:%s"%(data,MD5_head_data)) + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) + + + def recv(self, event, msg): + """ + + ("TK_ProtoCol:datalen:{} {} {}".format(wechat_num,MXA_MSG,wechat_recode_list)) + @param event: 微聊 + @param msg: 接收到的下行数据 + [SZKW*860132060004322*20BD*TK,#!AMR...] + """ + #Wechat_log("K_ProtoCol:recv:data:{}".format(msg)) + # EventMesh.debug_log("TK recv:{}".format(msg)) + msg_tmp = msg.decode('ascii') + str = msg_tmp.split('TKS,') + # Wechat_log("TK_ProtoCol:recv:len:{} {} {}".format(len(msg),len(str),msg_tmp.find("#!AMR"))) + read_AMR_flag = msg_tmp.find("#!AMR") + # if EventMesh.publish("get_wechat_record_flag") != 1 and read_AMR_flag != -1: #是否是服务器下发音频数据 + if read_AMR_flag != -1: #是否是服务器下发音频数据 + # Wechat_log("TK_ProtoCol:recv:datalen{}".format(len(msg))) + arm_data = bytearray(str[1])#获取amr输出 + get_wechat_data = EventMesh.publish("get_wechat_data") + MXA_MSG = get_wechat_data[0] + wechat_recode_list = get_wechat_data[1] + wechat_num = int(wechat_recode_list["num"]) + # Wechat_log("TK_ProtoCol:datalen:{} {} {}".format(wechat_num,MXA_MSG,wechat_recode_list)) + + if wechat_num >= MXA_MSG: + wechat_num = 0 + if wechat_num == 0: + wechat_num += 1 + elif wechat_num > 0: + wechat_num += 1 + + + EventMesh.debug_log("num_total:datalen:{} {}".format(MXA_MSG,wechat_recode_list)) + wechat_recode_list["%02d"%(wechat_num)] = "read:1" + wechat_recode_list['num'] = wechat_num + EventMesh.publish("set_wechat_data",[MXA_MSG,wechat_recode_list]) + #写语音文件数据 + + # path = "/usr/static/storage_file/wechat.amr" + path = "/usr/static/storage_file/{}.amr".format(wechat_num) + with open(path,"w") as fd: + arm = bytearray() + j = 0 + for i in range(len(arm_data)): + if arm_data[j] == 0x7d and arm_data[j+1] == 0x01: + arm.extend(b'\x7d') + j+=1 + elif arm_data[j] == 0x7d and arm_data[j+1] == 0x02: + arm.extend(b'\x5b') + j+=1 + elif arm_data[j] == 0x7d and arm_data[j+1] == 0x03: + arm.extend(b'\x5d') + j+=1 + elif arm_data[j] == 0x7d and arm_data[j+1] == 0x04: + arm.extend(b'\x2c') + j+=1 + elif arm_data[j] == 0x7d and arm_data[j+1] == 0x05: + arm.extend(b'\x2a') + j+=1 + else : + arm.append(arm_data[j]) + j+=1 + if j >= len(arm_data): + break + fd.write(arm) + EventMesh.publish("recv_wechat_audio")# + EventMesh.publish(constants.PROTOCOL.TKS_SEND,1)#返回接收成功 + else : + if read_AMR_flag != -1 : + EventMesh.publish(constants.PROTOCOL.TKS_SEND,0)#返回接收失败 + + + + + + + +class MESSAGE_ProtoCol(ProtoCol): + """微聊""" + TYPE = "MESSAGE" + + + def send(self, event, msg): + #[XT*334588000000156*0007*MESSAGE] + send_data = EventMesh.publish("get_new_pid")+"*%s*0007*MESSAGE"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + #Wechat_log("POWEROFF_ProtoCol:send:%s"%(data)) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) + + def recv(self, event, msg): + """ + + @param event: 微聊文字 + @param msg: 接收到的下行数据 + """ + # msg = msg[1:-1] + + # msg_s = msg.decode('ascii') + # msg_s = msg_s.split(',') + # msg_s = msg_s[1] + # # Wechat_log("msg_tmp:len:{}\r\n data:{}".format(len(msg_s),msg_s)) + + + # get_wechat_data = EventMesh.publish("get_wechat_data") + + # MXA_MSG = get_wechat_data[0] + # wechat_recode_list = get_wechat_data[1] + # wechat_num = wechat_recode_list["num"] + # # Wechat_log("TK_ProtoCol:datalen:{} {} {}".format(wechat_num,MXA_MSG,wechat_recode_list)) + + # if wechat_num >= MXA_MSG: + # wechat_num = 0 + # if wechat_num == 0: + # wechat_num += 1 + # elif wechat_num > 0: + # wechat_num += 1 + # msg_txt = {} + # # 0 1 2 3 + # Wechat_log("wechat_num:init {}".format(wechat_num)) + # msg_txt = UnicodeHexStr_To_Utf8Str(msg_s) + # # Wechat_log("msg_txt:{}".format(msg_txt)) + # wechat_recode_list["%02d"%(wechat_num)] = "T:{}".format(msg_txt) + # wechat_recode_list['num'] = wechat_num + # EventMesh.publish("set_wechat_data",[MXA_MSG,wechat_recode_list]) + # # Wechat_log("wechat_recode_list:len data:{}".format(wechat_recode_list)) + + # screen_NAME = EventMesh.publish("get_screen_NAME") + # get_lcd_state = EventMesh.publish("get_lcd_state") + # if screen_NAME != "wechat" or get_lcd_state == 0: + # EventMesh.publish("load_screen", {"screen": "wechat_popup"}) + # else: + # EventMesh.publish("wechat_updata_list_show") + EventMesh.publish(constants.PROTOCOL.MESSAGE_SEND) + # EventMesh.publish("recv_wechat_audio")# + +class FALLDOWN_ProtoCol(ProtoCol): + """ + 跌倒提醒开关 + 服务器下发跌倒报警设置命令 + [XT*334588000000156*LEN*FALLDOWN,ONOFF] + ONOFF: 1:开启,0:关闭。 + 终端回复 + [XT*334588000000156*LEN*FALLDOWN] + """ + TYPE = "FALLDOWN" + + def send(self, event, msg): + + #[XT*334588000000156*LEN*FALLDOWN] + send_data = EventMesh.publish("get_new_pid")+"*%s*0008*FALLDOWN"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + #Wechat_log("POWEROFF_ProtoCol:send:%s"%(data)) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) + + def recv(self, event, msg): + """ + [SZKW*860132060341484*000A*FALLDOWN,1] + """ + msg = msg[1:-1] + msg_tmp = msg.decode('ascii') + msg_data = msg_tmp.split(',') + + Falldowm = msg_data[1] + EventMesh.debug_log("FALLDOWN:{}".format(Falldowm)) + EventMesh.publish("set_storage_config",["fall_sw",Falldowm]) + + EventMesh.publish(constants.PROTOCOL.FALLDOWN_SEND) + +class REMOVE_ProtoCol(ProtoCol): + """ + 取下手环报警开关 + 平台发送: + [XT*YYYYYYYYYYYYYYY*LEN*REMOVE,0或者1] + 实例:[XT*334588000000156*0008*REMOVE,1] + 终端回复: + [XT*YYYYYYYYYYYYYYY*LEN*REMOVE] + """ + TYPE = "REMOVE" + + def send(self, event, msg): + send_data = EventMesh.publish("get_new_pid")+"*%s*0006*REMOVE"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + #Wechat_log("POWEROFF_ProtoCol:send:%s"%(data)) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) + + def recv(self, event, msg): + msg = msg[1:-1] + msg_tmp = msg.decode('ascii') + msg_data = msg_tmp.split(',') + Falldowm = msg_data[1] + EventMesh.debug_log("REMOVE:{}".format(Falldowm)) + EventMesh.publish("set_storage_config",["remove_sw",Falldowm]) + EventMesh.publish(constants.PROTOCOL.REMOVE_SEND) + +class HELP_ProtoCol(ProtoCol): + """ +一键报警 + [XT*YYYYYYYYYYYYYYY*LEN*HELP,状态] + 状态值为整数:60或不带默认是普通报警,61光电式感烟火灾报警,62检测环境温度(高温报警,温度变化报警), + 63人体活动检测报警,64电池欠压提醒功能,65设备脱落提醒功能,66离线报警,67测试报警,123气感报警, + 124烟感报警,125水浸报警 + 实例: + [XT*334588000000156*0004*HELP,60] + """ + TYPE = "HELP" + + def send(self, event, msg): + #[XT*334588000000156*LEN*FALLDOWN] + send_data = EventMesh.publish("get_new_pid")+"*%s*0008*HELP,%d"%(self.imei,msg) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + #Wechat_log("POWEROFF_ProtoCol:send:%s"%(data)) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) + + def recv(self, event, msg): + """ + [XT*334588000000156*0004*HELP,60] + """ + + pass + + +#喝水闹钟提示 +# 喝水闹钟设置指令 +# 平台发送: +# [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_DRINK,时间间隔(小时),开关(0为关,1为开)] +# 实例: +# [XT*334588000000156*0026*REMIND_CH_DRINK,4,0] +# 终端回复: +# [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_DRINK] +# 实例:[XT*334588000000156*000E*REMIND_CH_DRINK] +class REMIND_CHDRINK_ProtoCol(ProtoCol): + """ + + 平台发送: + [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_DRINK,时间间隔(小时),开关(0为关,1为开)] + 实例:[XT*334588000000156*0008*REMIND_CH_DRINK,时间间隔(小时),开关(0为关,1为开)] + 终端回复: + [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_DRINK] + """ + TYPE = "REMIND_CH_DRINK" + + def send(self, event, msg): + send_data = EventMesh.publish("get_new_pid")+"*%s*000F*REMIND_CH_DRINK"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + #Wechat_log("POWEROFF_ProtoCol:send:%s"%(data)) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) + + def recv(self, event, msg): + # SZKW*860132060346475*0013*REMIND_CH_DRINK,4-1 + msg = msg[1:-1] + msg_tmp = msg.decode('ascii') + msg_data = msg_tmp.split(',') + data = str(msg_data[1]) + hour = int(data.split('-')[0]) + btn_on = int(data.split('-')[1]) + + EventMesh.debug_log("recv REMIND_CH_DRINK:{}-{}-{}".format(hour,btn_on,msg)) + EventMesh.publish("set_storage_config",["drink_on",btn_on]) + EventMesh.publish("set_storage_config",["drink_time",hour]) + EventMesh.publish(constants.PROTOCOL.REMIND_CH_DRINK_SEND) + +# 自定义服药闹钟设置指令 +# 平台发送: +# [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_MEDICINE2,时间1-开关,时间2-开关,周几] +# 实例: +# [XT*334588000000156*0026*REMIND_CH_MEDICINE2,08:10-0,09:10-0,1000001] +# 终端回复: +# [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_MEDICINE2] +# 实例:[XT*334588000000156*000E*REMIND_CH_MEDICINE2] +# 说明:闹铃格式为:时间-开关(0/1),周几(周六到周日) + +#REMIND_CH_MEDICINE2,09:00-1,14:00-0,18:00-0,1111111]'",) +class REMIND_CHMEDICINE2_ProtoCol(ProtoCol):#吃药提醒 + """ + + 平台发送: + [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_MEDICINE2,,时间1-开关,时间2-开关,周几] + 实例:[XT*334588000000156*0008*REMIND_CH_MEDICINE2,,时间1-开关,时间2-开关,周几] + 终端回复: + [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_MEDICINE2] + """ + TYPE = "REMIND_CH_MEDICINE2" + + def send(self, event, msg): + send_data = EventMesh.publish("get_new_pid")+"*%s*0013*REMIND_CH_MEDICINE2"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + #Wechat_log("POWEROFF_ProtoCol:send:%s"%(data)) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) + + def recv(self, event, msg): + # SZKW*860132060346475*0013*REMIND_CH_MEDICINE2,4-1 + msg = msg[1:-1] + msg_tmp = msg.decode('ascii') + + msg_data = str(msg_tmp.split('REMIND_CH_MEDICINE2,')[1]) + msg_data_tmp = str(msg_tmp.split('REMIND_CH_MEDICINE2')[1]) + + medicin_data = [] + alarmday=[] + count = 0 + for i in str(msg_data_tmp): + # print("i",i) + if i == ",": + count+=1 + + if count >= 3: + count = 3 + medicine_alarmday = [] + for i in range(0,count):#默认是三个时间多了也不保存 + medicine_alarmday = str(msg_data.split(",")[count]) + # print("i",i) + medicine_alarm = str(msg_data.split(",")[i]) + if str(medicine_alarm).find("-") != -1: + on = int(medicine_alarm.split('-')[1]) + if on != 0: + alarmday = [] + data = str(medicine_alarm.split('-')[0]) + hour = int(data.split(":")[0]) + min = int(data.split(":")[1]) + for i in range(0,7): + # print("medicine_alarmday",medicine_alarmday,medicine_alarmday[i]) + if medicine_alarmday[i] != '0': + alarmday.append(i) + enable = 1 + medicin_data.append({"hour":hour,"min":min,"day":alarmday,"enable":enable}) + + EventMesh.publish("set_storage_config",["medicine",medicin_data]) + EventMesh.debug_log("recv REMIND_CH_MEDICINE2:{} medicin_data ;{}".format(msg,medicin_data)) + + EventMesh.publish(constants.PROTOCOL.REMIND_CH_MEDICINE2_SEND) + EventMesh.publish("clear_medicine_alarm") + +# 回家闹钟设置指令 +# 可设置闹钟的提醒文字 +# 平台发送: +# [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_HOME,闹钟1,闹钟2,闹钟3] +# 实例: +# [XT*334588000000156*0018*REMIND_CH_HOME,08:10,12:10] +# 终端回复: +# [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_HOME] +# 实例:[XT*334588000000156*0006*REMIND_CH_HOME] +# 说明:闹钟为时间点; +class REMIND_CH_HOME_ProtoCol(ProtoCol):#回家提醒 + """ + + 平台发送: + [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_HOME,,时间1-开关,时间2-开关,周几] + 实例:[XT*334588000000156*0008*REMIND_CH_HOME,,时间1-开关,时间2-开关,周几] + 终端回复: + [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_HOME] + """ + TYPE = "REMIND_CH_HOME" + + def send(self, event, msg): + send_data = EventMesh.publish("get_new_pid")+"*%s*000E*REMIND_CH_HOME"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + #Wechat_log("POWEROFF_ProtoCol:send:%s"%(data)) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) + + def recv(self, event, msg): + # SZKW*860132060346475*0013*REMIND_CH_MEDICINE2,4-1 + msg = msg[1:-1] + msg_tmp = msg.decode('ascii') + msg_data = msg_tmp.split(',') + + # [SZKW*860132060346475*0014*REMIND_CH_HOME,00:00',) + home_data = str(msg_data[1]) + + EventMesh.debug_log("recv REMIND_CH_HOME:{} medicin_data ;{}".format(msg,home_data)) + if len(home_data) != 0: + EventMesh.publish("set_storage_config",["home_alarm",home_data]) + EventMesh.publish("clear_home_alarm") + EventMesh.publish(constants.PROTOCOL.REMIND_CH_HOME_SEND) +# 起床闹钟设置指令 +# 平台发送: +# [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_WAKEUP,闹钟1,闹钟2] +# 实例: +# [XT*334588000000156*0026*REMIND_CH_WAKEUP,08:10-0-3-1000001,09:10-0-3-1000001] +# 闹钟格式为:时间-开关-频率(1:一次;2:每天;3:自定义) +# 08:10-1-1:闹钟时间8:10,打开,响铃一次 +# 08:10-1-2:闹钟时间8:10,打开,每天响铃 +# 08:10-1-3-0111110:闹钟时间8:10,打开,自定义周一至周五打开 +# 最左边是周日,最右边是周六,即0111110的顺序是:周日,周一,周二,周三,周四,周五,周六(1为打开,0为关闭),其中周一至周五打开闹钟 +# 终端回复: +# [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_WAKEUP] +# 实例:[XT*334588000000156*000E*REMIND_CH_WAKEUP] +# 说明:闹铃格式为:时间-开关-周几(周六到周日) +class REMIND_CH_WAKEUP_ProtoCol(ProtoCol):#该起床了 + """ + + 平台发送: + [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_WAKEUP,,时间1-开关,时间2-开关,周几] + 实例:[XT*334588000000156*0008*REMIND_CH_WAKEUP,,时间1-开关,时间2-开关,周几] + 终端回复: + [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_WAKEUP] + """ + TYPE = "REMIND_CH_WAKEUP" + + def send(self, event, msg): + send_data = EventMesh.publish("get_new_pid")+"*%s*0011*REMIND_CH_WAKEUP"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + #Wechat_log("POWEROFF_ProtoCol:send:%s"%(data)) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) + + def recv(self, event, msg): + # SZKW*860132060346475*0013*REMIND_CH_MEDICINE2,4-1 + msg = msg[1:-1] + msg_tmp = msg.decode('ascii') + msg_tmp_new = str(msg_tmp.split('REMIND_CH_WAKEUP,')[1]) + msg_tmp_data = str(msg_tmp.split('REMIND_CH_WAKEUP')[1]) + count = 0 + for i in str(msg_tmp_data): + # print("i",i) + if i == ",": + count+=1 + wakeup_data_save = [] + # # ("handler -> b'[SZKW*860132060346475*001C*REMIND_CH_WAKEUP,08:00-1-1,,]'",) + # medicine_alarmday = str(msg_data[4]) + # alarmday=[] + wakeup_day = [] + wakeup_switch = 0 + + print("count",count) + if count >= 3: + count = 3 + for i in range(0,count):#默认是三个时间多了也不保存 + wakeup_day = [] + wakeup_data = str(msg_tmp_new.split(',')[i]) + # print("i",i,wakeup_data) + if len(wakeup_data) != 0: + b = wakeup_data.find('-') + if b != -1: + wakeup_time = wakeup_data.split('-')[0]#-作为分隔符 + wakeup_switch = int(wakeup_data.split('-')[1])#开关 + wakeup_repeat = int(wakeup_data.split('-')[2])#是单次还是每天 还是自定义 + + wakeup_hour = int(wakeup_time.split(":")[0])#时间 + wakeup_min = int(wakeup_time.split(":")[1])#冒号分隔时间 时 分 + + + if wakeup_repeat == 2:#每一天 + wakeup_day = [0,1,2,3,4,5,6] + elif wakeup_repeat == 3:#自定义 + wakeup_day_tmp = wakeup_data.split('-')[3]#-作为分隔符 + for i in range(0,7): + if wakeup_day_tmp[i] != '0': + wakeup_day.append(i) + else:#单次 1 + wakeup_day=[] + if wakeup_switch != 0: + wakeup_data_save.append({"hour":wakeup_hour,"min":wakeup_min,"day":wakeup_day,"enable":wakeup_switch}) + + EventMesh.publish("set_storage_config",["wakeup_alarm",wakeup_data_save]) + wakeup = EventMesh.publish("get_storage_config","wakeup_alarm") + + EventMesh.debug_log("recv REMIND_CH_WAKEUP:{} wakeup ;{}".format(msg,wakeup)) + + EventMesh.publish(constants.PROTOCOL.REMIND_CH_WAKEUP_SEND) + + EventMesh.publish("clear_wakeup_alarm") + + + +# 睡觉闹钟设置指令 +# 平台发送: +# [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_SLEEP,闹钟1,闹钟2] +# 实例: +# [XT*334588000000156*0026*REMIND_CH_SLEEP,08:10-0-3-1000001,09:10-0-3-1000001] +# 闹钟格式为:时间-开关-频率(1:一次;2:每天;3:自定义) +# 08:10-1-1:闹钟时间8:10,打开,响铃一次 +# 08:10-1-2:闹钟时间8:10,打开,每天响铃 +# 08:10-1-3-0111110:闹钟时间8:10,打开,自定义周一至周五打开 +# 最左边是周日,最右边是周六,即0111110的顺序是:周日,周一,周二,周三,周四,周五,周六(1为打开,0为关闭),其中周一至周五打开闹钟 +# 终端回复: +# [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_SLEEP] +# 实例:[XT*334588000000156*000E*REMIND_CH_SLEEP] +# 说明:闹铃格式为:时间-开关-周几(周六到周日) +class REMIND_CH_SLEEP_ProtoCol(ProtoCol):#该睡觉了 + """ + + 平台发送: + [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_SLEEP,,时间1-开关,时间2-开关,周几] + 实例:[XT*334588000000156*0008*REMIND_CH_SLEEP,,时间1-开关,时间2-开关,周几] + 终端回复: + [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_SLEEP] + """ + TYPE = "REMIND_CH_SLEEP" + + def send(self, event, msg): + send_data = EventMesh.publish("get_new_pid")+"*%s*0011*REMIND_CH_SLEEP"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + #Wechat_log("POWEROFF_ProtoCol:send:%s"%(data)) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) + + def recv(self, event, msg): + # SZKW*860132060346475*0013*REMIND_CH_MEDICINE2,4-1 + msg = msg[1:-1] + msg_tmp = msg.decode('ascii') + msg_tmp_new = str(msg_tmp.split('REMIND_CH_SLEEP,')[1]) + msg_tmp_data = str(msg_tmp.split('REMIND_CH_SLEEP')[1]) + count = 0 + for i in str(msg_tmp_data): + # print("i",i) + if i == ",": + count+=1 + + sleep_data_save = [] + # # ("handler -> b'[SZKW*860132060346475*001C*REMIND_CH_SLEEP,08:00-1-1,,]'",) + # b'[SZKW*860132060346475*001B*REMIND_CH_SLEEP,08:00-1-1,,]'",) + # medicine_alarmday = str(msg_data[4]) + # alarmday=[] + sleep_day = [] + sleep_switch = 0 + + print("count",count) + if count >= 3: + count = 3 + for i in range(0,count):#默认是三个时间多了也不保存 + sleep_day = [] + sleep_data = str(msg_tmp_new.split(',')[i]) + # print("i",i,sleep_data) + if len(sleep_data) != 0: + b = sleep_data.find('-') + if b != -1: + sleep_time = sleep_data.split('-')[0]#-作为分隔符 + sleep_switch = int(sleep_data.split('-')[1])#开关 + sleep_repeat = int(sleep_data.split('-')[2])#是单次还是每天 还是自定义 + + sleep_hour = int(sleep_time.split(":")[0])#时间 + sleep_min = int(sleep_time.split(":")[1])#冒号分隔时间 时 分 + + + if sleep_repeat == 2:#每一天 + sleep_day = [0,1,2,3,4,5,6] + elif sleep_repeat == 3:#自定义 + sleep_day_tmp = sleep_data.split('-')[3]#-作为分隔符 + for i in range(0,7): + if sleep_day_tmp[i] != '0': + sleep_day.append(i) + else:#单次 1 + sleep_day=[] + if sleep_switch != 0: + sleep_data_save.append({"hour":sleep_hour,"min":sleep_min,"day":sleep_day,"enable":sleep_switch}) + + EventMesh.publish("set_storage_config",["sleep_alarm",sleep_data_save]) + # sleep = EventMesh.publish("get_storage_config","sleep_alarm") + + # EventMesh.debug_log("recv REMIND_CH_SLEEP_SEND:{} sleep ;{}".format(msg,sleep)) + + EventMesh.publish(constants.PROTOCOL.REMIND_CH_SLEEP_SEND) + EventMesh.publish("clear_sleep_alarm") + + +# 可设置闹钟的提醒文字 +# 平台发送: +# [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_REST,时间间隔1,时间间隔2,时间间隔3] +# 实例: +# [XT*334588000000156*0026*REMIND_CH_REST,08:10-10:00,12:10-15:00] +# 终端回复: +# [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_REST] +# 实例:[XT*334588000000156*000E*REMIND_CH_REST] +# 说明:时间间隔 【起始-结束】,起始为开始休息,结束为休息结束 + +class REMIND_CH_REST_ProtoCol(ProtoCol):#该休息了 + """ + + 平台发送: + [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_REST,,时间1-开关,时间2-开关,周几] + 实例:[XT*334588000000156*0008*REMIND_CH_REST,,时间1-开关,时间2-开关,周几] + 终端回复: + [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_REST] + """ + TYPE = "REMIND_CH_REST" + + def send(self, event, msg): + send_data = EventMesh.publish("get_new_pid")+"*%s*000E*REMIND_CH_REST"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + #Wechat_log("POWEROFF_ProtoCol:send:%s"%(data)) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) + + def recv(self, event, msg): + # SZKW*860132060346475*0013*REMIND_CH_REST,4-1 + msg = msg[1:-1] + msg_tmp = msg.decode('ascii') + msg_data = str(msg_tmp.split('REMIND_CH_REST,')[1]) + msg_data_new = str(msg_tmp.split('REMIND_CH_REST')[1]) + print("REMIND_CH_REST",len(msg_data),msg_data) + + reset_data_save = [] + count = 0 + for i in str(msg_data_new): + # print("i",i) + if i == ",": + count+=1 + + if count >= 2: + count = 2 + + for i in range(0,count):#默认是三个时间多了也不保存 + reset_data = str(msg_data.split(',')[i]) + print("i",i,reset_data) + if len(reset_data) != 0: + b = reset_data.find('-') + if b != -1: + start_time = reset_data.split('-')[0]#-作为分隔符 + end_time = reset_data.split('-')[1]#-作为分隔符 + + start_hour = int(start_time.split(":")[0]) + start_min = int(start_time.split(":")[1]) + + end_hour = int(end_time.split(":")[0]) + end_min = int(end_time.split(":")[1]) + + reset_data_save.append({"start_hour":start_hour,"start_min":start_min,"end_hour":end_hour,"end_min":end_min}) + + EventMesh.publish("set_storage_config",["reset_alarm",reset_data_save]) + # reset = EventMesh.publish("get_storage_config","reset_alarm") + + # EventMesh.debug_log("recv REMIND_CH_REST:{} reset ;{}".format(msg,reset)) + + EventMesh.publish(constants.PROTOCOL.REMIND_CH_REST_SEND) + EventMesh.publish("clear_reset_alarm") + + + +class WLKEY_ProtoCol(ProtoCol):#白名单开关 + """ + 白名单开关 + [XT*YYYYYYYYYYYYYYY*LEN*WLKEY,ONOFF] ONOFF: 1:开启,0:关闭,2:30秒后自动接听。 + 实例:[XT*334588000000156*0008*WLKEY,1] + 终端回复 + [XT*YYYYYYYYYYYYYYY*LEN*WLKEY] + 实例:[XT*334588000000156*0006*WLKEY] + """ + TYPE = "WLKEY" + + def send(self, event, msg): + send_data = EventMesh.publish("get_new_pid")+"*%s*00006*WLKEY"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + #Wechat_log("POWEROFF_ProtoCol:send:%s"%(data)) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) + + def recv(self, event, msg): + + msg = msg[1:-1] + msg_tmp = msg.decode('ascii') + msg_data = msg_tmp.split(',') + EventMesh.debug_log("WLKEY_ProtoCol".format(msg_data[1])) + EventMesh.publish("set_storage_config",["WLKEY",msg_data[1]]) + + + EventMesh.publish(constants.PROTOCOL.WLKEY_SEND) +# 终端发送: +# [XT*YYYYYYYYYYYYYYY*LEN*SLEEP_DATA,清醒时间(分钟),浅睡时间(分钟),深睡时间(分钟),日期(年月日)] +# 实例: [XT*334588000000156*0004*SLEEP_DATA,120,240,360,20221008] +# 实例表示:上传睡眠数据 +#[XT*334588000000156*0010*SleepReport,2022-02-09,80,2,532,164,164,25,25,25,25,21:45-0-164-155-3,22:00-1-162-155-0,22:15-2-162-155-0] +class SLEEP_DATA_ProtoCol(ProtoCol):#睡眠时间 + """ + 白名单开关 + [XT*YYYYYYYYYYYYYYY*LEN*WLKEY,ONOFF] ONOFF: 1:开启,0:关闭,2:30秒后自动接听。 + 实例:[XT*334588000000156*0008*WLKEY,1] + 终端回复 + [XT*YYYYYYYYYYYYYYY*LEN*WLKEY] + 实例:[XT*334588000000156*0006*WLKEY] + """ + TYPE = "SleepReport" + + def send(self, event, msg): + send_data = EventMesh.publish("get_new_pid")+"*%s*0000b*SleepReport"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s,%s]"%(str(MD5_SIGN),send_data,msg) + EventMesh.debug_log("SLEEP_DATA:send:%s"%(data)) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) + + def recv(self, event, msg): + + EventMesh.debug_log("SLEEP_DATA!!!!!!!!!") + # msg = msg[1:-1] + # msg_tmp = msg.decode('ascii') + # msg_data = msg_tmp.split(',') + # EventMesh.debug_log("WLKEY_ProtoCol".format(msg_data[1])) + # EventMesh.publish("set_storage_config",["WLKEY",msg_data[1]]) + + + # EventMesh.publish(constants.PROTOCOL.WLKEY_SEND) + +class SLEEPTIME_ProtoCol(ProtoCol):#睡眠时间 + """ + """ + TYPE = "SLEEPTIME" + + def send(self, event, msg): + send_data = EventMesh.publish("get_new_pid")+"*%s*00009*SLEEPTIME"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + EventMesh.debug_log("SLEEPTIME:send:%s"%(data)) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) + + def recv(self, event, msg): + # 实例:[XT*5678901234*0014*SLEEPTIME,23:30-7:30] + EventMesh.debug_log("SLEEPTIME!!!!!!!!!") + msg = msg[1:-1] + msg_tmp = msg.decode('ascii') + msg_data = str(msg_tmp.split(',')[1]) + data = {} + if len(msg_data) == 0: + EventMesh.publish("set_storage_config",["sleep_time",data]) + pass + else: + sleep_start = msg_data.split("-")[0] + sleep_end = msg_data.split("-")[1] + start_hour = int(sleep_start.split(":")[0]) + start_min = int(sleep_start.split(":")[1]) + + end_hour = int(sleep_end.split(":")[0]) + end_min = int(sleep_end.split(":")[1]) + + data = {"start_hour":start_hour,"start_min":start_min,"end_hour":end_hour,"end_min":end_min} + # EventMesh.debug_log("SLEEPTIME".format(data)) + EventMesh.publish("set_storage_config",["sleep_time",data]) + # sleep_time = EventMesh.publish("get_storage_config","sleep_time") + # EventMesh.debug_log("sleep_time:{}".format(sleep_time)) + + EventMesh.publish(constants.PROTOCOL.SLEEPTIME_SEND) + +# 平台发送: +# [XT*YYYYYYYYYYYYYYY*LEN*FACTORY] +# 实例:[XT*334588000000156*0007*FACTORY] +# 终端回复: +# [XT*YYYYYYYYYYYYYYY*LEN*FACTORY] +# 实例:[XT*334588000000156*0007*FACTORY] +# 说明:终端恢复出厂设置,里面设置的号码都将清空 +class FACTORY_ProtoCol(ProtoCol):#睡眠时间 + """ + 实例:[XT*334588000000156*0008*FACTORY] + 终端回复 + [XT*YYYYYYYYYYYYYYY*LEN*WLKEY] + 实例:[XT*334588000000156*0006*FACTORY] + """ + TYPE = "FACTORY" + + def send(self, event, msg): + send_data = EventMesh.publish("get_new_pid")+"*%s*0007*FACTORY"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + EventMesh.debug_log("FACTORY:send:%s"%(data)) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) + + def recv(self, event, msg): + + EventMesh.debug_log("FACTORY!!!!!!!!!") + # msg = msg[1:-1] + # msg_tmp = msg.decode('ascii') + # msg_data = msg_tmp.split(',') + # EventMesh.debug_log("WLKEY_ProtoCol".format(msg_data[1])) + # EventMesh.publish("set_storage_config",["WLKEY",msg_data[1]]) + + EventMesh.publish(constants.PROTOCOL.FACTORY_SEND) + EventMesh.publish("app_factory",None)#app恢复出厂 + +# 平台发送: +# [3G*YYYYYYYYYY*LEN*RESET] +# 实例:[3g*5678901234*0005*RESET] +# 终端回复: +# [3G*YYYYYYYYYY*LEN*RESET] +class RESET_ProtoCol(ProtoCol):#重启 + """ + 实例:[XT*334588000000156*0008*RESET] + 终端回复 + [XT*YYYYYYYYYYYYYYY*LEN*RESET] + 实例:[XT*334588000000156*0006*RESET] + """ + TYPE = "RESET" + + def send(self, event, msg): + send_data = EventMesh.publish("get_new_pid")+"*%s*0005*RESET"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + EventMesh.debug_log("RESET:send:%s"%(data)) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) + + def recv(self, event, msg): + + EventMesh.debug_log("RESET!!!!!!!!!") + # msg = msg[1:-1] + # msg_tmp = msg.decode('ascii') + # msg_data = msg_tmp.split(',') + # EventMesh.debug_log("WLKEY_ProtoCol".format(msg_data[1])) + # EventMesh.publish("set_storage_config",["WLKEY",msg_data[1]]) + + EventMesh.publish(constants.PROTOCOL.RESET_SEND) + Power.powerRestart() + +# 平台发送: +# [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_SIT,时间间隔(分钟),总开关(0为关,1为开),午间休息时段,晚间休息时段] +# 午间/晚间休息时段格式为:开始时间(hh:mm)-结束时间(hh:mm)-开关(0为关,1为开),例如 12:00-15:00-1。 +# 久坐默认值为20分钟。 +# 午间和晚间默认值,午间12:00-14:00,晚上20:00-07:00。 +# 实例: +# [XT*334588000000156*0026*REMIND_CH_SIT,20,0,12:00-15:00-1,20:00-07:00-1] +# 终端回复: +# [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_SIT] +# 实例:[XT*334588000000156*000E*REMIND_CH_SIT] +class REMIND_CH_SIT_ProtoCol(ProtoCol):#久坐提醒 + """ + 实例:[XT*334588000000156*0008*REMIND_CH_SIT] + 终端回复 + [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_SIT] + 实例:[XT*334588000000156*0006*REMIND_CH_SIT] + """ + TYPE = "REMIND_CH_SIT" + + def send(self, event, msg): + send_data = EventMesh.publish("get_new_pid")+"*%s*000d*REMIND_CH_SIT"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + EventMesh.debug_log("REMIND_CH_SIT:send:%s"%(data)) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) + + def recv(self, event, msg): + + EventMesh.debug_log("REMIND_CH_SIT!!!!!!!!!") + # msg = msg[1:-1] + # msg_tmp = msg.decode('ascii') + # msg_data = msg_tmp.split(',') + # EventMesh.debug_log("WLKEY_ProtoCol".format(msg_data[1])) + # EventMesh.publish("set_storage_config",["WLKEY",msg_data[1]]) + + EventMesh.publish(constants.PROTOCOL.REMIND_CH_SIT_SEND) + +# 平台发送: +# [XT*YYYYYYYYYYYYYYY*LEN*SCREEN_SHOW,参数内容] +# 实例:[XT*334588000000156*0016*SCREEN_SHOW,00000000000] +# 参数内容用 unicode 编码呈现,设备收到后需解码。 +# 解码后的参数内容可能有多个参数,不同参数用逗号分隔,设备自己决定如何在屏幕中显示这些参数。比如 "SCREEN_SHOW,深圳第一中学,三年1班、张三" +# 终端回复: +# [XT*YYYYYYYYYYYYYYY*LEN*SCREEN_SHOW] +# 实例:[XT*334588000000156*000B*SCREEN_SHOW] + +class SCREEN_SHOWProtoCol(ProtoCol): + """开屏显示""" + TYPE = "SCREEN_SHOW" + def send(self, event, msg): + # [XT*334588000000156*0006*SILENCETIME2] + send_data = EventMesh.publish("get_new_pid")+"*%s*000B*SCREEN_SHOW"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + # print("KEYBRD:data:%s"%(data)) + # print("KEYBRD!!!!!!!!!!!!!",msg) + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) + + def recv(self, event, msg): + """ + @param event: + @param msg: 接收到的下行数据 + """ + msg = msg[1:-1] + msg_tmp = msg.decode('ascii') + msg_tmp = msg_tmp.split(',') + msg_tmp = msg_tmp[1:] + msg_tmp = msg_tmp[0] + print("screen_school_data msg",msg) + + j = 0 + i = 0 + videobook_old = {} + videobook_name_tmp = UnicodeHexStr_To_Utf8Str(msg_tmp) + lst = videobook_name_tmp.split(",") + print("lst data",lst) + + # 0 1 2 3 + screen_school_data = ""#学校 + screen_class_data = ""#班级 + screen_fullname_data = ""#姓名 + if len(lst) != 0: + count = len(lst) + if count > 3: + count = 3 + for i in range(count): + if i == 0: + screen_school_data = lst[0] + EventMesh.publish("set_schoolname", screen_school_data)# + elif i == 1: + screen_class_data = lst[1] + EventMesh.publish("set_classname", screen_class_data)# + else: + screen_fullname_data= lst[2] + EventMesh.publish("set_fullname", screen_fullname_data)# + + # EventMesh.publish("update_screen_show")#更新开屏显示 + + print("screen_school_data!!!:",screen_school_data,screen_class_data,screen_fullname_data) + + EventMesh.publish(constants.PROTOCOL.SCREEN_SHOW_SEND) + +# #小见平台视频通话 +# # [XT*YYYYYYYYYYYYYYY*LEN*JPREG] +# # 实例: +# # [XT*334588000000156*0004*JPREG] +# # 平台回复: +# # [XT*设备ID*LEN*JPREG,账号(整型)] +# # 实例:[XT*334588000000156*0010*JPREG,1087654321] +class JPREG_ProtoCol(ProtoCol):#登入注册 + """""" + TYPE = "JPREG" + def send(self, event, msg): + + # [XT*334588000000156*0005*WLKEY] + send_data = EventMesh.publish("get_new_pid")+"*%s*0005*JPREG"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + # print("WLKEY:data:%s"%(data)) + # print("WLKEY!!!!!!!!!!!!!") + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) + + def recv(self, event, msg): + """ + @param event: + @param msg: 接收到的下行数据 + """ + # b'[SZKW*867387060319166*000A*KEYBRD]' + print("JPREG!!!!!!!!!!!!!",msg,EventMesh.publish("get_new_pid")) + # EventMesh.publish(constants.PROTOCOL.JPREG_SEND) + +# # (声网,佰锐的账号是整型) +# # [XT*YYYYYYYYYYYYYYY*LEN*MEMBERS] +# # 实例:[XT*334588000000156*0007*MEMBERS] +# # 平台回复:[XT*设备ID*LEN*MEMBERS,账号1,昵称1,电话1,账号2,昵称2,电话2.....] +# # 实例: +# # [XT*334588000000156*003F*MEMBERS,d3e2f759f9d5af3858f3530,爸爸,13662313580,妈妈,555] +# # 以上数据部分使用Unicode编码,最终上面示例传到服务端将是: + +class MEMBERS_ProtoCol(ProtoCol):#获取账号列表 + """""" + TYPE = "MEMBERS" + def send(self, event, msg): + + # [XT*334588000000156*0005*WLKEY] + send_data = EventMesh.publish("get_new_pid")+"*%s*0007*MEMBERS"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s]"%(str(MD5_SIGN),send_data) + print("MEMBERS SEND:data:%s"%(data)) + # print("WLKEY!!!!!!!!!!!!!") + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) + + def recv(self, event, msg): + """ + @param event: + @param msg: 接收到的下行数据 + """ + # b'[SZKW*876226002021444*0048*MEMBERS,0036003900350031003800330032002C563F563FD83CDF410020D83CDF42002C]' + print("MEMBERS!!!!!!!!!!!!!",msg,EventMesh.publish("get_new_pid")) + msg = msg[1:-1] + msg_tmp = msg.decode('ascii') + msg_tmp = msg_tmp.split(',') + + videobook = {} + msg_tmp = msg_tmp[1:] + msg_tmp = msg_tmp[0] + + j = 0 + i = 0 + videobook_old = {} + videobook_name_tmp = UnicodeHexStr_To_Utf8Str(msg_tmp) + lst = videobook_name_tmp.split(",") + + print("msg_tmp:{} phonebook_oldtmp:{} type:{}".format(msg_tmp,videobook_name_tmp,lst)) + # 0 1 2 3 + for vediobook_tmp in lst: + + if (j % 3) == 0:#账号 + videobook_old = vediobook_tmp + elif (j % 3) == 1:#名称 + i+=1 + videobook_name_cont= "{}:{}".format("%03d"%(i),videobook_old) + videobook[videobook_name_cont] = vediobook_tmp + j+=1 + print("videobook!!!:{}".format(str(videobook))) + # print("phonebook!!!:{}".format(str(phonebook))) + with open("/usr/static/storage_file/videobook.json","w",encoding="utf-8") as fd: + ujson.dump(videobook,fd) + print("创建视频通话账号") + + EventMesh.publish("set_videobook_list",[1,videobook]) + # EventMesh.publish("video_updata_list_show") + # EventMesh.publish(constants.PROTOCOL.MEMBERS_SEND) + +# # [X*Y*LEN*CALLING,呼叫者id,会议id,通话类型,Token] + +# # 设备回复 +# # [X*Y*LEN*CALLING,音视频状态] +# # 音视频状态:为0表示正常可通讯状态,否则填上用音视频返回的状态码,比如200,如果未获取到返回状态码,则填1 +class CALLING_ProtoCol(ProtoCol):#app发起视频通话 + """""" + TYPE = "CALLING" + def send(self, event, msg): + + # [XT*334588000000156*0005*WLKEY] + send_data = EventMesh.publish("get_new_pid")+"*%s*0007*CALLING"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s,%d]"%(str(MD5_SIGN),send_data,msg) + # print("CALLING:send data:%s"%(data)) + # print("WLKEY!!!!!!!!!!!!!") + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) + + def recv(self, event, msg): + """ + @param event: + @param msg: 接收到的下行数据 + """ + # b'[SZKW*867387060319166*000A*CALLING]' + print("CALLING!!!!!!!!!!!!!",msg) + if EventMesh.model == "D10":#D10没有视频通话 + EventMesh.publish(constants.PROTOCOL.CALLING_SEND,1) + return + msg = msg[1:-1] + msg_tmp = msg.decode('ascii') + msg_tmp_d = msg_tmp.split(',') + call_id = msg_tmp_d[1]#id + meet_id = msg_tmp_d[2]#会议id + call_type = int(msg_tmp_d[3])#会议id# 0音频 1视频 + tokens_data = msg_tmp_d[4]#tokens + EventMesh.publish("set_vedio_call_id", call_id)# + EventMesh.publish("set_vedio_meet_id", meet_id)# + EventMesh.publish("set_vedio_call_type", call_type)# + EventMesh.publish("set_vedio_tokens_data", tokens_data)# + + flag = EventMesh.publish("get_call_state") + fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识 + usb_state = EventMesh.publish("get_usb")# + video_state = EventMesh.publish("get_video_state") + sos_dialing = EventMesh.publish("get_sos_state_out")#正在拨打sos电话 + if flag != 0 or fall_down != 0 or video_state != 0 or sos_dialing != 0: #电话在打入或者 在充电不允许视频通话 + EventMesh.publish(constants.PROTOCOL.CALLING_SEND,1) + else: + EventMesh.publish(constants.PROTOCOL.CALLING_SEND,0) + EventMesh.publish("set_video_state", 6) + EventMesh.publish("set_dev_app_mode", 2)# + EventMesh.publish("close_hr_sop2")# + EventMesh.publish("video_call_in_event",call_type) + +# # [XT*YYYYYYYYYYYYYYY*LEN*RCALLING,呼叫者id,会议id/声网频道名(没有则留空,但位置保留),音频还是视频(0为音频,1为视频)] +# # 实例: +# # [XT*334588000000156*0007*RCALLING,d3e2f759f9d5af3858f3530b,,0] +# # 终端回复: +# # [XT*设备ID*LEN*RCALLING] +# # 实例:[XT*334588000000156*0009*RCALLING] +# # +class RCALLING_ProtoCol(ProtoCol):#设备拒接接听 + """""" + TYPE = "RCALLING" + def send(self, event, msg): + + # [XT*334588000000156*0005*WLKEY] + send_data = EventMesh.publish("get_new_pid")+"*%s*0008*RCALLING"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s,%s,%s,%d]"%(str(MD5_SIGN),send_data,msg[0],msg[1],msg[2]) + # print("RCALLING:send data:%s"%(data)) + # print("WLKEY!!!!!!!!!!!!!") + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) + # print("RCALLING:send data end:%s"%(data)) + + def recv(self, event, msg): + """ + @param event: + @param msg: 接收到的下行数据 + """ + # b'[SZKW*867387060319166*000A*RCALLING]' + print("RCALLING!!!!!!!!!!!!!") + +class AGTALK_ProtoCol(ProtoCol):#设备发起视频通话与app接听视频通话 + """""" + TYPE = "AGTALK" + def send(self, event, msg): + + # [XT*334588000000156*0005*WLKEY] + send_data = EventMesh.publish("get_new_pid")+"*%s*0006*AGTALK"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s,%d,%s]"%(str(MD5_SIGN),send_data,msg[0],msg[1]) + print("AGTALK:send data:%s"%(data)) + # print("WLKEY!!!!!!!!!!!!!") + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) + + def recv(self, event, msg): + """ + @param event: + @param msg: 接收到的下行数据 + """ + # b'[SZKW*876226002021444*007B*AGTALK,0,01lqlyqzzQHpfwv5g7jFVC2H6Ha2tHFpMlfSm5sd2uo7o55JEcc=OVxewje6MjP0NgEODwsLDwkJCwkLCA0NDQ==,8762260020214441701226895]' + # print("AGTALK!!!!!!!!!!!!!") + msg = msg[1:-1] + msg_tmp = msg.decode('ascii') + msg_tmp_d = msg_tmp.split(',') + call_state = int(msg_tmp_d[1])#返回是否可以视频通话 + if call_state == 0:#可正常通话 + if EventMesh.publish("get_video_state") != 0: + # print("AGTALK!!!!!!!!!!!!!answer") + tokens_data = msg_tmp_d[2]#会议id + meet_id = msg_tmp_d[3]#会议id + EventMesh.publish("set_vedio_meet_id", meet_id)# + EventMesh.publish("set_vedio_tokens_data", tokens_data)# + EventMesh.publish("open_vedio_infor") + + else: + #不能视频通话 + tokens_data = msg_tmp_d[2]#token数据 + meet_id = msg_tmp_d[3]#会议id + EventMesh.publish("set_vedio_meet_id", meet_id)# + EventMesh.publish("set_vedio_tokens_data", tokens_data)# + EventMesh.publish("video_newwork_reject_cb",None)#挂断视频通话 + # print("AGTALK no!!!!!!!!!!!!!") + + print("AGTALK!!!!!!!!!!!!!") + + +class RTALK_ProtoCol(ProtoCol):#app拒接视频通话 + """""" + TYPE = "RTALK" + def send(self, event, msg): + + # [XT*334588000000156*0005*WLKEY] + send_data = EventMesh.publish("get_new_pid")+"*%s*0005*RTALK"%(self.imei) + MD5_SIGN = self.pack_MD5_head(send_data) + data = "[%s%s,%d,%s]"%(str(MD5_SIGN),send_data,msg[0],msg[1]) + # print("AGTALK:send data:%s"%(data)) + # print("WLKEY!!!!!!!!!!!!!") + # 通过socket发送到服务器端 + EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) + + def recv(self, event, msg): + """ + @param event: + @param msg: 接收到的下行数据 + """ + # b'[SZKW*867387060319166*000A*RTALK]' + print("RTALK!!!!!!!!!!!!!") + # [SZKW*876226002021444*003A*RTALK,3ef20e64f3abb84b27f7d764,8762260020214441701226522,1]' + msg = msg[1:-1] + msg_tmp = msg.decode('ascii') + msg_tmp_d = msg_tmp.split(',') + EventMesh.publish("app_rtalk_cb",1) + + + + +class ProtoColResolver(object): + def __init__(self): + self.protocol_list = [] + + def add_support(self, prot): + self.protocol_list.append(prot) + prot.initialization() + + def handler(self, data): + # 这里接收数据 + + EventMesh.debug_log("handler -> {}".format(data)) + # if data.startswith('Init;'): + # data = data[5:] + # EventMesh.publish(constants.EVENT.SET_KEY, {"value": ujson.loads(data)['KEY']}) + + # elif data.startswith("Update;"): + # data = data[7:] + # EventMesh.publish(constants.PROTOCOL.H04_RECV, data) + try: + if len(data) > 0: + #EventMesh.debug_log("handler:{}".format(len(data))) + playload_data(data) + except Exception as e: + EventMesh.debug_log("handler:ERROR:") + usys.print_exception(e) + EventMesh.debug_log("handler:error data:{}".format(len(data)))