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