-try:\r
- from qp_log import qp_print as print\r
-except Exception:\r
- pass\r
-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 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
-SHA256 = uhashlib.sha256\r
-import versions\r
-import version_util\r
-try:\r
- import vc_config as _vc_cfg\r
- _NLP_EXTENDED_CMDS = _vc_cfg.get_bool("NLP_EXTENDED_CMDS", False)\r
-except Exception:\r
- _NLP_EXTENDED_CMDS = False\r
-\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 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
-######################IOT######################\r
-import sms\r
-import voiceCall\r
-import quecgnss\r
-import wifiScan\r
-from misc import Power,USB\r
-def wifiScan_cb(args):\r
- print("wifi_data:{}".format(args))\r
- EventMesh.publish(constants.EVENT.WIFIINFO, args)\r
- wifiScan.control(0)\r
-#定位thered\r
-class IOTWebLocationManager(Abstract):\r
-\r
- def __init__(self):\r
- self.gps = None\r
- #self.match = GPSMatch()\r
- self.timer_read_GPS_info = osTimer()\r
- self.timer_sos_report_info = osTimer()\r
- self.wifi_data = []\r
- self.cell_data = []\r
- self.location_timer_count = 0\r
- self.location_check_data_timer_count = 0\r
- self.GGA_count = 0\r
- self.RMC_A_count = 0\r
- self.location_type = 0 #定位类型,0:正常定位,有gps数据或60秒关闭;1:测试模式,只有发CLOSE_LOCATION消息才关闭\r
- self.location_flag = 0\r
- self.start_location_flag = 0\r
- self.location_thread_id = 0\r
- self.location_queue = Queue(100)\r
- self.lpm_fd = None\r
- self.start_agps = 0\r
- self.sos_report_flag=0\r
- quecgnss.gnssEnable(0)\r
-\r
- def post_processor_after_instantiation(self):\r
- EventMesh.subscribe(constants.EVENT.START_LOCATION, self.start_location)\r
- EventMesh.subscribe(constants.EVENT.WIFIINFO, self.WIFI_INFO)\r
- EventMesh.subscribe(constants.EVENT.WIFISCANOPEN,self.WIFI_scan_open)\r
- EventMesh.subscribe(constants.EVENT.CLOSE_LOCATION,self.close_location)\r
- EventMesh.subscribe("get_location_flag",self.get_location_flag)\r
- #EventMesh.subscribe(constants.EVENT.GPSCLOSE, self.gps_close)\r
- def get_location_flag(self, event, msg):\r
- return self.location_flag\r
- \r
- def sos_report_info(self):\r
- EventMesh.debug_log("sos_report_info:")\r
- if self.sos_report_flag == 1:\r
- return\r
- self.soswifi_data = []\r
- self.soscell_data = []\r
- self.sos_report_flag = 1\r
- self.timer_sos_report_info.start(3000, 1, self.sos_timer)\r
- \r
- def close_sos(self):\r
- self.soswifi_data = []\r
- self.soscell_data = []\r
- self.sos_report_flag=0\r
- self.timer_sos_report_info.stop()\r
-\r
- \r
- def sos_timer(self, *args, **kwargs):\r
- if self.sos_report_flag == 1:\r
- try : \r
- #检查wifi数据\r
- if self.soswifi_data == [] or (self.soswifi_data != [] and self.soswifi_data[0] == 0):#and self.wifi_data[0] <= 0:\r
- EventMesh.publish(constants.EVENT.WIFISCANOPEN)\r
- \r
- #检查基站数据\r
- if self.soscell_data== []: \r
- data_tmp = net.getCellInfo()\r
- if(len(data_tmp)>=2):\r
- for cell in data_tmp:\r
- if cell and cell[0][0] == 0 and len(cell[0]) > 1:\r
- self.soscell_data = cell\r
- break\r
- if self.soscell_data != [] and self.soswifi_data != []:\r
- self.close_sos()\r
- self.Location_send([WEB_CMD_ENUM.SOS_REPORT_S_CMD,self.soswifi_data,self.soscell_data])\r
-\r
- except Exception as e:\r
- usys.print_exception(e)\r
-\r
- def start_location(self, event, msg):\r
- self.location_queue.put(msg)#测试类型入队\r
- self.wifi_data = []\r
- self.cell_data = []\r
- print("start_location:{} self.location_flag:{}".format(msg,self.location_flag))\r
- if( self.location_flag == 1):\r
- return\r
- self.location_flag = 1\r
- _thread.stack_size((9+5)*1024)\r
- self.location_thread_id = _thread.start_new_thread(self.location_thread, ())\r
- _thread.stack_size(8*1024)\r
- # self.timer_read_GPS_info.start(1000, 1, self.location_timer)\r
- # if msg == WEB_CMD_ENUM.SOS_REPORT_S_CMD:\r
- # self.sos_report_info()\r
- # pass\r
- # elif msg == WEB_CMD_ENUM.GPS_REPORT_S_CMD:\r
- # self.gps_report_init()\r
- # pass\r
- def gps_report_init(self):\r
-\r
- EventMesh.debug_log("start_location:")\r
- if self.location_flag == 1:\r
- return\r
- self.wifi_data = []\r
- self.cell_data = []\r
- self.location_timer_count = 0\r
- self.location_flag = 1\r
- self.timer_read_GPS_info.start(3000, 1, self.location_timer)\r
-\r
-\r
- def close_location(self,event,msg):\r
- self.location_flag = 0\r
- if wifiScan.getState() == True:\r
- wifiScan.control(0)\r
- # self.timer_read_GPS_info.stop()\r
- if self.location_queue.empty() == False:\r
- self.location_queue.clear()\r
- if self.location_thread_id != 0:\r
- try:\r
- _thread.stop_thread(self.location_thread_id)\r
- except Exception as e:\r
- pass\r
- self.location_thread_id=0\r
- print("close_location:!!!!!!!!!")\r
-\r
- \r
-\r
- def WIFI_INFO(self, event, msg):\r
- self.wifi_data = msg\r
-\r
- def WIFI_scan_open(self, event, msg):\r
-\r
- if wifiScan.getState() == False :\r
- self.wifi_data = []\r
- wifiScan.control(1)\r
- wifiScan.setCfgParam(6, 2, 5, 0) #设置WiFi参数,10秒上层,两轮,最多6个,6秒底层,PS优先\r
- wifiScan.setCallback(wifiScan_cb) #注册回调函数\r
- wifiScan.asyncStart()\r
- #EventMesh.debug_log("wifiScan.asyncStart")\r
- \r
- def location_timer(self, *args, **kwargs):\r
- if self.location_flag == 1:\r
- try : \r
- #检查wifi数据\r
- if self.wifi_data == [] or (self.wifi_data != [] and self.wifi_data[0] == 0):#and self.wifi_data[0] <= 0:\r
- EventMesh.publish(constants.EVENT.WIFISCANOPEN)\r
- \r
- #检查基站数据\r
- if self.cell_data == []: \r
- data_tmp = net.getCellInfo()\r
- if(len(data_tmp)>=2):\r
- for cell in data_tmp:\r
- if cell and cell[0][0] == 0 and len(cell[0]) > 1:\r
- self.cell_data = cell\r
- break\r
- if self.cell_data != [] and self.wifi_data != []:\r
- self.close_location(0,0)\r
- self.Location_send([WEB_CMD_ENUM.POST_LOCATION_S_CMD,self.wifi_data,self.cell_data])\r
-\r
- except Exception as e:\r
- usys.print_exception(e)\r
- \r
- def Location_send(self, msg) :\r
- EventMesh.debug_log("Location_send1")\r
- if self.location_queue.empty() == True:\r
- return\r
- EventMesh.debug_log("Location_send2")\r
- print("Location_send1")\r
- while True:\r
- if self.location_queue.empty() == False:\r
- TYPE = self.location_queue.get()\r
- # (5, [('70:2A:D7:63:BD:B4', -38), ('C0:94:AD:80:21:5F', -61), ('D8:38:0D:05:1F:E3', -65), ('08:9E:84:E7:A6:38', -73), ('B0:44:14:BC:13:B0', -73)])\r
- wifi_tmp = []\r
- wifi_num = msg[0][0]\r
- print("wifi_num:{}".format(wifi_num))\r
- if wifi_num == 0:\r
- wifi_tmp = []\r
- else: #([], [], [(0, 69483137, 1120, 1, 385, 30504, 100, -75, -8), (3, 111950593, 1120, 1, 58, 30504, 1650, -98, -19), (3, 219097617, 1120, 17, 76, 30504, 2452, -106, -23), (3, 102345712, 1120, 1, 58, 30504, 3740, -96, -18)])\r
- \r
- wifi_tmp_data = msg[0][1]\r
- print(wifi_tmp_data)\r
- for i in range(wifi_num):\r
- list_data = {}\r
- list_data["mac"] = str(wifi_tmp_data[i][0])\r
- list_data["rsi"] = str(wifi_tmp_data[i][1])\r
- # list_data = "{},{}".format(wifi_tmp_data[i][0],wifi_tmp_data[i][1])\r
-\r
- wifi_tmp.append(list_data)\r
- pass\r
- # ([(flag, cid, mcc, mnc, lac, arfcn, bsic, rssi)], [(flag, cid, licd, mcc, mnc, lac, uarfcn, psc, rssi)], [(flag, cid, mcc, mnc, pci, tac, earfcn, rssi, rsrq),...])\r
- date_tmp = utime.localtime()\r
- time_tmp = utime.mktime(date_tmp)\r
- celList = []\r
- if msg[1] != []:\r
- for CELL in msg[1] :\r
- print("CELL:{}".format(CELL))\r
- CELL_data = {}\r
- CELL_data["mcc"] = str(CELL[2])\r
- CELL_data["mnc"] = str(CELL[3])\r
- CELL_data["lac"] = str(CELL[4])\r
- CELL_data["cid"] = str(CELL[1])\r
- CELL_data["rsi"] = str(CELL[7])\r
-\r
-\r
- # CELL_data += str(CELL[2]) +"," #MCC\r
- # CELL_data += str(CELL[3]) +"," #MNC\r
- # CELL_data += str(CELL[4]) +"," #LAC\r
- # CELL_data += str(CELL[7]) +"," #RSSI\r
- celList.append(CELL_data)\r
- s_msg=""\r
- s_cmd = ""\r
- if TYPE == WEB_CMD_ENUM.POST_LOCATION_S_CMD:\r
- s_msg = "上报经纬度"\r
- s_cmd = "post_location"\r
- elif TYPE == WEB_CMD_ENUM.POST_SOS_S_CMD:\r
- s_msg = "上报SOS求救"\r
- s_cmd = "post_sos"\r
- send_data = {\r
- "cmd":s_cmd,\r
- "ts":int(time_tmp),\r
- "msg":s_msg,\r
- "data":{\r
- "gps": {\r
- "longitude": "0",\r
- "latitude": "0",\r
- "located": "0",\r
- "speed": "0"\r
- },\r
- "wifiList":wifi_tmp,\r
- "celList":celList\r
- \r
- }\r
- }\r
- print("TYPE{}".format(TYPE))\r
- EventMesh.publish(TYPE,send_data)\r
- else:\r
- self.location_thread_id=0\r
- EventMesh.publish(constants.EVENT.CLOSE_LOCATION)\r
- break\r
-\r
-\r
- def location_thread(self):\r
- \r
- self.wifi_data = []\r
- print("location_thread self.location_flag {}".format(self.location_flag))\r
- while self.location_flag == 1:\r
- try : \r
-\r
- #检查wifi数据\r
- if self.wifi_data == [] or (self.wifi_data != [] and self.wifi_data[0] == 0):#and self.wifi_data[0] <= 0:\r
- EventMesh.publish(constants.EVENT.WIFISCANOPEN)\r
- \r
- #检查基站数据\r
- if self.cell_data == []: \r
- print("location_thread")\r
- data_tmp = net.getCellInfo()\r
- if(len(data_tmp)>=2):\r
- for cell in data_tmp:\r
- if cell and cell[0][0] == 0 and len(cell[0]) > 1:\r
- self.cell_data = cell\r
- break\r
-\r
- if self.cell_data != [] and self.wifi_data != []:\r
- self.Location_send([self.wifi_data,self.cell_data])\r
- \r
- break\r
- \r
- except Exception as e:\r
- usys.print_exception(e)\r
- EventMesh.publish(constants.EVENT.CLOSE_LOCATION)#关闭定位 \r
- utime.sleep_ms(1000)\r
- wifiScan.control(0)\r
-\r
- \r
-\r
-import uwebsocket\r
-import sim\r
-# 设备主动上报后台返回cmd的字符串\r
-DEVICE_REPORT_RETURN_STRING = "post_rest" \r
-# 服务器主动下发给设备的cmd的字符串\r
-IOT_AUTO_REPORT_RETURN_STRING = "dispatch_rest" \r
-MAGIC_STR = len("FFFE")\r
-VERSION_STR =len("03")\r
-TYPE_STR = len("03")\r
-PLAYLOAD_STR = len("0000")\r
-PROTOCLO_LEN = MAGIC_STR+VERSION_STR+TYPE_STR+PLAYLOAD_STR+len('{')+len('}')+len("cmd:")+len("data:")+len("ts:")\r
-\r
-class WEB_CMD_ENUM:\r
- HR_R_CMD = "post_heart_beat_R"\r
- HR_S_CMD = "post_heart_beat_S"\r
-\r
- POST_LOCATION_R_CMD = "post_location_R"\r
- POST_LOCATION_S_CMD = "post_location_S"\r
-\r
- POST_SOS_R_CMD = "post_sos_R"\r
- POST_SOS_S_CMD = "post_sos_S"\r
-\r
- POST_DEVICE_STATE_R_CMD = "post_device_state_R"\r
- POST_DEVICE_STATE_S_CMD = "post_device_state_S"\r
-\r
- POST_ALARM_R_CMD = "post_alarm_R"\r
- POST_ALARM_S_CMD = "post_alarm_S"\r
-\r
- POST_SCHEDULE_R_CMD = "post_schedule_R"\r
- POST_SCHEDULE_S_CMD = "post_schedule_S"\r
-\r
- FIND_DEVCE_R_CMD = "find_device_R"\r
- FIND_DEVCE_S_CMD = "find_device_S"\r
-\r
- LOCATION_NOW_R_CMD = "locate_now_R"\r
- LOCATION_NOW_S_CMD = "locate_now_S"\r
-\r
- LOCATION_DURATION_R_CMD = "locate_duration_R"\r
- LOCATION_DURATION_S_CMD = "locate_duration_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
- SCHEDULE_LIST_R_CMD = "schedule_list_R"\r
- SCHEDULE_LIST_S_CMD = "schedule_list_S"\r
- \r
- SOS_LIST_R_CMD ="sos_list_R"\r
- SOS_LIST_S_CMD ="sos_list_S"\r
-\r
- SOS_CONFIG_R_CMD = "sos_config_R"\r
- SOS_CONFIG_S_CMD = "sos_config_S"\r
-\r
- DEVICE_SHAKE_STATE_R_CMD = "device_shake_state_R"\r
- DEVICE_SHAKE_STATE_S_CMD = "device_shake_state_S"\r
-\r
- RING_TONE_URL_R_CMD = "ring_tone_url_R"\r
- RING_TONE_URL_S_CMD = "ring_tone_url_S"\r
-\r
- VOLUME_R_CMD = "volume_R"\r
- VOLUME_S_CMD = "volume_S"\r
-\r
- TEXT_MSG_R_CMD = "text_msg_R"\r
- TEXT_MSG_S_CMD = "text_msg_S"\r
-\r
- VOICE_RECORD_R_CMD = "voice_record_R"\r
- VOICE_RECORD_S_CMD = "voice_record_S"\r
-\r
- GET_RINGTONE_R_CMD = "get_ringtone_R"\r
- GET_RINGTONE_S_CMD = "get_ringtone_S"\r
-\r
- RINGTONE_LIST_R_CMD = "ringtone_list_R"\r
- RINGTONE_LIST_S_CMD = "ringtone_list_S"\r
-\r
- SCHEDULE_R_CMD = "schedule_R"\r
- SCHEDULE_S_CMD = "schedule_S"\r
- \r
- SWITCH_BT_STATE_R_CMD="switch_bt_state_R"\r
- SWITCH_BT_STATE_S_CMD="switch_bt_state_S"\r
-\r
-\r
- BT_SCAN_R_CMD="bt_scan_R"\r
- BT_SCAN_S_CMD="bt_scan_S"\r
-\r
- BT_STATE_R_CMD="bt_state_R"\r
- BT_STATE_S_CMD="bt_state_S"\r
-\r
- BT_SCAN_REST_R_CMD = "bt_scan_rest_R"\r
- BT_SCAN_REST_S_CMD = "bt_scan_rest_S"\r
-\r
- CONNECT_BT_R="connect_bt_R"\r
- CONNECT_BT_S="connect_bt_S"\r
-\r
- DISCONNECT_BT_R="disconnect_bt_R"\r
- DISCONNECT_BT_S="disconnect_bt_S"\r
-\r
- NEW_VOICE_MSG_R = "new_voice_msg_R"\r
- NEW_VOICE_MSG_S = "new_voice_msg_S"\r
-\r
- GET_NEW_VOICE_MSG_R="get_new_voice_msg_R"\r
- GET_NEW_VOICE_MSG_S="get_new_voice_msg_S"\r
-\r
- NEW_VOICE_MSG_LIST_R="new_voice_msg_list_R"\r
- NEW_VOICE_MSG_LIST_S="new_voice_msg_list_S"\r
-\r
- PUT_VOICE_MSG_STATE_R="put_voice_msg_state_R"\r
- PUT_VOICE_MSG_STATE_S="put_voice_msg_state_S"\r
-\r
- GET_BT_STATE_R="get_bt_state_R"\r
- GET_BT_STATE_S="get_bt_state_S"\r
-\r
- GET_BT_CONNECT_RECORD_LIST_R = "get_bt_connect_record_list_R"\r
- GET_BT_CONNECT_RECORD_LIST_S = "get_bt_connect_record_list_S"\r
-\r
- BT_CONNECT_RECORD_LIST_R="bt_connect_record_list_R"\r
- BT_CONNECT_RECORD_LIST_S="bt_connect_record_list_S"\r
-\r
- FENCE_SOS_R="fence_sos_R"\r
- FENCE_SOS_S="fence_sos_S"\r
-\r
- PLAY_CONTROL_R="player_control_R"\r
- PLAY_CONTROL_S="player_control_S"\r
-\r
- GET_CHAT_CONFIG_R="get_chat_config_R"\r
- GET_CHAT_CONFIG_S="get_chat_config_S"\r
-\r
- CHAT_CONFIG_R = "chat_config_R"\r
- CHAT_CONFIG_S = "chat_config_S"\r
-\r
- POST_BT_CONNECT_REST_R = "post_bt_connect_rest_R"\r
- POST_BT_CONNECT_REST_S = "post_bt_connect_rest_S"\r
-\r
- UNBIND_DEV_R="unbind_dev_R"\r
- UNBIND_DEV_S="unbind_dev_S"\r
-\r
- USER_UNBIND_DEV_R="user_unbind_dev_R"\r
- USER_UNBIND_DEV_S="user_unbind_dev_S"\r
-\r
- MUSIC_PLAY_R="music_play_R"\r
- MUSIC_PLAY_S="music_play_S"\r
-\r
- NLP_PLAY_R = "ai_cmd_R"\r
- NLP_PLAY_S = "ai_cmd_S"\r
-\r
- #金三\r
- GET_DEVICE_STATE_R = "get_device_state_R"\r
- GET_DEVICE_STATE_S = "get_device_state_S"\r
-class IOTSendCmdManager(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_WEB_SEND_CMD", self.get_iot_send_cmd)\r
- print("IOTSendCmdManager")\r
-\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.HR_S_CMD:\r
- self.send_data = self.hr_send_data(self.time_tmp)\r
- return self.send_data\r
- elif msg == WEB_CMD_ENUM.POST_LOCATION_S_CMD:\r
- self.send_data = self.gps_send_data()\r
- return self.send_data\r
- elif msg == WEB_CMD_ENUM.POST_SOS_S_CMD:\r
- self.send_data = self.sos_wraing_send_data()\r
- return self.send_data\r
- elif msg == WEB_CMD_ENUM.POST_DEVICE_STATE_S_CMD:\r
- self.send_data = self.device_report_state_send_data()\r
- return self.send_data\r
- elif msg == WEB_CMD_ENUM.POST_ALARM_S_CMD:\r
- self.send_data = self.alarm_config_send_data()\r
- elif msg == WEB_CMD_ENUM.POST_SCHEDULE_S_CMD:\r
- self.send_data = self.schedule_config_send_data()\r
- return self.send_data\r
- \r
- # 心率上报数据格式\r
- def hr_send_data(self,time):\r
- print("hr_send_data")\r
- battery = (EventMesh.publish("screen_get_battery"))[1]\r
- if battery >= 100 or battery == None:\r
- battery = 100\r
- hr_send_data = {\r
- "cmd":"post_heart_beat",\r
- "ts":time,\r
- "msg":"心跳",\r
- "data":{\r
- "battery": int(battery)\r
- }\r
- }\r
- return hr_send_data\r
- \r
- # gps上报数据格式\r
- def gps_send_data(self):\r
- gps_data = {\r
- "cmd":"post_location",\r
- "ts":self.time_tmp,\r
- "data":{\r
- "gps":{\r
- "longitude":"W,67",\r
- "latitude":"S,465",\r
- "direction":"FR",\r
- "speed":"45",\r
- "altude":"56",\r
- "count":"3"\r
- },\r
- "wifiList":[\r
- "89:78:78:67:89:98,-98"\r
- ],\r
- "celList":[\r
- "MCC,MNC,LAC,CID,RSSI"\r
- ],\r
- "btList":[\r
- "D4:78:65:67:89:78"\r
- ]\r
- }\r
- }\r
- return gps_data\r
- \r
- # sos警告上报数据格式\r
- def sos_wraing_send_data(self):\r
- sos_wraing_data ={\r
- "cmd":"post_sos",\r
- "ts":self.time_tmp,\r
- "data":{\r
- "gps":{\r
- "longitude":"W,67",\r
- "latitude":"S,465",\r
- "direction":"FR",\r
- "speed":"45",\r
- "altude":"56",\r
- "count":"3"\r
- },\r
- "wifiList":[\r
- "89:78:78:67:89:98,-98"\r
- ],\r
- "celList":[\r
- "MCC,MNC,LAC,CID,RSSI"\r
- ],\r
- "btList":[\r
- "D4:78:65:67:89:78"\r
- ]\r
- }\r
- }\r
- return sos_wraing_data\r
- \r
- #设备上报状态上报数据格式\r
- def device_report_state_send_data(self):\r
- get_volume = EventMesh.publish("get_storage_config","VC_TTS_volume")\r
- device_report_data ={\r
- "cmd":"post_device_state",\r
- "ts":self.time_tmp,\r
- "data":{\r
- "mediaTitle":"haha",\r
- "mediaState":"stop",\r
- "cover":"899",\r
- "volume":get_volume\r
- }\r
- }\r
- # HR_DATA=EventMesh.publish("GET_IOT_WEB_SEND_CMD",WEB_CMD_ENUM.POST_DEVICE_STATE_S_CMD)\r
- # print("HR_DATA{}".format(HR_DATA))\r
- # EventMesh.publish(WEB_CMD_ENUM.POST_DEVICE_STATE_S_CMD,HR_DATA)\r
- return device_report_data\r
-\r
- #闹钟配置上报数据格式\r
- def alarm_config_send_data(self):\r
- alarm_data = {\r
- "cmd":"post_alarm",\r
- "ts":self.time_tmp,\r
- "msg":"上报闹钟",\r
- "data":[\r
- {\r
- "name":"喝水",\r
- "loop":"0101001",\r
- "state":"0",\r
- "time":"14:34",\r
- "ringTimes":1,\r
- "alarmMode":"ring",\r
- "shakeType":"short"\r
- }, \r
- {\r
- "name":"起床",\r
- "loop":"0101001",\r
- "state":"0",\r
- "time":"07:40",\r
- "ringTimes":1,\r
- "alarmMode":"ring",\r
- "shakeType":"short"\r
- }\r
- ]\r
- }\r
- \r
- return alarm_data\r
- #日程配置上报数据格式\r
- def schedule_config_send_data(self):\r
- schedule_data = {\r
- "cmd":"post_schedule",\r
- "ts":self.time_tmp,\r
- "msg":"上报日程",\r
- "data":[\r
- {\r
- "name":"喝水",\r
- "loop":"0101001",\r
- "state":"0",\r
- "time":"14:34",\r
- "ringTimes":1,\r
- "alarmMode":"ring",\r
- "shakeType":"short"\r
- }, \r
- {\r
- "name":"起床",\r
- "loop":"0101001",\r
- "state":"0",\r
- "time":"07:40",\r
- "ringTimes":1,\r
- "alarmMode":"ring",\r
- "shakeType":"short"\r
- }\r
- ]\r
- }\r
- \r
- return schedule_data\r
-#解析收到的数据协议\r
-def playpolad_data(data):\r
- if(isinstance(data, bytes) == 0 or len(data) <= PROTOCLO_LEN):\r
- return\r
-\r
- if data[0] != 0xff and data[1] !=0xfe and data[2] != 0x03 and data[3] !=0x03:\r
- return\r
- \r
- # print(type(data))\r
- json_bytes = data[8:]\r
- # print(data[0],data[1],data[2],data[3],data[4],data[5],data[6],data[7])\r
- # 2. 将二进制JSON转换为字符串(使用UTF-8解码)\r
- json_str = json_bytes.decode('utf-8')\r
- print("解析出的JSON字符串:")\r
- print(json_str)\r
- print("\n" + "-"*50 + "\n")\r
-\r
- # 3. 将JSON字符串转换为Python字典\r
- try:\r
- data_dict = ujson.loads(json_str)\r
- print("解析后的字典数据:")\r
- print(data_dict)\r
- \r
- # 可以直接访问字典中的字段\r
- \r
- cmd = data_dict['cmd']\r
- if cmd != None:\r
- if cmd == DEVICE_REPORT_RETURN_STRING:\r
- data_cmd = data_dict['data']\r
- if "cmd" in data_cmd:\r
- cmd = data_dict['data']["cmd"]\r
- # {"cmd ":"post_rest","ts":1753870158426,"data":{"cmd":"post_heart_beat","rest":"success","msg":"."}}\r
- print("设备主动上报后台返回的数据 设备不需要回复")\r
- EventMesh.publish(cmd+"_R",data_dict)\r
- else:\r
- print("返回的data里面没有cmd 返回的数据出错了")\r
- else:\r
- # {"cmd":"locate_now","msg":"","data":"876226211472149","ts":1753870224117}\r
- print("后台主动下发给设备 需要设备回复给后台的数据命令") #后台主动下发的数据不为dict类型\r
- EventMesh.publish(cmd+"_R",data_dict)\r
- else:\r
- print("cmd is None") #下发的指令无不解析\r
- except Exception as e:\r
- print("解析JSON出错:", str(e))\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
-#普通协议数据格式根据协议指定\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
-#magic+version+type+msgid+playload_len+playload\r
-def protocol_audio_ji_playload_data(data,msgid,endflag):\r
- MAGIC = (0xfffe).to_bytes(2,"big")\r
- VERSION = (0x01).to_bytes(1,"big")#"03".encode('utf-8')\r
- TYPE = (0x05).to_bytes(1,"big")\r
- MSGID = msgid.to_bytes(4,"big")\r
- ENDFLAG = endflag.to_bytes(1,"big")\r
- DATA_LEN = (len(data)).to_bytes(4,"big")\r
- heards_infor = b''\r
- heards_infor = MAGIC+VERSION+TYPE+MSGID+ENDFLAG+DATA_LEN+data\r
- return heards_infor\r
-\r
-#语音留言格式\r
-def protocol_yuyin_voice_playload_data(data,msgid,endflag):\r
- MAGIC = (0xfffe).to_bytes(2,"big")\r
- VERSION = (0x01).to_bytes(1,"big")#"03".encode('utf-8')\r
- TYPE = (0x08).to_bytes(1,"big")\r
- MSGID = msgid.to_bytes(4,"big")\r
- ENDFLAG = endflag.to_bytes(1,"big")\r
- DATA_LEN = (len(data)).to_bytes(4,"big")\r
- heards_infor = b''\r
- heards_infor = MAGIC+VERSION+TYPE+MSGID+ENDFLAG+DATA_LEN+data\r
- return heards_infor\r
-\r
-#会议纪要格式\r
-def protocol_meet_playload_data(data,msgid,endflag):\r
- MAGIC = (0xfffe).to_bytes(2,"big")\r
- VERSION = (0x01).to_bytes(1,"big")#"03".encode('utf-8')\r
- TYPE = (0x09).to_bytes(1,"big")\r
- MSGID = msgid.to_bytes(4,"big")\r
- ENDFLAG = endflag.to_bytes(1,"big")\r
- DATA_LEN = (len(data)).to_bytes(4,"big")\r
- heards_infor = b''\r
- heards_infor = MAGIC+VERSION+TYPE+MSGID+ENDFLAG+DATA_LEN+data\r
- return heards_infor\r
-\r
-#AI翻译格式\r
-def protocol_trans_playload_data(data,msgid,endflag):\r
- MAGIC = (0xfffe).to_bytes(2,"big")\r
- VERSION = (0x01).to_bytes(1,"big")#"03".encode('utf-8')\r
- TYPE = (0x0A).to_bytes(1,"big")\r
- MSGID = msgid.to_bytes(4,"big")\r
- ENDFLAG = endflag.to_bytes(1,"big")\r
- DATA_LEN = (len(data)).to_bytes(4,"big")\r
- heards_infor = b''\r
- heards_infor = MAGIC+VERSION+TYPE+MSGID+ENDFLAG+DATA_LEN+data\r
- return heards_infor\r
-#sos紧急电话class\r
-class sosInfoCallManager(Abstract): \r
- def __init__(self):\r
- self.num = 0\r
- self.num=0\r
- self.num_len = 0\r
- self.sos_list = []\r
- self.sos_flag = 0\r
- self.sos_timer1 = osTimer()\r
- self.sos_timer2 = osTimer()\r
- self.save_list = []\r
- self.call_state = 0\r
- self.sos_config = {}\r
- self.phone110112_flag = 0\r
- self.phone110112 = ""\r
- if EventMesh.publish("get_storage_config","sos_list") != None:\r
- self.sos_list = EventMesh.publish("get_storage_config","sos_list")\r
- if EventMesh.publish("get_storage_config","sos_config") != None:\r
- self.sos_config= EventMesh.publish("get_storage_config","sos_config")\r
- \r
- # self.sos_list=[{"index":0,"phone":"15521469561","name":"dengxueying0"}, {"name":"dengxueying1","index":0,"phone":"15692025051"},{"name":"dengxueying2","index":0,"phone":"15521469561"}]\r
- EventMesh.subscribe("call_out_cb", self.call_out_cb) \r
- EventMesh.subscribe("get_sos_flag", self.get_sos_flag) \r
-\r
- def post_processor_after_instantiation(self):\r
- self.num = 0\r
- self.sos_flag = 0\r
- voiceCall.setCallback(self.voice_callback)\r
- EventMesh.subscribe("set_sos_info_call", self.set_sos_info_call)\r
- EventMesh.subscribe("set_sos_list_info",self.set_sos_list_info)\r
- EventMesh.subscribe("stop_sos_call",self.stop_sos_call)\r
- EventMesh.subscribe("set_sos_config",self.set_sos_config)\r
- def set_sos_config(self,event,msg):\r
- # sos_config:{'enable110': '1', 'pressDuration': 3, 'enableSos': '0'}\r
- print("set_sos_config:{}".format(msg))\r
- self.sos_config = msg\r
- # self.start_phone110112()\r
- pass\r
- def get_sos_flag(self,event,msg):\r
- if self.call_state != 0:\r
- return 1\r
- else:\r
- return 0\r
- # import EventMesh\r
- # EventMesh.publish("set_sos_info_call")\r
- def close_call_timer(self):\r
- self.sos_timer2.stop()\r
- pass\r
- def stop_sos_call(self,event,msg): #停止sos拨打\r
- EventMesh.publish("publish_AI_btnInfo",{"func":self.stop_sos_call_cb})\r
- def stop_sos_call_cb(self):\r
- if self.call_state == 0:\r
- return\r
- self.phone110112_flag=0\r
- self.sos_flag = 0\r
- self.call_state = 0\r
- self.num=0 #不管有没有拨打sos都清除\r
- self.num_len = 0\r
- self.sos_timer2.stop()\r
- self.sos_timer1.stop()\r
- voiceCall.callEnd() #挂断\r
-\r
- def start_phone110112(self):\r
- print("start_phone110112:{} self.sos_config:{}".format(self.call_state,self.sos_config))\r
- if self.sos_config != {}:\r
- if "enableSos" in self.sos_config:\r
- enableSos = self.sos_config["enableSos"]\r
- if enableSos == "1":\r
- if "enable110" in self.sos_config:\r
- p110 = self.sos_config["enable110"]\r
- if p110 == "0":\r
- self.phone110112 = "110"\r
- tts_str = "正在呼叫{}".format(self.phone110112)\r
- EventMesh.publish("stop_voice_record") #电话优先级最高\r
- EventMesh.publish("stop_AI_record")\r
- EventMesh.publish("play_tts",[tts_str,1]) #播放tts闹钟文本内容\r
- self.sos_timer1.stop()\r
- self.sos_timer1.start(2000, 0, self.phone110112_cb)\r
- elif p110 == "1":\r
- self.phone110112 = "112"\r
- tts_str = "正在呼叫{}".format(self.phone110112)\r
- EventMesh.publish("stop_voice_record") #电话优先级最高\r
- EventMesh.publish("stop_AI_record")\r
- EventMesh.publish("play_tts",[tts_str,1]) #播放tts闹钟文本内容\r
- self.sos_timer1.stop()\r
- self.sos_timer1.start(2000, 0, self.phone110112_cb)\r
- \r
- else:\r
- return 1\r
-\r
- def sos_call_out_phone(self, msg):#电话拨出去\r
- if self.call_state == 0:\r
- ret = voiceCall.callStart(self.sos_phone_num)\r
- if ret == -1:\r
- \r
- tts_str = "请确认卡支持语音拨号及余额充足"\r
- EventMesh.publish("stop_voice_record") #电话优先级最高\r
- EventMesh.publish("stop_AI_record")\r
- EventMesh.publish("play_tts",[tts_str,1]) #播放tts闹钟文本内容\r
- self.call_state = 0\r
- self.num=0 #不管有没有拨打sos都清除\r
- self.num_len = 0\r
- self.sos_flag = 0\r
- self.phone110112_flag=0\r
- return -1\r
- else:\r
- EventMesh.publish(constants.EVENT.START_LOCATION,WEB_CMD_ENUM.POST_SOS_S_CMD) #开始AL定位\r
- self.sos_timer2.stop()\r
- self.sos_timer2.start(30000, 0, self.sos_time_out_phone)\r
- return 1\r
- \r
- def phone110112_cb(self,*argc):\r
- if self.call_state == 0:\r
- ret = voiceCall.callStart(self.phone110112)\r
- if ret != -1:\r
- self.phone110112_flag=1\r
- else:\r
- self.phone110112_flag=0\r
- # print("ret:{} {}".format(ret,self.phone110112))\r
- self.phone110112 = ""\r
-\r
- def set_sos_list_info(self,event,msg):\r
- self.sos_list = msg\r
-\r
- \r
- def call_out_cb(self,event,phonenumber):\r
- \r
- if self.call_state == 0:\r
- self.sos_phone_num = phonenumber\r
- EventMesh.publish("stop_voice_record") #电话优先级最高\r
- EventMesh.publish("stop_AI_record")\r
- \r
- tts_str = "正在呼叫号码{}".format(self.sos_phone_num)\r
- EventMesh.publish("stop_voice_record") #电话优先级最高\r
- EventMesh.publish("stop_AI_record")\r
- EventMesh.publish("play_tts",[tts_str,1]) #播放tts闹钟文本内容\r
- self.sos_timer1.stop()\r
- self.sos_timer1.start(2000, 0, self.sos_call_out_phone)\r
- \r
- \r
- \r
- def sos_time_out_phone(self, msg):#30s超时未打通或者信号不好则重新拨打\r
- \r
- if self.sos_flag == 1:\r
- if self.call_state == 0:\r
- voiceCall.callEnd() #挂断\r
- EventMesh.publish("set_sos_info_call") #电话优先级最高\r
- pass #再次拨打\r
-\r
- def set_sos_info_call(self,event,msg):\r
- if EventMesh.publish("get_yuyinaudio_flag") == 1 or EventMesh.publish("get_voice_record_mode") != 0: #语言留言模式不允许拨打电话\r
- self.call_state = 0\r
- self.num=0 #不管有没有拨打sos都清除\r
- self.num_len = 0\r
- self.sos_flag = 0\r
- self.phone110112_flag=0\r
- return\r
- if sim.getStatus() != 1:#网络正常\r
- tts_str = "无SIM卡"\r
- EventMesh.publish("stop_voice_record") #电话优先级最高\r
- EventMesh.publish("stop_AI_record")\r
- EventMesh.publish("play_tts",[tts_str,1]) #播放tts闹钟文本内容\r
- self.call_state = 0\r
- self.num=0 #不管有没有拨打sos都清除\r
- self.num_len = 0\r
- self.sos_flag = 0\r
- self.phone110112_flag=0\r
- return\r
- if self.call_state != 0:\r
- return\r
- if len(self.sos_list) > 0:\r
- self.call_state = 0\r
- self.call_sos_cb(1)\r
- else:\r
- tts_str = "未设置号码"\r
- EventMesh.publish("stop_voice_record") #电话优先级最高\r
- EventMesh.publish("stop_AI_record")\r
- EventMesh.publish("play_tts",[tts_str,1]) #播放tts闹钟文本内容\r
- self.call_state = 0\r
- self.num=0 #不管有没有拨打sos都清除\r
- self.num_len = 0\r
- self.sos_flag = 0\r
- self.phone110112_flag=0\r
-\r
- def call_sos_cb(self,*argc):\r
- self.phone110112_flag=0\r
- if self.sos_flag == 0:\r
- self.sos_flag = 1\r
- sos_flag = self.sos_flag\r
- EventMesh.debug_log('voicecall sos_flag',sos_flag)\r
- if sos_flag == 0 :\r
- self.num = 0\r
- else:\r
- if len(self.sos_list) > 0:\r
- # for list_t in self.sos_list:\r
- # tmp = list_t["phone"]\r
- # self.save_list.append(tmp)\r
- \r
- self.num +=1\r
- if len(self.sos_list) == 1:\r
- self.num_len = len(self.sos_list)*3#三次 1\r
- elif len(self.sos_list) == 2:\r
- self.num_len = len(self.sos_list)*3 #1+2+1+2\r
- elif len(self.sos_list) == 3:\r
- self.num_len = len(self.sos_list)*3 #1+3+5\r
- # EventMesh.debug_log("number:{} number_len :{} num:{} num_len:{}".format(number,len(number),num,num_len))\r
- if self.num > self.num_len :\r
- \r
- self.start_phone110112()\r
- EventMesh.debug_log("call phone!!!!!!!")\r
- self.sos_flag = 0\r
- self.num = 0\r
- self.num_len = 0\r
- else:\r
- self.phone110112_flag=0\r
- EventMesh.debug_log("self.num:{} self.num_len :{}".format(self.num,self.num_len))\r
-\r
- if len(self.sos_list) == 1:\r
- if len(self.sos_list[0]["phone"]) != 0:\r
- EventMesh.publish("call_out_cb", self.sos_list[0]["phone"]) \r
- # EventMesh.publish("set_callnumer_cb",self.sos_list[0]["pnone"])\r
- EventMesh.debug_log("phone 1 {}".format(self.sos_list[0]["phone"]))\r
- elif len(self.sos_list) == 2:\r
- # 1 2 \r
- # 3 4 \r
- # 5 6\r
- if self.num == 1 or self.num == 3 or self.num == 5: #1 2 3 4 5 \r
- if len(self.sos_list[0]) != 0:\r
- EventMesh.debug_log("phone 2 {}".format(self.sos_list[0]["phone"]))\r
- EventMesh.publish("call_out_cb", self.sos_list[0]["phone"]) \r
- # EventMesh.publish("set_callnumer_cb",self.sos_list[1]["pnone"])\r
- elif self.num == 2 or self.num == 4 or self.num == 6:\r
- if len(self.sos_list[1]) != 0:\r
- EventMesh.debug_log("phone 3 {}".format(self.sos_list[1]["phone"]))\r
- EventMesh.publish("call_out_cb", self.sos_list[1]["phone"]) \r
- # EventMesh.publish("set_callnumer_cb",self.sos_list[0]["pnone"])\r
- elif len(self.sos_list) == 3:\r
- # 1 2 3 \r
- # 4 5 6 \r
- # 7 8 9 \r
- if self.num == 1 or self.num == 4 or self.num == 7:\r
- if len(self.sos_list[0]) != 0:\r
- EventMesh.publish("call_out_cb", self.sos_list[0]["phone"]) \r
- # EventMesh.publish("set_callnumer_cb",self.sos_list[0]["phone"])\r
- EventMesh.debug_log("phone 4 {}".format(self.sos_list[0]["phone"]))\r
- elif self.num == 2 or self.num == 5 or self.num == 8:\r
- if len(self.sos_list[1]) != 0:\r
- EventMesh.debug_log("phone 5 {}".format(self.sos_list[1]["phone"]))\r
- EventMesh.publish("call_out_cb", self.sos_list[1]["phone"]) \r
- # EventMesh.publish("set_callnumer_cb",self.sos_list[2]["phone"])\r
- elif self.num == 3 or self.num == 6 or self.num == 9:\r
- if len(self.sos_list[2]) != 0:\r
- EventMesh.debug_log("phone 6 {}".format(self.sos_list[2]["phone"]))\r
- EventMesh.publish("call_out_cb", self.sos_list[2]["phone"]) \r
- # EventMesh.publish("set_callnumer_cb",self.sos_list[0]["phone"])\r
- else: #清除表示\r
- tts_str = "未设置号码"\r
- EventMesh.publish("stop_voice_record") #电话优先级最高\r
- EventMesh.publish("stop_AI_record")\r
- EventMesh.publish("play_tts",[tts_str,1]) #播放tts闹钟文本内容\r
- self.sos_flag = 0\r
- self.num = 0\r
- self.call_state = 0\r
- self.num=0 #不管有没有拨打sos都清除\r
- self.num_len = 0\r
- self.phone110112_flag=0\r
- #未设置号码\r
- \r
-\r
- def voice_callback(self,args):\r
- EventMesh.debug_log('111test voicecall iinfo:{}'.format(args))\r
- if args[0] == 10: #电话拨进来\r
- self.sos_flag = 0\r
- self.call_state = 1 \r
- self.phone110112_flag=0\r
- elif args[0] == 11: #已接听\r
- self.call_state = 2\r
- self.num=0 #不管有没有拨打sos都清除\r
- self.num_len = 0\r
- self.sos_flag = 0\r
- self.phone110112_flag=0\r
- self.close_call_timer()\r
-\r
- EventMesh.debug_log('voicecall connected, PhoneNO.: ', args[6])\r
-\r
- elif args[0] == 12: #电话挂断\r
- self.phone110112_flag=0\r
- if self.call_state == 2 or self.call_state == 1: #电话拨出去没有接听 就挂断\r
- pass\r
- else:\r
- \r
- EventMesh.debug_log('voicecall disconnect end !!!')\r
- self.close_call_timer()\r
- self.call_state = 0\r
- if self.sos_flag == 1:\r
- EventMesh.publish("set_sos_info_call")\r
- pass\r
- self.call_state = 0\r
- #再次拨打下一个电话号码\r
- EventMesh.debug_log('voicecall disconnect end')\r
- \r
-\r
- elif args[0] == 13: #\r
- self.call_state = 7\r
- EventMesh.debug_log('voicecall is waiting, PhoneNO.: ', args[6])\r
- elif args[0] == 14: #电话拨出去\r
- EventMesh.debug_log('voicecall dialing, PhoneNO.: ', args[6])\r
- if self.sos_flag == 1:\r
- self.call_state = 3 #当前是拨打sos号码标识\r
- else:\r
- self.call_state = 4\r
- \r
- elif args[0] == 15:\r
- self.call_state = 5\r
- EventMesh.debug_log('voicecall alerting, PhoneNO.: ', args[6])\r
- \r
- \r
- elif args[0] == 16:\r
- self.call_state = 6\r
- EventMesh.debug_log('voicecall holding, PhoneNO.: ', args[6])\r
-\r
-\r
-\r
- \r
-try: \r
- import usr.ai_alarm as _schedule\r
-except Exception as e:\r
- usys.print_exception(e)\r
- import ai_alarm as _schedule\r
-DEFIEN_HR_REPORT_TIME = 5*60\r
-DEFINE_TIME_COUNT = 10\r
-DEFIEN_LOCATION_REPORT_TIME = DEFINE_TIME_COUNT\r
-WEB_CONNECT_MAX_COUNT = 10 #默认重连次数\r
-class SockMangager(Abstract):\r
- def __init__(self):\r
- self.thread_buf_size = 16*1024\r
- self.iot_web_send_queue = Queue(100)\r
- self.iot_web_protoclo_recv_id=0\r
- self.iot_protocol_client = None\r
- self.connect_web_timer = osTimer() \r
- self.connect_web_timer_count = 0\r
- self.hr_report_timer = osTimer()\r
- self.resolver = None\r
- self.timerHr = 0\r
- self.timerLocation = 0\r
- self.send_device_time = 0\r
- self.vbat_buf = []\r
- self.network_state = 0\r
- self.curr_battery_level = 0\r
- self.iot_web_send_queue_id = 0\r
- self.bat_count = 0\r
- self.minute_now_old = 0\r
- self.old_minute = 0\r
- self.is_alarm = 0\r
- self.reconnect_count = 0 #连续重连次数 默认十次 不过就不重连了 等下一个心跳重连\r
- self.schedule = _schedule.schedule()\r
- self._1S_timer = osTimer()\r
- self._5S_timer = osTimer()\r
- self.timer_id = 0\r
- self.start_voice_flag = 0\r
- self.init_send_default=0\r
- self.play_new_voice_state = 0\r
- self.stop_play = 0\r
- self.get_voice_new_msginit = 0\r
- self.voice_id = "0"\r
- self.bt_connect_list = []\r
- self.new_voice_list = []\r
- self.location_info= {}\r
- self.locate_duration = 0\r
- self.locate_duration_state = 0\r
- self.location_info = EventMesh.publish("get_storage_config","locate_duration_time") #获取定位频率信息\r
-\r
- self.temp = 0\r
- if self.location_info == None:\r
- self.location_info = {}\r
- else:\r
- # location_time["duration"]=locate_duration_time\r
- # location_time["state"]=locate_duration_state\r
- if "duration" in self.location_info:\r
- self.locate_duration = self.location_info["duration"] #定位频率\r
- if "state" in self.location_info:\r
- self.locate_duration_state = self.location_info["state"] #是否开启频率定位\r
- pass\r
- EventMesh.subscribe("REPORT_ALARM_TO_IOT",self.report_alarm_to_iot)\r
- EventMesh.subscribe("REPORT_SCHEDULE_TO_IOT",self.report_schedule_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 report_schedule_to_iot(self,event,msg):\r
- EventMesh.publish(WEB_CMD_ENUM.POST_SCHEDULE_S_CMD,msg)\r
- pass\r
- def usb_event_cb(self, state):\r
- status = state\r
- def post_processor_after_instantiation(self):\r
- self.minute_now_old=0\r
- EventMesh.subscribe("set_curr_battery_level",self.set_curr_battery_level)\r
- EventMesh.subscribe("get_curr_battery_level",self.get_curr_battery_level)\r
- EventMesh.subscribe("screen_get_battery",self.get_battery)\r
- EventMesh.subscribe("CHANNEL_IOT_WEB_SEND",self.user_send)\r
- EventMesh.subscribe("set_temp",self.set_temp)\r
- EventMesh.subscribe("GET_IOT_PROTOCOL_CILENT",self.get_iot_protoclo_client)\r
- EventMesh.subscribe("SEND_JINMOAUDIO_TO_IOT",self.send_jm_audio_to_iot)\r
- EventMesh.subscribe("SEND_YUYINAUDIO_TO_IOT",self.send_yuyin_audio_to_iot)\r
- EventMesh.subscribe("SEND_MEETAUDIO_TO_IOT",self.send_meet_audio_to_iot)\r
- EventMesh.subscribe("SEND_TRANSAUDIO_TO_IOT",self.send_trans_audio_to_iot)\r
- EventMesh.subscribe("open_websocket_timer",self.open_websocket_timer)\r
- EventMesh.subscribe("close_websocket_timer",self.close_websocket_timer)\r
- EventMesh.subscribe("connect_iot_websocket_cb",self.connect_iot_websocket_cb)\r
- EventMesh.subscribe("set_play_new_voice_list",self.set_play_new_voice_list)\r
- EventMesh.subscribe("get_play_new_voice_list",self.get_play_new_voice_list)\r
-\r
- EventMesh.subscribe("send_meet_open_flag_to_iot",self.send_meet_open_flag_to_iot)#会议创建\r
- EventMesh.subscribe("send_meet_end_flag_to_iot",self.send_meet_end_flag_to_iot)#会议结束\r
-\r
- EventMesh.subscribe("send_trans_come_flag_to_iot",self.send_trans_come_flag_to_iot)#进入翻译\r
- EventMesh.subscribe("send_trans_ok_flag_to_iot",self.send_trans_ok_flag_to_iot)#向APP发送进入翻译成功\r
- EventMesh.subscribe("send_trans_end_flag_to_iot",self.send_trans_end_flag_to_iot)#退出翻译\r
- # import EventMesh\r
- # EventMesh.publish("play_new_voice_list")\r
- EventMesh.subscribe("play_new_voice_list",self.play_new_voice_list) #播放语音未读信息\r
- EventMesh.subscribe("update_play_new_voice_info",self.update_play_new_voice_info) #更新语音未读信息状态上报IOT\r
- EventMesh.subscribe("send_bt_scan_list",self.send_bt_scan_list) #上报扫描列表\r
- EventMesh.subscribe("save_bt_connect_list",self.save_bt_connect_list) #保存耳机连接状态列表\r
- EventMesh.subscribe("send_bt_connect_list",self.send_bt_connect_list) #发送耳机连接状态列表\r
- EventMesh.subscribe("set_play_new_voice_state",self.set_play_new_voice_state) #设置播放语音未读状态1正在播放语音未读消息\r
- EventMesh.subscribe("get_play_new_voice_state",self.get_play_new_voice_state) #获取播放语音未读状态1正在播放语音未读消息\r
- EventMesh.subscribe("set_stop_play",self.set_stop_play) #外部控制url音频播放列表暂停\r
- EventMesh.subscribe("get_stop_play",self.get_stop_play) #获取外部控制url音频播放列表暂停情况\r
- EventMesh.subscribe("send_bt_connect_state_to_iot",self.send_bt_connect_state_to_iot) #发耳机;链接状态->IOT\r
- EventMesh.subscribe("send_unbind_dev_to_iot",self.send_unbind_dev_to_iot) #发送解绑指令到IOT平台\r
- EventMesh.subscribe("set_location_info",self.set_location_info) #设置定位信息\r
- EventMesh.subscribe("post_device_state",self.post_device_state) #上报设备状态信息-》IOT\r
- EventMesh.subscribe("send_power_init_data",self.send_power_init_data) #上电初始化上报数据集合\r
- # count = 0\r
- # while True:\r
- # count += 1\r
- # if count > 20 :\r
- # break\r
- # data = dataCall.getInfo(1, 0)\r
- # print("data call INFO {}".format(data))\r
- # if data[2][0]:\r
- # self.network_state = 1\r
- # break\r
- # print("web等待网络 {}...".format(count))\r
-\r
- # utime.sleep_ms(500)\r
- self.timerHr = 0\r
- self.reconnect_count = 0\r
- self.voice_id = "0"\r
- self.deviceReadState = ""\r
- self.get_voice_new_msginit = 0\r
- self.bt_connect_list = []\r
- self.new_voice_list = []\r
- self.connect_web_timer.start(2000,0,self.iot_web_connect_timerCb) #开机2s之后连接iot\r
- def connect_iot_websocket(self):\r
- if EventMesh.publish("get_voice_record_flag") == 1:\r
- EventMesh.publish("stop_voice_record")\r
- print("connect_iot_websocket !!!!")\r
- self.iot_close_web_therad()\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
-\r
- print("token:{}".format(token))\r
- # token = "957119d6b67b89dc1bc533d2e0c058d559"\r
- # token = "951b74498eabe241e8a8c644a4f07531ef"\r
-\r
- try:\r
- if token != None:\r
- self.connect_web_timer_count = 0\r
- url_t = "{}?bz-dt={}".format(constants.IOT_WS_URL, token)\r
- try:\r
- self.iot_protocol_client=uwebsocket.Client.connect(url_t, debug=True)\r
- self.reconnect_count=0\r
- except Exception as e:\r
- print("再次连接,iot连接报错是")\r
- print(e)\r
- self.reconnect_count+=1\r
- EventMesh.publish("publish_AI_btnInfo",{"func":self.connect_iot_websocket}) #self.connect_iot_websocket()\r
- return \r
-\r
- if self.iot_protocol_client != None:\r
- self.reconnect_count = 0\r
- _thread.stack_size(self.thread_buf_size+8*1024) #_thread.stack_size(16*1024)\r
- self.iot_web_send_queue_id = _thread.start_new_thread(self.websocket_send_queue_thread, ())\r
- _thread.stack_size(8*1024)\r
- \r
- _thread.stack_size(self.thread_buf_size+8*1024)\r
- self.iot_web_protoclo_recv_id = _thread.start_new_thread(self.websocket_recv_queue_thread, ())\r
- _thread.stack_size(8*1024)\r
- \r
- else:\r
- print("self.iot_protocol_client init!!!!!!!!!")\r
- self.reconnect_count+=1\r
- # EventMesh.publish("connect_iot_websocket_cb")\r
- EventMesh.publish("publish_AI_btnInfo",{"func":self.connect_iot_websocket}) #self.connect_iot_websocket()\r
- return \r
-\r
- if self.iot_protocol_client != None:\r
- self.start_voice_flag = 1\r
- else:\r
- self.start_voice_flag = 0\r
- \r
- print("self.iot_protocol_client %d self.start_voice_flag:%d",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.public_report_event)\r
- self.timer_id=1\r
- else:\r
- print("没有token!!!!!!!!!!")\r
- self.connect_web_timer_count+=1\r
- if self.connect_web_timer_count <= 10:\r
- self.connect_web_timer.start(5000,0,self.iot_web_connect_timerCb) #没有token 5s之后再重连\r
- pass\r
- except Exception as e: \r
- self.iot_protocol_client = None\r
- print("connect_iot_websocket error")\r
- \r
- def post_device_state(self,event,msg): #上报设备状态\r
- device_state=EventMesh.publish("GET_IOT_WEB_SEND_CMD",WEB_CMD_ENUM.POST_DEVICE_STATE_S_CMD)\r
- print("device_state{}".format(device_state))\r
- EventMesh.publish(WEB_CMD_ENUM.POST_DEVICE_STATE_S_CMD,device_state) #上报设备状态\r
- def set_location_info(self,event,msg):\r
- if "duration" in msg:\r
- self.locate_duration=msg["duration"]\r
- if "state" in msg:\r
- self.locate_duration_state=msg["state"]\r
-\r
-\r
- def save_bt_connect_list(self,event,msg):\r
- print("msg:{}".format(msg))\r
- # msg = {"event":"bt_connect_single","data":{"name":"yeiwyei","mac":"89:89:78:78:98:89","state":"connected"}}\r
- try:\r
- data = msg["data"]\r
- if "None" in data: #开机没有连接过蓝牙耳机就为kong\r
- return\r
- if isinstance(data,dict) == True:\r
- mac = data["mac"]\r
- state = data["state"]\r
- name = data["name"]\r
- need_save = 0\r
- for i,_alarm in enumerate(self.bt_connect_list):\r
- mac_tmp = _alarm["mac"]\r
- if mac_tmp == mac:\r
- need_save = 1\r
- self.bt_connect_list[i]["state"] = state\r
- self.bt_connect_list[i]["name"] = name\r
- break\r
- self.bt_connect_list[i]["state"] ="disconnected"\r
-\r
- if need_save == 0: #列表里面没有才需要保存\r
- self.bt_connect_list.append(data)\r
- print("self.bt_connect_list:{}".format(self.bt_connect_list))\r
- except Exception as e:\r
- print("json数据不完整:self.recv_bt_connect_record_list")\r
- usys.print_exception(e)\r
- pass\r
- def send_bt_connect_list(self,event,msg):\r
- \r
- date_tmp = utime.localtime()\r
- time_tmp = utime.mktime(date_tmp)\r
- bt_connect_record_list = {\r
- "cmd":"bt_connect_record_list",\r
- "ts":time_tmp,\r
- "msg":"上报蓝牙连接列表",\r
- "data":self.bt_connect_list\r
- \r
- }\r
- print("bt_connect_record_list:{}".format(bt_connect_record_list))\r
- EventMesh.publish(WEB_CMD_ENUM.BT_CONNECT_RECORD_LIST_S,bt_connect_record_list)\r
- pass\r
-\r
- def set_play_new_voice_list(self,event,msg):\r
- self.new_voice_list = msg\r
- pass\r
-\r
- def get_play_new_voice_list(self,event,msg):\r
- return self.new_voice_list\r
-\r
- def set_play_new_voice_state(self,event,msg):\r
- self.play_new_voice_state = msg\r
- pass\r
-\r
- def get_play_new_voice_state(self,event,msg):\r
- return self.play_new_voice_state\r
-\r
- def get_stop_play(self,event,msg):\r
- return self.stop_play\r
-\r
- def set_stop_play(self,event,msg):\r
- self.stop_play = msg\r
- pass\r
-\r
- def _1S_timer_cb(self,*argc):\r
- EventMesh.publish("publish_AI_btnInfo",{"func":self._1S_timer_cb_}) \r
-\r
- def _1S_timer_cb_(self): \r
- #self.iot_web_send_queue.put("ping") \r
- get_VC_satrt_flag = EventMesh.publish("get_VC_satrt_flag")\r
- if get_VC_satrt_flag == None:\r
- get_VC_satrt_flag = 0\r
- if get_VC_satrt_flag == 0:\r
- self.play_new_voice_list_timer_cb()\r
- self._1S_timer.stop()\r
-\r
- def play_new_voice_list(self,event,msg):\r
- if len(self.new_voice_list) != 0:\r
- self._1S_timer.start(1000, 1, self._1S_timer_cb)\r
-\r
- def play_new_voice_list_timer_cb(self):\r
- print("play_new_voice_list:{}".format(len(self.new_voice_list)))\r
- voice_list = self.new_voice_list\r
- if len(self.new_voice_list) != 0:\r
- \r
- for i,data in enumerate(self.new_voice_list):\r
- if EventMesh.publish("get_history_voice_flag") == 1:\r
- data = voice_list[len(self.new_voice_list)-1-i]\r
- print("data:{}".format(data))\r
- self.voice_index = i\r
- self.voice_id = str(data["id"])\r
- url = str(data["url"])\r
- # url = "http://qipaiai-oss1.tos-cn-beijing.volces.com/qi_pai_ringtone/2025_08_11/742659759219544064test.mp3"\r
- self.play_new_voice_state = 1\r
- if self.stop_play == 1:\r
- print("结束播放")\r
- self.stop_play = 0\r
- break\r
- if EventMesh.publish("get_storage_config","is_noread_voice") == 1:#还有未读的(开机)\r
- if EventMesh.publish("get_open_device") == 1:#刚开机\r
- EventMesh.publish("play_wait_voice",[url,1])\r
- EventMesh.publish("set_open_device",0)\r
- if EventMesh.publish("get_history_voice_flag") == 1:#播放历史留言 or 播放当前留言\r
- if EventMesh.publish("get_wait_voice_flag") == 1:#等待留言\r
- EventMesh.publish("play_wait_voice",[url,1])\r
- else:\r
- time = str(data["createTimeStr"])\r
- EventMesh.publish("play_his_voice",[url,1,time])\r
- if len(EventMesh.publish("get_play_new_voice_list")) == 0:#列表为空才清零\r
- EventMesh.publish("set_history_voice_flag",0)#修改标志位\r
- else:\r
- EventMesh.publish("play_new_voice",[url,1])\r
- break\r
- pass\r
- def update_play_new_voice_info(self,event,msg): #更新播放语音留言信息\r
- date_tmp = utime.localtime()\r
- time_tmp = utime.mktime(date_tmp)\r
- put_voice_msg_state = {\r
- "cmd":"put_voice_msg_state",\r
- "ts":time_tmp,\r
- "msg":"修改语音消息阅读状态",\r
- "data":self.voice_id\r
- }\r
- if len(self.new_voice_list) != 0:\r
- self.new_voice_list.pop(self.voice_index)\r
- EventMesh.publish(WEB_CMD_ENUM.PUT_VOICE_MSG_STATE_S,put_voice_msg_state)\r
- pass\r
- \r
- def send_bt_scan_list(self,event,msg):\r
- date_tmp = utime.localtime()\r
- time_tmp = utime.mktime(date_tmp)\r
- try:\r
- # print("type:{}".format(msg))\r
- data = msg["data"]\r
- bt_scan_rest ={\r
- "cmd":"bt_scan_rest",\r
- "ts":time_tmp,\r
- "msg":"上报扫描列表",\r
- "data":data\r
- }\r
- EventMesh.publish(WEB_CMD_ENUM.BT_SCAN_REST_S_CMD,bt_scan_rest)\r
- except Exception as e:\r
- usys.print_exception(e)\r
- pass\r
- def send_unbind_dev_to_iot(self,event,msg):\r
- self._5S_timer.start(5000,0,self._5S_timer_cb)\r
- def _5S_timer_cb(self,*argc):\r
- EventMesh.publish("publish_AI_btnInfo",{"func":self.send_unbind_dev_to_iot_cb})\r
- pass\r
- def send_unbind_dev_to_iot_cb(self):\r
- EventMesh.publish(WEB_CMD_ENUM.UNBIND_DEV_S)\r
- pass\r
- def send_bt_connect_state_to_iot(self,event,msg):\r
- date_tmp = utime.localtime()\r
- time_tmp = utime.mktime(date_tmp)\r
- \r
- try:\r
- # {\r
- # "cmd":"post_bt_connect_rest",\r
- # "ts":1738283829,\r
- # "msg":"上报蓝牙连接结果",\r
- # "data":{\r
- # "mac":"mac地址",\r
- # "state":"connected/disconnected/connecting/failed"\r
- # }\r
- # }\r
- event = msg["event"]\r
- mac = msg["data"]["mac"]\r
- state = msg["data"]["state"]\r
- json_data = \\r
- {\r
- \r
- "cmd": event,\r
- "ts":time_tmp,\r
- "msg":"上报蓝牙连接结果",\r
- "data":{\r
- "mac":mac,\r
- "state":state\r
- } \r
- \r
- }\r
- EventMesh.publish(WEB_CMD_ENUM.POST_BT_CONNECT_REST_S,json_data)\r
- except Exception as e:\r
- usys.print_exception(e)\r
- pass\r
- \r
- def send_meet_open_flag_to_iot(self,event,msg): #创建会议纪要上报到IOT平台\r
- time_tmp = utime.mktime(date_tmp)\r
- meet_open = {\r
- "msg": "开始会议",\r
- "data": None,\r
- "cmd": "meet_begin",\r
- "ts": time_tmp\r
- }\r
- send_data = protocol_send_total_data(meet_open)\r
- EventMesh.publish("CHANNEL_IOT_WEB_SEND",send_data)\r
- pass\r
-\r
- def send_meet_end_flag_to_iot(self,event,msg): #结束会议纪要上报到IOT平台\r
- time_tmp = utime.mktime(date_tmp)\r
- meet_end = {\r
- "msg": "结束会议",\r
- "data": None,\r
- "cmd": "meet_end",\r
- "ts": time_tmp\r
- }\r
- send_data = protocol_send_total_data(meet_end)\r
- EventMesh.publish("CHANNEL_IOT_WEB_SEND",send_data)\r
- pass\r
-\r
- def send_trans_come_flag_to_iot(self,event,msg): #进入翻译上报到IOT平台\r
- time_tmp = utime.mktime(date_tmp)\r
- trans_open = {\r
- "msg": "进入翻译模式",\r
- "data": None,\r
- "cmd": "translate_device_enter",\r
- "ts": time_tmp\r
- }\r
- send_data = protocol_send_total_data(trans_open)\r
- EventMesh.publish("CHANNEL_IOT_WEB_SEND",send_data)\r
- pass\r
-\r
- def send_trans_ok_flag_to_iot(self,event,msg): #成功进入翻译发给APP\r
- time_tmp = utime.mktime(date_tmp)\r
- trans_ok = {\r
- "msg": "进入成功",\r
- "data": None,\r
- "cmd": "translate_device_complete",\r
- "ts": time_tmp\r
- }\r
- send_data = protocol_send_total_data(trans_ok)\r
- EventMesh.publish("CHANNEL_IOT_WEB_SEND",send_data)\r
- pass\r
- \r
- def send_trans_end_flag_to_iot(self,event,msg): #退出翻译上报到IOT平台\r
- time_tmp = utime.mktime(date_tmp)\r
- trans_open = {\r
- "msg": "退出翻译",\r
- "data": None,\r
- "cmd": "translate_device_exit",\r
- "ts": time_tmp\r
- }\r
- send_data = protocol_send_total_data(trans_open)\r
- EventMesh.publish("CHANNEL_IOT_WEB_SEND",send_data)\r
- pass\r
-\r
- def send_jm_audio_to_iot(self,event,msg): #静默录音音频数据上报到IOT平台\r
- send_data = b''\r
- send_data = protocol_audio_ji_playload_data(msg[0],msg[1],msg[2])\r
- # print("jm:{}".format(msg[2]))\r
- EventMesh.publish("CHANNEL_IOT_WEB_SEND",send_data)\r
- pass\r
-\r
- def send_yuyin_audio_to_iot(self,event,msg): #上报语音留言音频数据到IOT平台\r
- send_data = b''\r
- send_data = protocol_yuyin_voice_playload_data(msg[0],msg[1],msg[2])\r
- # print("yuyin:{}".format(msg[2]))\r
- EventMesh.publish("CHANNEL_IOT_WEB_SEND",send_data)\r
- pass\r
-\r
- def send_meet_audio_to_iot(self,event,msg): #上报会议纪要音频数据到IOT平台\r
- send_data = b''\r
- send_data = protocol_meet_playload_data(msg[0],msg[1],msg[2])\r
- # print("yuyin:{}".format(msg[2]))\r
- EventMesh.publish("CHANNEL_IOT_WEB_SEND",send_data)\r
- pass\r
-\r
- def send_trans_audio_to_iot(self,event,msg): #上报AI翻译音频数据到IOT平台\r
- send_data = b''\r
- send_data = protocol_trans_playload_data(msg[0],msg[1],msg[2])\r
- # print("yuyin:{}".format(msg[2]))\r
- EventMesh.publish("CHANNEL_IOT_WEB_SEND",send_data)\r
- pass\r
- \r
-\r
- #获取电池电量\r
- def get_battery(self, event=None, msg=None):\r
- """\r
- 获取电池事件,暂时没支持\r
- :param event:\r
- :param msg:\r
- :return:\r
- """\r
-\r
- charge_state = '0'\r
- usb_state = EventMesh.publish("GET_USB_STATE")\r
- if usb_state == None:\r
- usb_state = 0\r
-\r
- if usb_state == 1:\r
- charge_state = '1'\r
- else:\r
- charge_state = '0'\r
-\r
- vbat = EventMesh.publish("get_battery")\r
- if vbat is None:\r
- vbat = 100\r
- # EventMesh.debug_log("vbat",vbat)\r
- # if temp != None :\r
- # if temp <= 3505:\r
- # vbat = 0 \r
- # elif temp <= 3699:\r
- # vbat = 20 #"E:/vbat_20.jpg"\r
- # elif temp <= 3772:\r
- # vbat = 40 #"E:/vbat_40.jpg"\r
- # elif temp <= 3882:\r
- # vbat = 60 #"E:/vbat_60.jpg"\r
- # elif temp <= 4070:\r
- # vbat = 80 #"E:/vbat_80.jpg"\r
- # elif temp <= 4200:\r
- # vbat = 90 #\r
- # else:\r
- # vbat = 100 #"E:/vbat_100.jpg"\r
- # else:\r
- # vbat = 100\r
-\r
- result = [charge_state, vbat]\r
-\r
- return result\r
- def set_curr_battery_level(self, event=None, msg=None):\r
- self.curr_battery_level = msg\r
- \r
- def get_curr_battery_level(self, event=None, msg=None):\r
- return self.curr_battery_level\r
- \r
- def initialization(self, *args):\r
- pass\r
- #EventMesh.debug_log("ProtoCol:{}".format(self.TYPE + "_SEND"))\r
- def connect_iot_websocket_cb(self,event,msg):\r
- self.connect_iot_websocket()\r
- def add_support_resolver(self, resolver):\r
- self.resolver = resolver\r
- def public_report_event(self, *args, **kwargs):\r
- EventMesh.publish("publish_AI_btnInfo",{"func":self.public_report_event_cb}) #self.connect_iot_websocket()\r
- def send_power_init_data(self,event=None,msg=None):\r
- self.public_report_event_cb()\r
- #上报心跳 上报设备状态 检查闹钟 日程\r
- def public_report_event_cb(self):\r
- """电池平均值:与 vc_hw._BatteryCfg 共用 10 点滑动平均,避免重复 getVbatt。"""\r
- bat_total_value = 0\r
- try:\r
- from vc_hw import _BatteryCfg\r
- bcfg = _BatteryCfg.instance()\r
- try:\r
- usb_st = EventMesh.publish("GET_USB_STATE")\r
- except Exception:\r
- usb_st = 0\r
- bcfg.push_vbatt_sample(usb_status=usb_st)\r
- bat_total_value = bcfg.soc_now()\r
- except Exception:\r
- bat_total_value = 0\r
- # EventMesh.publish("AI_schedule_open")#读取闹钟数组\r
- # print("AI_schedule_open!!!")\r
- if EventMesh.publish("get_sos_flag") != None:\r
- if EventMesh.publish("get_sos_flag") == 1:\r
- print("get_sos_flag!!!!!!")\r
- EventMesh.publish(constants.EVENT.SYSTEM_UP)#唤醒休眠\r
- print("get_sos_flag1!!!!!!")\r
-\r
- EventMesh.publish("AI_alarm_start") #检查是否有闹钟需要提醒\r
- EventMesh.publish("AI_schedule_open")#检查日程是否需要提醒\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
- self.timerHr+=DEFINE_TIME_COUNT\r
- if self.timerHr >= DEFIEN_HR_REPORT_TIME:\r
- self.timerHr= 0\r
- self.reconnect_count = 0\r
- self.connect_web_timer_count=0\r
- EventMesh.publish("publish_AI_btnInfo",{"func":self.hr_report_publish_event,"data":0}) \r
- # print("self.locate_duration_state:{} self.locate_duration:{}".format(self.locate_duration_state,self.locate_duration))\r
- if self.locate_duration_state == 1:\r
- if self.locate_duration == None:\r
- self.timerLocation = 0\r
- else:\r
- if self.locate_duration != 0:\r
- self.timerLocation+=DEFINE_TIME_COUNT\r
- if self.timerLocation >= self.locate_duration:\r
- self.timerLocation= 0\r
- EventMesh.publish(constants.EVENT.START_LOCATION,WEB_CMD_ENUM.POST_LOCATION_S_CMD) #定位上报\r
- else:\r
- self.timerLocation= 0\r
- else:\r
- self.timerLocation= 0\r
-\r
- \r
- if self.send_device_time < DEFIEN_LOCATION_REPORT_TIME : #上电初始化上报一次设备状态信息\r
- self.send_device_time+=DEFINE_TIME_COUNT\r
- else:\r
- if self.get_voice_new_msginit == 0: \r
- self.get_voice_new_msginit=1\r
- EventMesh.publish("publish_AI_btnInfo",{"func":self.hr_report_publish_event,"data":0}) \r
- device_state=EventMesh.publish("GET_IOT_WEB_SEND_CMD",WEB_CMD_ENUM.POST_DEVICE_STATE_S_CMD)\r
- print("device_state{}".format(device_state))\r
- EventMesh.publish(WEB_CMD_ENUM.POST_DEVICE_STATE_S_CMD,device_state) #上报设备状态\r
- # if dev_type == "7PIN_1_5":#二代开机获取留言\r
- # EventMesh.publish("set_open_device",1)\r
- # EventMesh.publish("set_history_voice_flag",1)\r
- # EventMesh.publish("set_wait_voice_flag",1)\r
- # EventMesh.publish(WEB_CMD_ENUM.GET_NEW_VOICE_MSG_S)#向IOT获取语音未读消息\r
- \r
- \r
- # http://220.160.104.34:30800/ws-bus/test/voice-record/876226211472149?state=1,\r
- # http://220.160.104.34:30800/ws-bus/test/860132066107046?testType=alarmList\r
- def hr_report_publish_event(self,data):\r
- \r
- HR_DATA = EventMesh.publish("GET_IOT_WEB_SEND_CMD",WEB_CMD_ENUM.HR_S_CMD)\r
- print("HR_DATA{}".format(HR_DATA))\r
- EventMesh.publish(WEB_CMD_ENUM.HR_S_CMD,HR_DATA)\r
- pass\r
-\r
- def iot_web_connect_timerCb(self,*argc):\r
- self.connect_iot_websocket()\r
-\r
- \r
- def open_websocket_timer(self,event,msg):\r
- self.VC_pingping_timerout = 0\r
- # self._1S_timer.start(500,1,self._1S_timer_cb)\r
- \r
- def close_websocket_timer(self,event,msg):\r
- self._1S_timer.stop()\r
-\r
- \r
- \r
- def websocket_send_queue_thread(self):\r
- while True:\r
- data = self.iot_web_send_queue.get()\r
- \r
- if data != None:\r
- # EventMesh.debug_log("websocket:send data1 len:{}".format(len(data)))\r
- try:\r
- # EventMesh.debug_log("websocket:send data1 len:{} {}".format(len(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
- else:\r
- # EventMesh.publish("connect_iot_websocket_cb")\r
- EventMesh.publish("publish_AI_btnInfo",{"func":self.connect_iot_websocket})\r
- EventMesh.debug_log("websocket:send data2 len:{}".format(len(data),self.iot_protocol_client)) \r
- except Exception as e:\r
- EventMesh.debug_log("websocket:send error") \r
- # EventMesh.publish("connect_iot_websocket_cb")\r
- EventMesh.publish("publish_AI_btnInfo",{"func":self.connect_iot_websocket})\r
- break\r
- \r
-\r
- def websocket_recv_queue_thread(self):\r
- while True:\r
- # 死循环接收数据\r
- try:\r
- recv_data = self.iot_protocol_client.recv()\r
- print("recv_data = {}".format(len(recv_data)))\r
- if recv_data == "websocket close":\r
- # 服务器关闭连接或客户端关闭连接\r
- print("对端 服务器强制关闭 cli close")\r
- # EventMesh.publish("connect_iot_websocket_cb")\r
- EventMesh.publish("publish_AI_btnInfo",{"func":self.connect_iot_websocket}) \r
- break\r
- elif recv_data == "":\r
- print("下发的空数据 不做处理")\r
- EventMesh.publish("publish_AI_btnInfo",{"func":self.connect_iot_websocket}) \r
- break\r
- else:\r
- if len(recv_data) != 0:\r
- self.reconnect_count = 0\r
- self.resolver.handler(recv_data)\r
- \r
- except Exception as e:\r
- print("cli break")\r
- # EventMesh.publish("connect_iot_websocket_cb")\r
- EventMesh.publish("publish_AI_btnInfo",{"func":self.connect_iot_websocket}) \r
- break\r
- self.iot_web_protoclo_recv_id =0\r
-\r
- def iot_web_send_queue_close(self):\r
- if self.iot_web_send_queue_id != 0:\r
- if self.iot_web_send_queue.empty()!=True:\r
- self.iot_web_send_queue.clear()\r
- \r
- try:\r
- _thread.stop_thread(self.iot_web_send_queue_id)\r
- except Exception as e:\r
- print("iot_web_send_queue_close !!!!!!!!")\r
- print("iot_web_send_queue_close 1111!!!!!!!!")\r
- self.iot_web_send_queue_id = 0\r
- \r
- def iot_web_protoclo_recv_close_therad(self):\r
- if self.iot_web_protoclo_recv_id != 0:\r
- try:\r
- _thread.stop_thread(self.iot_web_protoclo_recv_id)\r
- except Exception as e:\r
- print("self.iot_web_protoclo_recv_id !!!!!!!!")\r
- self.iot_web_protoclo_recv_id = 0\r
- if self.iot_protocol_client != None:\r
- try:\r
- print("关闭websocke")\r
- self.iot_protocol_client.close()\r
- except Exception as e: \r
- print("关闭websocke失败")\r
- self.iot_protocol_client = None\r
- \r
-\r
- \r
- def iot_close_web_therad(self):\r
- try:\r
- self.iot_web_send_queue_close()\r
- except Exception as e:\r
- print("iot_web_send_queue_close error!!!!!!!!")\r
-\r
- try:\r
- self.iot_web_protoclo_recv_close_therad()\r
- except Exception as e:\r
- print("iot_web_protoclo_recv_close_therad error!!!!!!!!")\r
- self.start_voice_flag = 0\r
- print("iot_close_web_therad")\r
- \r
- def get_iot_protoclo_client(self,event,msg):\r
- return self.iot_protocol_client\r
- def set_temp(self,event,data):\r
- if self.temp == 0:\r
- self.temp = 1\r
- else:\r
- self.temp = 0\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
- # if self.temp == 1:\r
- # print("没信号")\r
- else :\r
- try:\r
- if self.start_voice_flag == 0: #如果关闭了就需要重新再\r
- EventMesh.publish("publish_AI_btnInfo",{"func":self.connect_iot_websocket}) \r
- return\r
- if data != None:\r
- if len(data) != 0:\r
- self.iot_web_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_websocket})\r
-\r
- except Exception as e: \r
- print("senc data err reconnect{}".format(data))\r
- EventMesh.publish("publish_AI_btnInfo",{"func":self.connect_iot_websocket})\r
- \r
- def iot_protocol_send_cb(self,data):\r
- try:\r
- if data != None:\r
- print("websocket 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("websocket send success")\r
- else:\r
- print("reconnect2 {}".format(data))\r
- # EventMesh.publish("connect_iot_websocket_cb")\r
- EventMesh.publish("publish_AI_btnInfo",{"func":self.connect_iot_websocket})\r
- except Exception as e:\r
- print("发送失败 重新连接")\r
- self.reconnect_count+=1\r
- # EventMesh.publish("connect_iot_websocket_cb")\r
- EventMesh.publish("publish_AI_btnInfo",{"func":self.connect_iot_websocket})\r
- \r
-\r
-\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
- btstate = 0\r
- blestate = 0\r
-\r
- def __init__(self):\r
- pass\r
-\r
- def initialization(self,*args):\r
- EventMesh.subscribe(self.TYPE+"_S", self.handler)\r
- EventMesh.subscribe(self.TYPE+"_R", self.handler)\r
- pass\r
-\r
- def handler(self, event, msg):\r
- print("handler {}".format(event))\r
- if event.endswith("_S"):\r
- self.send(event, msg)\r
- else:\r
- self.recv(event, msg)\r
-\r
- def send(self, event, msg):\r
- \r
- pass\r
-\r
- def recv(self, event, msg):\r
- pass\r
-#上报蓝牙连接状态\r
-class IOTWeb_post_bt_connect_restProtoCol(ProtoCol):\r
- """post_bt_connect_rest"""\r
- TYPE = "post_bt_connect_rest"\r
-\r
- def send(self, event, msg):\r
- # print("send post_bt_connect_rest{}".format(msg))\r
- send_data = b''\r
- send_data = protocol_send_total_data(msg)\r
- print("send post_bt_connect_rest{}".format(send_data))\r
- EventMesh.publish("CHANNEL_IOT_WEB_SEND", send_data)\r
-\r
- def recv(self, event, msg):\r
- """\r
-\r
- @param event: 上报蓝牙耳机连接状态\r
- @param msg: 接收到的下行数据\r
- """\r
- print("recv post_bt_connect_rest{}".format(msg))\r
-#电子围栏触发SOS警告\r
-class IOTWeb_fence_sosProtoCol(ProtoCol):\r
- """fence_sos"""\r
- TYPE = "fence_sos"\r
-\r
- def send(self, event, msg):\r
- # print("send fence_sos{}".format(msg))\r
- date_tmp = utime.localtime()\r
- time_tmp = utime.mktime(date_tmp)\r
- # 通过websocket发送到服务器端\r
- fence_sos = {\r
- "cmd":"dispatch_rest",\r
- "ts":time_tmp,\r
- "msg":"消息收到响应",\r
- "data":{\r
- "cmd":"fence_sos",\r
- "rest":"success",\r
- "msg":"收到紧急呼叫指令"\r
- }\r
- }\r
- send_data = b''\r
- send_data = protocol_send_total_data(fence_sos)\r
- print("send fence_sos{}".format(send_data))\r
- EventMesh.publish("CHANNEL_IOT_WEB_SEND", send_data)\r
-\r
- def recv(self, event, msg):\r
- """\r
-\r
- @param event: 电子围栏警告\r
- @param msg: 接收到的下行数据\r
- """\r
- EventMesh.publish(WEB_CMD_ENUM.FENCE_SOS_S)\r
- sos_list = EventMesh.publish("get_storage_config","sos_list")\r
- if sos_list != None:\r
- if len(sos_list) > 0:\r
- get_sos_flag = EventMesh.publish("get_sos_flag") \r
- if get_sos_flag == 0:\r
- EventMesh.publish("set_sos_info_call")\r
- pass\r
- \r
- print("recv fence_sos{}".format(msg))\r
-#上报心跳\r
-class IOTWeb_HRProtoCol(ProtoCol):\r
- """post_heart_beat"""\r
- TYPE = "post_heart_beat"\r
- \r
- def send(self, event, msg):\r
- print("send hr{}".format(msg))\r
- # 通过websocket发送到服务器端\r
- send_data = b''\r
- send_data = protocol_send_total_data(msg)\r
- EventMesh.publish("CHANNEL_IOT_WEB_SEND", send_data)\r
-\r
- def recv(self, event, msg):\r
- """\r
-\r
- @param event: 心跳成功\r
- @param msg: 接收到的下行数据\r
- """\r
- # {\r
- # "cmd":"post_rest",\r
- # "ts":1738283829,\r
- # "msg":"消息收到响应",\r
- # "data":{\r
- # "cmd":"post_heart_beat",\r
- # "rest":"bind/unbind",\r
- # "msg":"上报成功/格式错误"\r
- # }\r
- # }\r
- print("recv hr{}".format(msg))\r
- if "data" in msg:\r
- data = msg["data"]\r
- rest = data["rest"]\r
- if rest == "unbind": #解绑需要开启蓝牙广播\r
- self.btstate = 0\r
- if self.blestate == 0:\r
- EventMesh.publish("set_storage_config",["switch_ble_state","1"])\r
- EventMesh.publish("send_ble_switch_toble","1")\r
-\r
- EventMesh.publish("set_storage_config",["switch_bt_state","1"])\r
- EventMesh.publish("send_bt_switch_toble","1")\r
- self.blestate=1\r
-\r
- elif rest == "bind": #绑定需要关闭蓝牙广播\r
- self.blestate =0\r
- if self.btstate == 0:\r
- EventMesh.publish("set_storage_config",["switch_ble_state","0"])\r
- EventMesh.publish("send_ble_switch_toble","0")\r
- self.btstate=1\r
-\r
-#定位周期\r
-class IOTWeb_locatedurationProtoCol(ProtoCol):\r
- """locate_duration"""\r
- TYPE = "locate_duration"\r
-\r
- def send(self, event, msg):\r
- print("send locate_duration{}".format(msg))\r
- # 通过websocket发送到服务器端\r
- date_tmp = utime.localtime()\r
- time_tmp = utime.mktime(date_tmp)\r
- locatio = {\r
- "cmd":"dispatch_rest",\r
- "ts":int(time_tmp),\r
- "msg":"消息收到响应",\r
- "data":{\r
- "cmd":"locate_duration",\r
- "rest":"success",\r
- "msg":"收到定位周期指令"\r
- }\r
- }\r
- send_data = b''\r
- send_data = protocol_send_total_data(locatio)\r
- EventMesh.publish("CHANNEL_IOT_WEB_SEND",send_data)\r
-\r
- def recv(self, event, msg):\r
- """\r
-\r
- @param event:定位周期\r
- @param msg: 接收到的下行数据\r
- """\r
- # locate_now = {\r
- # "cmd":"locate_duration",\r
- # "ts":1738283829,\r
- # "msg":"下发定位周期",\r
- # "data":300,0表示关\r
- # }\r
- # {"cmd":"locate_duration","msg":"下发定位周期","data":{"duration":300,"state":"1"},"ts":1756089226052,"targetDeviceId":"860132064633266"}\r
- #location_time\r
- location_time = {}\r
- if "data" in msg:\r
- data = msg["data"]\r
- if "duration" in data:\r
- locate_duration_time = int(data["duration"])\r
- locate_duration_state = int(data["state"])\r
- location_time["duration"]=locate_duration_time\r
- location_time["state"]=locate_duration_state\r
-\r
- EventMesh.publish("set_storage_config",["locate_duration_time",location_time])\r
- EventMesh.publish("set_location_info",location_time)\r
- locate_duration_c = EventMesh.publish("get_storage_config","locate_duration_time")\r
- print("locate_duration_c:{}".format(locate_duration_c))\r
- \r
-#上报SOS告警信息\r
-class IOTWeb_post_sosProtoCol(ProtoCol):\r
- """post_sos"""\r
- TYPE = "post_sos"\r
-\r
- def send(self, event, msg):\r
- print("send post_sos{}".format(msg))\r
- # 通过websocket发送到服务器端\r
- \r
- send_data = b''\r
- send_data = protocol_send_total_data(msg)\r
- EventMesh.publish("CHANNEL_IOT_WEB_SEND",send_data)\r
-\r
- def recv(self, event, msg):\r
- """\r
- @param event:msg\r
- @param msg: 接收到的下行数据\r
- """\r
- # locate_now = {\r
- # "cmd":"locate_duration",\r
- # "ts":1738283829,\r
- # "msg":"下发定位周期",\r
- # "data":300,0表示关\r
- # }\r
- print("recv post_sos{}".format(msg))\r
-\r
-#上报设备状态 \r
-class IOTWeb_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_WEB_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
- \r
-#上报闹钟列表 \r
-class IOTWeb_post_alarmProtoCol(ProtoCol):\r
- """post_alarm"""\r
- TYPE = "post_alarm"\r
-\r
- def send(self, event, msg):\r
- print("send post_alarm{}".format(msg))\r
- # 通过websocket发送到服务器端\r
- \r
- send_data = b''\r
- send_data = protocol_send_total_data(msg)\r
- print("send send_data{}".format(send_data))\r
- EventMesh.publish("CHANNEL_IOT_WEB_SEND",send_data)\r
-\r
- def recv(self, event, msg):\r
- """\r
-\r
- @param event:post_alarm\r
- @param msg: 接收到的下行数据\r
- """\r
- print("recv post_alarm{}".format(msg))\r
- \r
-#查找设备\r
-class IOTWeb_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_WEB_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
-#立即定位\r
-class IOTWeb_LocateNowProtoCol(ProtoCol):\r
- """locate_now"""\r
- TYPE = "locate_now"\r
- def send(self, event, msg):\r
- print("send locate_now{}".format(msg))\r
- # 通过websocket发送到服务器端\r
- date_tmp = utime.localtime()\r
- time_tmp = utime.mktime(date_tmp)\r
- locate_now = {\r
- "cmd":"dispatch_rest",\r
- "ts":time_tmp,\r
- "msg":"消息收到响应",\r
- "data":{\r
- "cmd":"locate_now",\r
- "rest":"success",\r
- "msg":"收到立即定位指令"\r
- }\r
- }\r
- send_data = b''\r
- send_data = protocol_send_total_data(locate_now)\r
- EventMesh.publish("CHANNEL_IOT_WEB_SEND",send_data)\r
-\r
- def recv(self, event, msg):\r
- """\r
-\r
- @param event:立即定位\r
- @param msg: 接收到的下行数据\r
- """\r
- \r
- EventMesh.publish(WEB_CMD_ENUM.LOCATION_NOW_S_CMD)\r
- print("recv locate_now{}".format(msg))\r
- EventMesh.publish(constants.EVENT.START_LOCATION,WEB_CMD_ENUM.POST_LOCATION_S_CMD) #开始定位 定位完之后上报定位数据\r
-\r
-\r
-#上报定位信息 \r
-class IOTWeb_post_locationProtoCol(ProtoCol):\r
- """post_location"""\r
- TYPE = "post_location"\r
-\r
- def send(self, event, msg):\r
- # 通过websocket发送到服务器端\r
- send_data = b''\r
- send_data = protocol_send_total_data(msg)\r
- print("send_data post_location{}".format(msg))\r
- EventMesh.publish("CHANNEL_IOT_WEB_SEND", send_data)\r
-\r
- def recv(self, event, msg):\r
- """\r
-\r
- @param event:定位信息下发\r
- @param msg: 接收到的下行数据\r
- """\r
- print("recv post_location{}".format(msg))\r
-#闹钟列表\r
-class IOTWeb_alarm_listProtoCol(ProtoCol):\r
- """alarm_list"""\r
- TYPE = "alarm_list"\r
-\r
- def send(self, event, msg):\r
- print("send alarm_list {}".format(msg))\r
- # 通过websocket发送到服务器端\r
- date_tmp = utime.localtime()\r
- time_tmp = utime.mktime(date_tmp)\r
- rest = "error"\r
- if msg == 1:\r
- rest = "success"\r
- alarm_list ={\r
- "cmd":"dispatch_rest",\r
- "ts":time_tmp,\r
- "msg":"消息收到响应",\r
- "data":{\r
- "cmd":"alarm_list",\r
- "rest":rest,\r
- "msg":"闹钟配置成功."\r
- }\r
- }\r
- send_data = b''\r
- send_data = protocol_send_total_data(alarm_list)\r
- print("send_data alarm_list {}".format(msg))\r
- EventMesh.publish("CHANNEL_IOT_WEB_SEND", send_data)\r
-\r
- def recv(self, event, msg):\r
- """\r
-\r
- @param event:上行下发闹钟配置\r
- @param msg: 接收到的下行数据\r
- """\r
- # 定义要添加的新元素\r
- # new_item = {'time': '11:30','index': 1}\r
- # data = [{"index":1,"name":"hihihi1"},{"index":2,"name":"hihihi2"},{"index":0,"name":"hihihi0"}]\r
- # len_t = len(data)\r
- # j = 0\r
- # for i in range(len_t):\r
- # if data[j]['index'] == 1:\r
- # removed_item = data.pop(j)\r
- # print(data)\r
- # j=0\r
- # continue\r
- # j+=1\r
- # len_t = len(data)\r
- # print(len_t)\r
- # for i in range(len(data)):\r
- # data[i]["index"] = i\r
- \r
- # url = http://220.160.104.34:30800/ws-bus/test/voice-record/876226211472149?state=1\r
- # url = http://220.160.104.34:30800/ws-bus/test/876226211472149?testType = alarmList\r
-\r
- alarm_list=[]\r
- ret = 1\r
- if "data" in msg:\r
- data = msg["data"]\r
- if isinstance(data,list) == True:\r
- for i in range(len(data)):\r
- data_list = data[i]\r
- data_list["index"] = i\r
- print("data_list:{}".format(data_list))\r
- alarm_list.append(data_list)\r
- alarm_list.sort(key=lambda x: x['index'])\r
- EventMesh.publish("set_storage_config",["alarm_list",alarm_list])\r
- EventMesh.publish("set_alarm_info",alarm_list)\r
- alarm_list = EventMesh.publish("get_storage_config","alarm_list")\r
- print("alarm_list:{}".format(alarm_list))\r
- else:\r
- ret = 0\r
- \r
- EventMesh.publish(WEB_CMD_ENUM.ALARM_LIST_S_CMD,ret)\r
-\r
-\r
-#闹钟配置下发\r
-\r
-class IOTWeb_alarm_configProtoCol(ProtoCol):\r
- """alarm_config"""\r
- TYPE = "alarm_config"\r
-\r
- def send(self, event, msg):\r
- # print("send alarm_config{}".format(msg))\r
- # 通过websocket发送到服务器端\r
- date_tmp = utime.localtime()\r
- time_tmp = utime.mktime(date_tmp)\r
- alarm_config ={\r
- "cmd":"dispatch_rest",\r
- "ts":int(time_tmp),\r
- "msg":"消息收到响应",\r
- "data":{\r
- "cmd":"alarm_config",\r
- "rest":"success",\r
- "msg":"闹钟配置成功."\r
- }\r
- }\r
- send_data = b''\r
- send_data = protocol_send_total_data(alarm_config)\r
- print("send_data alarm_config{}".format(send_data))\r
- EventMesh.publish("CHANNEL_IOT_WEB_SEND", send_data)\r
-\r
- def recv(self, event, msg):\r
- """\r
-\r
- @param event:上行下发闹钟配置\r
- @param msg: 接收到的下行数据\r
- """\r
- print("recv alarm_config{}".format(msg))\r
- EventMesh.publish(WEB_CMD_ENUM.ALARM_CONFIG_S_CMD)\r
-\r
-#SOS联系人下发\r
-class IOTWeb_sos_listProtoCol(ProtoCol):\r
- """sos_list"""\r
- TYPE = "sos_list"\r
-\r
- def send(self, event, msg):\r
- # 通过websocket发送到服务器端\r
- date_tmp = utime.localtime()\r
- time_tmp = utime.mktime(date_tmp)\r
- sos_list ={\r
- "cmd":"dispatch_rest",\r
- "ts":int(time_tmp),\r
- "msg":"消息收到响应",\r
- "data":{\r
- "cmd":"sos_list",\r
- "rest":"success",\r
- "msg":"收到SOS联系人列表."\r
- }\r
- }\r
- send_data = b''\r
- send_data = protocol_send_total_data(sos_list)\r
- print("send_data sos_list{}".format(send_data))\r
- EventMesh.publish("CHANNEL_IOT_WEB_SEND", send_data)\r
-\r
- def recv(self, event, msg):\r
- """\r
-\r
- @param event:上行下发sos列表\r
- @param msg: 接收到的下行数据\r
- """\r
- #{'msg': 'SOS', 'data': [{'name': '0', 'createTime': 1754031896067, 'updateTime': 1754031896067, 'phone': '12345678900', 'id': '1754031896067', 'deviceId': '876226211472149'}, \r
- # {'name': '1', 'createTime': 1754031896067, 'updateTime': 1754031896067, 'phone': '12345678901', 'id': '1754031896067', 'deviceId': '876226211472149'},\r
- # {'name': '2', 'createTime': 1754031896067, 'updateTime': 1754031896067, 'phone': '12345678902', 'id': '1754031896067', 'deviceId': '876226211472149'},\r
- # {'name': '3', 'createTime': 1754031896067, 'updateTime': 1754031896067, 'phone': '12345678903', 'id': '1754031896067', 'deviceId': '876226211472149'},\r
- # {'name': '4', 'createTime': 1754031896067, 'updateTime': 1754031896067, 'phone': '12345678904', 'id': '1754031896067', 'deviceId': '876226211472149'}],\r
- # 'ts': 1754031896067, 'cmd': 'sos_list'}\r
- print("recv sos_list{}".format(msg))\r
- sos_list = []\r
- if "data" in msg:\r
- data = msg["data"]\r
- if isinstance(data,list) == True:\r
- sos_list_len = len(data)\r
- if sos_list_len >= 3:\r
- sos_list_len = 3\r
- for i in range(sos_list_len):\r
- save_data = {}\r
- # EventMesh.publish("set_storage_config",["SOS_NUMBER{}".format(i+1),data[i+1]])\r
- # sos_list.append(str(data[i+1]))\r
- save_data["index"] = i\r
- save_data["name"] = data[i]["name"]\r
- save_data["phone"] = data[i]["phone"]\r
- sos_list.append(save_data)\r
- # EventMesh.publish("set_storage_config",["sos_list",sos_list])\r
- sos_list.sort(key=lambda x: x['index'])\r
- EventMesh.publish("set_storage_config",["sos_list",sos_list])\r
- EventMesh.publish("set_sos_list_info",sos_list)\r
- read_soslist = EventMesh.publish("get_storage_config","sos_list")\r
- print(read_soslist)\r
- EventMesh.publish(WEB_CMD_ENUM.SOS_LIST_S_CMD)\r
-#NLP指令处理\r
-def ai_cmd_handle(cmd):\r
- # print("")\r
- if "查询" in cmd:#当指令中有查询时,截取查询操作\r
- EventMesh.publish("find_cmd",cmd)\r
- elif "讲话" in cmd:#当指令中有讲话时,截取语速操作\r
- voice_start_index = cmd.index("讲话") + len("讲话")#动态判断截取部分\r
- find = cmd[voice_start_index:]#查询截取\r
- if "快" in find:\r
- EventMesh.publish("rate_move",1)\r
- volume = "变快"\r
- elif "慢" in find:\r
- EventMesh.publish("rate_move",0)\r
- volume = "变慢"\r
- tts_play_str = "语速已经" + volume\r
- EventMesh.publish("play_tts",[tts_play_str,0])\r
- elif "声音改为" in cmd:#当指令中有声音改为时,进入音色修改\r
- voice_start_index = cmd.index("声音改为") + len("声音改为")#动态判断截取部分\r
- find = cmd[voice_start_index:]#查询截取\r
- EventMesh.publish("change_voice",find)\r
- elif "结束对话" in cmd:#当指令中有结束对话时,结束当前对话\r
- EventMesh.publish("Close_VC")\r
- elif "音量" in cmd:#当指令中有音量改为时,音量改为具体数值\r
- if "调节" in cmd :\r
- voice_start_index = cmd.index("音量调节:") + len("音量调节:")#动态判断截取部分\r
- find = cmd[voice_start_index:]#查询截取\r
- print("find = {}".format(find))\r
- volume = int(find)\r
- volume += 100#设置音量以100-200为参数\r
- result = EventMesh.publish("change_volume",volume)\r
- if result == 1:\r
- tts_play_str = "音量已经改为" + find\r
- EventMesh.publish("play_tts",[tts_play_str,0])\r
- else:\r
- tts_play_str = "设置失败,请重新设置0~100的音量大小"\r
- EventMesh.publish("play_tts",[tts_play_str,0])\r
- if "加大" in cmd:\r
- result = EventMesh.publish("change_volume",1)\r
- if result == 1:\r
- tts_play_str = "音量已经加大"\r
- EventMesh.publish("play_tts",[tts_play_str,0])\r
- else:\r
- tts_play_str = "当前音量已经是最大了"\r
- EventMesh.publish("play_tts",[tts_play_str,0])\r
- elif "减小" in cmd:\r
- result = EventMesh.publish("change_volume",0)\r
- if result == 1:\r
- tts_play_str = "音量已经减小"\r
- EventMesh.publish("play_tts",[tts_play_str,0])\r
- else:\r
- tts_play_str = "当前音量已经是最小了"\r
- EventMesh.publish("play_tts",[tts_play_str,0])\r
- \r
- elif "语速倍速设置为:" in cmd:#修改对话模式\r
- voice_start_index = cmd.index("语速倍速设置为:") + len("语速倍速设置为:")#动态判断截取部分\r
- find = cmd[voice_start_index:]#查询截取\r
- print("find = {}".format(find))\r
- if float(find) > 2.0 or float(find) < 0.5:\r
- tts_play_str = "抱歉,语速仅支持0.5-2倍,请重新设置"\r
- EventMesh.publish("play_tts",[tts_play_str,0])\r
- return\r
- EventMesh.publish("SET_SPEECH_RATE",float(find))\r
- tts_play_str = "语速已经改为" + find\r
- EventMesh.publish("play_tts",[tts_play_str,0])\r
- elif "聆听" in cmd:#聆听快/慢一些\r
- if "快" in cmd:\r
- tts_play_str = EventMesh.publish("NLP_set_vad_silence",1)\r
- elif "慢" in cmd:\r
- tts_play_str = EventMesh.publish("NLP_set_vad_silence",0)\r
- EventMesh.publish("play_tts",[tts_play_str,0])\r
- elif "这个不支持哦,请换一个" in cmd:\r
- tts_play_str = "抱歉呀,暂不支持该方言,请换一个"\r
- EventMesh.publish("play_tts",[tts_play_str,0])\r
- elif "不支持的操作" in cmd:\r
- tts_play_str = "抱歉呀,暂不支持该命令"\r
- EventMesh.publish("play_tts",[tts_play_str,0]) \r
-\r
- if not _NLP_EXTENDED_CMDS:\r
- return\r
- if "会议纪要" in cmd:\r
- print("cmd:已进入会议")\r
- EventMesh.publish("come_meet_mode")\r
- elif "翻译" in cmd:\r
- print("cmd:已进入翻译")\r
- EventMesh.publish("come_trans_mode")\r
- elif "查看历史留言" in cmd:\r
- EventMesh.publish(WEB_CMD_ENUM.GET_NEW_VOICE_MSG_S)\r
- EventMesh.publish("set_history_voice_flag", 1)\r
- EventMesh.publish("clean_unread_vocie")\r
- EventMesh.publish("set_storage_config", ["is_noread_voice", 0])\r
-\r
-#NLP指令\r
-class IOTWeb_Nlp_ConfigProtoCol(ProtoCol):\r
- """ai_cmd"""\r
- TYPE = "ai_cmd"\r
-\r
- def send(self, event, msg):\r
- # print("ai_cmd{}".format(msg))\r
- # 通过websocket发送到服务器端\r
- date_tmp = utime.localtime()\r
- time_tmp = utime.mktime(date_tmp)\r
- ai_cmd = {\r
- "cmd":"ai_cmd",\r
- "ts":time_tmp,\r
- "msg":"AI指令",\r
- "data":None\r
- }\r
- send_data = b''\r
- send_data = protocol_send_total_data(ai_cmd)\r
- print("send_data ai_cmd{}".format(send_data))\r
- EventMesh.publish("CHANNEL_IOT_WEB_SEND", send_data)\r
-\r
- def recv(self, event, msg):\r
- """\r
- @param event:上行下发push_music\r
- @param msg: 接收到的下行数据\r
- """\r
- #提取指令名称\r
- cmdName = msg["data"]\r
- print("提取到的AI指令为{}".format(cmdName))\r
- ai_cmd_handle(cmdName)\r
-#设备进入翻译,小程序返回在线情况\r
-class IOTWeb_translate_device_enterProtoCol(ProtoCol):\r
- """translate_device_enter"""\r
- TYPE = "translate_device_enter"\r
-\r
- def send(self, event, msg):\r
- # print("translate_device_enter{}".format(msg))\r
- # 通过websocket发送到服务器端\r
- print("设备进入翻译,小程序返回在线情况")\r
-\r
- def recv(self, event, msg):\r
- """\r
- @param event:上行下发translate_device_enter\r
- @param msg: 接收到的下行数据\r
- """\r
- print("设备进入翻译获取状态:{}".format(msg["data"]["msg"]))\r
- status = msg["data"]["rest"]\r
- \r
- if status == "success":\r
- EventMesh.publish("set_trans_flag",1)#能进入AI翻译\r
- exit_tts = "已进入实时翻译模式"\r
- EventMesh.publish("play_tts",[exit_tts,1])\r
- elif status == "error":\r
- EventMesh.publish("set_trans_flag",0)#不能进入AI翻译\r
- exit_tts = msg["data"]["msg"]\r
- EventMesh.publish("play_tts",[exit_tts,0])\r
- print("recv translate_device_enter")\r
-\r
-#接收小程序控制进入翻译\r
-class IOTWeb_come_transProtoCol(ProtoCol):\r
- """translate_app_enter"""\r
- TYPE = "translate_app_enter"\r
-\r
- def send(self, event, msg):\r
- # print("translate_app_enter{}".format(msg))\r
- # 通过websocket发送到服务器端\r
- date_tmp = utime.localtime()\r
- time_tmp = utime.mktime(date_tmp)\r
- come_trans = {\r
- "cmd":"translate_device_complete",\r
- "ts":time_tmp,\r
- "msg":"进入成功",\r
- "data":None\r
- }\r
- send_data = b''\r
- send_data = protocol_send_total_data(come_trans)\r
- print("send_data translate_app_enter{}".format(send_data))\r
- EventMesh.publish("CHANNEL_IOT_WEB_SEND", send_data)\r
-\r
- def recv(self, event, msg):\r
- """\r
- @param event:上行下发translate_app_enter\r
- @param msg: 接收到的下行数据\r
- """\r
- EventMesh.publish("come_trans_mode")#进入AI翻译\r
- print("recv translate_app_enter{}".format(msg))\r
-\r
-#接收小程序控制退出翻译\r
-class IOTWeb_exit_transProtoCol(ProtoCol):\r
- """translate_app_exit"""\r
- TYPE = "translate_app_exit"\r
-\r
- def send(self, event, msg):\r
- # print("translate_app_enter{}".format(msg))\r
- # 通过websocket发送到服务器端\r
- date_tmp = utime.localtime()\r
- time_tmp = utime.mktime(date_tmp)\r
- come_trans = {\r
- "msg": "退出翻译",\r
- "data": None,\r
- "cmd": "translate_device_exit",\r
- "ts": time_tmp\r
- }\r
- send_data = b''\r
- send_data = protocol_send_total_data(come_trans)\r
- print("send_data translate_app_enter{}".format(send_data))\r
- EventMesh.publish("CHANNEL_IOT_WEB_SEND", send_data)\r
-\r
- def recv(self, event, msg):\r
- """\r
- @param event:上行下发translate_app_enter\r
- @param msg: 接收到的下行数据\r
- """\r
- EventMesh.publish("exit_trans_mode")#退出AI翻译\r
- print("recv translate_app_exit{}".format(msg))\r
-\r
-#接收小程序控制进入会议\r
-class IOTWeb_appcontrol_meetProtoCol(ProtoCol):\r
- """meet_control"""\r
- TYPE = "meet_control"\r
- def send(self, event, msg):\r
- # print("translate_app_enter{}".format(msg))\r
- # 通过websocket发送到服务器端\r
- date_tmp = utime.localtime()\r
- time_tmp = utime.mktime(date_tmp)\r
- come_trans = {\r
- "msg": "开始会议",\r
- "data": None,\r
- "cmd": "meet_begin",\r
- "ts": 1761121597\r
- }\r
- send_data = b''\r
- send_data = protocol_send_total_data(come_trans)\r
- print("send_data translate_app_enter{}".format(send_data))\r
- EventMesh.publish("CHANNEL_IOT_WEB_SEND", send_data)\r
-\r
- def recv(self, event, msg):\r
- """\r
- @param event:上行下发meeting_app_enter\r
- @param msg: 接收到的下行数据\r
- """\r
- data = msg["data"]#判断是开启还是关闭\r
- if data == "begin":\r
- EventMesh.publish("come_meet_mode")#进入会议纪要\r
- elif data == "end":\r
- EventMesh.publish("exit_meet_mode")#退出会议纪要\r
- print("APP Meeting Control")\r
-\r
-#翻译播放TTS\r
-class IOTWeb_play_trans_TTSProtoCol(ProtoCol):\r
- """tts_audio_url"""\r
- TYPE = "tts_audio_url"\r
-\r
- def send(self, event, msg):\r
- # print("tts_audio_url{}".format(msg))\r
- # 通过websocket发送到服务器端\r
- date_tmp = utime.localtime()\r
- time_tmp = utime.mktime(date_tmp)\r
- tts_audio_url = {\r
- "cmd":"tts_audio_url_complete",\r
- "ts":time_tmp,\r
- "msg":"返回状态",\r
- "data":None\r
- }\r
- send_data = b''\r
- send_data = protocol_send_total_data(tts_audio_url)\r
- print("send_data tts_audio_url{}".format(send_data))\r
- EventMesh.publish("CHANNEL_IOT_WEB_SEND", send_data)\r
-\r
- def recv(self, event, msg):\r
- """\r
- @param event:上行下发push_music\r
- @param msg: 接收到的下行数据\r
- """\r
- #提取录音播放名称\r
- voiceUrl = msg["data"]\r
- print("提取到的翻译路径为{}".format(voiceUrl))\r
- EventMesh.publish("play_trans_tts",voiceUrl)\r
- print("recv tts_audio_url{}".format(msg))\r
-\r
-#音乐播放\r
-class IOTWeb_play_MusicProtoCol(ProtoCol):\r
- """push_music"""\r
- TYPE = "push_music"\r
-\r
- def send(self, event, msg):\r
- # print("push_music{}".format(msg))\r
- # 通过websocket发送到服务器端\r
- date_tmp = utime.localtime()\r
- time_tmp = utime.mktime(date_tmp)\r
- push_music = {\r
- "cmd":"push_music",\r
- "ts":time_tmp,\r
- "msg":"音乐播放",\r
- "data":None\r
- }\r
- send_data = b''\r
- send_data = protocol_send_total_data(push_music)\r
- print("send_data push_music{}".format(send_data))\r
- EventMesh.publish("CHANNEL_IOT_WEB_SEND", send_data)\r
-\r
- def recv(self, event, msg):\r
- """\r
- @param event:上行下发push_music\r
- @param msg: 接收到的下行数据\r
- """\r
- #提取音乐播放名称,地址\r
- print("recv push_music{}".format(msg))\r
- musicName = msg["data"]["musicName"]\r
- musicUrl = msg["data"]["musicUrl"]\r
- print("提取到的音乐名称为{},路径为{}".format(musicName,musicUrl))\r
- EventMesh.publish("play_music",[musicName,musicUrl,1])\r
- \r
-\r
-#音量下发\r
-class IOTWeb_volumeProtoCol(ProtoCol):\r
- """volume"""\r
- TYPE = "volume"\r
-\r
- def send(self, event, msg):\r
- print("send volume{}".format(msg))\r
- # 通过websocket发送到服务器端\r
- date_tmp = utime.localtime()\r
- time_tmp = utime.mktime(date_tmp)\r
- volume = {\r
- "cmd":"dispatch_rest",\r
- "ts":time_tmp,\r
- "msg":"消息收到响应",\r
- "data":{\r
- "cmd":"volume",\r
- "rest":"success",\r
- "msg":"收到音量设置."\r
- }\r
- }\r
- send_data = b''\r
- send_data = protocol_send_total_data(volume)\r
- print("send_data volume{}".format(send_data))\r
- EventMesh.publish("CHANNEL_IOT_WEB_SEND", send_data)\r
-\r
- def recv(self, event, msg):\r
- """\r
-\r
- @param event:上行下发volume\r
- @param msg: 接收到的下行数据\r
- """\r
- if "data" in msg:\r
- r_volume = msg["data"]\r
- print("recv volume{} type:{}".format(r_volume,type(msg)))\r
- \r
- EventMesh.publish("SET_TTS_VOLUME",int(r_volume))\r
- EventMesh.publish("adjust_volume_toBle",r_volume)\r
- EventMesh.publish(WEB_CMD_ENUM.VOLUME_S_CMD)\r
-#下发SOS配置\r
-class IOTWeb_sos_configProtoCol(ProtoCol):\r
- """sos_config"""\r
- TYPE = "sos_config"\r
-\r
- def send(self, event, msg):\r
- print("send sos_config{}".format(msg))\r
- # 通过websocket发送到服务器端\r
- date_tmp = utime.localtime()\r
- time_tmp = utime.mktime(date_tmp)\r
- sos_config = {\r
- "cmd":"dispatch_rest",\r
- "ts":time_tmp,\r
- "msg":"消息收到响应",\r
- "data":{\r
- "cmd":"sos_config",\r
- "rest":"success",\r
- "msg":"SOS配置成功."\r
- }\r
- }\r
- send_data = b''\r
- send_data = protocol_send_total_data(sos_config)\r
- print("send_data sos_config{}".format(send_data))\r
- EventMesh.publish("CHANNEL_IOT_WEB_SEND", send_data)\r
-\r
- def recv(self, event, msg):\r
- """\r
-\r
- @param event:上行下发sos_config\r
- @param msg: 接收到的下行数据\r
- """\r
- print("recv sos_config{}".format(msg))\r
- if "data" in msg:\r
- sos_config = msg["data"]\r
- print("recv sos_config{} type:{}".format(sos_config,type(msg)))\r
- EventMesh.publish("set_storage_config",["sos_config",sos_config])\r
- EventMesh.publish("set_sos_config",sos_config)\r
- sos_config = EventMesh.publish("get_storage_config","sos_config")\r
- # print("sos_config:{} type:{}".format(sos_config,sos_config["enable110"]))\r
- EventMesh.publish(WEB_CMD_ENUM.SOS_CONFIG_S_CMD)\r
-#闹钟铃声获取\r
-\r
-class IOTWeb_get_ringtoneProtoCol(ProtoCol):\r
- """get_ringtone"""\r
- TYPE = "get_ringtone"\r
-\r
- def send(self, event, msg):\r
- print("send get_ringtone{}".format(msg))\r
- # 通过websocket发送到服务器端\r
- date_tmp = utime.localtime()\r
- time_tmp = utime.mktime(date_tmp)\r
- get_ringtone ={\r
- "cmd":"get_ringtone",\r
- "ts":time_tmp,\r
- "msg":"请求下发铃声列表",\r
- "data":None\r
- }\r
- send_data = b''\r
- send_data = protocol_send_total_data(get_ringtone)\r
- print("send_data get_ringtone{}".format(send_data))\r
- EventMesh.publish("CHANNEL_IOT_WEB_SEND", send_data)\r
-\r
- def recv(self, event, msg):\r
- """\r
-\r
- @param event:上行下发get_ringtone\r
- @param msg: 接收到的下行数据\r
- """\r
- print("recv get_ringtone{}".format(msg))\r
-\r
-#闹钟铃声列表\r
-class IOTWeb_ringtone_listProtoCol(ProtoCol):\r
- """ringtone_list"""\r
- TYPE = "ringtone_list"\r
-\r
- def send(self, event, msg):\r
- print("send ringtone_list{}".format(msg))\r
- # 通过websocket发送到服务器端\r
- date_tmp = utime.localtime()\r
- time_tmp = utime.mktime(date_tmp)\r
- ringtone_list ={\r
- "cmd":"dispatch_rest",\r
- "ts":time_tmp,\r
- "msg":"消息收到响应",\r
- "data":{\r
- "cmd":"ringtone_list",\r
- "rest":"success",\r
- "msg":"收到闹钟铃声列表."\r
- }\r
- }\r
- send_data = b''\r
- send_data = protocol_send_total_data(ringtone_list)\r
- print("send_data ringtone_list{}".format(msg))\r
- EventMesh.publish("CHANNEL_IOT_WEB_SEND", send_data)\r
-\r
- def recv(self, event, msg):\r
- """\r
-\r
- @param event:上行下发ringtone_list\r
- @param msg: 接收到的下行数据\r
- """\r
- print("recv ringtone_list{}".format(msg))\r
-\r
-\r
-#下发静默录音\r
-class IOTWeb_voice_recordProtoCol(ProtoCol):\r
- """voice_record"""\r
- TYPE = "voice_record"\r
- start_ai = 0\r
- def send(self, event, msg):\r
- print("send voice_record{}".format(msg))\r
- # 通过websocket发送到服务器端\r
- date_tmp = utime.localtime()\r
- time_tmp = utime.mktime(date_tmp)\r
- s_rest = "0"\r
- s_msg = "停止录音."\r
- if msg == "1":\r
- print("设备允许录音")\r
- s_rest = "1"\r
- s_msg = "开始录音."\r
- \r
- voice_record = {\r
- "cmd":"dispatch_rest",\r
- "ts":time_tmp,\r
- "msg":"消息收到响应",\r
- "data":{\r
- "cmd":"voice_record",\r
- "rest":s_rest,\r
- "msg":s_msg\r
- }\r
- }\r
- send_data = b''\r
- send_data = protocol_send_total_data(voice_record)\r
- print("send_data voice_record{}".format(send_data))\r
- EventMesh.publish("CHANNEL_IOT_WEB_SEND", send_data)\r
-\r
- def recv(self, event, msg):\r
- """\r
-\r
- @param event:上行下发voice_record\r
- @param msg: 接收到的下行数据\r
- """\r
- print("recv voice_record{}".format(msg))\r
- if "data" in msg:\r
- data = msg["data"]\r
- s_rest = "0"\r
- if data == "0":\r
- s_rest = "0"\r
- \r
- record_mode = EventMesh.publish("get_voice_record_mode")\r
- if record_mode == None:\r
- record_mode = 0\r
- if record_mode != 2:#语音留言不允许打断\r
- EventMesh.publish("stop_voice_record")\r
- print("停止录音")\r
- EventMesh.publish(WEB_CMD_ENUM.VOICE_RECORD_S_CMD,s_rest)\r
- \r
- elif data == "1":\r
- \r
- get_sos_flag = EventMesh.publish("get_sos_flag") \r
- if get_sos_flag != 0:\r
- s_rest = "0"\r
- print("正在电话")\r
- EventMesh.publish(WEB_CMD_ENUM.VOICE_RECORD_S_CMD,s_rest)\r
- return\r
- record_mode = EventMesh.publish("get_voice_record_mode")\r
- if record_mode == None:\r
- record_mode = 0\r
- get_VC_satrt_flag = EventMesh.publish("get_VC_satrt_flag")\r
- if get_VC_satrt_flag == None:\r
- get_VC_satrt_flag = 0\r
- \r
- if record_mode == 2 or get_VC_satrt_flag == 1:# 如果在AI对话 或者语音留言不允许静默录音\r
- s_rest = "0"\r
- EventMesh.publish(WEB_CMD_ENUM.VOICE_RECORD_S_CMD,s_rest)\r
- EventMesh.publish("stop_voice_record")\r
- else:\r
- s_rest = "1"\r
- EventMesh.publish(WEB_CMD_ENUM.VOICE_RECORD_S_CMD,s_rest)\r
- EventMesh.publish("start_voice_record",1)\r
- print("开始录音")\r
- \r
-#设备解绑\r
-class IOTWeb_unbind_devProtoCol(ProtoCol):\r
- """unbind_dev"""\r
- TYPE = "unbind_dev"\r
- unbind_devtimer = osTimer()\r
- init_flag = 0\r
- def send(self, event, msg):\r
- print("send unbind_dev{}".format(msg))\r
- # 通过websocket发送到服务器端\r
- date_tmp = utime.localtime()\r
- time_tmp = utime.mktime(date_tmp)\r
- unbind_dev={\r
- "cmd":"unbind_dev",\r
- "ts":time_tmp,\r
- "msg":"主动解绑设备",\r
- "data":None\r
- }\r
- send_data = b''\r
- send_data = protocol_send_total_data(unbind_dev)\r
- print("unbind_dev{}".format(send_data))\r
- EventMesh.publish("CHANNEL_IOT_WEB_SEND", send_data)\r
- self.init_flag=1\r
- self.unbind_devtimer.start(2000,0,self.unbind_devtimer_cb)\r
- def unbind_devtimer_cb(self,*argc):\r
- if self.init_flag == 1:\r
- play_str = "设备解绑失败"\r
- EventMesh.publish("play_tts",[play_str,1])\r
-\r
- def recv(self, event, msg):\r
- """\r
-\r
- @param event:上行下发unbind_dev\r
- @param msg: 接收到的下行数据\r
- """\r
- # {\r
- # "cmd":"post_rest",\r
- # "ts":1738283829,\r
- # "msg":"消息收到响应",\r
- # "data":{\r
- # "cmd":"unbind_dev",\r
- # "rest":"success|error",\r
- # "msg":"收到主动解绑设备指令"\r
- # }\r
- # }\r
- self.btstate = 0\r
- self.blestate = 0\r
- self.unbind_devtimer.stop()\r
- self.init_flag=0\r
- if "data" in msg:\r
- data = msg["data"]\r
- rest = data["rest"]\r
- if rest == "success":\r
- play_str = "设备解绑成功"\r
- EventMesh.publish("set_storage_config",["switch_ble_state","1"])\r
- EventMesh.publish("send_ble_switch_toble","1")\r
-\r
- \r
- EventMesh.publish("set_storage_config",["switch_bt_state","1"])\r
- EventMesh.publish("send_bt_switch_toble","1")\r
- EventMesh.publish("play_tts",[play_str,1])\r
- # ret = 0\r
- # ret = ql_fs.path_exists("/usr/static/storage_file")#配置文件\r
- # if ret == True:\r
- # ql_fs.rmdirs("/usr/static/storage_file")\r
- # ql_fs.mkdirs("/usr/static/storage_file")\r
- # utime.sleep_ms(2000)\r
- # Power.powerRestart()\r
- pass\r
- else:\r
- play_str = "设备解绑失败"\r
- EventMesh.publish("play_tts",[play_str,1])\r
- pass\r
- print("recv unbind_dev{}".format(msg)) \r
-#用户解绑\r
-class IOTWeb_user_unbind_devProtoCol(ProtoCol):\r
- """user_unbind_dev"""\r
- TYPE = "user_unbind_dev"\r
- def send(self, event, msg):\r
- print("send user_unbind_dev{}".format(msg))\r
- # 通过websocket发送到服务器端\r
- date_tmp = utime.localtime()\r
- time_tmp = utime.mktime(date_tmp)\r
- user_unbind_dev={\r
- "cmd":"dispatch_rest",\r
- "ts":time_tmp,\r
- "msg":"消息收到响应",\r
- "data":{\r
- "cmd":"user_unbind_dev",\r
- "rest":"success",\r
- "msg":"收到用户解绑设备指令"\r
- }\r
- }\r
- send_data = b''\r
- send_data = protocol_send_total_data(user_unbind_dev)\r
- print("user_unbind_dev{}".format(send_data))\r
- EventMesh.publish("CHANNEL_IOT_WEB_SEND", send_data)\r
-\r
- def recv(self, event, msg):\r
- """\r
-\r
- @param event:上行下发user_unbind_dev\r
- @param msg: 接收到的下行数据\r
- """\r
- # {\r
- # "cmd":"post_rest",\r
- # "ts":1738283829,\r
- # "msg":"消息收到响应",\r
- # "data":{\r
- # "cmd":"user_unbind_dev",\r
- # "rest":"success|error",\r
- # "msg":"收到主动解绑设备指令"\r
- # }\r
- # }\r
- self.btstate = 0\r
- self.blestate = 0\r
- EventMesh.publish("set_storage_config",["switch_ble_state","1"]) #用户解绑设备需要开启广播 开启经典蓝牙\r
- EventMesh.publish("send_ble_switch_toble","1")\r
-\r
- EventMesh.publish("set_storage_config",["switch_bt_state","1"])\r
- EventMesh.publish("send_bt_switch_toble","1")\r
- EventMesh.publish(WEB_CMD_ENUM.USER_UNBIND_DEV_S)\r
- tts_play_str = "设备已解绑"\r
- EventMesh.publish("play_tts",[tts_play_str,1])\r
- # ret = 0\r
- # ret = ql_fs.path_exists("/usr/static/storage_file")#配置文件\r
- # if ret == True:\r
- # ql_fs.rmdirs("/usr/static/storage_file")\r
- # ql_fs.mkdirs("/usr/static/storage_file")\r
- # utime.sleep_ms(100)\r
- # Power.powerRestart()\r
- print("recv user_unbind_dev{}".format(msg)) \r
-#下发位子留言\r
-class IOTWeb_text_msgProtoCol(ProtoCol):\r
- """text_msg"""\r
- TYPE = "text_msg"\r
-\r
- def send(self, event, msg):\r
- print("send text_msg{}".format(msg))\r
- # 通过websocket发送到服务器端\r
- date_tmp = utime.localtime()\r
- time_tmp = utime.mktime(date_tmp)\r
-\r
- rest = "error"\r
- if msg == 1:\r
- rest = "success"\r
- text_msg = {\r
- "cmd":"post_rest",\r
- "ts":time_tmp,\r
- "msg":"消息收到响应",\r
- "data":{\r
- "cmd":"text_msg",\r
- "rest":rest,\r
- "msg":"收到文本消息."\r
- }\r
- }\r
- send_data = b''\r
- send_data = protocol_send_total_data(text_msg)\r
- print("send_data text_msg{}".format(send_data))\r
- EventMesh.publish("CHANNEL_IOT_WEB_SEND", send_data)\r
-\r
- def recv(self, event, msg):\r
- """\r
-\r
- @param event:上行下发voice_record\r
- @param msg: 接收到的下行数据\r
- """\r
- print("recv time_tmp{}".format(msg))\r
- recv_state = 0\r
- if "data" in msg:\r
- play_tts_text = msg["data"]\r
- try:\r
- EventMesh.publish("play_tts",[play_tts_text,1])\r
- recv_state = 1\r
- except Exception as e:\r
- print("下发文字留言出错了")\r
- EventMesh.publish(WEB_CMD_ENUM.TEXT_MSG_S_CMD,recv_state)\r
- \r
-#AI对话音色配置\r
-class IOTWeb_chat_configProtoCol(ProtoCol):\r
- """chat_config"""\r
- TYPE = "chat_config"\r
-\r
- def send(self, event, msg):\r
- # print("send chat_config{}".format(msg))\r
- # 通过websocket发送到服务器端\r
- date_tmp = utime.localtime()\r
- time_tmp = utime.mktime(date_tmp)\r
- chat_config = {\r
- "cmd":"dispatch_rest",\r
- "ts":time_tmp,\r
- "msg":"消息收到响应",\r
- "data":{\r
- "cmd":"chat_config",\r
- "rest":"success",\r
- "msg":"收到AI对话配置"\r
- }\r
- }\r
- send_data = b''\r
- send_data = protocol_send_total_data(chat_config)\r
- print("send_data chat_config{}".format(send_data))\r
- EventMesh.publish("CHANNEL_IOT_WEB_SEND", send_data)\r
-\r
- def recv(self, event, msg):\r
- """\r
-\r
- @param event:上行下发chat_config\r
- @param msg: 接收到的下行数据\r
- """\r
- print("recv chat_config{}".format(msg))\r
- # {\r
- # "cmd":"chat_config",\r
- # "ts":1738283829,\r
- # "msg":"下发AI对话配置",\r
- # "data":{\r
- # "speed":1.5,\r
- # "vadDuration":600,\r
- # "voiceId":"音色ID,火山音色或者科大讯飞音色ID"\r
- # }\r
- # }\r
- # {'msg': '测试聊天配置.', 'data': {'botName': '柒乐乐', 'vadDuration': 600, 'speed': '1.0', 'provider': 'iflytek', 'voiceId': 'x3_linlin'}, \r
- # 'ts': 1755600807553, 'cmd': 'chat_config'}\r
-\r
- if "data" in msg:\r
- data = msg["data"]\r
- speed = None\r
- try:\r
- speed = float(data["speed"])\r
- except Exception as e:\r
- usys.print_exception(e)\r
- vadDuration = data["vadDuration"]\r
- voiceId = data["voiceId"]\r
- provider = data["provider"]\r
- botName = data["botName"]\r
- asr = data["asr"]\r
- if speed != None:\r
- EventMesh.publish("SET_SPEECH_RATE",speed)\r
- if vadDuration != None:\r
- #if len(vadDuration) != 0:\r
- EventMesh.publish("set_vad_silence",vadDuration)\r
- tts_type = {}\r
- if voiceId != None and len(voiceId) != 0:\r
- tts_type["voice"] = voiceId\r
- if provider != None and len(provider) != 0:\r
- tts_type["outbound_attributess_provider"] = provider\r
- if botName != None and len(botName) != 0:\r
- tts_type["bot_name"] = botName\r
- if voiceId != None and len(voiceId) != 0:\r
- tts_type["voice"] = voiceId\r
- if asr != None and len(asr) != 0:\r
- tts_type["inbound_attributess_provider"] = asr\r
- if len(tts_type)>0:\r
- print("tts_type:{}".format(tts_type))\r
- EventMesh.publish("set_VC_TTS_voice_type",tts_type)\r
- EventMesh.publish(WEB_CMD_ENUM.CHAT_CONFIG_S)\r
-#获取AI对话音色配置\r
-class IOTWeb_get_chat_configProtoCol(ProtoCol):\r
- """get_chat_config"""\r
- TYPE = "get_chat_config"\r
-\r
- def send(self, event, msg):\r
- # print("send chat_config{}".format(msg))\r
- # 通过websocket发送到服务器端\r
- date_tmp = utime.localtime()\r
- time_tmp = utime.mktime(date_tmp)\r
- get_chat_config = {\r
- "cmd":"get_chat_config",\r
- "ts":time_tmp,\r
- "msg":"获取AI对话配置",\r
- "data":None\r
- }\r
- send_data = b''\r
- send_data = protocol_send_total_data(get_chat_config)\r
- print("send_data chat_config{}".format(send_data))\r
- EventMesh.publish("CHANNEL_IOT_WEB_SEND", send_data)\r
-\r
- def recv(self, event, msg):\r
- """\r
-\r
- @param event:上行下发get_chat_config\r
- @param msg: 接收到的下行数据\r
- """\r
- print("recv get_chat_config{}".format(msg))\r
-\r
-#上报日程列表 \r
-class IOTWeb_post_scheduleProtoCol(ProtoCol):\r
- """post_schedule"""\r
- TYPE = "post_schedule"\r
-\r
- def send(self, event, msg):\r
- print("send post_schedule{}".format(msg))\r
- # 通过websocket发送到服务器端\r
- \r
- send_data = b''\r
- send_data = protocol_send_total_data(msg)\r
- print("send send_data{}".format(send_data))\r
- EventMesh.publish("CHANNEL_IOT_WEB_SEND",send_data)\r
-\r
- def recv(self, event, msg):\r
- """\r
-\r
- @param event:post_schedule\r
- @param msg: 接收到的下行数据\r
- """\r
- print("recv post_schedule{}".format(msg))\r
-\r
-\r
-#下发日程 \r
-class IOTWeb_scheduleProtoCol(ProtoCol):\r
- """schedule"""\r
- TYPE = "schedule"\r
-\r
- def send(self, event, msg):\r
- print("send schedule{}".format(msg))\r
- # 通过websocket发送到服务器端\r
- date_tmp = utime.localtime()\r
- time_tmp = utime.mktime(date_tmp)\r
- schedule = {\r
- "cmd":"post_rest",\r
- "ts":time_tmp,\r
- "msg":"消息收到响应",\r
- "data":{\r
- "cmd":"schedule",\r
- "rest":"success",\r
- "msg":"收到日程列表."\r
- }\r
- }\r
- send_data = b''\r
- send_data = protocol_send_total_data(schedule)\r
- print("send_data schedule{}".format(send_data))\r
- EventMesh.publish("CHANNEL_IOT_WEB_SEND", send_data)\r
-\r
- def recv(self, event, msg):\r
- """\r
-\r
- @param event:上行下发schedule\r
- @param msg: 接收到的下行数据\r
- """\r
- # {\r
- # "cmd":"text_msg",\r
- # "ts":1738283829,\r
- # "msg":"下发文本消息",\r
- # "data":"文本内容"\r
- # }\r
- print("recv time_tmp{}".format(msg))\r
- # {\r
- # "cmd":"schedule",\r
- # "ts":1738283829,\r
- # "msg":"下发日程列表",\r
- # "data":[\r
- # "title":"日程名称",\r
- # "description":"提醒内容",\r
- # "repeat":1~4播报重复次数,\r
- # "date":"日期,yyyy-MM-dd",\r
- # "时间":"HH:mm"\r
- # ]\r
- # }\r
- schedule = []\r
- if "data" in msg:\r
- data = msg["data"]\r
- for i,sh in enumerate(data):\r
- sh["index"] = i\r
- schedule.append(sh)\r
- schedule.sort(key=lambda x: x['index'])\r
- EventMesh.publish("set_storage_config",["schedule",schedule])\r
- \r
- schedule = EventMesh.publish("get_storage_config","schedule")\r
- EventMesh.publish("set_schedule_info",schedule)#\r
- print(schedule)\r
- EventMesh.publish(WEB_CMD_ENUM.SCHEDULE_S_CMD)\r
-#下发新的语音未读留言 \r
-class IOTWeb_new_voice_msgProtoCol(ProtoCol):\r
- """new_voice_msg"""\r
- TYPE = "new_voice_msg"\r
-\r
- def send(self, event, msg):\r
- print("send new_voice_msg{}".format(msg))\r
- # 通过websocket发送到服务器端\r
- date_tmp = utime.localtime()\r
- time_tmp = utime.mktime(date_tmp)\r
- new_voice_msg = {\r
- "cmd":"dispatch_rest",\r
- "ts":time_tmp,\r
- "msg":"消息收到响应",\r
- "data":{\r
- "cmd":"new_voice_msg",\r
- "rest":"success",\r
- "msg":"收到新语音消息指令."\r
- }\r
- }\r
- send_data = b''\r
- send_data = protocol_send_total_data(new_voice_msg)\r
- print("send send_data{}".format(send_data))\r
- EventMesh.publish("CHANNEL_IOT_WEB_SEND",send_data)\r
- EventMesh.publish(WEB_CMD_ENUM.GET_NEW_VOICE_MSG_S)\r
- def recv(self, event, msg):\r
- """\r
-\r
- @param event:new_voice_msg\r
- @param msg: 接收到的下行数据\r
- """\r
- EventMesh.publish(WEB_CMD_ENUM.NEW_VOICE_MSG_S)\r
-\r
- print("recv new_voice_msg{}".format(msg))\r
-\r
-#设备主动查询未读的语音消息列表\r
-class IOTWeb_find_new_voice_msgProtoCol(ProtoCol):\r
- """find_voice_msg_list"""\r
- TYPE = "find_voice_msg_list"\r
- def __init__(self):\r
- super().__init__()\r
- self.history_board_flag = 0#第一次进去要广播\r
- self.open_device = 0#开机播报未读留言\r
- self.has_processed_history_voice = 0 #播完列表不许再拨“历史未读留言为空”\r
- EventMesh.subscribe("set_history_board_flag",self.set_history_board_flag)\r
- EventMesh.subscribe("set_open_device",self.set_open_device)\r
- EventMesh.subscribe("get_open_device",self.get_open_device)\r
- def send(self, event, msg):\r
- print("send find_voice_msg_list")\r
-\r
- def recv(self, event, msg):\r
- """\r
-\r
- @param event:find_voice_msg_list\r
- @param msg: 接收到的下行数据\r
- """\r
- print("recv find_voice_msg_list{}".format(msg))\r
-\r
- new_voice_list = []#字典列表\r
- voice_list = msg["data"]\r
- print("msg[\"data\"] = {}".format(voice_list))\r
- if EventMesh.publish("get_history_voice_flag") == 1:\r
- if len(voice_list) == 0:#为空\r
- if EventMesh.publish("get_wait_voice_flag") == 0:#未听历史留言\r
- tts_play_str = "已无更多历史留言"\r
- EventMesh.publish("play_tts",[tts_play_str,0])\r
- self.history_board_flag = 0\r
- self.has_processed_wait_voice = 0\r
- self.wait_first_flag = 0\r
- # if self.has_processed_history_voice == 0:\r
- # tts_play_str = "已无更多历史留言"\r
- # EventMesh.publish("play_tts",[tts_play_str,0])\r
- # else:\r
- # self.has_processed_history_voice = 0#读完了置为0\r
- # self.history_board_flag = 0#广播置为0\r
- # self.history_board_flag = 0\r
- # self.has_processed_wait_voice = 0\r
- # self.wait_first_flag = 0\r
- else:#等待历史留言\r
- self.has_processed_wait_voice = 0\r
- self.wait_first_flag = 0\r
- EventMesh.publish("set_recv_voice",0) #设置留言播放状态\r
- EventMesh.publish("set_history_voice_flag",0)\r
- EventMesh.publish("set_wait_voice_flag",0)\r
- else:#有历史留言\r
- if EventMesh.publish("get_wait_voice_flag") == 0:#历史留言\r
- print("历史广播状态!!!!! = {}".format(self.history_board_flag))\r
- if self.history_board_flag == 0:\r
- tts_play_str = "您共有" + str(len(voice_list)) + "条历史留言,正在为您播放"\r
- EventMesh.publish("play_tts",[tts_play_str,1])\r
- EventMesh.publish("set_pwk_notice_flag",1)\r
- EventMesh.publish("set_pwk_cnt_voice",len(voice_list))#设置多,防止进入留言播完判断\r
- self.history_board_flag = 1\r
- self.has_processed_history_voice = 1\r
- for da in voice_list:\r
- new_voice_list.append(da)\r
- if len(new_voice_list) > 0:\r
- pass\r
- else:#未读留言\r
- if self.open_device == 1 or EventMesh.publish("get_60S_voice_flag") == 1:\r
- EventMesh.publish("set_pwk_cnt_voice",len(voice_list))#设置未读次数,由于是开机一起查看的\r
- EventMesh.publish("set_60S_voice_flag",0)\r
- for da in voice_list:\r
- new_voice_list.append(da)\r
- if len(new_voice_list) > 0:\r
- pass\r
- EventMesh.publish("set_play_new_voice_list",new_voice_list)\r
- EventMesh.publish("play_new_voice_list")\r
- else:#正常留言\r
- if EventMesh.publish("get_1M_flag") == 0:\r
- if EventMesh.publish("get_pwk_cnt_voice") >= 0:\r
- for da in voice_list:\r
- new_voice_list.append(da)\r
- if len(new_voice_list) > 0:\r
- pass\r
- EventMesh.publish("set_play_new_voice_list",new_voice_list)\r
- EventMesh.publish("play_new_voice_list")\r
- def set_history_board_flag(self,event,msg):\r
- self.history_board_flag = msg \r
- def set_open_device(self,event,msg):\r
- self.open_device = msg\r
- def get_open_device(self,event,msg):\r
- return self.open_device\r
-#请求未读的语音消息列表\r
-class IOTWeb_get_new_voice_msgProtoCol(ProtoCol):\r
- """get_new_voice_msg"""\r
- TYPE = "get_new_voice_msg"\r
-\r
- def send(self, event, msg):\r
- # 通过websocket发送到服务器端\r
- date_tmp = utime.localtime()\r
- time_tmp = utime.mktime(date_tmp)\r
- # {\r
- # "cmd":"get_new_voice_msg",\r
- # "ts":1738283829,\r
- # "msg":"请求未读的语音消息列表",\r
- # "data":null\r
- # }\r
- get_new_voice_msg = {\r
- "cmd":"get_new_voice_msg",\r
- "ts":time_tmp,\r
- "msg":"请求未读的语音消息列表",\r
- "data":None\r
- }\r
- \r
- send_data = b''\r
- send_data = protocol_send_total_data(get_new_voice_msg)\r
- print("send get_new_voice_msg{}".format(send_data))\r
- EventMesh.publish("CHANNEL_IOT_WEB_SEND",send_data)\r
-\r
- def recv(self, event, msg):\r
- """\r
-\r
- @param event:get_new_voice_msg\r
- @param msg: 接收到的下行数据\r
- """\r
- # get_new_voice_msg = {\r
- # "cmd":"post_rest",\r
- # "ts":time_tmp,\r
- # "msg":"消息收到响应",\r
- # "data":{\r
- # "cmd":"get_new_voice_msg",\r
- # "rest":"success",\r
- # "msg":"收到请求新语音列表."\r
- # }\r
- # }\r
- print("recv get_new_voice_msg{}".format(msg))\r
-# 1播放 0暂停 2上一首 3下一首\r
-class IOTWeb_player_controlProtoCol(ProtoCol):\r
- """player_control"""\r
- TYPE = "player_control"\r
-\r
- def send(self, event, msg):\r
- # 通过websocket发送到服务器端\r
- date_tmp = utime.localtime()\r
- time_tmp = utime.mktime(date_tmp)\r
- paly_str = "停止"\r
- paly_data = "stop"\r
- if msg == 1:\r
- paly_str = "播放"\r
- paly_data = "play"\r
- pass\r
- elif msg == 0:\r
- paly_str = "停止"\r
- paly_data = "stop"\r
- pass\r
- elif msg == 2:\r
- paly_str = "上一首"\r
- paly_data = "pre"\r
- pass\r
- elif msg == 3:\r
- paly_str = "下一首"\r
- paly_data = "next"\r
- pass\r
- player_control = {\r
- "cmd":"player_control",\r
- "ts":time_tmp,\r
- "msg":paly_str,\r
- "data":paly_data\r
- }\r
- \r
- send_data = b''\r
- send_data = protocol_send_total_data(player_control)\r
- print("send player_control{}".format(send_data))\r
- EventMesh.publish("CHANNEL_IOT_WEB_SEND",msg)\r
-\r
- def recv(self, event, msg):\r
- """\r
-\r
- @param event:get_new_voice_msg\r
- @param msg: 接收到的下行数据\r
- """\r
- # {\r
- # "cmd":"post_rest",\r
- # "ts":1738283829,\r
- # "msg":"消息收到响应",\r
- # "data":{\r
- # "cmd":"player_control",\r
- # "rest":"success|error",\r
- # "msg":"收到播放/停止/暂停指令/下一首/上一首"\r
- # }\r
- # }\r
- paly_state = 0\r
- if "data" in msg:\r
- data = msg["data"]\r
- msg_str = data["msg"]\r
- if msg_str.find("播放") != -1:\r
- paly_state=1\r
- pass\r
- elif msg_str.find("停止") != -1:\r
- paly_state=0\r
- pass\r
- elif msg_str.find("下一首") != -1:\r
- paly_state = 3\r
- pass\r
- elif msg_str.find("上一首") != -1:\r
- paly_state = 2\r
- pass\r
-\r
- EventMesh.publish(WEB_CMD_ENUM.PLAY_CONTROL_S,paly_state)\r
- print("recv send_data{}".format(msg))\r
-class IOTWeb_new_voice_msg_listProtoCol(ProtoCol):\r
- """new_voice_msg_list"""\r
- TYPE = "new_voice_msg_list"\r
- def __init__(self):\r
- super().__init__()\r
- self._1M_flag = 0#判断一分钟定时器是否开启中\r
- self._1M_nowplay_flag = 0#判断当前留言播放是否结束去影响新留言播放的标志位\r
- self.app_new_voice_flag = 0#app是否下发留言\r
- self._1M_timer = osTimer()#多发留言间隙时间60S\r
- self._60S_voice_flag = 0\r
- self.is_listen_wait = 0#是否收听未听留言\r
- self.close_timer_cnt = 0 #若两次未听定时器关闭\r
- EventMesh.subscribe("get_app_new_voice_flag",self.get_app_new_voice_flag)\r
- EventMesh.subscribe("set_app_new_voice_flag",self.set_app_new_voice_flag)\r
- EventMesh.subscribe("get_1M_flag",self.get_1M_flag)\r
- EventMesh.subscribe("set_1M_nowplay_flag",self.set_1M_nowplay_flag)\r
- EventMesh.subscribe("set_is_listen_wait",self.set_is_listen_wait)\r
- EventMesh.subscribe("get_60S_voice_flag",self.get_60S_voice_flag)\r
- EventMesh.subscribe("set_60S_voice_flag",self.set_60S_voice_flag)\r
- \r
- def send(self, event, msg):\r
- print("send new_voice_msg_list{}".format(msg))\r
- # 通过websocket发送到服务器端\r
- date_tmp = utime.localtime()\r
- time_tmp = utime.mktime(date_tmp)\r
- new_voice_msg_list = {\r
- "cmd":"dispatch_rest",\r
- "ts":time_tmp,\r
- "msg":"消息收到响应",\r
- "data":{\r
- "cmd":"new_voice_msg_list",\r
- "rest":"success",\r
- "msg":"收到新语音列表."\r
- }\r
- }\r
- send_data = b''\r
- send_data = protocol_send_total_data(new_voice_msg_list)\r
- print("send send_data{}".format(send_data))\r
- EventMesh.publish("CHANNEL_IOT_WEB_SEND",send_data)\r
-\r
- def recv(self, event, msg):\r
- """\r
-\r
- @param event:new_voice_msg_list\r
- @param msg: 接收到的下行数据\r
- """\r
- self.app_new_voice_flag = 1#标志位为1\r
- new_voice_list = []\r
- if "data" in msg:\r
- data = msg["data"]\r
- for da in data:\r
- new_voice_list.append(da)\r
- if len(new_voice_list) > 0:\r
- pass\r
- EventMesh.publish("set_play_new_voice_list",new_voice_list)\r
- print("是否收到留言:{},self._1M_flag = {}".format(EventMesh.publish("get_recv_voice"),self._1M_flag))\r
- if EventMesh.publish("get_recv_voice") == 0 and self._1M_flag == 0 and self._1M_nowplay_flag == 0:#当没有音频在播放时,再播放新的,否则保存下来不播放,等60S后一起播放\r
- EventMesh.publish("set_recv_voice",1) #设置留言播放状态\r
- EventMesh.publish("play_new_voice_list")\r
- self._1M_nowplay_flag == 1\r
- else:#当有音频在播放时,存下来开始倒计时\r
- pass\r
- if self._1M_flag == 0 :\r
- print("等待留言60S倒计时开启")\r
- self._1M_timer.start(60000, 0, self._1M_timer_cb)\r
- self._1M_flag = 1\r
- EventMesh.publish(WEB_CMD_ENUM.NEW_VOICE_MSG_LIST_S)\r
- print("recv new_voice_msg_list{}".format(msg))\r
- def _1M_timer_cb(self,*argc):\r
- EventMesh.publish("publish_AI_btnInfo",{"func":self._1M_timer_cb_}) \r
-\r
- def _1M_timer_cb_(self): \r
- #self.iot_web_send_queue.put("ping") \r
- self._1M_flag = 0\r
- self._60S_voice_flag = 1\r
- get_VC_satrt_flag = EventMesh.publish("get_VC_satrt_flag")\r
- if get_VC_satrt_flag == None:\r
- get_VC_satrt_flag = 0\r
- if get_VC_satrt_flag == 0:\r
- print("收到多条信息,统一播放")\r
- EventMesh.publish("set_history_voice_flag",1)#修改历史留言标志位\r
- EventMesh.publish("set_wait_voice_flag",1)#修改60S标志位\r
- EventMesh.publish(WEB_CMD_ENUM.GET_NEW_VOICE_MSG_S)\r
-\r
- def get_app_new_voice_flag(self,event,msg):\r
- return self.app_new_voice_flag\r
- def set_app_new_voice_flag(self,event,msg):\r
- self.app_new_voice_flag = msg\r
- def get_1M_flag(self,event,msg):\r
- return self._1M_flag \r
- def get_60S_voice_flag(self,event,msg):\r
- return self._60S_voice_flag\r
- def set_60S_voice_flag(self,event,msg):\r
- self._60S_voice_flag = msg\r
- def set_1M_nowplay_flag(self,event,msg):\r
- self._1M_nowplay_flag = msg\r
- def set_is_listen_wait(self,event,msg):\r
- self.is_listen_wait = msg\r
-class IOTWeb_put_voice_msg_stateProtoCol(ProtoCol):\r
- """put_voice_msg_state"""\r
- TYPE = "put_voice_msg_state"\r
-\r
- def send(self, event, msg):\r
- print("send put_voice_msg_state{}".format(msg))\r
- # 通过websocket发送到服务器端\r
- \r
- send_data = b''\r
- send_data = protocol_send_total_data(msg)\r
- print("send send_data{}".format(send_data))\r
- EventMesh.publish("CHANNEL_IOT_WEB_SEND",send_data)\r
-\r
- def recv(self, event, msg):\r
- """\r
-\r
- @param event:put_voice_msg_state\r
- @param msg: 接收到的下行数据\r
- """\r
- print("recv put_voice_msg_state{}".format(msg))\r
-#收到蓝牙连接记录获取请求\r
-class IOTWeb_get_bt_connect_record_listProtoCol(ProtoCol):\r
- """get_bt_connect_record_list"""\r
- TYPE = "get_bt_connect_record_list"\r
-\r
- def send(self, event, msg):\r
- print("send get_bt_connect_record_list{}".format(msg))\r
- # 通过websocket发送到服务器端\r
- date_tmp = utime.localtime()\r
- time_tmp = utime.mktime(date_tmp)\r
- get_bt_connect_record_list = {\r
- "cmd":"dispatch_rest",\r
- "ts":time_tmp,\r
- "msg":"消息收到响应",\r
- "data":{\r
- "cmd":"get_bt_connect_record_list",\r
- "rest":"success",\r
- "msg":"收到蓝牙连接记录获取请求"\r
- }\r
- }\r
- send_data = b''\r
- send_data = protocol_send_total_data(get_bt_connect_record_list)\r
- print("send send_data{}".format(send_data))\r
- EventMesh.publish("CHANNEL_IOT_WEB_SEND",send_data)\r
-\r
- def recv(self, event, msg):\r
- """\r
-\r
- @param event:get_bt_connect_record_list\r
- @param msg: 接收到的下行数据\r
- """\r
- # {\r
- # "cmd":"get_bt_connect_record_list",\r
- # "ts":1738283829,\r
- # "msg":"上报蓝牙连接列表",\r
- # "data": None\r
- # }\r
- EventMesh.publish("send_get_connect_bt_state")\r
- EventMesh.publish(WEB_CMD_ENUM.GET_BT_CONNECT_RECORD_LIST_S)\r
- print("recv get_bt_connect_record_list{}".format(msg))\r
-\r
-#蓝牙开关\r
-class IOTWeb_switch_bt_stateProtoCol(ProtoCol):\r
- """switch_bt_state"""\r
- TYPE = "switch_bt_state"\r
-\r
- def send(self, event, msg):\r
- # print("send switch_bt_state{}".format(msg))\r
- # 通过websocket发送到服务器端\r
- date_tmp = utime.localtime()\r
- time_tmp = utime.mktime(date_tmp)\r
- # {\r
- # "cmd":"dispatch_rest",\r
- # "ts":1738283829,\r
- # "msg":"消息收到响应",\r
- # "data":{\r
- # "cmd":"switch_bt_state",\r
- # "rest":"success|error",\r
- # "msg":"收到蓝牙已打开/蓝牙已关闭指令"\r
- # }\r
- # }\r
- s_msg = "蓝牙已关闭指令"\r
- if msg == "1":\r
- s_msg = "收到蓝牙已打开"\r
- elif msg == "0":\r
- s_msg = "蓝牙已关闭指令"\r
- switch_bt_state = {\r
- "cmd":"dispatch_rest",\r
- "ts":time_tmp,\r
- "msg":"消息收到响应",\r
- "data":{\r
- "cmd":"switch_bt_state",\r
- "rest":"success",\r
- "msg":s_msg\r
- }\r
- }\r
- send_data = b''\r
- send_data = protocol_send_total_data(switch_bt_state)\r
- print("send_data switch_bt_state{}".format(send_data))\r
- EventMesh.publish("CHANNEL_IOT_WEB_SEND", send_data)\r
-\r
- def recv(self, event, msg):\r
- """\r
-\r
- @param event:上行下发switch_bt_state\r
- @param msg: 接收到的下行数据\r
- """\r
- s_state = "1"\r
- if "data" in msg:\r
- data = msg["data"]\r
- if data == "0":\r
- s_state = "0"\r
- EventMesh.publish("set_storage_config",["switch_bt_state","0"])\r
- EventMesh.publish("send_bt_switch_toble","0")\r
- pass\r
- elif data == "1":\r
- s_state = "1"\r
- EventMesh.publish("set_storage_config",["switch_bt_state","1"])\r
- EventMesh.publish("send_bt_switch_toble","1")\r
- pass\r
- print("recv switch_bt_state{}".format(msg))\r
- \r
- EventMesh.publish(WEB_CMD_ENUM.SWITCH_BT_STATE_S_CMD,s_state)\r
-\r
-#蓝牙扫描\r
-class IOTWeb_bt_scanProtoCol(ProtoCol):\r
- """bt_scan"""\r
- TYPE = "bt_scan"\r
-\r
- def send(self, event, msg):\r
- print("send schedule{}".format(msg))\r
- # 通过websocket发送到服务器端\r
- date_tmp = utime.localtime()\r
- time_tmp = utime.mktime(date_tmp)\r
- s_msg = ""\r
- if msg == "1":\r
- s_msg = "开始扫描附近设备"\r
- elif msg == "0":\r
- s_msg = "停止扫描附近设备"\r
- bt_scan = {\r
- "cmd":"dispatch_rest",\r
- "ts":time_tmp,\r
- "msg":"消息收到响应",\r
- "data":{\r
- "cmd":"bt_scan",\r
- "rest":"success",\r
- "msg":s_msg\r
- }\r
- }\r
- send_data = b''\r
- send_data = protocol_send_total_data(bt_scan)\r
- print("send_data bt_scan{}".format(send_data))\r
- EventMesh.publish("CHANNEL_IOT_WEB_SEND", send_data)\r
-\r
- def recv(self, event, msg):\r
- """\r
-\r
- @param event:上行下发bt_scan\r
- @param msg: 接收到的下行数据\r
- """\r
- # {\r
- # "cmd":"bt_scan",\r
- # "ts":1738283829,\r
- # "msg":"开始扫描附近设备/停止扫描附近设备",\r
- # "data":"0/1"\r
- # }\r
- s_ret = "1"\r
- if "data" in msg:\r
- data = msg["data"]\r
- if data == "1":\r
- s_ret = "1"\r
- EventMesh.publish("send_ble_scan","1")\r
- elif data == "0":\r
- s_ret = "0"\r
- EventMesh.publish("send_ble_scan","0")\r
- \r
- pass\r
- \r
- print("recv bt_scan{}".format(msg))\r
- EventMesh.publish(WEB_CMD_ENUM.BT_SCAN_S_CMD,s_ret)\r
-\r
-#蓝牙当前状态\r
-class IOTWeb_get_bt_stateProtoCol(ProtoCol):\r
- """get_bt_state"""\r
- TYPE = "get_bt_state"\r
-\r
- def send(self, event, msg):\r
- print("send schedule{}".format(msg))\r
- # 通过websocket发送到服务器端\r
- date_tmp = utime.localtime()\r
- time_tmp = utime.mktime(date_tmp)\r
- bt_state ={\r
- "cmd":"dispatch_rest",\r
- "ts":time_tmp,\r
- "msg":"消息收到响应",\r
- "data":{\r
- "cmd":"get_bt_state",\r
- "rest":msg,\r
- "msg":"上报蓝牙开关状态"\r
- }\r
- }\r
- send_data = b''\r
- send_data = protocol_send_total_data(bt_state)\r
- print("send_data bt_state{}".format(send_data))\r
- EventMesh.publish("CHANNEL_IOT_WEB_SEND", send_data)\r
-\r
- def recv(self, event, msg):\r
- """\r
-\r
- @param event:上行下发bt_state\r
- @param msg: 接收到的下行数据\r
- """\r
- print("recv bt_state{}".format(msg))\r
- switch_bt_state = EventMesh.publish("get_storage_config","switch_bt_state")\r
- if switch_bt_state == None:\r
- switch_bt_state = "1"\r
- \r
- EventMesh.publish(WEB_CMD_ENUM.GET_BT_STATE_S,str(switch_bt_state))\r
-\r
-#蓝牙扫描列表\r
-class IOTWeb_bt_scan_restProtoCol(ProtoCol):\r
- """bt_scan_rest"""\r
- TYPE = "bt_scan_rest"\r
-\r
- def send(self, event, msg):\r
- print("send bt_scan_rest{}".format(msg))\r
- # 通过websocket发送到服务器端\r
-\r
- send_data = b''\r
- send_data = protocol_send_total_data(msg)\r
- print(" bt_scan_rest{}".format(send_data))\r
- EventMesh.publish("CHANNEL_IOT_WEB_SEND", send_data)\r
-\r
- def recv(self, event, msg):\r
- """\r
-\r
- @param event:上行下发bt_scan_rest\r
- @param msg: 接收到的下行数据\r
- """\r
- print("recv bt_scan_rest{}".format(msg))\r
- \r
-\r
-#连接目标蓝牙设备\r
-class IOTWeb_connect_btProtoCol(ProtoCol):\r
- """connect_bt"""\r
- TYPE = "connect_bt"\r
-\r
- def send(self, event, msg):\r
- print("send connect_bt{}".format(msg))\r
- # 通过websocket发送到服务器端\r
- date_tmp = utime.localtime()\r
- time_tmp = utime.mktime(date_tmp)\r
- s_ret = "success"\r
- if msg == 0:\r
- s_ret = "error"\r
- connect_bt = {\r
- "cmd":"dispatch_rest",\r
- "ts":time_tmp,\r
- "msg":"消息收到响应",\r
- "data":{\r
- "cmd":"connect_bt",\r
- "rest":s_ret,\r
- "msg":"收到蓝牙连接请求"\r
- }\r
- }\r
- send_data = b''\r
- send_data = protocol_send_total_data(connect_bt)\r
- print("send_data bt_state{}".format(send_data))\r
- EventMesh.publish("CHANNEL_IOT_WEB_SEND", send_data)\r
-\r
- def recv(self, event, msg):\r
- """\r
-\r
- @param event:上行下发connect_bt\r
- @param msg: 接收到的下行数据\r
- """\r
- # {\r
- # "cmd":"connect_bt",\r
- # "ts":1738283829,\r
- # "msg":"连接蓝牙设备",\r
- # "data":"目标设备mac地址"\r
- # }\r
- ok = 1\r
- if "data" in msg:\r
- mac = msg["data"]\r
- # mac = "36:72:cc:e6:dd:e8"#deep \r
- # mac = "61:E8:6D:CD:7F:17" #Q36\r
- # mac = "75:E8:8C:62:9A:DF" Fineblue Clip\r
- if len(mac) == 17:\r
- ok = 1\r
- EventMesh.publish("send_connect_bt_mac",mac)\r
- else:\r
- ok = 0\r
- EventMesh.publish(WEB_CMD_ENUM.CONNECT_BT_S,ok)\r
- print("recv connect_bt{}".format(msg))\r
-#上报连接记录\r
-class IOTWeb_bt_connect_record_listProtoCol(ProtoCol):\r
- """bt_connect_record_list"""\r
- TYPE = "bt_connect_record_list"\r
-\r
- def send(self, event, msg):\r
- print("send bt_connect_record_list{}".format(msg))\r
- # 通过websocket发送到服务器端\r
- send_data = b''\r
- send_data = protocol_send_total_data(msg)\r
- print("send_data bt_state{}".format(send_data))\r
- EventMesh.publish("CHANNEL_IOT_WEB_SEND", send_data)\r
-\r
- def recv(self, event, msg):\r
- """\r
-\r
- @param event:上行下发bt_connect_record_list\r
- @param msg: 接收到的下行数据\r
- """\r
- # {\r
- # "cmd":"post_rest",\r
- # "ts":1738283829,\r
- # "msg":"消息收到响应",\r
- # "data":{\r
- # "cmd":"bt_connect_record_list",\r
- # "rest":"success|error",\r
- # "msg":"收到蓝牙连接记录列表"\r
- # }\r
- # }\r
- print("recv bt_connect_record_list{}".format(msg)) \r
-#断开设备蓝牙连接\r
-class IOTWeb_disconnect_btProtoCol(ProtoCol):\r
- """disconnect_bt"""\r
- TYPE = "disconnect_bt"\r
-\r
- def send(self, event, msg):\r
- print("send disconnect_bt{}".format(msg))\r
- # 通过websocket发送到服务器端\r
- date_tmp = utime.localtime()\r
- time_tmp = utime.mktime(date_tmp)\r
- disconnect_bt = {\r
- "cmd":"dispatch_rest",\r
- "ts":time_tmp,\r
- "msg":"消息收到响应",\r
- "data":{\r
- "cmd":"disconnect_bt",\r
- "rest":"success",\r
- "msg":"断开蓝牙设备连接请求"\r
- }\r
- }\r
- send_data = b''\r
- send_data = protocol_send_total_data(disconnect_bt)\r
- print("send_data bt_state{}".format(send_data))\r
- EventMesh.publish("CHANNEL_IOT_WEB_SEND", send_data)\r
-\r
- def recv(self, event, msg):\r
- """\r
-\r
- @param event:上行下发disconnect_bt\r
- @param msg: 接收到的下行数据\r
- """\r
- #{\r
- # 'msg': '断开设备蓝牙', \r
- # 'data': 'AB:12:34:56:78', \r
- # 'ts': 1754555005787, \r
- # 'cmd': 'disconnect_bt'}\r
- if "data" in msg:\r
- mac = msg["data"]\r
- EventMesh.publish("send_disconnect_bt_mac",mac)\r
- print("recv disconnect_bt{}".format(msg))\r
- EventMesh.publish(WEB_CMD_ENUM.DISCONNECT_BT_S)\r
-class IOTWeb_find_deviceProtoCol(ProtoCol):\r
- """find_device"""\r
- TYPE = "find_device"\r
-\r
- def send(self, event, msg):\r
- # print("c{}".format(msg))\r
- # 通过websocket发送到服务器端\r
- date_tmp = utime.localtime()\r
- time_tmp = utime.mktime(date_tmp)\r
- come_trans = {\r
- "msg": "查找设备",\r
- "data": None,\r
- "cmd": "find_device",\r
- "ts": time_tmp\r
- }\r
- send_data = b''\r
- send_data = protocol_send_total_data(come_trans)\r
- print("send_data find_device{}".format(send_data))\r
- EventMesh.publish("CHANNEL_IOT_WEB_SEND", send_data)\r
-\r
- def recv(self, event, msg):\r
- """\r
- @param event:上行下发translate_app_enter\r
- @param msg: 接收到的下行数据\r
- """\r
- tts_str = "我在这呀,我在这呀,我在这呀 "\r
- EventMesh.publish("play_tts",[tts_str,1])\r
-\r
-#接收小程序控制上传设备状态\r
-class IOTWeb_get_device_stateProtoCol(ProtoCol):\r
- """get_device_state"""\r
- TYPE = "get_device_state"\r
-\r
- def send(self, event, msg):\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
- Timeversion = version_util.get_unified_version()\r
- ts = utime.mktime(utime.localtime())\r
- come_trans = {\r
- "data":{\r
- "version":Timeversion,#版本号\r
- "charge":battery_state,#0表示未充电,1表示充电中\r
- "currentRoleName":"",#当前音色的name\r
- "volume":str(VC_TTS_volume),#百分比数值\r
- "wifiRssi":str(net.csqQueryPoll()//6),#wifi强弱:0,1,2,3,4,5。转成这几个梯度\r
- "battery":str(battery),#电量\r
- "bargein": "0",#不能手动设置打断模式\r
- "deviceId":modem.getDevImei(),#设备号\r
- },\r
- "cmd":"device_info",\r
- "msg": "上报设备信息",\r
- "ts": ts\r
- }\r
- send_data = b''\r
- send_data = protocol_send_total_data(come_trans)\r
- print("send_data get_device_state{}".format(send_data))\r
- EventMesh.publish("CHANNEL_IOT_WEB_SEND", send_data)\r
-\r
- def recv(self, event, msg):\r
- """\r
- @param event:get_device_state\r
- @param msg: 接收到的下行数据\r
- """\r
- EventMesh.publish(WEB_CMD_ENUM.GET_DEVICE_STATE_S)\r
-\r
-#接收小程序控制设备音量\r
-class IOTWeb_switch_volumeProtoCol(ProtoCol):\r
- """switch_volume"""\r
- TYPE = "switch_volume"\r
-\r
- def send(self, event, msg):\r
- # print("c{}".format(msg))\r
- # 通过websocket发送到服务器端\r
- date_tmp = utime.localtime()\r
- time_tmp = utime.mktime(date_tmp)\r
- come_trans = {\r
- "msg": "设置音量",\r
- "data": None,\r
- "cmd": "switch_volume",\r
- "ts": time_tmp\r
- }\r
- send_data = b''\r
- send_data = protocol_send_total_data(come_trans)\r
- print("send_data switch_volume{}".format(send_data))\r
- EventMesh.publish("CHANNEL_IOT_WEB_SEND", send_data)\r
-\r
- def recv(self, event, msg):\r
- """\r
- @param event:switch_volume\r
- @param msg: 接收到的下行数据\r
- """\r
- volume = int(msg["data"]["target"]) + 100\r
- print("音量修改为:{}".format(volume-100))\r
- EventMesh.publish("change_volume",volume)\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(len(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
- playpolad_data(data)\r
- # EventMesh.publish(ProtoCol_type, data) #返回协议read\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
+try:
+ from qp_log import qp_print as print
+except Exception:
+ pass
+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 net
+import usocket
+import osTimer
+
+import machine
+import urandom
+import _thread
+import usys
+import request
+import umqtt
+import modem
+SHA256 = uhashlib.sha256
+import versions
+import version_util
+try:
+ import vc_config as _vc_cfg
+ _NLP_EXTENDED_CMDS = _vc_cfg.get_bool("NLP_EXTENDED_CMDS", False)
+except Exception:
+ _NLP_EXTENDED_CMDS = False
+
+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 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
+
+######################IOT######################
+import sms
+import voiceCall
+import quecgnss
+import wifiScan
+from misc import Power,USB
+def wifiScan_cb(args):
+ print("wifi_data:{}".format(args))
+ EventMesh.publish(constants.EVENT.WIFIINFO, args)
+ wifiScan.control(0)
+#定位thered
+class IOTWebLocationManager(Abstract):
+
+ def __init__(self):
+ self.gps = None
+ #self.match = GPSMatch()
+ self.timer_read_GPS_info = osTimer()
+ self.timer_sos_report_info = osTimer()
+ self.wifi_data = []
+ self.cell_data = []
+ self.location_timer_count = 0
+ self.location_check_data_timer_count = 0
+ self.GGA_count = 0
+ self.RMC_A_count = 0
+ self.location_type = 0 #定位类型,0:正常定位,有gps数据或60秒关闭;1:测试模式,只有发CLOSE_LOCATION消息才关闭
+ self.location_flag = 0
+ self.start_location_flag = 0
+ self.location_thread_id = 0
+ self.location_queue = Queue(100)
+ self.lpm_fd = None
+ self.start_agps = 0
+ self.sos_report_flag=0
+ quecgnss.gnssEnable(0)
+
+ def post_processor_after_instantiation(self):
+ EventMesh.subscribe(constants.EVENT.START_LOCATION, self.start_location)
+ EventMesh.subscribe(constants.EVENT.WIFIINFO, self.WIFI_INFO)
+ EventMesh.subscribe(constants.EVENT.WIFISCANOPEN,self.WIFI_scan_open)
+ EventMesh.subscribe(constants.EVENT.CLOSE_LOCATION,self.close_location)
+ EventMesh.subscribe("get_location_flag",self.get_location_flag)
+ #EventMesh.subscribe(constants.EVENT.GPSCLOSE, self.gps_close)
+ def get_location_flag(self, event, msg):
+ return self.location_flag
+
+ def sos_report_info(self):
+ EventMesh.debug_log("sos_report_info:")
+ if self.sos_report_flag == 1:
+ return
+ self.soswifi_data = []
+ self.soscell_data = []
+ self.sos_report_flag = 1
+ self.timer_sos_report_info.start(3000, 1, self.sos_timer)
+
+ def close_sos(self):
+ self.soswifi_data = []
+ self.soscell_data = []
+ self.sos_report_flag=0
+ self.timer_sos_report_info.stop()
+
+
+ def sos_timer(self, *args, **kwargs):
+ if self.sos_report_flag == 1:
+ try :
+ #检查wifi数据
+ if self.soswifi_data == [] or (self.soswifi_data != [] and self.soswifi_data[0] == 0):#and self.wifi_data[0] <= 0:
+ EventMesh.publish(constants.EVENT.WIFISCANOPEN)
+
+ #检查基站数据
+ if self.soscell_data== []:
+ data_tmp = net.getCellInfo()
+ if(len(data_tmp)>=2):
+ for cell in data_tmp:
+ if cell and cell[0][0] == 0 and len(cell[0]) > 1:
+ self.soscell_data = cell
+ break
+ if self.soscell_data != [] and self.soswifi_data != []:
+ self.close_sos()
+ self.Location_send([WEB_CMD_ENUM.SOS_REPORT_S_CMD,self.soswifi_data,self.soscell_data])
+
+ except Exception as e:
+ usys.print_exception(e)
+
+ def start_location(self, event, msg):
+ self.location_queue.put(msg)#测试类型入队
+ self.wifi_data = []
+ self.cell_data = []
+ print("start_location:{} self.location_flag:{}".format(msg,self.location_flag))
+ if( self.location_flag == 1):
+ return
+ self.location_flag = 1
+ _thread.stack_size((9+5)*1024)
+ self.location_thread_id = _thread.start_new_thread(self.location_thread, ())
+ _thread.stack_size(8*1024)
+ # self.timer_read_GPS_info.start(1000, 1, self.location_timer)
+ # if msg == WEB_CMD_ENUM.SOS_REPORT_S_CMD:
+ # self.sos_report_info()
+ # pass
+ # elif msg == WEB_CMD_ENUM.GPS_REPORT_S_CMD:
+ # self.gps_report_init()
+ # pass
+ def gps_report_init(self):
+
+ EventMesh.debug_log("start_location:")
+ if self.location_flag == 1:
+ return
+ self.wifi_data = []
+ self.cell_data = []
+ self.location_timer_count = 0
+ self.location_flag = 1
+ self.timer_read_GPS_info.start(3000, 1, self.location_timer)
+
+
+ def close_location(self,event,msg):
+ self.location_flag = 0
+ if wifiScan.getState() == True:
+ wifiScan.control(0)
+ # self.timer_read_GPS_info.stop()
+ if self.location_queue.empty() == False:
+ self.location_queue.clear()
+ if self.location_thread_id != 0:
+ try:
+ _thread.stop_thread(self.location_thread_id)
+ except Exception as e:
+ pass
+ self.location_thread_id=0
+ print("close_location:!!!!!!!!!")
+
+
+
+ def WIFI_INFO(self, event, msg):
+ self.wifi_data = msg
+
+ def WIFI_scan_open(self, event, msg):
+
+ if wifiScan.getState() == False :
+ self.wifi_data = []
+ wifiScan.control(1)
+ wifiScan.setCfgParam(6, 2, 5, 0) #设置WiFi参数,10秒上层,两轮,最多6个,6秒底层,PS优先
+ wifiScan.setCallback(wifiScan_cb) #注册回调函数
+ wifiScan.asyncStart()
+ #EventMesh.debug_log("wifiScan.asyncStart")
+
+ def location_timer(self, *args, **kwargs):
+ if self.location_flag == 1:
+ try :
+ #检查wifi数据
+ if self.wifi_data == [] or (self.wifi_data != [] and self.wifi_data[0] == 0):#and self.wifi_data[0] <= 0:
+ EventMesh.publish(constants.EVENT.WIFISCANOPEN)
+
+ #检查基站数据
+ if self.cell_data == []:
+ data_tmp = net.getCellInfo()
+ if(len(data_tmp)>=2):
+ for cell in data_tmp:
+ if cell and cell[0][0] == 0 and len(cell[0]) > 1:
+ self.cell_data = cell
+ break
+ if self.cell_data != [] and self.wifi_data != []:
+ self.close_location(0,0)
+ self.Location_send([WEB_CMD_ENUM.POST_LOCATION_S_CMD,self.wifi_data,self.cell_data])
+
+ except Exception as e:
+ usys.print_exception(e)
+
+ def Location_send(self, msg) :
+ EventMesh.debug_log("Location_send1")
+ if self.location_queue.empty() == True:
+ return
+ EventMesh.debug_log("Location_send2")
+ print("Location_send1")
+ while True:
+ if self.location_queue.empty() == False:
+ TYPE = self.location_queue.get()
+ # (5, [('70:2A:D7:63:BD:B4', -38), ('C0:94:AD:80:21:5F', -61), ('D8:38:0D:05:1F:E3', -65), ('08:9E:84:E7:A6:38', -73), ('B0:44:14:BC:13:B0', -73)])
+ wifi_tmp = []
+ wifi_num = msg[0][0]
+ print("wifi_num:{}".format(wifi_num))
+ if wifi_num == 0:
+ wifi_tmp = []
+ else: #([], [], [(0, 69483137, 1120, 1, 385, 30504, 100, -75, -8), (3, 111950593, 1120, 1, 58, 30504, 1650, -98, -19), (3, 219097617, 1120, 17, 76, 30504, 2452, -106, -23), (3, 102345712, 1120, 1, 58, 30504, 3740, -96, -18)])
+
+ wifi_tmp_data = msg[0][1]
+ print(wifi_tmp_data)
+ for i in range(wifi_num):
+ list_data = {}
+ list_data["mac"] = str(wifi_tmp_data[i][0])
+ list_data["rsi"] = str(wifi_tmp_data[i][1])
+ # list_data = "{},{}".format(wifi_tmp_data[i][0],wifi_tmp_data[i][1])
+
+ wifi_tmp.append(list_data)
+ pass
+ # ([(flag, cid, mcc, mnc, lac, arfcn, bsic, rssi)], [(flag, cid, licd, mcc, mnc, lac, uarfcn, psc, rssi)], [(flag, cid, mcc, mnc, pci, tac, earfcn, rssi, rsrq),...])
+ date_tmp = utime.localtime()
+ time_tmp = utime.mktime(date_tmp)
+ celList = []
+ if msg[1] != []:
+ for CELL in msg[1] :
+ print("CELL:{}".format(CELL))
+ CELL_data = {}
+ CELL_data["mcc"] = str(CELL[2])
+ CELL_data["mnc"] = str(CELL[3])
+ CELL_data["lac"] = str(CELL[4])
+ CELL_data["cid"] = str(CELL[1])
+ CELL_data["rsi"] = str(CELL[7])
+
+
+ # CELL_data += str(CELL[2]) +"," #MCC
+ # CELL_data += str(CELL[3]) +"," #MNC
+ # CELL_data += str(CELL[4]) +"," #LAC
+ # CELL_data += str(CELL[7]) +"," #RSSI
+ celList.append(CELL_data)
+ s_msg=""
+ s_cmd = ""
+ if TYPE == WEB_CMD_ENUM.POST_LOCATION_S_CMD:
+ s_msg = "上报经纬度"
+ s_cmd = "post_location"
+ elif TYPE == WEB_CMD_ENUM.POST_SOS_S_CMD:
+ s_msg = "上报SOS求救"
+ s_cmd = "post_sos"
+ send_data = {
+ "cmd":s_cmd,
+ "ts":int(time_tmp),
+ "msg":s_msg,
+ "data":{
+ "gps": {
+ "longitude": "0",
+ "latitude": "0",
+ "located": "0",
+ "speed": "0"
+ },
+ "wifiList":wifi_tmp,
+ "celList":celList
+
+ }
+ }
+ print("TYPE{}".format(TYPE))
+ EventMesh.publish(TYPE,send_data)
+ else:
+ self.location_thread_id=0
+ EventMesh.publish(constants.EVENT.CLOSE_LOCATION)
+ break
+
+
+ def location_thread(self):
+
+ self.wifi_data = []
+ print("location_thread self.location_flag {}".format(self.location_flag))
+ while self.location_flag == 1:
+ try :
+
+ #检查wifi数据
+ if self.wifi_data == [] or (self.wifi_data != [] and self.wifi_data[0] == 0):#and self.wifi_data[0] <= 0:
+ EventMesh.publish(constants.EVENT.WIFISCANOPEN)
+
+ #检查基站数据
+ if self.cell_data == []:
+ print("location_thread")
+ data_tmp = net.getCellInfo()
+ if(len(data_tmp)>=2):
+ for cell in data_tmp:
+ if cell and cell[0][0] == 0 and len(cell[0]) > 1:
+ self.cell_data = cell
+ break
+
+ if self.cell_data != [] and self.wifi_data != []:
+ self.Location_send([self.wifi_data,self.cell_data])
+
+ break
+
+ except Exception as e:
+ usys.print_exception(e)
+ EventMesh.publish(constants.EVENT.CLOSE_LOCATION)#关闭定位
+ utime.sleep_ms(1000)
+ wifiScan.control(0)
+
+
+
+import uwebsocket
+import sim
+# 设备主动上报后台返回cmd的字符串
+DEVICE_REPORT_RETURN_STRING = "post_rest"
+# 服务器主动下发给设备的cmd的字符串
+IOT_AUTO_REPORT_RETURN_STRING = "dispatch_rest"
+MAGIC_STR = len("FFFE")
+VERSION_STR =len("03")
+TYPE_STR = len("03")
+PLAYLOAD_STR = len("0000")
+PROTOCLO_LEN = MAGIC_STR+VERSION_STR+TYPE_STR+PLAYLOAD_STR+len('{')+len('}')+len("cmd:")+len("data:")+len("ts:")
+
+class WEB_CMD_ENUM:
+ HR_R_CMD = "post_heart_beat_R"
+ HR_S_CMD = "post_heart_beat_S"
+
+ POST_LOCATION_R_CMD = "post_location_R"
+ POST_LOCATION_S_CMD = "post_location_S"
+
+ POST_SOS_R_CMD = "post_sos_R"
+ POST_SOS_S_CMD = "post_sos_S"
+
+ POST_DEVICE_STATE_R_CMD = "post_device_state_R"
+ POST_DEVICE_STATE_S_CMD = "post_device_state_S"
+
+ POST_ALARM_R_CMD = "post_alarm_R"
+ POST_ALARM_S_CMD = "post_alarm_S"
+
+ POST_SCHEDULE_R_CMD = "post_schedule_R"
+ POST_SCHEDULE_S_CMD = "post_schedule_S"
+
+ FIND_DEVCE_R_CMD = "find_device_R"
+ FIND_DEVCE_S_CMD = "find_device_S"
+
+ LOCATION_NOW_R_CMD = "locate_now_R"
+ LOCATION_NOW_S_CMD = "locate_now_S"
+
+ LOCATION_DURATION_R_CMD = "locate_duration_R"
+ LOCATION_DURATION_S_CMD = "locate_duration_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"
+
+ SCHEDULE_LIST_R_CMD = "schedule_list_R"
+ SCHEDULE_LIST_S_CMD = "schedule_list_S"
+
+ SOS_LIST_R_CMD ="sos_list_R"
+ SOS_LIST_S_CMD ="sos_list_S"
+
+ SOS_CONFIG_R_CMD = "sos_config_R"
+ SOS_CONFIG_S_CMD = "sos_config_S"
+
+ DEVICE_SHAKE_STATE_R_CMD = "device_shake_state_R"
+ DEVICE_SHAKE_STATE_S_CMD = "device_shake_state_S"
+
+ RING_TONE_URL_R_CMD = "ring_tone_url_R"
+ RING_TONE_URL_S_CMD = "ring_tone_url_S"
+
+ VOLUME_R_CMD = "volume_R"
+ VOLUME_S_CMD = "volume_S"
+
+ TEXT_MSG_R_CMD = "text_msg_R"
+ TEXT_MSG_S_CMD = "text_msg_S"
+
+ VOICE_RECORD_R_CMD = "voice_record_R"
+ VOICE_RECORD_S_CMD = "voice_record_S"
+
+ GET_RINGTONE_R_CMD = "get_ringtone_R"
+ GET_RINGTONE_S_CMD = "get_ringtone_S"
+
+ RINGTONE_LIST_R_CMD = "ringtone_list_R"
+ RINGTONE_LIST_S_CMD = "ringtone_list_S"
+
+ SCHEDULE_R_CMD = "schedule_R"
+ SCHEDULE_S_CMD = "schedule_S"
+
+ SWITCH_BT_STATE_R_CMD="switch_bt_state_R"
+ SWITCH_BT_STATE_S_CMD="switch_bt_state_S"
+
+
+ BT_SCAN_R_CMD="bt_scan_R"
+ BT_SCAN_S_CMD="bt_scan_S"
+
+ BT_STATE_R_CMD="bt_state_R"
+ BT_STATE_S_CMD="bt_state_S"
+
+ BT_SCAN_REST_R_CMD = "bt_scan_rest_R"
+ BT_SCAN_REST_S_CMD = "bt_scan_rest_S"
+
+ CONNECT_BT_R="connect_bt_R"
+ CONNECT_BT_S="connect_bt_S"
+
+ DISCONNECT_BT_R="disconnect_bt_R"
+ DISCONNECT_BT_S="disconnect_bt_S"
+
+ NEW_VOICE_MSG_R = "new_voice_msg_R"
+ NEW_VOICE_MSG_S = "new_voice_msg_S"
+
+ GET_NEW_VOICE_MSG_R="get_new_voice_msg_R"
+ GET_NEW_VOICE_MSG_S="get_new_voice_msg_S"
+
+ NEW_VOICE_MSG_LIST_R="new_voice_msg_list_R"
+ NEW_VOICE_MSG_LIST_S="new_voice_msg_list_S"
+
+ PUT_VOICE_MSG_STATE_R="put_voice_msg_state_R"
+ PUT_VOICE_MSG_STATE_S="put_voice_msg_state_S"
+
+ GET_BT_STATE_R="get_bt_state_R"
+ GET_BT_STATE_S="get_bt_state_S"
+
+ GET_BT_CONNECT_RECORD_LIST_R = "get_bt_connect_record_list_R"
+ GET_BT_CONNECT_RECORD_LIST_S = "get_bt_connect_record_list_S"
+
+ BT_CONNECT_RECORD_LIST_R="bt_connect_record_list_R"
+ BT_CONNECT_RECORD_LIST_S="bt_connect_record_list_S"
+
+ FENCE_SOS_R="fence_sos_R"
+ FENCE_SOS_S="fence_sos_S"
+
+ PLAY_CONTROL_R="player_control_R"
+ PLAY_CONTROL_S="player_control_S"
+
+ GET_CHAT_CONFIG_R="get_chat_config_R"
+ GET_CHAT_CONFIG_S="get_chat_config_S"
+
+ CHAT_CONFIG_R = "chat_config_R"
+ CHAT_CONFIG_S = "chat_config_S"
+
+ POST_BT_CONNECT_REST_R = "post_bt_connect_rest_R"
+ POST_BT_CONNECT_REST_S = "post_bt_connect_rest_S"
+
+ UNBIND_DEV_R="unbind_dev_R"
+ UNBIND_DEV_S="unbind_dev_S"
+
+ USER_UNBIND_DEV_R="user_unbind_dev_R"
+ USER_UNBIND_DEV_S="user_unbind_dev_S"
+
+ MUSIC_PLAY_R="music_play_R"
+ MUSIC_PLAY_S="music_play_S"
+
+ NLP_PLAY_R = "ai_cmd_R"
+ NLP_PLAY_S = "ai_cmd_S"
+
+ #金三
+ GET_DEVICE_STATE_R = "get_device_state_R"
+ GET_DEVICE_STATE_S = "get_device_state_S"
+class IOTSendCmdManager(Abstract):
+ #
+ def __init__(self):
+ self.send_data = ""
+ self.time_tmp = 0
+ def post_processor_after_instantiation(self):
+ EventMesh.subscribe("GET_IOT_WEB_SEND_CMD", self.get_iot_send_cmd)
+ print("IOTSendCmdManager")
+
+ def get_iot_send_cmd(self, event, msg):
+ date_tmp = utime.localtime()
+ self.time_tmp = utime.mktime(date_tmp)
+ if msg == WEB_CMD_ENUM.HR_S_CMD:
+ self.send_data = self.hr_send_data(self.time_tmp)
+ return self.send_data
+ elif msg == WEB_CMD_ENUM.POST_LOCATION_S_CMD:
+ self.send_data = self.gps_send_data()
+ return self.send_data
+ elif msg == WEB_CMD_ENUM.POST_SOS_S_CMD:
+ self.send_data = self.sos_wraing_send_data()
+ return self.send_data
+ elif msg == WEB_CMD_ENUM.POST_DEVICE_STATE_S_CMD:
+ self.send_data = self.device_report_state_send_data()
+ return self.send_data
+ elif msg == WEB_CMD_ENUM.POST_ALARM_S_CMD:
+ self.send_data = self.alarm_config_send_data()
+ elif msg == WEB_CMD_ENUM.POST_SCHEDULE_S_CMD:
+ self.send_data = self.schedule_config_send_data()
+ return self.send_data
+
+ # 心率上报数据格式
+ def hr_send_data(self,time):
+ print("hr_send_data")
+ battery = (EventMesh.publish("screen_get_battery"))[1]
+ if battery >= 100 or battery == None:
+ battery = 100
+ hr_send_data = {
+ "cmd":"post_heart_beat",
+ "ts":time,
+ "msg":"心跳",
+ "data":{
+ "battery": int(battery)
+ }
+ }
+ return hr_send_data
+
+ # gps上报数据格式
+ def gps_send_data(self):
+ gps_data = {
+ "cmd":"post_location",
+ "ts":self.time_tmp,
+ "data":{
+ "gps":{
+ "longitude":"W,67",
+ "latitude":"S,465",
+ "direction":"FR",
+ "speed":"45",
+ "altude":"56",
+ "count":"3"
+ },
+ "wifiList":[
+ "89:78:78:67:89:98,-98"
+ ],
+ "celList":[
+ "MCC,MNC,LAC,CID,RSSI"
+ ],
+ "btList":[
+ "D4:78:65:67:89:78"
+ ]
+ }
+ }
+ return gps_data
+
+ # sos警告上报数据格式
+ def sos_wraing_send_data(self):
+ sos_wraing_data ={
+ "cmd":"post_sos",
+ "ts":self.time_tmp,
+ "data":{
+ "gps":{
+ "longitude":"W,67",
+ "latitude":"S,465",
+ "direction":"FR",
+ "speed":"45",
+ "altude":"56",
+ "count":"3"
+ },
+ "wifiList":[
+ "89:78:78:67:89:98,-98"
+ ],
+ "celList":[
+ "MCC,MNC,LAC,CID,RSSI"
+ ],
+ "btList":[
+ "D4:78:65:67:89:78"
+ ]
+ }
+ }
+ return sos_wraing_data
+
+ #设备上报状态上报数据格式
+ def device_report_state_send_data(self):
+ get_volume = EventMesh.publish("get_storage_config","VC_TTS_volume")
+ device_report_data ={
+ "cmd":"post_device_state",
+ "ts":self.time_tmp,
+ "data":{
+ "mediaTitle":"haha",
+ "mediaState":"stop",
+ "cover":"899",
+ "volume":get_volume
+ }
+ }
+ # HR_DATA=EventMesh.publish("GET_IOT_WEB_SEND_CMD",WEB_CMD_ENUM.POST_DEVICE_STATE_S_CMD)
+ # print("HR_DATA{}".format(HR_DATA))
+ # EventMesh.publish(WEB_CMD_ENUM.POST_DEVICE_STATE_S_CMD,HR_DATA)
+ return device_report_data
+
+ #闹钟配置上报数据格式
+ def alarm_config_send_data(self):
+ alarm_data = {
+ "cmd":"post_alarm",
+ "ts":self.time_tmp,
+ "msg":"上报闹钟",
+ "data":[
+ {
+ "name":"喝水",
+ "loop":"0101001",
+ "state":"0",
+ "time":"14:34",
+ "ringTimes":1,
+ "alarmMode":"ring",
+ "shakeType":"short"
+ },
+ {
+ "name":"起床",
+ "loop":"0101001",
+ "state":"0",
+ "time":"07:40",
+ "ringTimes":1,
+ "alarmMode":"ring",
+ "shakeType":"short"
+ }
+ ]
+ }
+
+ return alarm_data
+ #日程配置上报数据格式
+ def schedule_config_send_data(self):
+ schedule_data = {
+ "cmd":"post_schedule",
+ "ts":self.time_tmp,
+ "msg":"上报日程",
+ "data":[
+ {
+ "name":"喝水",
+ "loop":"0101001",
+ "state":"0",
+ "time":"14:34",
+ "ringTimes":1,
+ "alarmMode":"ring",
+ "shakeType":"short"
+ },
+ {
+ "name":"起床",
+ "loop":"0101001",
+ "state":"0",
+ "time":"07:40",
+ "ringTimes":1,
+ "alarmMode":"ring",
+ "shakeType":"short"
+ }
+ ]
+ }
+
+ return schedule_data
+#解析收到的数据协议
+def playpolad_data(data):
+ if(isinstance(data, bytes) == 0 or len(data) <= PROTOCLO_LEN):
+ return
+
+ if data[0] != 0xff and data[1] !=0xfe and data[2] != 0x03 and data[3] !=0x03:
+ return
+
+ # print(type(data))
+ json_bytes = data[8:]
+ # print(data[0],data[1],data[2],data[3],data[4],data[5],data[6],data[7])
+ # 2. 将二进制JSON转换为字符串(使用UTF-8解码)
+ json_str = json_bytes.decode('utf-8')
+ print("解析出的JSON字符串:")
+ print(json_str)
+ print("\n" + "-"*50 + "\n")
+
+ # 3. 将JSON字符串转换为Python字典
+ try:
+ data_dict = ujson.loads(json_str)
+ print("解析后的字典数据:")
+ print(data_dict)
+
+ # 可以直接访问字典中的字段
+
+ cmd = data_dict['cmd']
+ if cmd != None:
+ if cmd == DEVICE_REPORT_RETURN_STRING:
+ data_cmd = data_dict['data']
+ if "cmd" in data_cmd:
+ cmd = data_dict['data']["cmd"]
+ # {"cmd ":"post_rest","ts":1753870158426,"data":{"cmd":"post_heart_beat","rest":"success","msg":"."}}
+ print("设备主动上报后台返回的数据 设备不需要回复")
+ EventMesh.publish(cmd+"_R",data_dict)
+ else:
+ print("返回的data里面没有cmd 返回的数据出错了")
+ else:
+ # {"cmd":"locate_now","msg":"","data":"876226211472149","ts":1753870224117}
+ print("后台主动下发给设备 需要设备回复给后台的数据命令") #后台主动下发的数据不为dict类型
+ EventMesh.publish(cmd+"_R",data_dict)
+ else:
+ print("cmd is None") #下发的指令无不解析
+ except Exception as e:
+ print("解析JSON出错:", str(e))
+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
+#音频流数据格式
+#magic+version+type+msgid+playload_len+playload
+def protocol_audio_ji_playload_data(data,msgid,endflag):
+ MAGIC = (0xfffe).to_bytes(2,"big")
+ VERSION = (0x01).to_bytes(1,"big")#"03".encode('utf-8')
+ TYPE = (0x05).to_bytes(1,"big")
+ MSGID = msgid.to_bytes(4,"big")
+ ENDFLAG = endflag.to_bytes(1,"big")
+ DATA_LEN = (len(data)).to_bytes(4,"big")
+ heards_infor = b''
+ heards_infor = MAGIC+VERSION+TYPE+MSGID+ENDFLAG+DATA_LEN+data
+ return heards_infor
+
+#语音留言格式
+def protocol_yuyin_voice_playload_data(data,msgid,endflag):
+ MAGIC = (0xfffe).to_bytes(2,"big")
+ VERSION = (0x01).to_bytes(1,"big")#"03".encode('utf-8')
+ TYPE = (0x08).to_bytes(1,"big")
+ MSGID = msgid.to_bytes(4,"big")
+ ENDFLAG = endflag.to_bytes(1,"big")
+ DATA_LEN = (len(data)).to_bytes(4,"big")
+ heards_infor = b''
+ heards_infor = MAGIC+VERSION+TYPE+MSGID+ENDFLAG+DATA_LEN+data
+ return heards_infor
+
+#会议纪要格式
+def protocol_meet_playload_data(data,msgid,endflag):
+ MAGIC = (0xfffe).to_bytes(2,"big")
+ VERSION = (0x01).to_bytes(1,"big")#"03".encode('utf-8')
+ TYPE = (0x09).to_bytes(1,"big")
+ MSGID = msgid.to_bytes(4,"big")
+ ENDFLAG = endflag.to_bytes(1,"big")
+ DATA_LEN = (len(data)).to_bytes(4,"big")
+ heards_infor = b''
+ heards_infor = MAGIC+VERSION+TYPE+MSGID+ENDFLAG+DATA_LEN+data
+ return heards_infor
+
+#AI翻译格式
+def protocol_trans_playload_data(data,msgid,endflag):
+ MAGIC = (0xfffe).to_bytes(2,"big")
+ VERSION = (0x01).to_bytes(1,"big")#"03".encode('utf-8')
+ TYPE = (0x0A).to_bytes(1,"big")
+ MSGID = msgid.to_bytes(4,"big")
+ ENDFLAG = endflag.to_bytes(1,"big")
+ DATA_LEN = (len(data)).to_bytes(4,"big")
+ heards_infor = b''
+ heards_infor = MAGIC+VERSION+TYPE+MSGID+ENDFLAG+DATA_LEN+data
+ return heards_infor
+#sos紧急电话class
+class sosInfoCallManager(Abstract):
+ def __init__(self):
+ self.num = 0
+ self.num=0
+ self.num_len = 0
+ self.sos_list = []
+ self.sos_flag = 0
+ self.sos_timer1 = osTimer()
+ self.sos_timer2 = osTimer()
+ self.save_list = []
+ self.call_state = 0
+ self.sos_config = {}
+ self.phone110112_flag = 0
+ self.phone110112 = ""
+ if EventMesh.publish("get_storage_config","sos_list") != None:
+ self.sos_list = EventMesh.publish("get_storage_config","sos_list")
+ if EventMesh.publish("get_storage_config","sos_config") != None:
+ self.sos_config= EventMesh.publish("get_storage_config","sos_config")
+
+ # self.sos_list=[{"index":0,"phone":"15521469561","name":"dengxueying0"}, {"name":"dengxueying1","index":0,"phone":"15692025051"},{"name":"dengxueying2","index":0,"phone":"15521469561"}]
+ EventMesh.subscribe("call_out_cb", self.call_out_cb)
+ EventMesh.subscribe("get_sos_flag", self.get_sos_flag)
+
+ def post_processor_after_instantiation(self):
+ self.num = 0
+ self.sos_flag = 0
+ voiceCall.setCallback(self.voice_callback)
+ EventMesh.subscribe("set_sos_info_call", self.set_sos_info_call)
+ EventMesh.subscribe("set_sos_list_info",self.set_sos_list_info)
+ EventMesh.subscribe("stop_sos_call",self.stop_sos_call)
+ EventMesh.subscribe("set_sos_config",self.set_sos_config)
+ def set_sos_config(self,event,msg):
+ # sos_config:{'enable110': '1', 'pressDuration': 3, 'enableSos': '0'}
+ print("set_sos_config:{}".format(msg))
+ self.sos_config = msg
+ # self.start_phone110112()
+ pass
+ def get_sos_flag(self,event,msg):
+ if self.call_state != 0:
+ return 1
+ else:
+ return 0
+ # import EventMesh
+ # EventMesh.publish("set_sos_info_call")
+ def close_call_timer(self):
+ self.sos_timer2.stop()
+ pass
+ def stop_sos_call(self,event,msg): #停止sos拨打
+ EventMesh.publish("publish_AI_btnInfo",{"func":self.stop_sos_call_cb})
+ def stop_sos_call_cb(self):
+ if self.call_state == 0:
+ return
+ self.phone110112_flag=0
+ self.sos_flag = 0
+ self.call_state = 0
+ self.num=0 #不管有没有拨打sos都清除
+ self.num_len = 0
+ self.sos_timer2.stop()
+ self.sos_timer1.stop()
+ voiceCall.callEnd() #挂断
+
+ def start_phone110112(self):
+ print("start_phone110112:{} self.sos_config:{}".format(self.call_state,self.sos_config))
+ if self.sos_config != {}:
+ if "enableSos" in self.sos_config:
+ enableSos = self.sos_config["enableSos"]
+ if enableSos == "1":
+ if "enable110" in self.sos_config:
+ p110 = self.sos_config["enable110"]
+ if p110 == "0":
+ self.phone110112 = "110"
+ tts_str = "正在呼叫{}".format(self.phone110112)
+ EventMesh.publish("stop_voice_record") #电话优先级最高
+ EventMesh.publish("stop_AI_record")
+ EventMesh.publish("play_tts",[tts_str,1]) #播放tts闹钟文本内容
+ self.sos_timer1.stop()
+ self.sos_timer1.start(2000, 0, self.phone110112_cb)
+ elif p110 == "1":
+ self.phone110112 = "112"
+ tts_str = "正在呼叫{}".format(self.phone110112)
+ EventMesh.publish("stop_voice_record") #电话优先级最高
+ EventMesh.publish("stop_AI_record")
+ EventMesh.publish("play_tts",[tts_str,1]) #播放tts闹钟文本内容
+ self.sos_timer1.stop()
+ self.sos_timer1.start(2000, 0, self.phone110112_cb)
+
+ else:
+ return 1
+
+ def sos_call_out_phone(self, msg):#电话拨出去
+ if self.call_state == 0:
+ ret = voiceCall.callStart(self.sos_phone_num)
+ if ret == -1:
+
+ tts_str = "请确认卡支持语音拨号及余额充足"
+ EventMesh.publish("stop_voice_record") #电话优先级最高
+ EventMesh.publish("stop_AI_record")
+ EventMesh.publish("play_tts",[tts_str,1]) #播放tts闹钟文本内容
+ self.call_state = 0
+ self.num=0 #不管有没有拨打sos都清除
+ self.num_len = 0
+ self.sos_flag = 0
+ self.phone110112_flag=0
+ return -1
+ else:
+ EventMesh.publish(constants.EVENT.START_LOCATION,WEB_CMD_ENUM.POST_SOS_S_CMD) #开始AL定位
+ self.sos_timer2.stop()
+ self.sos_timer2.start(30000, 0, self.sos_time_out_phone)
+ return 1
+
+ def phone110112_cb(self,*argc):
+ if self.call_state == 0:
+ ret = voiceCall.callStart(self.phone110112)
+ if ret != -1:
+ self.phone110112_flag=1
+ else:
+ self.phone110112_flag=0
+ # print("ret:{} {}".format(ret,self.phone110112))
+ self.phone110112 = ""
+
+ def set_sos_list_info(self,event,msg):
+ self.sos_list = msg
+
+
+ def call_out_cb(self,event,phonenumber):
+
+ if self.call_state == 0:
+ self.sos_phone_num = phonenumber
+ EventMesh.publish("stop_voice_record") #电话优先级最高
+ EventMesh.publish("stop_AI_record")
+
+ tts_str = "正在呼叫号码{}".format(self.sos_phone_num)
+ EventMesh.publish("stop_voice_record") #电话优先级最高
+ EventMesh.publish("stop_AI_record")
+ EventMesh.publish("play_tts",[tts_str,1]) #播放tts闹钟文本内容
+ self.sos_timer1.stop()
+ self.sos_timer1.start(2000, 0, self.sos_call_out_phone)
+
+
+
+ def sos_time_out_phone(self, msg):#30s超时未打通或者信号不好则重新拨打
+
+ if self.sos_flag == 1:
+ if self.call_state == 0:
+ voiceCall.callEnd() #挂断
+ EventMesh.publish("set_sos_info_call") #电话优先级最高
+ pass #再次拨打
+
+ def set_sos_info_call(self,event,msg):
+ if EventMesh.publish("get_yuyinaudio_flag") == 1 or EventMesh.publish("get_voice_record_mode") != 0: #语言留言模式不允许拨打电话
+ self.call_state = 0
+ self.num=0 #不管有没有拨打sos都清除
+ self.num_len = 0
+ self.sos_flag = 0
+ self.phone110112_flag=0
+ return
+ if sim.getStatus() != 1:#网络正常
+ tts_str = "无SIM卡"
+ EventMesh.publish("stop_voice_record") #电话优先级最高
+ EventMesh.publish("stop_AI_record")
+ EventMesh.publish("play_tts",[tts_str,1]) #播放tts闹钟文本内容
+ self.call_state = 0
+ self.num=0 #不管有没有拨打sos都清除
+ self.num_len = 0
+ self.sos_flag = 0
+ self.phone110112_flag=0
+ return
+ if self.call_state != 0:
+ return
+ if len(self.sos_list) > 0:
+ self.call_state = 0
+ self.call_sos_cb(1)
+ else:
+ tts_str = "未设置号码"
+ EventMesh.publish("stop_voice_record") #电话优先级最高
+ EventMesh.publish("stop_AI_record")
+ EventMesh.publish("play_tts",[tts_str,1]) #播放tts闹钟文本内容
+ self.call_state = 0
+ self.num=0 #不管有没有拨打sos都清除
+ self.num_len = 0
+ self.sos_flag = 0
+ self.phone110112_flag=0
+
+ def call_sos_cb(self,*argc):
+ self.phone110112_flag=0
+ if self.sos_flag == 0:
+ self.sos_flag = 1
+ sos_flag = self.sos_flag
+ EventMesh.debug_log('voicecall sos_flag',sos_flag)
+ if sos_flag == 0 :
+ self.num = 0
+ else:
+ if len(self.sos_list) > 0:
+ # for list_t in self.sos_list:
+ # tmp = list_t["phone"]
+ # self.save_list.append(tmp)
+
+ self.num +=1
+ if len(self.sos_list) == 1:
+ self.num_len = len(self.sos_list)*3#三次 1
+ elif len(self.sos_list) == 2:
+ self.num_len = len(self.sos_list)*3 #1+2+1+2
+ elif len(self.sos_list) == 3:
+ self.num_len = len(self.sos_list)*3 #1+3+5
+ # EventMesh.debug_log("number:{} number_len :{} num:{} num_len:{}".format(number,len(number),num,num_len))
+ if self.num > self.num_len :
+
+ self.start_phone110112()
+ EventMesh.debug_log("call phone!!!!!!!")
+ self.sos_flag = 0
+ self.num = 0
+ self.num_len = 0
+ else:
+ self.phone110112_flag=0
+ EventMesh.debug_log("self.num:{} self.num_len :{}".format(self.num,self.num_len))
+
+ if len(self.sos_list) == 1:
+ if len(self.sos_list[0]["phone"]) != 0:
+ EventMesh.publish("call_out_cb", self.sos_list[0]["phone"])
+ # EventMesh.publish("set_callnumer_cb",self.sos_list[0]["pnone"])
+ EventMesh.debug_log("phone 1 {}".format(self.sos_list[0]["phone"]))
+ elif len(self.sos_list) == 2:
+ # 1 2
+ # 3 4
+ # 5 6
+ if self.num == 1 or self.num == 3 or self.num == 5: #1 2 3 4 5
+ if len(self.sos_list[0]) != 0:
+ EventMesh.debug_log("phone 2 {}".format(self.sos_list[0]["phone"]))
+ EventMesh.publish("call_out_cb", self.sos_list[0]["phone"])
+ # EventMesh.publish("set_callnumer_cb",self.sos_list[1]["pnone"])
+ elif self.num == 2 or self.num == 4 or self.num == 6:
+ if len(self.sos_list[1]) != 0:
+ EventMesh.debug_log("phone 3 {}".format(self.sos_list[1]["phone"]))
+ EventMesh.publish("call_out_cb", self.sos_list[1]["phone"])
+ # EventMesh.publish("set_callnumer_cb",self.sos_list[0]["pnone"])
+ elif len(self.sos_list) == 3:
+ # 1 2 3
+ # 4 5 6
+ # 7 8 9
+ if self.num == 1 or self.num == 4 or self.num == 7:
+ if len(self.sos_list[0]) != 0:
+ EventMesh.publish("call_out_cb", self.sos_list[0]["phone"])
+ # EventMesh.publish("set_callnumer_cb",self.sos_list[0]["phone"])
+ EventMesh.debug_log("phone 4 {}".format(self.sos_list[0]["phone"]))
+ elif self.num == 2 or self.num == 5 or self.num == 8:
+ if len(self.sos_list[1]) != 0:
+ EventMesh.debug_log("phone 5 {}".format(self.sos_list[1]["phone"]))
+ EventMesh.publish("call_out_cb", self.sos_list[1]["phone"])
+ # EventMesh.publish("set_callnumer_cb",self.sos_list[2]["phone"])
+ elif self.num == 3 or self.num == 6 or self.num == 9:
+ if len(self.sos_list[2]) != 0:
+ EventMesh.debug_log("phone 6 {}".format(self.sos_list[2]["phone"]))
+ EventMesh.publish("call_out_cb", self.sos_list[2]["phone"])
+ # EventMesh.publish("set_callnumer_cb",self.sos_list[0]["phone"])
+ else: #清除表示
+ tts_str = "未设置号码"
+ EventMesh.publish("stop_voice_record") #电话优先级最高
+ EventMesh.publish("stop_AI_record")
+ EventMesh.publish("play_tts",[tts_str,1]) #播放tts闹钟文本内容
+ self.sos_flag = 0
+ self.num = 0
+ self.call_state = 0
+ self.num=0 #不管有没有拨打sos都清除
+ self.num_len = 0
+ self.phone110112_flag=0
+ #未设置号码
+
+
+ def voice_callback(self,args):
+ EventMesh.debug_log('111test voicecall iinfo:{}'.format(args))
+ if args[0] == 10: #电话拨进来
+ self.sos_flag = 0
+ self.call_state = 1
+ self.phone110112_flag=0
+ elif args[0] == 11: #已接听
+ self.call_state = 2
+ self.num=0 #不管有没有拨打sos都清除
+ self.num_len = 0
+ self.sos_flag = 0
+ self.phone110112_flag=0
+ self.close_call_timer()
+
+ EventMesh.debug_log('voicecall connected, PhoneNO.: ', args[6])
+
+ elif args[0] == 12: #电话挂断
+ self.phone110112_flag=0
+ if self.call_state == 2 or self.call_state == 1: #电话拨出去没有接听 就挂断
+ pass
+ else:
+
+ EventMesh.debug_log('voicecall disconnect end !!!')
+ self.close_call_timer()
+ self.call_state = 0
+ if self.sos_flag == 1:
+ EventMesh.publish("set_sos_info_call")
+ pass
+ self.call_state = 0
+ #再次拨打下一个电话号码
+ EventMesh.debug_log('voicecall disconnect end')
+
+
+ elif args[0] == 13: #
+ self.call_state = 7
+ EventMesh.debug_log('voicecall is waiting, PhoneNO.: ', args[6])
+ elif args[0] == 14: #电话拨出去
+ EventMesh.debug_log('voicecall dialing, PhoneNO.: ', args[6])
+ if self.sos_flag == 1:
+ self.call_state = 3 #当前是拨打sos号码标识
+ else:
+ self.call_state = 4
+
+ elif args[0] == 15:
+ self.call_state = 5
+ EventMesh.debug_log('voicecall alerting, PhoneNO.: ', args[6])
+
+
+ elif args[0] == 16:
+ self.call_state = 6
+ EventMesh.debug_log('voicecall holding, PhoneNO.: ', args[6])
+
+
+
+
+try:
+ import usr.ai_alarm as _schedule
+except Exception as e:
+ usys.print_exception(e)
+ import ai_alarm as _schedule
+DEFIEN_HR_REPORT_TIME = 5*60
+DEFINE_TIME_COUNT = 10
+DEFIEN_LOCATION_REPORT_TIME = DEFINE_TIME_COUNT
+WEB_CONNECT_MAX_COUNT = 10 #默认重连次数
+class SockMangager(Abstract):
+ def __init__(self):
+ self.thread_buf_size = 16*1024
+ self.iot_web_send_queue = Queue(100)
+ self.iot_web_protoclo_recv_id=0
+ self.iot_protocol_client = None
+ self.connect_web_timer = osTimer()
+ self.connect_web_timer_count = 0
+ self.hr_report_timer = osTimer()
+ self.resolver = None
+ self.timerHr = 0
+ self.timerLocation = 0
+ self.send_device_time = 0
+ self.vbat_buf = []
+ self.network_state = 0
+ self.curr_battery_level = 0
+ self.iot_web_send_queue_id = 0
+ self.bat_count = 0
+ self.minute_now_old = 0
+ self.old_minute = 0
+ self.is_alarm = 0
+ self.reconnect_count = 0 #连续重连次数 默认十次 不过就不重连了 等下一个心跳重连
+ self.schedule = _schedule.schedule()
+ self._1S_timer = osTimer()
+ self._5S_timer = osTimer()
+ self.timer_id = 0
+ self.start_voice_flag = 0
+ self.init_send_default=0
+ self.play_new_voice_state = 0
+ self.stop_play = 0
+ self.get_voice_new_msginit = 0
+ self.voice_id = "0"
+ self.bt_connect_list = []
+ self.new_voice_list = []
+ self.location_info= {}
+ self.locate_duration = 0
+ self.locate_duration_state = 0
+ self.location_info = EventMesh.publish("get_storage_config","locate_duration_time") #获取定位频率信息
+
+ self.temp = 0
+ if self.location_info == None:
+ self.location_info = {}
+ else:
+ # location_time["duration"]=locate_duration_time
+ # location_time["state"]=locate_duration_state
+ if "duration" in self.location_info:
+ self.locate_duration = self.location_info["duration"] #定位频率
+ if "state" in self.location_info:
+ self.locate_duration_state = self.location_info["state"] #是否开启频率定位
+ pass
+ EventMesh.subscribe("REPORT_ALARM_TO_IOT",self.report_alarm_to_iot)
+ EventMesh.subscribe("REPORT_SCHEDULE_TO_IOT",self.report_schedule_to_iot)
+
+ def report_alarm_to_iot(self,event,msg):
+ EventMesh.publish(WEB_CMD_ENUM.POST_ALARM_S_CMD,msg)
+ pass
+ def report_schedule_to_iot(self,event,msg):
+ EventMesh.publish(WEB_CMD_ENUM.POST_SCHEDULE_S_CMD,msg)
+ pass
+ def usb_event_cb(self, state):
+ status = state
+ def post_processor_after_instantiation(self):
+ self.minute_now_old=0
+ EventMesh.subscribe("set_curr_battery_level",self.set_curr_battery_level)
+ EventMesh.subscribe("get_curr_battery_level",self.get_curr_battery_level)
+ EventMesh.subscribe("screen_get_battery",self.get_battery)
+ EventMesh.subscribe("CHANNEL_IOT_WEB_SEND",self.user_send)
+ EventMesh.subscribe("set_temp",self.set_temp)
+ EventMesh.subscribe("GET_IOT_PROTOCOL_CILENT",self.get_iot_protoclo_client)
+ EventMesh.subscribe("SEND_JINMOAUDIO_TO_IOT",self.send_jm_audio_to_iot)
+ EventMesh.subscribe("SEND_YUYINAUDIO_TO_IOT",self.send_yuyin_audio_to_iot)
+ EventMesh.subscribe("SEND_MEETAUDIO_TO_IOT",self.send_meet_audio_to_iot)
+ EventMesh.subscribe("SEND_TRANSAUDIO_TO_IOT",self.send_trans_audio_to_iot)
+ EventMesh.subscribe("open_websocket_timer",self.open_websocket_timer)
+ EventMesh.subscribe("close_websocket_timer",self.close_websocket_timer)
+ EventMesh.subscribe("connect_iot_websocket_cb",self.connect_iot_websocket_cb)
+ EventMesh.subscribe("set_play_new_voice_list",self.set_play_new_voice_list)
+ EventMesh.subscribe("get_play_new_voice_list",self.get_play_new_voice_list)
+
+ EventMesh.subscribe("send_meet_open_flag_to_iot",self.send_meet_open_flag_to_iot)#会议创建
+ EventMesh.subscribe("send_meet_end_flag_to_iot",self.send_meet_end_flag_to_iot)#会议结束
+
+ EventMesh.subscribe("send_trans_come_flag_to_iot",self.send_trans_come_flag_to_iot)#进入翻译
+ EventMesh.subscribe("send_trans_ok_flag_to_iot",self.send_trans_ok_flag_to_iot)#向APP发送进入翻译成功
+ EventMesh.subscribe("send_trans_end_flag_to_iot",self.send_trans_end_flag_to_iot)#退出翻译
+ # import EventMesh
+ # EventMesh.publish("play_new_voice_list")
+ EventMesh.subscribe("play_new_voice_list",self.play_new_voice_list) #播放语音未读信息
+ EventMesh.subscribe("update_play_new_voice_info",self.update_play_new_voice_info) #更新语音未读信息状态上报IOT
+ EventMesh.subscribe("send_bt_scan_list",self.send_bt_scan_list) #上报扫描列表
+ EventMesh.subscribe("save_bt_connect_list",self.save_bt_connect_list) #保存耳机连接状态列表
+ EventMesh.subscribe("send_bt_connect_list",self.send_bt_connect_list) #发送耳机连接状态列表
+ EventMesh.subscribe("set_play_new_voice_state",self.set_play_new_voice_state) #设置播放语音未读状态1正在播放语音未读消息
+ EventMesh.subscribe("get_play_new_voice_state",self.get_play_new_voice_state) #获取播放语音未读状态1正在播放语音未读消息
+ EventMesh.subscribe("set_stop_play",self.set_stop_play) #外部控制url音频播放列表暂停
+ EventMesh.subscribe("get_stop_play",self.get_stop_play) #获取外部控制url音频播放列表暂停情况
+ EventMesh.subscribe("send_bt_connect_state_to_iot",self.send_bt_connect_state_to_iot) #发耳机;链接状态->IOT
+ EventMesh.subscribe("send_unbind_dev_to_iot",self.send_unbind_dev_to_iot) #发送解绑指令到IOT平台
+ EventMesh.subscribe("set_location_info",self.set_location_info) #设置定位信息
+ EventMesh.subscribe("post_device_state",self.post_device_state) #上报设备状态信息-》IOT
+ EventMesh.subscribe("send_power_init_data",self.send_power_init_data) #上电初始化上报数据集合
+ # count = 0
+ # while True:
+ # count += 1
+ # if count > 20 :
+ # break
+ # data = dataCall.getInfo(1, 0)
+ # print("data call INFO {}".format(data))
+ # if data[2][0]:
+ # self.network_state = 1
+ # break
+ # print("web等待网络 {}...".format(count))
+
+ # utime.sleep_ms(500)
+ self.timerHr = 0
+ self.reconnect_count = 0
+ self.voice_id = "0"
+ self.deviceReadState = ""
+ self.get_voice_new_msginit = 0
+ self.bt_connect_list = []
+ self.new_voice_list = []
+ self.connect_web_timer.start(2000,0,self.iot_web_connect_timerCb) #开机2s之后连接iot
+ def connect_iot_websocket(self):
+ if EventMesh.publish("get_voice_record_flag") == 1:
+ EventMesh.publish("stop_voice_record")
+ print("connect_iot_websocket !!!!")
+ self.iot_close_web_therad()
+
+ 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")
+
+ print("token:{}".format(token))
+ # token = "957119d6b67b89dc1bc533d2e0c058d559"
+ # token = "951b74498eabe241e8a8c644a4f07531ef"
+
+ try:
+ if token != None:
+ self.connect_web_timer_count = 0
+ url_t = "{}?bz-dt={}".format(constants.IOT_WS_URL, token)
+ try:
+ self.iot_protocol_client=uwebsocket.Client.connect(url_t, debug=True)
+ self.reconnect_count=0
+ except Exception as e:
+ print("再次连接,iot连接报错是")
+ print(e)
+ self.reconnect_count+=1
+ EventMesh.publish("publish_AI_btnInfo",{"func":self.connect_iot_websocket}) #self.connect_iot_websocket()
+ return
+
+ if self.iot_protocol_client != None:
+ self.reconnect_count = 0
+ _thread.stack_size(self.thread_buf_size+8*1024) #_thread.stack_size(16*1024)
+ self.iot_web_send_queue_id = _thread.start_new_thread(self.websocket_send_queue_thread, ())
+ _thread.stack_size(8*1024)
+
+ _thread.stack_size(self.thread_buf_size+8*1024)
+ self.iot_web_protoclo_recv_id = _thread.start_new_thread(self.websocket_recv_queue_thread, ())
+ _thread.stack_size(8*1024)
+
+ else:
+ print("self.iot_protocol_client init!!!!!!!!!")
+ self.reconnect_count+=1
+ # EventMesh.publish("connect_iot_websocket_cb")
+ EventMesh.publish("publish_AI_btnInfo",{"func":self.connect_iot_websocket}) #self.connect_iot_websocket()
+ return
+
+ if self.iot_protocol_client != None:
+ self.start_voice_flag = 1
+ else:
+ self.start_voice_flag = 0
+
+ print("self.iot_protocol_client %d self.start_voice_flag:%d",self.iot_protocol_client,self.start_voice_flag)
+ if self.iot_protocol_client != None:
+ if self.timer_id == 0:
+ # self.hr_report_timer.start(DEFINE_TIME_COUNT*1000, 1, self.public_report_event)
+ self.timer_id=1
+ else:
+ print("没有token!!!!!!!!!!")
+ self.connect_web_timer_count+=1
+ if self.connect_web_timer_count <= 10:
+ self.connect_web_timer.start(5000,0,self.iot_web_connect_timerCb) #没有token 5s之后再重连
+ pass
+ except Exception as e:
+ self.iot_protocol_client = None
+ print("connect_iot_websocket error")
+
+ def post_device_state(self,event,msg): #上报设备状态
+ device_state=EventMesh.publish("GET_IOT_WEB_SEND_CMD",WEB_CMD_ENUM.POST_DEVICE_STATE_S_CMD)
+ print("device_state{}".format(device_state))
+ EventMesh.publish(WEB_CMD_ENUM.POST_DEVICE_STATE_S_CMD,device_state) #上报设备状态
+ def set_location_info(self,event,msg):
+ if "duration" in msg:
+ self.locate_duration=msg["duration"]
+ if "state" in msg:
+ self.locate_duration_state=msg["state"]
+
+
+ def save_bt_connect_list(self,event,msg):
+ print("msg:{}".format(msg))
+ # msg = {"event":"bt_connect_single","data":{"name":"yeiwyei","mac":"89:89:78:78:98:89","state":"connected"}}
+ try:
+ data = msg["data"]
+ if "None" in data: #开机没有连接过蓝牙耳机就为kong
+ return
+ if isinstance(data,dict) == True:
+ mac = data["mac"]
+ state = data["state"]
+ name = data["name"]
+ need_save = 0
+ for i,_alarm in enumerate(self.bt_connect_list):
+ mac_tmp = _alarm["mac"]
+ if mac_tmp == mac:
+ need_save = 1
+ self.bt_connect_list[i]["state"] = state
+ self.bt_connect_list[i]["name"] = name
+ break
+ self.bt_connect_list[i]["state"] ="disconnected"
+
+ if need_save == 0: #列表里面没有才需要保存
+ self.bt_connect_list.append(data)
+ print("self.bt_connect_list:{}".format(self.bt_connect_list))
+ except Exception as e:
+ print("json数据不完整:self.recv_bt_connect_record_list")
+ usys.print_exception(e)
+ pass
+ def send_bt_connect_list(self,event,msg):
+
+ date_tmp = utime.localtime()
+ time_tmp = utime.mktime(date_tmp)
+ bt_connect_record_list = {
+ "cmd":"bt_connect_record_list",
+ "ts":time_tmp,
+ "msg":"上报蓝牙连接列表",
+ "data":self.bt_connect_list
+
+ }
+ print("bt_connect_record_list:{}".format(bt_connect_record_list))
+ EventMesh.publish(WEB_CMD_ENUM.BT_CONNECT_RECORD_LIST_S,bt_connect_record_list)
+ pass
+
+ def set_play_new_voice_list(self,event,msg):
+ self.new_voice_list = msg
+ pass
+
+ def get_play_new_voice_list(self,event,msg):
+ return self.new_voice_list
+
+ def set_play_new_voice_state(self,event,msg):
+ self.play_new_voice_state = msg
+ pass
+
+ def get_play_new_voice_state(self,event,msg):
+ return self.play_new_voice_state
+
+ def get_stop_play(self,event,msg):
+ return self.stop_play
+
+ def set_stop_play(self,event,msg):
+ self.stop_play = msg
+ pass
+
+ def _1S_timer_cb(self,*argc):
+ EventMesh.publish("publish_AI_btnInfo",{"func":self._1S_timer_cb_})
+
+ def _1S_timer_cb_(self):
+ #self.iot_web_send_queue.put("ping")
+ get_VC_satrt_flag = EventMesh.publish("get_VC_satrt_flag")
+ if get_VC_satrt_flag == None:
+ get_VC_satrt_flag = 0
+ if get_VC_satrt_flag == 0:
+ self.play_new_voice_list_timer_cb()
+ self._1S_timer.stop()
+
+ def play_new_voice_list(self,event,msg):
+ if len(self.new_voice_list) != 0:
+ self._1S_timer.start(1000, 1, self._1S_timer_cb)
+
+ def play_new_voice_list_timer_cb(self):
+ print("play_new_voice_list:{}".format(len(self.new_voice_list)))
+ voice_list = self.new_voice_list
+ if len(self.new_voice_list) != 0:
+
+ for i,data in enumerate(self.new_voice_list):
+ if EventMesh.publish("get_history_voice_flag") == 1:
+ data = voice_list[len(self.new_voice_list)-1-i]
+ print("data:{}".format(data))
+ self.voice_index = i
+ self.voice_id = str(data["id"])
+ url = str(data["url"])
+ # url = "http://qipaiai-oss1.tos-cn-beijing.volces.com/qi_pai_ringtone/2025_08_11/742659759219544064test.mp3"
+ self.play_new_voice_state = 1
+ if self.stop_play == 1:
+ print("结束播放")
+ self.stop_play = 0
+ break
+ if EventMesh.publish("get_storage_config","is_noread_voice") == 1:#还有未读的(开机)
+ if EventMesh.publish("get_open_device") == 1:#刚开机
+ EventMesh.publish("play_wait_voice",[url,1])
+ EventMesh.publish("set_open_device",0)
+ if EventMesh.publish("get_history_voice_flag") == 1:#播放历史留言 or 播放当前留言
+ if EventMesh.publish("get_wait_voice_flag") == 1:#等待留言
+ EventMesh.publish("play_wait_voice",[url,1])
+ else:
+ time = str(data["createTimeStr"])
+ EventMesh.publish("play_his_voice",[url,1,time])
+ if len(EventMesh.publish("get_play_new_voice_list")) == 0:#列表为空才清零
+ EventMesh.publish("set_history_voice_flag",0)#修改标志位
+ else:
+ EventMesh.publish("play_new_voice",[url,1])
+ break
+ pass
+ def update_play_new_voice_info(self,event,msg): #更新播放语音留言信息
+ date_tmp = utime.localtime()
+ time_tmp = utime.mktime(date_tmp)
+ put_voice_msg_state = {
+ "cmd":"put_voice_msg_state",
+ "ts":time_tmp,
+ "msg":"修改语音消息阅读状态",
+ "data":self.voice_id
+ }
+ if len(self.new_voice_list) != 0:
+ self.new_voice_list.pop(self.voice_index)
+ EventMesh.publish(WEB_CMD_ENUM.PUT_VOICE_MSG_STATE_S,put_voice_msg_state)
+ pass
+
+ def send_bt_scan_list(self,event,msg):
+ date_tmp = utime.localtime()
+ time_tmp = utime.mktime(date_tmp)
+ try:
+ # print("type:{}".format(msg))
+ data = msg["data"]
+ bt_scan_rest ={
+ "cmd":"bt_scan_rest",
+ "ts":time_tmp,
+ "msg":"上报扫描列表",
+ "data":data
+ }
+ EventMesh.publish(WEB_CMD_ENUM.BT_SCAN_REST_S_CMD,bt_scan_rest)
+ except Exception as e:
+ usys.print_exception(e)
+ pass
+ def send_unbind_dev_to_iot(self,event,msg):
+ self._5S_timer.start(5000,0,self._5S_timer_cb)
+ def _5S_timer_cb(self,*argc):
+ EventMesh.publish("publish_AI_btnInfo",{"func":self.send_unbind_dev_to_iot_cb})
+ pass
+ def send_unbind_dev_to_iot_cb(self):
+ EventMesh.publish(WEB_CMD_ENUM.UNBIND_DEV_S)
+ pass
+ def send_bt_connect_state_to_iot(self,event,msg):
+ date_tmp = utime.localtime()
+ time_tmp = utime.mktime(date_tmp)
+
+ try:
+ # {
+ # "cmd":"post_bt_connect_rest",
+ # "ts":1738283829,
+ # "msg":"上报蓝牙连接结果",
+ # "data":{
+ # "mac":"mac地址",
+ # "state":"connected/disconnected/connecting/failed"
+ # }
+ # }
+ event = msg["event"]
+ mac = msg["data"]["mac"]
+ state = msg["data"]["state"]
+ json_data = \
+ {
+
+ "cmd": event,
+ "ts":time_tmp,
+ "msg":"上报蓝牙连接结果",
+ "data":{
+ "mac":mac,
+ "state":state
+ }
+
+ }
+ EventMesh.publish(WEB_CMD_ENUM.POST_BT_CONNECT_REST_S,json_data)
+ except Exception as e:
+ usys.print_exception(e)
+ pass
+
+ def send_meet_open_flag_to_iot(self,event,msg): #创建会议纪要上报到IOT平台
+ time_tmp = utime.mktime(date_tmp)
+ meet_open = {
+ "msg": "开始会议",
+ "data": None,
+ "cmd": "meet_begin",
+ "ts": time_tmp
+ }
+ send_data = protocol_send_total_data(meet_open)
+ EventMesh.publish("CHANNEL_IOT_WEB_SEND",send_data)
+ pass
+
+ def send_meet_end_flag_to_iot(self,event,msg): #结束会议纪要上报到IOT平台
+ time_tmp = utime.mktime(date_tmp)
+ meet_end = {
+ "msg": "结束会议",
+ "data": None,
+ "cmd": "meet_end",
+ "ts": time_tmp
+ }
+ send_data = protocol_send_total_data(meet_end)
+ EventMesh.publish("CHANNEL_IOT_WEB_SEND",send_data)
+ pass
+
+ def send_trans_come_flag_to_iot(self,event,msg): #进入翻译上报到IOT平台
+ time_tmp = utime.mktime(date_tmp)
+ trans_open = {
+ "msg": "进入翻译模式",
+ "data": None,
+ "cmd": "translate_device_enter",
+ "ts": time_tmp
+ }
+ send_data = protocol_send_total_data(trans_open)
+ EventMesh.publish("CHANNEL_IOT_WEB_SEND",send_data)
+ pass
+
+ def send_trans_ok_flag_to_iot(self,event,msg): #成功进入翻译发给APP
+ time_tmp = utime.mktime(date_tmp)
+ trans_ok = {
+ "msg": "进入成功",
+ "data": None,
+ "cmd": "translate_device_complete",
+ "ts": time_tmp
+ }
+ send_data = protocol_send_total_data(trans_ok)
+ EventMesh.publish("CHANNEL_IOT_WEB_SEND",send_data)
+ pass
+
+ def send_trans_end_flag_to_iot(self,event,msg): #退出翻译上报到IOT平台
+ time_tmp = utime.mktime(date_tmp)
+ trans_open = {
+ "msg": "退出翻译",
+ "data": None,
+ "cmd": "translate_device_exit",
+ "ts": time_tmp
+ }
+ send_data = protocol_send_total_data(trans_open)
+ EventMesh.publish("CHANNEL_IOT_WEB_SEND",send_data)
+ pass
+
+ def send_jm_audio_to_iot(self,event,msg): #静默录音音频数据上报到IOT平台
+ send_data = b''
+ send_data = protocol_audio_ji_playload_data(msg[0],msg[1],msg[2])
+ # print("jm:{}".format(msg[2]))
+ EventMesh.publish("CHANNEL_IOT_WEB_SEND",send_data)
+ pass
+
+ def send_yuyin_audio_to_iot(self,event,msg): #上报语音留言音频数据到IOT平台
+ send_data = b''
+ send_data = protocol_yuyin_voice_playload_data(msg[0],msg[1],msg[2])
+ # print("yuyin:{}".format(msg[2]))
+ EventMesh.publish("CHANNEL_IOT_WEB_SEND",send_data)
+ pass
+
+ def send_meet_audio_to_iot(self,event,msg): #上报会议纪要音频数据到IOT平台
+ send_data = b''
+ send_data = protocol_meet_playload_data(msg[0],msg[1],msg[2])
+ # print("yuyin:{}".format(msg[2]))
+ EventMesh.publish("CHANNEL_IOT_WEB_SEND",send_data)
+ pass
+
+ def send_trans_audio_to_iot(self,event,msg): #上报AI翻译音频数据到IOT平台
+ send_data = b''
+ send_data = protocol_trans_playload_data(msg[0],msg[1],msg[2])
+ # print("yuyin:{}".format(msg[2]))
+ EventMesh.publish("CHANNEL_IOT_WEB_SEND",send_data)
+ pass
+
+
+ #获取电池电量
+ def get_battery(self, event=None, msg=None):
+ """
+ 获取电池事件,暂时没支持
+ :param event:
+ :param msg:
+ :return:
+ """
+
+ charge_state = '0'
+ usb_state = EventMesh.publish("GET_USB_STATE")
+ if usb_state == None:
+ usb_state = 0
+
+ if usb_state == 1:
+ charge_state = '1'
+ else:
+ charge_state = '0'
+
+ vbat = EventMesh.publish("get_battery")
+ if vbat is None:
+ vbat = 100
+ # EventMesh.debug_log("vbat",vbat)
+ # if temp != None :
+ # if temp <= 3505:
+ # vbat = 0
+ # elif temp <= 3699:
+ # vbat = 20 #"E:/vbat_20.jpg"
+ # elif temp <= 3772:
+ # vbat = 40 #"E:/vbat_40.jpg"
+ # elif temp <= 3882:
+ # vbat = 60 #"E:/vbat_60.jpg"
+ # elif temp <= 4070:
+ # vbat = 80 #"E:/vbat_80.jpg"
+ # elif temp <= 4200:
+ # vbat = 90 #
+ # else:
+ # vbat = 100 #"E:/vbat_100.jpg"
+ # else:
+ # vbat = 100
+
+ result = [charge_state, vbat]
+
+ return result
+ def set_curr_battery_level(self, event=None, msg=None):
+ self.curr_battery_level = msg
+
+ def get_curr_battery_level(self, event=None, msg=None):
+ return self.curr_battery_level
+
+ def initialization(self, *args):
+ pass
+ #EventMesh.debug_log("ProtoCol:{}".format(self.TYPE + "_SEND"))
+ def connect_iot_websocket_cb(self,event,msg):
+ self.connect_iot_websocket()
+ def add_support_resolver(self, resolver):
+ self.resolver = resolver
+ def public_report_event(self, *args, **kwargs):
+ EventMesh.publish("publish_AI_btnInfo",{"func":self.public_report_event_cb}) #self.connect_iot_websocket()
+ def send_power_init_data(self,event=None,msg=None):
+ self.public_report_event_cb()
+ #上报心跳 上报设备状态 检查闹钟 日程
+ def public_report_event_cb(self):
+ """电池平均值:与 vc_hw._BatteryCfg 共用 10 点滑动平均,避免重复 getVbatt。"""
+ bat_total_value = 0
+ try:
+ from vc_hw import _BatteryCfg
+ bcfg = _BatteryCfg.instance()
+ try:
+ usb_st = EventMesh.publish("GET_USB_STATE")
+ except Exception:
+ usb_st = 0
+ bcfg.push_vbatt_sample(usb_status=usb_st)
+ bat_total_value = bcfg.soc_now()
+ except Exception:
+ bat_total_value = 0
+ # EventMesh.publish("AI_schedule_open")#读取闹钟数组
+ # print("AI_schedule_open!!!")
+ if EventMesh.publish("get_sos_flag") != None:
+ if EventMesh.publish("get_sos_flag") == 1:
+ print("get_sos_flag!!!!!!")
+ EventMesh.publish(constants.EVENT.SYSTEM_UP)#唤醒休眠
+ print("get_sos_flag1!!!!!!")
+
+ EventMesh.publish("AI_alarm_start") #检查是否有闹钟需要提醒
+ EventMesh.publish("AI_schedule_open")#检查日程是否需要提醒
+ # 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})
+ self.timerHr+=DEFINE_TIME_COUNT
+ if self.timerHr >= DEFIEN_HR_REPORT_TIME:
+ self.timerHr= 0
+ self.reconnect_count = 0
+ self.connect_web_timer_count=0
+ EventMesh.publish("publish_AI_btnInfo",{"func":self.hr_report_publish_event,"data":0})
+ # print("self.locate_duration_state:{} self.locate_duration:{}".format(self.locate_duration_state,self.locate_duration))
+ if self.locate_duration_state == 1:
+ if self.locate_duration == None:
+ self.timerLocation = 0
+ else:
+ if self.locate_duration != 0:
+ self.timerLocation+=DEFINE_TIME_COUNT
+ if self.timerLocation >= self.locate_duration:
+ self.timerLocation= 0
+ EventMesh.publish(constants.EVENT.START_LOCATION,WEB_CMD_ENUM.POST_LOCATION_S_CMD) #定位上报
+ else:
+ self.timerLocation= 0
+ else:
+ self.timerLocation= 0
+
+
+ if self.send_device_time < DEFIEN_LOCATION_REPORT_TIME : #上电初始化上报一次设备状态信息
+ self.send_device_time+=DEFINE_TIME_COUNT
+ else:
+ if self.get_voice_new_msginit == 0:
+ self.get_voice_new_msginit=1
+ EventMesh.publish("publish_AI_btnInfo",{"func":self.hr_report_publish_event,"data":0})
+ device_state=EventMesh.publish("GET_IOT_WEB_SEND_CMD",WEB_CMD_ENUM.POST_DEVICE_STATE_S_CMD)
+ print("device_state{}".format(device_state))
+ EventMesh.publish(WEB_CMD_ENUM.POST_DEVICE_STATE_S_CMD,device_state) #上报设备状态
+ # if dev_type == "7PIN_1_5":#二代开机获取留言
+ # EventMesh.publish("set_open_device",1)
+ # EventMesh.publish("set_history_voice_flag",1)
+ # EventMesh.publish("set_wait_voice_flag",1)
+ # EventMesh.publish(WEB_CMD_ENUM.GET_NEW_VOICE_MSG_S)#向IOT获取语音未读消息
+
+
+ # http://220.160.104.34:30800/ws-bus/test/voice-record/876226211472149?state=1,
+ # http://220.160.104.34:30800/ws-bus/test/860132066107046?testType=alarmList
+ def hr_report_publish_event(self,data):
+
+ HR_DATA = EventMesh.publish("GET_IOT_WEB_SEND_CMD",WEB_CMD_ENUM.HR_S_CMD)
+ print("HR_DATA{}".format(HR_DATA))
+ EventMesh.publish(WEB_CMD_ENUM.HR_S_CMD,HR_DATA)
+ pass
+
+ def iot_web_connect_timerCb(self,*argc):
+ self.connect_iot_websocket()
+
+
+ def open_websocket_timer(self,event,msg):
+ self.VC_pingping_timerout = 0
+ # self._1S_timer.start(500,1,self._1S_timer_cb)
+
+ def close_websocket_timer(self,event,msg):
+ self._1S_timer.stop()
+
+
+
+ def websocket_send_queue_thread(self):
+ while True:
+ data = self.iot_web_send_queue.get()
+
+ if data != None:
+ # EventMesh.debug_log("websocket:send data1 len:{}".format(len(data)))
+ try:
+ # EventMesh.debug_log("websocket:send data1 len:{} {}".format(len(data),self.iot_protocol_client))
+ if self.iot_protocol_client != None:
+ self.iot_protocol_client.send(data)
+ self.reconnect_count = 0
+ else:
+ # EventMesh.publish("connect_iot_websocket_cb")
+ EventMesh.publish("publish_AI_btnInfo",{"func":self.connect_iot_websocket})
+ EventMesh.debug_log("websocket:send data2 len:{}".format(len(data),self.iot_protocol_client))
+ except Exception as e:
+ EventMesh.debug_log("websocket:send error")
+ # EventMesh.publish("connect_iot_websocket_cb")
+ EventMesh.publish("publish_AI_btnInfo",{"func":self.connect_iot_websocket})
+ break
+
+
+ def websocket_recv_queue_thread(self):
+ while True:
+ # 死循环接收数据
+ try:
+ recv_data = self.iot_protocol_client.recv()
+ print("recv_data = {}".format(len(recv_data)))
+ if recv_data == "websocket close":
+ # 服务器关闭连接或客户端关闭连接
+ print("对端 服务器强制关闭 cli close")
+ # EventMesh.publish("connect_iot_websocket_cb")
+ EventMesh.publish("publish_AI_btnInfo",{"func":self.connect_iot_websocket})
+ break
+ elif recv_data == "":
+ print("下发的空数据 不做处理")
+ EventMesh.publish("publish_AI_btnInfo",{"func":self.connect_iot_websocket})
+ break
+ else:
+ if len(recv_data) != 0:
+ self.reconnect_count = 0
+ self.resolver.handler(recv_data)
+
+ except Exception as e:
+ print("cli break")
+ # EventMesh.publish("connect_iot_websocket_cb")
+ EventMesh.publish("publish_AI_btnInfo",{"func":self.connect_iot_websocket})
+ break
+ self.iot_web_protoclo_recv_id =0
+
+ def iot_web_send_queue_close(self):
+ if self.iot_web_send_queue_id != 0:
+ if self.iot_web_send_queue.empty()!=True:
+ self.iot_web_send_queue.clear()
+
+ try:
+ _thread.stop_thread(self.iot_web_send_queue_id)
+ except Exception as e:
+ print("iot_web_send_queue_close !!!!!!!!")
+ print("iot_web_send_queue_close 1111!!!!!!!!")
+ self.iot_web_send_queue_id = 0
+
+ def iot_web_protoclo_recv_close_therad(self):
+ if self.iot_web_protoclo_recv_id != 0:
+ try:
+ _thread.stop_thread(self.iot_web_protoclo_recv_id)
+ except Exception as e:
+ print("self.iot_web_protoclo_recv_id !!!!!!!!")
+ self.iot_web_protoclo_recv_id = 0
+ if self.iot_protocol_client != None:
+ try:
+ print("关闭websocke")
+ self.iot_protocol_client.close()
+ except Exception as e:
+ print("关闭websocke失败")
+ self.iot_protocol_client = None
+
+
+
+ def iot_close_web_therad(self):
+ try:
+ self.iot_web_send_queue_close()
+ except Exception as e:
+ print("iot_web_send_queue_close error!!!!!!!!")
+
+ try:
+ self.iot_web_protoclo_recv_close_therad()
+ except Exception as e:
+ print("iot_web_protoclo_recv_close_therad error!!!!!!!!")
+ self.start_voice_flag = 0
+ print("iot_close_web_therad")
+
+ def get_iot_protoclo_client(self,event,msg):
+ return self.iot_protocol_client
+ def set_temp(self,event,data):
+ if self.temp == 0:
+ self.temp = 1
+ else:
+ self.temp = 0
+ 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
+ # if self.temp == 1:
+ # print("没信号")
+ else :
+ try:
+ if self.start_voice_flag == 0: #如果关闭了就需要重新再
+ EventMesh.publish("publish_AI_btnInfo",{"func":self.connect_iot_websocket})
+ return
+ if data != None:
+ if len(data) != 0:
+ self.iot_web_send_queue.put(data)
+ # EventMesh.debug_log("self.socket_send_queue.put:success:{}".format(len(data)))
+ except Exception as e:
+ EventMesh.debug_log("self.socket_send_queue.put:ERROR:")
+ usys.print_exception(e)
+
+ return
+ sim_state = sim.getStatus()
+ if sim_state != 1 or self.network_state == 0: #没sim,则不发送 ,没联网
+ return
+ else :
+ try:
+ if self.iot_protocol_client != None:
+ EventMesh.publish("publish_AI_btnInfo",{"func":self.iot_protocol_send_cb,"data":data})
+ else:
+ print("reconnect1 {}".format(data))
+ EventMesh.publish("publish_AI_btnInfo",{"func":self.connect_iot_websocket})
+
+ except Exception as e:
+ print("senc data err reconnect{}".format(data))
+ EventMesh.publish("publish_AI_btnInfo",{"func":self.connect_iot_websocket})
+
+ def iot_protocol_send_cb(self,data):
+ try:
+ if data != None:
+ print("websocket connect success:{} self.iot_protocol_client:{}".format(data,self.iot_protocol_client))
+ if self.iot_protocol_client != None:
+ self.iot_protocol_client.send(data)
+ self.reconnect_count = 0
+ print("websocket send success")
+ else:
+ print("reconnect2 {}".format(data))
+ # EventMesh.publish("connect_iot_websocket_cb")
+ EventMesh.publish("publish_AI_btnInfo",{"func":self.connect_iot_websocket})
+ except Exception as e:
+ print("发送失败 重新连接")
+ self.reconnect_count+=1
+ # EventMesh.publish("connect_iot_websocket_cb")
+ EventMesh.publish("publish_AI_btnInfo",{"func":self.connect_iot_websocket})
+
+
+
+
+class ProtoCol(Abstract):
+ TYPE = ""
+ HEADER = "#@{}@#;"
+ SEPARATOR = ";"
+ END = ";" + chr(0x01)
+ #PID = "SZKW"
+ #PID = "qAELPTKmFanR4RHe"
+ md5_key = ''
+ PID = ''
+ btstate = 0
+ blestate = 0
+
+ def __init__(self):
+ pass
+
+ def initialization(self,*args):
+ EventMesh.subscribe(self.TYPE+"_S", self.handler)
+ EventMesh.subscribe(self.TYPE+"_R", self.handler)
+ pass
+
+ def handler(self, event, msg):
+ print("handler {}".format(event))
+ if event.endswith("_S"):
+ self.send(event, msg)
+ else:
+ self.recv(event, msg)
+
+ def send(self, event, msg):
+
+ pass
+
+ def recv(self, event, msg):
+ pass
+#上报蓝牙连接状态
+class IOTWeb_post_bt_connect_restProtoCol(ProtoCol):
+ """post_bt_connect_rest"""
+ TYPE = "post_bt_connect_rest"
+
+ def send(self, event, msg):
+ # print("send post_bt_connect_rest{}".format(msg))
+ send_data = b''
+ send_data = protocol_send_total_data(msg)
+ print("send post_bt_connect_rest{}".format(send_data))
+ EventMesh.publish("CHANNEL_IOT_WEB_SEND", send_data)
+
+ def recv(self, event, msg):
+ """
+
+ @param event: 上报蓝牙耳机连接状态
+ @param msg: 接收到的下行数据
+ """
+ print("recv post_bt_connect_rest{}".format(msg))
+#电子围栏触发SOS警告
+class IOTWeb_fence_sosProtoCol(ProtoCol):
+ """fence_sos"""
+ TYPE = "fence_sos"
+
+ def send(self, event, msg):
+ # print("send fence_sos{}".format(msg))
+ date_tmp = utime.localtime()
+ time_tmp = utime.mktime(date_tmp)
+ # 通过websocket发送到服务器端
+ fence_sos = {
+ "cmd":"dispatch_rest",
+ "ts":time_tmp,
+ "msg":"消息收到响应",
+ "data":{
+ "cmd":"fence_sos",
+ "rest":"success",
+ "msg":"收到紧急呼叫指令"
+ }
+ }
+ send_data = b''
+ send_data = protocol_send_total_data(fence_sos)
+ print("send fence_sos{}".format(send_data))
+ EventMesh.publish("CHANNEL_IOT_WEB_SEND", send_data)
+
+ def recv(self, event, msg):
+ """
+
+ @param event: 电子围栏警告
+ @param msg: 接收到的下行数据
+ """
+ EventMesh.publish(WEB_CMD_ENUM.FENCE_SOS_S)
+ sos_list = EventMesh.publish("get_storage_config","sos_list")
+ if sos_list != None:
+ if len(sos_list) > 0:
+ get_sos_flag = EventMesh.publish("get_sos_flag")
+ if get_sos_flag == 0:
+ EventMesh.publish("set_sos_info_call")
+ pass
+
+ print("recv fence_sos{}".format(msg))
+#上报心跳
+class IOTWeb_HRProtoCol(ProtoCol):
+ """post_heart_beat"""
+ TYPE = "post_heart_beat"
+
+ def send(self, event, msg):
+ print("send hr{}".format(msg))
+ # 通过websocket发送到服务器端
+ send_data = b''
+ send_data = protocol_send_total_data(msg)
+ EventMesh.publish("CHANNEL_IOT_WEB_SEND", send_data)
+
+ def recv(self, event, msg):
+ """
+
+ @param event: 心跳成功
+ @param msg: 接收到的下行数据
+ """
+ # {
+ # "cmd":"post_rest",
+ # "ts":1738283829,
+ # "msg":"消息收到响应",
+ # "data":{
+ # "cmd":"post_heart_beat",
+ # "rest":"bind/unbind",
+ # "msg":"上报成功/格式错误"
+ # }
+ # }
+ print("recv hr{}".format(msg))
+ if "data" in msg:
+ data = msg["data"]
+ rest = data["rest"]
+ if rest == "unbind": #解绑需要开启蓝牙广播
+ self.btstate = 0
+ if self.blestate == 0:
+ EventMesh.publish("set_storage_config",["switch_ble_state","1"])
+ EventMesh.publish("send_ble_switch_toble","1")
+
+ EventMesh.publish("set_storage_config",["switch_bt_state","1"])
+ EventMesh.publish("send_bt_switch_toble","1")
+ self.blestate=1
+
+ elif rest == "bind": #绑定需要关闭蓝牙广播
+ self.blestate =0
+ if self.btstate == 0:
+ EventMesh.publish("set_storage_config",["switch_ble_state","0"])
+ EventMesh.publish("send_ble_switch_toble","0")
+ self.btstate=1
+
+#定位周期
+class IOTWeb_locatedurationProtoCol(ProtoCol):
+ """locate_duration"""
+ TYPE = "locate_duration"
+
+ def send(self, event, msg):
+ print("send locate_duration{}".format(msg))
+ # 通过websocket发送到服务器端
+ date_tmp = utime.localtime()
+ time_tmp = utime.mktime(date_tmp)
+ locatio = {
+ "cmd":"dispatch_rest",
+ "ts":int(time_tmp),
+ "msg":"消息收到响应",
+ "data":{
+ "cmd":"locate_duration",
+ "rest":"success",
+ "msg":"收到定位周期指令"
+ }
+ }
+ send_data = b''
+ send_data = protocol_send_total_data(locatio)
+ EventMesh.publish("CHANNEL_IOT_WEB_SEND",send_data)
+
+ def recv(self, event, msg):
+ """
+
+ @param event:定位周期
+ @param msg: 接收到的下行数据
+ """
+ # locate_now = {
+ # "cmd":"locate_duration",
+ # "ts":1738283829,
+ # "msg":"下发定位周期",
+ # "data":300,0表示关
+ # }
+ # {"cmd":"locate_duration","msg":"下发定位周期","data":{"duration":300,"state":"1"},"ts":1756089226052,"targetDeviceId":"860132064633266"}
+ #location_time
+ location_time = {}
+ if "data" in msg:
+ data = msg["data"]
+ if "duration" in data:
+ locate_duration_time = int(data["duration"])
+ locate_duration_state = int(data["state"])
+ location_time["duration"]=locate_duration_time
+ location_time["state"]=locate_duration_state
+
+ EventMesh.publish("set_storage_config",["locate_duration_time",location_time])
+ EventMesh.publish("set_location_info",location_time)
+ locate_duration_c = EventMesh.publish("get_storage_config","locate_duration_time")
+ print("locate_duration_c:{}".format(locate_duration_c))
+
+#上报SOS告警信息
+class IOTWeb_post_sosProtoCol(ProtoCol):
+ """post_sos"""
+ TYPE = "post_sos"
+
+ def send(self, event, msg):
+ print("send post_sos{}".format(msg))
+ # 通过websocket发送到服务器端
+
+ send_data = b''
+ send_data = protocol_send_total_data(msg)
+ EventMesh.publish("CHANNEL_IOT_WEB_SEND",send_data)
+
+ def recv(self, event, msg):
+ """
+ @param event:msg
+ @param msg: 接收到的下行数据
+ """
+ # locate_now = {
+ # "cmd":"locate_duration",
+ # "ts":1738283829,
+ # "msg":"下发定位周期",
+ # "data":300,0表示关
+ # }
+ print("recv post_sos{}".format(msg))
+
+#上报设备状态
+class IOTWeb_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_WEB_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 IOTWeb_post_alarmProtoCol(ProtoCol):
+ """post_alarm"""
+ TYPE = "post_alarm"
+
+ def send(self, event, msg):
+ print("send post_alarm{}".format(msg))
+ # 通过websocket发送到服务器端
+
+ send_data = b''
+ send_data = protocol_send_total_data(msg)
+ print("send send_data{}".format(send_data))
+ EventMesh.publish("CHANNEL_IOT_WEB_SEND",send_data)
+
+ def recv(self, event, msg):
+ """
+
+ @param event:post_alarm
+ @param msg: 接收到的下行数据
+ """
+ print("recv post_alarm{}".format(msg))
+
+#查找设备
+class IOTWeb_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_WEB_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, "find_device"])
+ print("recv find_device{}".format(msg))
+ EventMesh.publish(WEB_CMD_ENUM.FIND_DEVCE_S_CMD)
+
+#立即定位
+class IOTWeb_LocateNowProtoCol(ProtoCol):
+ """locate_now"""
+ TYPE = "locate_now"
+ def send(self, event, msg):
+ print("send locate_now{}".format(msg))
+ # 通过websocket发送到服务器端
+ date_tmp = utime.localtime()
+ time_tmp = utime.mktime(date_tmp)
+ locate_now = {
+ "cmd":"dispatch_rest",
+ "ts":time_tmp,
+ "msg":"消息收到响应",
+ "data":{
+ "cmd":"locate_now",
+ "rest":"success",
+ "msg":"收到立即定位指令"
+ }
+ }
+ send_data = b''
+ send_data = protocol_send_total_data(locate_now)
+ EventMesh.publish("CHANNEL_IOT_WEB_SEND",send_data)
+
+ def recv(self, event, msg):
+ """
+
+ @param event:立即定位
+ @param msg: 接收到的下行数据
+ """
+
+ EventMesh.publish(WEB_CMD_ENUM.LOCATION_NOW_S_CMD)
+ print("recv locate_now{}".format(msg))
+ EventMesh.publish(constants.EVENT.START_LOCATION,WEB_CMD_ENUM.POST_LOCATION_S_CMD) #开始定位 定位完之后上报定位数据
+
+
+#上报定位信息
+class IOTWeb_post_locationProtoCol(ProtoCol):
+ """post_location"""
+ TYPE = "post_location"
+
+ def send(self, event, msg):
+ # 通过websocket发送到服务器端
+ send_data = b''
+ send_data = protocol_send_total_data(msg)
+ print("send_data post_location{}".format(msg))
+ EventMesh.publish("CHANNEL_IOT_WEB_SEND", send_data)
+
+ def recv(self, event, msg):
+ """
+
+ @param event:定位信息下发
+ @param msg: 接收到的下行数据
+ """
+ print("recv post_location{}".format(msg))
+#闹钟列表
+class IOTWeb_alarm_listProtoCol(ProtoCol):
+ """alarm_list"""
+ TYPE = "alarm_list"
+
+ def send(self, event, msg):
+ print("send alarm_list {}".format(msg))
+ # 通过websocket发送到服务器端
+ date_tmp = utime.localtime()
+ time_tmp = utime.mktime(date_tmp)
+ rest = "error"
+ if msg == 1:
+ rest = "success"
+ alarm_list ={
+ "cmd":"dispatch_rest",
+ "ts":time_tmp,
+ "msg":"消息收到响应",
+ "data":{
+ "cmd":"alarm_list",
+ "rest":rest,
+ "msg":"闹钟配置成功."
+ }
+ }
+ send_data = b''
+ send_data = protocol_send_total_data(alarm_list)
+ print("send_data alarm_list {}".format(msg))
+ EventMesh.publish("CHANNEL_IOT_WEB_SEND", send_data)
+
+ def recv(self, event, msg):
+ """
+
+ @param event:上行下发闹钟配置
+ @param msg: 接收到的下行数据
+ """
+ # 定义要添加的新元素
+ # new_item = {'time': '11:30','index': 1}
+ # data = [{"index":1,"name":"hihihi1"},{"index":2,"name":"hihihi2"},{"index":0,"name":"hihihi0"}]
+ # len_t = len(data)
+ # j = 0
+ # for i in range(len_t):
+ # if data[j]['index'] == 1:
+ # removed_item = data.pop(j)
+ # print(data)
+ # j=0
+ # continue
+ # j+=1
+ # len_t = len(data)
+ # print(len_t)
+ # for i in range(len(data)):
+ # data[i]["index"] = i
+
+ # url = http://220.160.104.34:30800/ws-bus/test/voice-record/876226211472149?state=1
+ # url = http://220.160.104.34:30800/ws-bus/test/876226211472149?testType = alarmList
+
+ alarm_list=[]
+ ret = 1
+ if "data" in msg:
+ data = msg["data"]
+ if isinstance(data,list) == True:
+ for i in range(len(data)):
+ data_list = data[i]
+ data_list["index"] = i
+ print("data_list:{}".format(data_list))
+ alarm_list.append(data_list)
+ alarm_list.sort(key=lambda x: x['index'])
+ EventMesh.publish("set_storage_config",["alarm_list",alarm_list])
+ EventMesh.publish("set_alarm_info",alarm_list)
+ alarm_list = EventMesh.publish("get_storage_config","alarm_list")
+ print("alarm_list:{}".format(alarm_list))
+ else:
+ ret = 0
+
+ EventMesh.publish(WEB_CMD_ENUM.ALARM_LIST_S_CMD,ret)
+
+
+#闹钟配置下发
+
+class IOTWeb_alarm_configProtoCol(ProtoCol):
+ """alarm_config"""
+ TYPE = "alarm_config"
+
+ def send(self, event, msg):
+ # print("send alarm_config{}".format(msg))
+ # 通过websocket发送到服务器端
+ date_tmp = utime.localtime()
+ time_tmp = utime.mktime(date_tmp)
+ alarm_config ={
+ "cmd":"dispatch_rest",
+ "ts":int(time_tmp),
+ "msg":"消息收到响应",
+ "data":{
+ "cmd":"alarm_config",
+ "rest":"success",
+ "msg":"闹钟配置成功."
+ }
+ }
+ send_data = b''
+ send_data = protocol_send_total_data(alarm_config)
+ print("send_data alarm_config{}".format(send_data))
+ EventMesh.publish("CHANNEL_IOT_WEB_SEND", send_data)
+
+ def recv(self, event, msg):
+ """
+
+ @param event:上行下发闹钟配置
+ @param msg: 接收到的下行数据
+ """
+ print("recv alarm_config{}".format(msg))
+ EventMesh.publish(WEB_CMD_ENUM.ALARM_CONFIG_S_CMD)
+
+#SOS联系人下发
+class IOTWeb_sos_listProtoCol(ProtoCol):
+ """sos_list"""
+ TYPE = "sos_list"
+
+ def send(self, event, msg):
+ # 通过websocket发送到服务器端
+ date_tmp = utime.localtime()
+ time_tmp = utime.mktime(date_tmp)
+ sos_list ={
+ "cmd":"dispatch_rest",
+ "ts":int(time_tmp),
+ "msg":"消息收到响应",
+ "data":{
+ "cmd":"sos_list",
+ "rest":"success",
+ "msg":"收到SOS联系人列表."
+ }
+ }
+ send_data = b''
+ send_data = protocol_send_total_data(sos_list)
+ print("send_data sos_list{}".format(send_data))
+ EventMesh.publish("CHANNEL_IOT_WEB_SEND", send_data)
+
+ def recv(self, event, msg):
+ """
+
+ @param event:上行下发sos列表
+ @param msg: 接收到的下行数据
+ """
+ #{'msg': 'SOS', 'data': [{'name': '0', 'createTime': 1754031896067, 'updateTime': 1754031896067, 'phone': '12345678900', 'id': '1754031896067', 'deviceId': '876226211472149'},
+ # {'name': '1', 'createTime': 1754031896067, 'updateTime': 1754031896067, 'phone': '12345678901', 'id': '1754031896067', 'deviceId': '876226211472149'},
+ # {'name': '2', 'createTime': 1754031896067, 'updateTime': 1754031896067, 'phone': '12345678902', 'id': '1754031896067', 'deviceId': '876226211472149'},
+ # {'name': '3', 'createTime': 1754031896067, 'updateTime': 1754031896067, 'phone': '12345678903', 'id': '1754031896067', 'deviceId': '876226211472149'},
+ # {'name': '4', 'createTime': 1754031896067, 'updateTime': 1754031896067, 'phone': '12345678904', 'id': '1754031896067', 'deviceId': '876226211472149'}],
+ # 'ts': 1754031896067, 'cmd': 'sos_list'}
+ print("recv sos_list{}".format(msg))
+ sos_list = []
+ if "data" in msg:
+ data = msg["data"]
+ if isinstance(data,list) == True:
+ sos_list_len = len(data)
+ if sos_list_len >= 3:
+ sos_list_len = 3
+ for i in range(sos_list_len):
+ save_data = {}
+ # EventMesh.publish("set_storage_config",["SOS_NUMBER{}".format(i+1),data[i+1]])
+ # sos_list.append(str(data[i+1]))
+ save_data["index"] = i
+ save_data["name"] = data[i]["name"]
+ save_data["phone"] = data[i]["phone"]
+ sos_list.append(save_data)
+ # EventMesh.publish("set_storage_config",["sos_list",sos_list])
+ sos_list.sort(key=lambda x: x['index'])
+ EventMesh.publish("set_storage_config",["sos_list",sos_list])
+ EventMesh.publish("set_sos_list_info",sos_list)
+ read_soslist = EventMesh.publish("get_storage_config","sos_list")
+ print(read_soslist)
+ EventMesh.publish(WEB_CMD_ENUM.SOS_LIST_S_CMD)
+#NLP指令处理
+def ai_cmd_handle(cmd):
+ # print("")
+ if "查询" in cmd:#当指令中有查询时,截取查询操作
+ EventMesh.publish("find_cmd",cmd)
+ elif "讲话" in cmd:#当指令中有讲话时,截取语速操作
+ voice_start_index = cmd.index("讲话") + len("讲话")#动态判断截取部分
+ find = cmd[voice_start_index:]#查询截取
+ if "快" in find:
+ EventMesh.publish("rate_move",1)
+ volume = "变快"
+ elif "慢" in find:
+ EventMesh.publish("rate_move",0)
+ volume = "变慢"
+ tts_play_str = "语速已经" + volume
+ EventMesh.publish("play_tts",[tts_play_str,0])
+ elif "声音改为" in cmd:#当指令中有声音改为时,进入音色修改
+ voice_start_index = cmd.index("声音改为") + len("声音改为")#动态判断截取部分
+ find = cmd[voice_start_index:]#查询截取
+ EventMesh.publish("change_voice",find)
+ elif "结束对话" in cmd:#当指令中有结束对话时,结束当前对话
+ EventMesh.publish("Close_VC")
+ elif "音量" in cmd:#当指令中有音量改为时,音量改为具体数值
+ if "调节" in cmd :
+ voice_start_index = cmd.index("音量调节:") + len("音量调节:")#动态判断截取部分
+ find = cmd[voice_start_index:]#查询截取
+ print("find = {}".format(find))
+ volume = int(find)
+ volume += 100#设置音量以100-200为参数
+ result = EventMesh.publish("change_volume",volume)
+ if result == 1:
+ tts_play_str = "音量已经改为" + find
+ EventMesh.publish("play_tts",[tts_play_str,0])
+ else:
+ tts_play_str = "设置失败,请重新设置0~100的音量大小"
+ EventMesh.publish("play_tts",[tts_play_str,0])
+ if "加大" in cmd:
+ result = EventMesh.publish("change_volume",1)
+ if result == 1:
+ tts_play_str = "音量已经加大"
+ EventMesh.publish("play_tts",[tts_play_str,0])
+ else:
+ tts_play_str = "当前音量已经是最大了"
+ EventMesh.publish("play_tts",[tts_play_str,0])
+ elif "减小" in cmd:
+ result = EventMesh.publish("change_volume",0)
+ if result == 1:
+ tts_play_str = "音量已经减小"
+ EventMesh.publish("play_tts",[tts_play_str,0])
+ else:
+ tts_play_str = "当前音量已经是最小了"
+ EventMesh.publish("play_tts",[tts_play_str,0])
+
+ elif "语速倍速设置为:" in cmd:#修改对话模式
+ voice_start_index = cmd.index("语速倍速设置为:") + len("语速倍速设置为:")#动态判断截取部分
+ find = cmd[voice_start_index:]#查询截取
+ print("find = {}".format(find))
+ if float(find) > 2.0 or float(find) < 0.5:
+ tts_play_str = "抱歉,语速仅支持0.5-2倍,请重新设置"
+ EventMesh.publish("play_tts",[tts_play_str,0])
+ return
+ EventMesh.publish("SET_SPEECH_RATE",float(find))
+ tts_play_str = "语速已经改为" + find
+ EventMesh.publish("play_tts",[tts_play_str,0])
+ elif "聆听" in cmd:#聆听快/慢一些
+ if "快" in cmd:
+ tts_play_str = EventMesh.publish("NLP_set_vad_silence",1)
+ elif "慢" in cmd:
+ tts_play_str = EventMesh.publish("NLP_set_vad_silence",0)
+ EventMesh.publish("play_tts",[tts_play_str,0])
+ elif "这个不支持哦,请换一个" in cmd:
+ tts_play_str = "抱歉呀,暂不支持该方言,请换一个"
+ EventMesh.publish("play_tts",[tts_play_str,0])
+ elif "不支持的操作" in cmd:
+ tts_play_str = "抱歉呀,暂不支持该命令"
+ EventMesh.publish("play_tts",[tts_play_str,0])
+
+ if not _NLP_EXTENDED_CMDS:
+ return
+ if "会议纪要" in cmd:
+ print("cmd:已进入会议")
+ EventMesh.publish("come_meet_mode")
+ elif "翻译" in cmd:
+ print("cmd:已进入翻译")
+ EventMesh.publish("come_trans_mode")
+ elif "查看历史留言" in cmd:
+ EventMesh.publish(WEB_CMD_ENUM.GET_NEW_VOICE_MSG_S)
+ EventMesh.publish("set_history_voice_flag", 1)
+ EventMesh.publish("clean_unread_vocie")
+ EventMesh.publish("set_storage_config", ["is_noread_voice", 0])
+
+#NLP指令
+class IOTWeb_Nlp_ConfigProtoCol(ProtoCol):
+ """ai_cmd"""
+ TYPE = "ai_cmd"
+
+ def send(self, event, msg):
+ # print("ai_cmd{}".format(msg))
+ # 通过websocket发送到服务器端
+ date_tmp = utime.localtime()
+ time_tmp = utime.mktime(date_tmp)
+ ai_cmd = {
+ "cmd":"ai_cmd",
+ "ts":time_tmp,
+ "msg":"AI指令",
+ "data":None
+ }
+ send_data = b''
+ send_data = protocol_send_total_data(ai_cmd)
+ print("send_data ai_cmd{}".format(send_data))
+ EventMesh.publish("CHANNEL_IOT_WEB_SEND", send_data)
+
+ def recv(self, event, msg):
+ """
+ @param event:上行下发push_music
+ @param msg: 接收到的下行数据
+ """
+ #提取指令名称
+ cmdName = msg["data"]
+ print("提取到的AI指令为{}".format(cmdName))
+ ai_cmd_handle(cmdName)
+#设备进入翻译,小程序返回在线情况
+class IOTWeb_translate_device_enterProtoCol(ProtoCol):
+ """translate_device_enter"""
+ TYPE = "translate_device_enter"
+
+ def send(self, event, msg):
+ # print("translate_device_enter{}".format(msg))
+ # 通过websocket发送到服务器端
+ print("设备进入翻译,小程序返回在线情况")
+
+ def recv(self, event, msg):
+ """
+ @param event:上行下发translate_device_enter
+ @param msg: 接收到的下行数据
+ """
+ print("设备进入翻译获取状态:{}".format(msg["data"]["msg"]))
+ status = msg["data"]["rest"]
+
+ if status == "success":
+ EventMesh.publish("set_trans_flag",1)#能进入AI翻译
+ exit_tts = "已进入实时翻译模式"
+ EventMesh.publish("play_tts",[exit_tts,1])
+ elif status == "error":
+ EventMesh.publish("set_trans_flag",0)#不能进入AI翻译
+ exit_tts = msg["data"]["msg"]
+ EventMesh.publish("play_tts",[exit_tts,0])
+ print("recv translate_device_enter")
+
+#接收小程序控制进入翻译
+class IOTWeb_come_transProtoCol(ProtoCol):
+ """translate_app_enter"""
+ TYPE = "translate_app_enter"
+
+ def send(self, event, msg):
+ # print("translate_app_enter{}".format(msg))
+ # 通过websocket发送到服务器端
+ date_tmp = utime.localtime()
+ time_tmp = utime.mktime(date_tmp)
+ come_trans = {
+ "cmd":"translate_device_complete",
+ "ts":time_tmp,
+ "msg":"进入成功",
+ "data":None
+ }
+ send_data = b''
+ send_data = protocol_send_total_data(come_trans)
+ print("send_data translate_app_enter{}".format(send_data))
+ EventMesh.publish("CHANNEL_IOT_WEB_SEND", send_data)
+
+ def recv(self, event, msg):
+ """
+ @param event:上行下发translate_app_enter
+ @param msg: 接收到的下行数据
+ """
+ EventMesh.publish("come_trans_mode")#进入AI翻译
+ print("recv translate_app_enter{}".format(msg))
+
+#接收小程序控制退出翻译
+class IOTWeb_exit_transProtoCol(ProtoCol):
+ """translate_app_exit"""
+ TYPE = "translate_app_exit"
+
+ def send(self, event, msg):
+ # print("translate_app_enter{}".format(msg))
+ # 通过websocket发送到服务器端
+ date_tmp = utime.localtime()
+ time_tmp = utime.mktime(date_tmp)
+ come_trans = {
+ "msg": "退出翻译",
+ "data": None,
+ "cmd": "translate_device_exit",
+ "ts": time_tmp
+ }
+ send_data = b''
+ send_data = protocol_send_total_data(come_trans)
+ print("send_data translate_app_enter{}".format(send_data))
+ EventMesh.publish("CHANNEL_IOT_WEB_SEND", send_data)
+
+ def recv(self, event, msg):
+ """
+ @param event:上行下发translate_app_enter
+ @param msg: 接收到的下行数据
+ """
+ EventMesh.publish("exit_trans_mode")#退出AI翻译
+ print("recv translate_app_exit{}".format(msg))
+
+#接收小程序控制进入会议
+class IOTWeb_appcontrol_meetProtoCol(ProtoCol):
+ """meet_control"""
+ TYPE = "meet_control"
+ def send(self, event, msg):
+ # print("translate_app_enter{}".format(msg))
+ # 通过websocket发送到服务器端
+ date_tmp = utime.localtime()
+ time_tmp = utime.mktime(date_tmp)
+ come_trans = {
+ "msg": "开始会议",
+ "data": None,
+ "cmd": "meet_begin",
+ "ts": 1761121597
+ }
+ send_data = b''
+ send_data = protocol_send_total_data(come_trans)
+ print("send_data translate_app_enter{}".format(send_data))
+ EventMesh.publish("CHANNEL_IOT_WEB_SEND", send_data)
+
+ def recv(self, event, msg):
+ """
+ @param event:上行下发meeting_app_enter
+ @param msg: 接收到的下行数据
+ """
+ data = msg["data"]#判断是开启还是关闭
+ if data == "begin":
+ EventMesh.publish("come_meet_mode")#进入会议纪要
+ elif data == "end":
+ EventMesh.publish("exit_meet_mode")#退出会议纪要
+ print("APP Meeting Control")
+
+#翻译播放TTS
+class IOTWeb_play_trans_TTSProtoCol(ProtoCol):
+ """tts_audio_url"""
+ TYPE = "tts_audio_url"
+
+ def send(self, event, msg):
+ # print("tts_audio_url{}".format(msg))
+ # 通过websocket发送到服务器端
+ date_tmp = utime.localtime()
+ time_tmp = utime.mktime(date_tmp)
+ tts_audio_url = {
+ "cmd":"tts_audio_url_complete",
+ "ts":time_tmp,
+ "msg":"返回状态",
+ "data":None
+ }
+ send_data = b''
+ send_data = protocol_send_total_data(tts_audio_url)
+ print("send_data tts_audio_url{}".format(send_data))
+ EventMesh.publish("CHANNEL_IOT_WEB_SEND", send_data)
+
+ def recv(self, event, msg):
+ """
+ @param event:上行下发push_music
+ @param msg: 接收到的下行数据
+ """
+ #提取录音播放名称
+ voiceUrl = msg["data"]
+ print("提取到的翻译路径为{}".format(voiceUrl))
+ EventMesh.publish("play_trans_tts",voiceUrl)
+ print("recv tts_audio_url{}".format(msg))
+
+#音乐播放
+class IOTWeb_play_MusicProtoCol(ProtoCol):
+ """push_music"""
+ TYPE = "push_music"
+
+ def send(self, event, msg):
+ # print("push_music{}".format(msg))
+ # 通过websocket发送到服务器端
+ date_tmp = utime.localtime()
+ time_tmp = utime.mktime(date_tmp)
+ push_music = {
+ "cmd":"push_music",
+ "ts":time_tmp,
+ "msg":"音乐播放",
+ "data":None
+ }
+ send_data = b''
+ send_data = protocol_send_total_data(push_music)
+ print("send_data push_music{}".format(send_data))
+ EventMesh.publish("CHANNEL_IOT_WEB_SEND", send_data)
+
+ def recv(self, event, msg):
+ """
+ @param event:上行下发push_music
+ @param msg: 接收到的下行数据
+ """
+ #提取音乐播放名称,地址
+ print("recv push_music{}".format(msg))
+ musicName = msg["data"]["musicName"]
+ musicUrl = msg["data"]["musicUrl"]
+ print("提取到的音乐名称为{},路径为{}".format(musicName,musicUrl))
+ EventMesh.publish("play_music",[musicName,musicUrl,1])
+
+
+#音量下发
+class IOTWeb_volumeProtoCol(ProtoCol):
+ """volume"""
+ TYPE = "volume"
+
+ def send(self, event, msg):
+ print("send volume{}".format(msg))
+ # 通过websocket发送到服务器端
+ date_tmp = utime.localtime()
+ time_tmp = utime.mktime(date_tmp)
+ volume = {
+ "cmd":"dispatch_rest",
+ "ts":time_tmp,
+ "msg":"消息收到响应",
+ "data":{
+ "cmd":"volume",
+ "rest":"success",
+ "msg":"收到音量设置."
+ }
+ }
+ send_data = b''
+ send_data = protocol_send_total_data(volume)
+ print("send_data volume{}".format(send_data))
+ EventMesh.publish("CHANNEL_IOT_WEB_SEND", send_data)
+
+ def recv(self, event, msg):
+ """
+
+ @param event:上行下发volume
+ @param msg: 接收到的下行数据
+ """
+ if "data" in msg:
+ r_volume = msg["data"]
+ print("recv volume{} type:{}".format(r_volume,type(msg)))
+
+ EventMesh.publish("SET_TTS_VOLUME",int(r_volume))
+ EventMesh.publish("adjust_volume_toBle",r_volume)
+ EventMesh.publish(WEB_CMD_ENUM.VOLUME_S_CMD)
+#下发SOS配置
+class IOTWeb_sos_configProtoCol(ProtoCol):
+ """sos_config"""
+ TYPE = "sos_config"
+
+ def send(self, event, msg):
+ print("send sos_config{}".format(msg))
+ # 通过websocket发送到服务器端
+ date_tmp = utime.localtime()
+ time_tmp = utime.mktime(date_tmp)
+ sos_config = {
+ "cmd":"dispatch_rest",
+ "ts":time_tmp,
+ "msg":"消息收到响应",
+ "data":{
+ "cmd":"sos_config",
+ "rest":"success",
+ "msg":"SOS配置成功."
+ }
+ }
+ send_data = b''
+ send_data = protocol_send_total_data(sos_config)
+ print("send_data sos_config{}".format(send_data))
+ EventMesh.publish("CHANNEL_IOT_WEB_SEND", send_data)
+
+ def recv(self, event, msg):
+ """
+
+ @param event:上行下发sos_config
+ @param msg: 接收到的下行数据
+ """
+ print("recv sos_config{}".format(msg))
+ if "data" in msg:
+ sos_config = msg["data"]
+ print("recv sos_config{} type:{}".format(sos_config,type(msg)))
+ EventMesh.publish("set_storage_config",["sos_config",sos_config])
+ EventMesh.publish("set_sos_config",sos_config)
+ sos_config = EventMesh.publish("get_storage_config","sos_config")
+ # print("sos_config:{} type:{}".format(sos_config,sos_config["enable110"]))
+ EventMesh.publish(WEB_CMD_ENUM.SOS_CONFIG_S_CMD)
+#闹钟铃声获取
+
+class IOTWeb_get_ringtoneProtoCol(ProtoCol):
+ """get_ringtone"""
+ TYPE = "get_ringtone"
+
+ def send(self, event, msg):
+ print("send get_ringtone{}".format(msg))
+ # 通过websocket发送到服务器端
+ date_tmp = utime.localtime()
+ time_tmp = utime.mktime(date_tmp)
+ get_ringtone ={
+ "cmd":"get_ringtone",
+ "ts":time_tmp,
+ "msg":"请求下发铃声列表",
+ "data":None
+ }
+ send_data = b''
+ send_data = protocol_send_total_data(get_ringtone)
+ print("send_data get_ringtone{}".format(send_data))
+ EventMesh.publish("CHANNEL_IOT_WEB_SEND", send_data)
+
+ def recv(self, event, msg):
+ """
+
+ @param event:上行下发get_ringtone
+ @param msg: 接收到的下行数据
+ """
+ print("recv get_ringtone{}".format(msg))
+
+#闹钟铃声列表
+class IOTWeb_ringtone_listProtoCol(ProtoCol):
+ """ringtone_list"""
+ TYPE = "ringtone_list"
+
+ def send(self, event, msg):
+ print("send ringtone_list{}".format(msg))
+ # 通过websocket发送到服务器端
+ date_tmp = utime.localtime()
+ time_tmp = utime.mktime(date_tmp)
+ ringtone_list ={
+ "cmd":"dispatch_rest",
+ "ts":time_tmp,
+ "msg":"消息收到响应",
+ "data":{
+ "cmd":"ringtone_list",
+ "rest":"success",
+ "msg":"收到闹钟铃声列表."
+ }
+ }
+ send_data = b''
+ send_data = protocol_send_total_data(ringtone_list)
+ print("send_data ringtone_list{}".format(msg))
+ EventMesh.publish("CHANNEL_IOT_WEB_SEND", send_data)
+
+ def recv(self, event, msg):
+ """
+
+ @param event:上行下发ringtone_list
+ @param msg: 接收到的下行数据
+ """
+ print("recv ringtone_list{}".format(msg))
+
+
+#下发静默录音
+class IOTWeb_voice_recordProtoCol(ProtoCol):
+ """voice_record"""
+ TYPE = "voice_record"
+ start_ai = 0
+ def send(self, event, msg):
+ print("send voice_record{}".format(msg))
+ # 通过websocket发送到服务器端
+ date_tmp = utime.localtime()
+ time_tmp = utime.mktime(date_tmp)
+ s_rest = "0"
+ s_msg = "停止录音."
+ if msg == "1":
+ print("设备允许录音")
+ s_rest = "1"
+ s_msg = "开始录音."
+
+ voice_record = {
+ "cmd":"dispatch_rest",
+ "ts":time_tmp,
+ "msg":"消息收到响应",
+ "data":{
+ "cmd":"voice_record",
+ "rest":s_rest,
+ "msg":s_msg
+ }
+ }
+ send_data = b''
+ send_data = protocol_send_total_data(voice_record)
+ print("send_data voice_record{}".format(send_data))
+ EventMesh.publish("CHANNEL_IOT_WEB_SEND", send_data)
+
+ def recv(self, event, msg):
+ """
+
+ @param event:上行下发voice_record
+ @param msg: 接收到的下行数据
+ """
+ print("recv voice_record{}".format(msg))
+ if "data" in msg:
+ data = msg["data"]
+ s_rest = "0"
+ if data == "0":
+ s_rest = "0"
+
+ record_mode = EventMesh.publish("get_voice_record_mode")
+ if record_mode == None:
+ record_mode = 0
+ if record_mode != 2:#语音留言不允许打断
+ EventMesh.publish("stop_voice_record")
+ print("停止录音")
+ EventMesh.publish(WEB_CMD_ENUM.VOICE_RECORD_S_CMD,s_rest)
+
+ elif data == "1":
+
+ get_sos_flag = EventMesh.publish("get_sos_flag")
+ if get_sos_flag != 0:
+ s_rest = "0"
+ print("正在电话")
+ EventMesh.publish(WEB_CMD_ENUM.VOICE_RECORD_S_CMD,s_rest)
+ return
+ record_mode = EventMesh.publish("get_voice_record_mode")
+ if record_mode == None:
+ record_mode = 0
+ get_VC_satrt_flag = EventMesh.publish("get_VC_satrt_flag")
+ if get_VC_satrt_flag == None:
+ get_VC_satrt_flag = 0
+
+ if record_mode == 2 or get_VC_satrt_flag == 1:# 如果在AI对话 或者语音留言不允许静默录音
+ s_rest = "0"
+ EventMesh.publish(WEB_CMD_ENUM.VOICE_RECORD_S_CMD,s_rest)
+ EventMesh.publish("stop_voice_record")
+ else:
+ s_rest = "1"
+ EventMesh.publish(WEB_CMD_ENUM.VOICE_RECORD_S_CMD,s_rest)
+ EventMesh.publish("start_voice_record",1)
+ print("开始录音")
+
+#设备解绑
+class IOTWeb_unbind_devProtoCol(ProtoCol):
+ """unbind_dev"""
+ TYPE = "unbind_dev"
+ unbind_devtimer = osTimer()
+ init_flag = 0
+ def send(self, event, msg):
+ print("send unbind_dev{}".format(msg))
+ # 通过websocket发送到服务器端
+ date_tmp = utime.localtime()
+ time_tmp = utime.mktime(date_tmp)
+ unbind_dev={
+ "cmd":"unbind_dev",
+ "ts":time_tmp,
+ "msg":"主动解绑设备",
+ "data":None
+ }
+ send_data = b''
+ send_data = protocol_send_total_data(unbind_dev)
+ print("unbind_dev{}".format(send_data))
+ EventMesh.publish("CHANNEL_IOT_WEB_SEND", send_data)
+ self.init_flag=1
+ self.unbind_devtimer.start(2000,0,self.unbind_devtimer_cb)
+ def unbind_devtimer_cb(self,*argc):
+ if self.init_flag == 1:
+ play_str = "设备解绑失败"
+ EventMesh.publish("play_tts",[play_str,1])
+
+ def recv(self, event, msg):
+ """
+
+ @param event:上行下发unbind_dev
+ @param msg: 接收到的下行数据
+ """
+ # {
+ # "cmd":"post_rest",
+ # "ts":1738283829,
+ # "msg":"消息收到响应",
+ # "data":{
+ # "cmd":"unbind_dev",
+ # "rest":"success|error",
+ # "msg":"收到主动解绑设备指令"
+ # }
+ # }
+ self.btstate = 0
+ self.blestate = 0
+ self.unbind_devtimer.stop()
+ self.init_flag=0
+ if "data" in msg:
+ data = msg["data"]
+ rest = data["rest"]
+ if rest == "success":
+ play_str = "设备解绑成功"
+ EventMesh.publish("set_storage_config",["switch_ble_state","1"])
+ EventMesh.publish("send_ble_switch_toble","1")
+
+
+ EventMesh.publish("set_storage_config",["switch_bt_state","1"])
+ EventMesh.publish("send_bt_switch_toble","1")
+ EventMesh.publish("play_tts",[play_str,1])
+ # ret = 0
+ # ret = ql_fs.path_exists("/usr/static/storage_file")#配置文件
+ # if ret == True:
+ # ql_fs.rmdirs("/usr/static/storage_file")
+ # ql_fs.mkdirs("/usr/static/storage_file")
+ # utime.sleep_ms(2000)
+ # Power.powerRestart()
+ pass
+ else:
+ play_str = "设备解绑失败"
+ EventMesh.publish("play_tts",[play_str,1])
+ pass
+ print("recv unbind_dev{}".format(msg))
+#用户解绑
+class IOTWeb_user_unbind_devProtoCol(ProtoCol):
+ """user_unbind_dev"""
+ TYPE = "user_unbind_dev"
+ def send(self, event, msg):
+ print("send user_unbind_dev{}".format(msg))
+ # 通过websocket发送到服务器端
+ date_tmp = utime.localtime()
+ time_tmp = utime.mktime(date_tmp)
+ user_unbind_dev={
+ "cmd":"dispatch_rest",
+ "ts":time_tmp,
+ "msg":"消息收到响应",
+ "data":{
+ "cmd":"user_unbind_dev",
+ "rest":"success",
+ "msg":"收到用户解绑设备指令"
+ }
+ }
+ send_data = b''
+ send_data = protocol_send_total_data(user_unbind_dev)
+ print("user_unbind_dev{}".format(send_data))
+ EventMesh.publish("CHANNEL_IOT_WEB_SEND", send_data)
+
+ def recv(self, event, msg):
+ """
+
+ @param event:上行下发user_unbind_dev
+ @param msg: 接收到的下行数据
+ """
+ # {
+ # "cmd":"post_rest",
+ # "ts":1738283829,
+ # "msg":"消息收到响应",
+ # "data":{
+ # "cmd":"user_unbind_dev",
+ # "rest":"success|error",
+ # "msg":"收到主动解绑设备指令"
+ # }
+ # }
+ self.btstate = 0
+ self.blestate = 0
+ EventMesh.publish("set_storage_config",["switch_ble_state","1"]) #用户解绑设备需要开启广播 开启经典蓝牙
+ EventMesh.publish("send_ble_switch_toble","1")
+
+ EventMesh.publish("set_storage_config",["switch_bt_state","1"])
+ EventMesh.publish("send_bt_switch_toble","1")
+ EventMesh.publish(WEB_CMD_ENUM.USER_UNBIND_DEV_S)
+ tts_play_str = "设备已解绑"
+ EventMesh.publish("play_tts",[tts_play_str,1])
+ # ret = 0
+ # ret = ql_fs.path_exists("/usr/static/storage_file")#配置文件
+ # if ret == True:
+ # ql_fs.rmdirs("/usr/static/storage_file")
+ # ql_fs.mkdirs("/usr/static/storage_file")
+ # utime.sleep_ms(100)
+ # Power.powerRestart()
+ print("recv user_unbind_dev{}".format(msg))
+#下发位子留言
+class IOTWeb_text_msgProtoCol(ProtoCol):
+ """text_msg"""
+ TYPE = "text_msg"
+
+ def send(self, event, msg):
+ print("send text_msg{}".format(msg))
+ # 通过websocket发送到服务器端
+ date_tmp = utime.localtime()
+ time_tmp = utime.mktime(date_tmp)
+
+ rest = "error"
+ if msg == 1:
+ rest = "success"
+ text_msg = {
+ "cmd":"post_rest",
+ "ts":time_tmp,
+ "msg":"消息收到响应",
+ "data":{
+ "cmd":"text_msg",
+ "rest":rest,
+ "msg":"收到文本消息."
+ }
+ }
+ send_data = b''
+ send_data = protocol_send_total_data(text_msg)
+ print("send_data text_msg{}".format(send_data))
+ EventMesh.publish("CHANNEL_IOT_WEB_SEND", send_data)
+
+ def recv(self, event, msg):
+ """
+
+ @param event:上行下发voice_record
+ @param msg: 接收到的下行数据
+ """
+ print("recv time_tmp{}".format(msg))
+ recv_state = 0
+ if "data" in msg:
+ play_tts_text = msg["data"]
+ try:
+ EventMesh.publish("play_tts",[play_tts_text,1])
+ recv_state = 1
+ except Exception as e:
+ print("下发文字留言出错了")
+ EventMesh.publish(WEB_CMD_ENUM.TEXT_MSG_S_CMD,recv_state)
+
+#AI对话音色配置
+class IOTWeb_chat_configProtoCol(ProtoCol):
+ """chat_config"""
+ TYPE = "chat_config"
+
+ def send(self, event, msg):
+ # print("send chat_config{}".format(msg))
+ # 通过websocket发送到服务器端
+ date_tmp = utime.localtime()
+ time_tmp = utime.mktime(date_tmp)
+ chat_config = {
+ "cmd":"dispatch_rest",
+ "ts":time_tmp,
+ "msg":"消息收到响应",
+ "data":{
+ "cmd":"chat_config",
+ "rest":"success",
+ "msg":"收到AI对话配置"
+ }
+ }
+ send_data = b''
+ send_data = protocol_send_total_data(chat_config)
+ print("send_data chat_config{}".format(send_data))
+ EventMesh.publish("CHANNEL_IOT_WEB_SEND", send_data)
+
+ def recv(self, event, msg):
+ """
+
+ @param event:上行下发chat_config
+ @param msg: 接收到的下行数据
+ """
+ print("recv chat_config{}".format(msg))
+ # {
+ # "cmd":"chat_config",
+ # "ts":1738283829,
+ # "msg":"下发AI对话配置",
+ # "data":{
+ # "speed":1.5,
+ # "vadDuration":600,
+ # "voiceId":"音色ID,火山音色或者科大讯飞音色ID"
+ # }
+ # }
+ # {'msg': '测试聊天配置.', 'data': {'botName': '柒乐乐', 'vadDuration': 600, 'speed': '1.0', 'provider': 'iflytek', 'voiceId': 'x3_linlin'},
+ # 'ts': 1755600807553, 'cmd': 'chat_config'}
+
+ if "data" in msg:
+ data = msg["data"]
+ speed = None
+ try:
+ speed = float(data["speed"])
+ except Exception as e:
+ usys.print_exception(e)
+ vadDuration = data["vadDuration"]
+ voiceId = data["voiceId"]
+ provider = data["provider"]
+ botName = data["botName"]
+ asr = data["asr"]
+ if speed != None:
+ EventMesh.publish("SET_SPEECH_RATE",speed)
+ if vadDuration != None:
+ #if len(vadDuration) != 0:
+ EventMesh.publish("set_vad_silence",vadDuration)
+ tts_type = {}
+ if voiceId != None and len(voiceId) != 0:
+ tts_type["voice"] = voiceId
+ if provider != None and len(provider) != 0:
+ tts_type["outbound_attributess_provider"] = provider
+ if botName != None and len(botName) != 0:
+ tts_type["bot_name"] = botName
+ if voiceId != None and len(voiceId) != 0:
+ tts_type["voice"] = voiceId
+ if asr != None and len(asr) != 0:
+ tts_type["inbound_attributess_provider"] = asr
+ if len(tts_type)>0:
+ print("tts_type:{}".format(tts_type))
+ EventMesh.publish("set_VC_TTS_voice_type",tts_type)
+ EventMesh.publish(WEB_CMD_ENUM.CHAT_CONFIG_S)
+#获取AI对话音色配置
+class IOTWeb_get_chat_configProtoCol(ProtoCol):
+ """get_chat_config"""
+ TYPE = "get_chat_config"
+
+ def send(self, event, msg):
+ # print("send chat_config{}".format(msg))
+ # 通过websocket发送到服务器端
+ date_tmp = utime.localtime()
+ time_tmp = utime.mktime(date_tmp)
+ get_chat_config = {
+ "cmd":"get_chat_config",
+ "ts":time_tmp,
+ "msg":"获取AI对话配置",
+ "data":None
+ }
+ send_data = b''
+ send_data = protocol_send_total_data(get_chat_config)
+ print("send_data chat_config{}".format(send_data))
+ EventMesh.publish("CHANNEL_IOT_WEB_SEND", send_data)
+
+ def recv(self, event, msg):
+ """
+
+ @param event:上行下发get_chat_config
+ @param msg: 接收到的下行数据
+ """
+ print("recv get_chat_config{}".format(msg))
+
+#上报日程列表
+class IOTWeb_post_scheduleProtoCol(ProtoCol):
+ """post_schedule"""
+ TYPE = "post_schedule"
+
+ def send(self, event, msg):
+ print("send post_schedule{}".format(msg))
+ # 通过websocket发送到服务器端
+
+ send_data = b''
+ send_data = protocol_send_total_data(msg)
+ print("send send_data{}".format(send_data))
+ EventMesh.publish("CHANNEL_IOT_WEB_SEND",send_data)
+
+ def recv(self, event, msg):
+ """
+
+ @param event:post_schedule
+ @param msg: 接收到的下行数据
+ """
+ print("recv post_schedule{}".format(msg))
+
+
+#下发日程
+class IOTWeb_scheduleProtoCol(ProtoCol):
+ """schedule"""
+ TYPE = "schedule"
+
+ def send(self, event, msg):
+ print("send schedule{}".format(msg))
+ # 通过websocket发送到服务器端
+ date_tmp = utime.localtime()
+ time_tmp = utime.mktime(date_tmp)
+ schedule = {
+ "cmd":"post_rest",
+ "ts":time_tmp,
+ "msg":"消息收到响应",
+ "data":{
+ "cmd":"schedule",
+ "rest":"success",
+ "msg":"收到日程列表."
+ }
+ }
+ send_data = b''
+ send_data = protocol_send_total_data(schedule)
+ print("send_data schedule{}".format(send_data))
+ EventMesh.publish("CHANNEL_IOT_WEB_SEND", send_data)
+
+ def recv(self, event, msg):
+ """
+
+ @param event:上行下发schedule
+ @param msg: 接收到的下行数据
+ """
+ # {
+ # "cmd":"text_msg",
+ # "ts":1738283829,
+ # "msg":"下发文本消息",
+ # "data":"文本内容"
+ # }
+ print("recv time_tmp{}".format(msg))
+ # {
+ # "cmd":"schedule",
+ # "ts":1738283829,
+ # "msg":"下发日程列表",
+ # "data":[
+ # "title":"日程名称",
+ # "description":"提醒内容",
+ # "repeat":1~4播报重复次数,
+ # "date":"日期,yyyy-MM-dd",
+ # "时间":"HH:mm"
+ # ]
+ # }
+ schedule = []
+ if "data" in msg:
+ data = msg["data"]
+ for i,sh in enumerate(data):
+ sh["index"] = i
+ schedule.append(sh)
+ schedule.sort(key=lambda x: x['index'])
+ EventMesh.publish("set_storage_config",["schedule",schedule])
+
+ schedule = EventMesh.publish("get_storage_config","schedule")
+ EventMesh.publish("set_schedule_info",schedule)#
+ print(schedule)
+ EventMesh.publish(WEB_CMD_ENUM.SCHEDULE_S_CMD)
+#下发新的语音未读留言
+class IOTWeb_new_voice_msgProtoCol(ProtoCol):
+ """new_voice_msg"""
+ TYPE = "new_voice_msg"
+
+ def send(self, event, msg):
+ print("send new_voice_msg{}".format(msg))
+ # 通过websocket发送到服务器端
+ date_tmp = utime.localtime()
+ time_tmp = utime.mktime(date_tmp)
+ new_voice_msg = {
+ "cmd":"dispatch_rest",
+ "ts":time_tmp,
+ "msg":"消息收到响应",
+ "data":{
+ "cmd":"new_voice_msg",
+ "rest":"success",
+ "msg":"收到新语音消息指令."
+ }
+ }
+ send_data = b''
+ send_data = protocol_send_total_data(new_voice_msg)
+ print("send send_data{}".format(send_data))
+ EventMesh.publish("CHANNEL_IOT_WEB_SEND",send_data)
+ EventMesh.publish(WEB_CMD_ENUM.GET_NEW_VOICE_MSG_S)
+ def recv(self, event, msg):
+ """
+
+ @param event:new_voice_msg
+ @param msg: 接收到的下行数据
+ """
+ EventMesh.publish(WEB_CMD_ENUM.NEW_VOICE_MSG_S)
+
+ print("recv new_voice_msg{}".format(msg))
+
+#设备主动查询未读的语音消息列表
+class IOTWeb_find_new_voice_msgProtoCol(ProtoCol):
+ """find_voice_msg_list"""
+ TYPE = "find_voice_msg_list"
+ def __init__(self):
+ super().__init__()
+ self.history_board_flag = 0#第一次进去要广播
+ self.open_device = 0#开机播报未读留言
+ self.has_processed_history_voice = 0 #播完列表不许再拨“历史未读留言为空”
+ EventMesh.subscribe("set_history_board_flag",self.set_history_board_flag)
+ EventMesh.subscribe("set_open_device",self.set_open_device)
+ EventMesh.subscribe("get_open_device",self.get_open_device)
+ def send(self, event, msg):
+ print("send find_voice_msg_list")
+
+ def recv(self, event, msg):
+ """
+
+ @param event:find_voice_msg_list
+ @param msg: 接收到的下行数据
+ """
+ print("recv find_voice_msg_list{}".format(msg))
+
+ new_voice_list = []#字典列表
+ voice_list = msg["data"]
+ print("msg[\"data\"] = {}".format(voice_list))
+ if EventMesh.publish("get_history_voice_flag") == 1:
+ if len(voice_list) == 0:#为空
+ if EventMesh.publish("get_wait_voice_flag") == 0:#未听历史留言
+ tts_play_str = "已无更多历史留言"
+ EventMesh.publish("play_tts",[tts_play_str,0])
+ self.history_board_flag = 0
+ self.has_processed_wait_voice = 0
+ self.wait_first_flag = 0
+ # if self.has_processed_history_voice == 0:
+ # tts_play_str = "已无更多历史留言"
+ # EventMesh.publish("play_tts",[tts_play_str,0])
+ # else:
+ # self.has_processed_history_voice = 0#读完了置为0
+ # self.history_board_flag = 0#广播置为0
+ # self.history_board_flag = 0
+ # self.has_processed_wait_voice = 0
+ # self.wait_first_flag = 0
+ else:#等待历史留言
+ self.has_processed_wait_voice = 0
+ self.wait_first_flag = 0
+ EventMesh.publish("set_recv_voice",0) #设置留言播放状态
+ EventMesh.publish("set_history_voice_flag",0)
+ EventMesh.publish("set_wait_voice_flag",0)
+ else:#有历史留言
+ if EventMesh.publish("get_wait_voice_flag") == 0:#历史留言
+ print("历史广播状态!!!!! = {}".format(self.history_board_flag))
+ if self.history_board_flag == 0:
+ tts_play_str = "您共有" + str(len(voice_list)) + "条历史留言,正在为您播放"
+ EventMesh.publish("play_tts",[tts_play_str,1])
+ EventMesh.publish("set_pwk_notice_flag",1)
+ EventMesh.publish("set_pwk_cnt_voice",len(voice_list))#设置多,防止进入留言播完判断
+ self.history_board_flag = 1
+ self.has_processed_history_voice = 1
+ for da in voice_list:
+ new_voice_list.append(da)
+ if len(new_voice_list) > 0:
+ pass
+ else:#未读留言
+ if self.open_device == 1 or EventMesh.publish("get_60S_voice_flag") == 1:
+ EventMesh.publish("set_pwk_cnt_voice",len(voice_list))#设置未读次数,由于是开机一起查看的
+ EventMesh.publish("set_60S_voice_flag",0)
+ for da in voice_list:
+ new_voice_list.append(da)
+ if len(new_voice_list) > 0:
+ pass
+ EventMesh.publish("set_play_new_voice_list",new_voice_list)
+ EventMesh.publish("play_new_voice_list")
+ else:#正常留言
+ if EventMesh.publish("get_1M_flag") == 0:
+ if EventMesh.publish("get_pwk_cnt_voice") >= 0:
+ for da in voice_list:
+ new_voice_list.append(da)
+ if len(new_voice_list) > 0:
+ pass
+ EventMesh.publish("set_play_new_voice_list",new_voice_list)
+ EventMesh.publish("play_new_voice_list")
+ def set_history_board_flag(self,event,msg):
+ self.history_board_flag = msg
+ def set_open_device(self,event,msg):
+ self.open_device = msg
+ def get_open_device(self,event,msg):
+ return self.open_device
+#请求未读的语音消息列表
+class IOTWeb_get_new_voice_msgProtoCol(ProtoCol):
+ """get_new_voice_msg"""
+ TYPE = "get_new_voice_msg"
+
+ def send(self, event, msg):
+ # 通过websocket发送到服务器端
+ date_tmp = utime.localtime()
+ time_tmp = utime.mktime(date_tmp)
+ # {
+ # "cmd":"get_new_voice_msg",
+ # "ts":1738283829,
+ # "msg":"请求未读的语音消息列表",
+ # "data":null
+ # }
+ get_new_voice_msg = {
+ "cmd":"get_new_voice_msg",
+ "ts":time_tmp,
+ "msg":"请求未读的语音消息列表",
+ "data":None
+ }
+
+ send_data = b''
+ send_data = protocol_send_total_data(get_new_voice_msg)
+ print("send get_new_voice_msg{}".format(send_data))
+ EventMesh.publish("CHANNEL_IOT_WEB_SEND",send_data)
+
+ def recv(self, event, msg):
+ """
+
+ @param event:get_new_voice_msg
+ @param msg: 接收到的下行数据
+ """
+ # get_new_voice_msg = {
+ # "cmd":"post_rest",
+ # "ts":time_tmp,
+ # "msg":"消息收到响应",
+ # "data":{
+ # "cmd":"get_new_voice_msg",
+ # "rest":"success",
+ # "msg":"收到请求新语音列表."
+ # }
+ # }
+ print("recv get_new_voice_msg{}".format(msg))
+# 1播放 0暂停 2上一首 3下一首
+class IOTWeb_player_controlProtoCol(ProtoCol):
+ """player_control"""
+ TYPE = "player_control"
+
+ def send(self, event, msg):
+ # 通过websocket发送到服务器端
+ date_tmp = utime.localtime()
+ time_tmp = utime.mktime(date_tmp)
+ paly_str = "停止"
+ paly_data = "stop"
+ if msg == 1:
+ paly_str = "播放"
+ paly_data = "play"
+ pass
+ elif msg == 0:
+ paly_str = "停止"
+ paly_data = "stop"
+ pass
+ elif msg == 2:
+ paly_str = "上一首"
+ paly_data = "pre"
+ pass
+ elif msg == 3:
+ paly_str = "下一首"
+ paly_data = "next"
+ pass
+ player_control = {
+ "cmd":"player_control",
+ "ts":time_tmp,
+ "msg":paly_str,
+ "data":paly_data
+ }
+
+ send_data = b''
+ send_data = protocol_send_total_data(player_control)
+ print("send player_control{}".format(send_data))
+ EventMesh.publish("CHANNEL_IOT_WEB_SEND",msg)
+
+ def recv(self, event, msg):
+ """
+
+ @param event:get_new_voice_msg
+ @param msg: 接收到的下行数据
+ """
+ # {
+ # "cmd":"post_rest",
+ # "ts":1738283829,
+ # "msg":"消息收到响应",
+ # "data":{
+ # "cmd":"player_control",
+ # "rest":"success|error",
+ # "msg":"收到播放/停止/暂停指令/下一首/上一首"
+ # }
+ # }
+ paly_state = 0
+ if "data" in msg:
+ data = msg["data"]
+ msg_str = data["msg"]
+ if msg_str.find("播放") != -1:
+ paly_state=1
+ pass
+ elif msg_str.find("停止") != -1:
+ paly_state=0
+ pass
+ elif msg_str.find("下一首") != -1:
+ paly_state = 3
+ pass
+ elif msg_str.find("上一首") != -1:
+ paly_state = 2
+ pass
+
+ EventMesh.publish(WEB_CMD_ENUM.PLAY_CONTROL_S,paly_state)
+ print("recv send_data{}".format(msg))
+class IOTWeb_new_voice_msg_listProtoCol(ProtoCol):
+ """new_voice_msg_list"""
+ TYPE = "new_voice_msg_list"
+ def __init__(self):
+ super().__init__()
+ self._1M_flag = 0#判断一分钟定时器是否开启中
+ self._1M_nowplay_flag = 0#判断当前留言播放是否结束去影响新留言播放的标志位
+ self.app_new_voice_flag = 0#app是否下发留言
+ self._1M_timer = osTimer()#多发留言间隙时间60S
+ self._60S_voice_flag = 0
+ self.is_listen_wait = 0#是否收听未听留言
+ self.close_timer_cnt = 0 #若两次未听定时器关闭
+ EventMesh.subscribe("get_app_new_voice_flag",self.get_app_new_voice_flag)
+ EventMesh.subscribe("set_app_new_voice_flag",self.set_app_new_voice_flag)
+ EventMesh.subscribe("get_1M_flag",self.get_1M_flag)
+ EventMesh.subscribe("set_1M_nowplay_flag",self.set_1M_nowplay_flag)
+ EventMesh.subscribe("set_is_listen_wait",self.set_is_listen_wait)
+ EventMesh.subscribe("get_60S_voice_flag",self.get_60S_voice_flag)
+ EventMesh.subscribe("set_60S_voice_flag",self.set_60S_voice_flag)
+
+ def send(self, event, msg):
+ print("send new_voice_msg_list{}".format(msg))
+ # 通过websocket发送到服务器端
+ date_tmp = utime.localtime()
+ time_tmp = utime.mktime(date_tmp)
+ new_voice_msg_list = {
+ "cmd":"dispatch_rest",
+ "ts":time_tmp,
+ "msg":"消息收到响应",
+ "data":{
+ "cmd":"new_voice_msg_list",
+ "rest":"success",
+ "msg":"收到新语音列表."
+ }
+ }
+ send_data = b''
+ send_data = protocol_send_total_data(new_voice_msg_list)
+ print("send send_data{}".format(send_data))
+ EventMesh.publish("CHANNEL_IOT_WEB_SEND",send_data)
+
+ def recv(self, event, msg):
+ """
+
+ @param event:new_voice_msg_list
+ @param msg: 接收到的下行数据
+ """
+ self.app_new_voice_flag = 1#标志位为1
+ new_voice_list = []
+ if "data" in msg:
+ data = msg["data"]
+ for da in data:
+ new_voice_list.append(da)
+ if len(new_voice_list) > 0:
+ pass
+ EventMesh.publish("set_play_new_voice_list",new_voice_list)
+ print("是否收到留言:{},self._1M_flag = {}".format(EventMesh.publish("get_recv_voice"),self._1M_flag))
+ if EventMesh.publish("get_recv_voice") == 0 and self._1M_flag == 0 and self._1M_nowplay_flag == 0:#当没有音频在播放时,再播放新的,否则保存下来不播放,等60S后一起播放
+ EventMesh.publish("set_recv_voice",1) #设置留言播放状态
+ EventMesh.publish("play_new_voice_list")
+ self._1M_nowplay_flag == 1
+ else:#当有音频在播放时,存下来开始倒计时
+ pass
+ if self._1M_flag == 0 :
+ print("等待留言60S倒计时开启")
+ self._1M_timer.start(60000, 0, self._1M_timer_cb)
+ self._1M_flag = 1
+ EventMesh.publish(WEB_CMD_ENUM.NEW_VOICE_MSG_LIST_S)
+ print("recv new_voice_msg_list{}".format(msg))
+ def _1M_timer_cb(self,*argc):
+ EventMesh.publish("publish_AI_btnInfo",{"func":self._1M_timer_cb_})
+
+ def _1M_timer_cb_(self):
+ #self.iot_web_send_queue.put("ping")
+ self._1M_flag = 0
+ self._60S_voice_flag = 1
+ get_VC_satrt_flag = EventMesh.publish("get_VC_satrt_flag")
+ if get_VC_satrt_flag == None:
+ get_VC_satrt_flag = 0
+ if get_VC_satrt_flag == 0:
+ print("收到多条信息,统一播放")
+ EventMesh.publish("set_history_voice_flag",1)#修改历史留言标志位
+ EventMesh.publish("set_wait_voice_flag",1)#修改60S标志位
+ EventMesh.publish(WEB_CMD_ENUM.GET_NEW_VOICE_MSG_S)
+
+ def get_app_new_voice_flag(self,event,msg):
+ return self.app_new_voice_flag
+ def set_app_new_voice_flag(self,event,msg):
+ self.app_new_voice_flag = msg
+ def get_1M_flag(self,event,msg):
+ return self._1M_flag
+ def get_60S_voice_flag(self,event,msg):
+ return self._60S_voice_flag
+ def set_60S_voice_flag(self,event,msg):
+ self._60S_voice_flag = msg
+ def set_1M_nowplay_flag(self,event,msg):
+ self._1M_nowplay_flag = msg
+ def set_is_listen_wait(self,event,msg):
+ self.is_listen_wait = msg
+class IOTWeb_put_voice_msg_stateProtoCol(ProtoCol):
+ """put_voice_msg_state"""
+ TYPE = "put_voice_msg_state"
+
+ def send(self, event, msg):
+ print("send put_voice_msg_state{}".format(msg))
+ # 通过websocket发送到服务器端
+
+ send_data = b''
+ send_data = protocol_send_total_data(msg)
+ print("send send_data{}".format(send_data))
+ EventMesh.publish("CHANNEL_IOT_WEB_SEND",send_data)
+
+ def recv(self, event, msg):
+ """
+
+ @param event:put_voice_msg_state
+ @param msg: 接收到的下行数据
+ """
+ print("recv put_voice_msg_state{}".format(msg))
+#收到蓝牙连接记录获取请求
+class IOTWeb_get_bt_connect_record_listProtoCol(ProtoCol):
+ """get_bt_connect_record_list"""
+ TYPE = "get_bt_connect_record_list"
+
+ def send(self, event, msg):
+ print("send get_bt_connect_record_list{}".format(msg))
+ # 通过websocket发送到服务器端
+ date_tmp = utime.localtime()
+ time_tmp = utime.mktime(date_tmp)
+ get_bt_connect_record_list = {
+ "cmd":"dispatch_rest",
+ "ts":time_tmp,
+ "msg":"消息收到响应",
+ "data":{
+ "cmd":"get_bt_connect_record_list",
+ "rest":"success",
+ "msg":"收到蓝牙连接记录获取请求"
+ }
+ }
+ send_data = b''
+ send_data = protocol_send_total_data(get_bt_connect_record_list)
+ print("send send_data{}".format(send_data))
+ EventMesh.publish("CHANNEL_IOT_WEB_SEND",send_data)
+
+ def recv(self, event, msg):
+ """
+
+ @param event:get_bt_connect_record_list
+ @param msg: 接收到的下行数据
+ """
+ # {
+ # "cmd":"get_bt_connect_record_list",
+ # "ts":1738283829,
+ # "msg":"上报蓝牙连接列表",
+ # "data": None
+ # }
+ EventMesh.publish("send_get_connect_bt_state")
+ EventMesh.publish(WEB_CMD_ENUM.GET_BT_CONNECT_RECORD_LIST_S)
+ print("recv get_bt_connect_record_list{}".format(msg))
+
+#蓝牙开关
+class IOTWeb_switch_bt_stateProtoCol(ProtoCol):
+ """switch_bt_state"""
+ TYPE = "switch_bt_state"
+
+ def send(self, event, msg):
+ # print("send switch_bt_state{}".format(msg))
+ # 通过websocket发送到服务器端
+ date_tmp = utime.localtime()
+ time_tmp = utime.mktime(date_tmp)
+ # {
+ # "cmd":"dispatch_rest",
+ # "ts":1738283829,
+ # "msg":"消息收到响应",
+ # "data":{
+ # "cmd":"switch_bt_state",
+ # "rest":"success|error",
+ # "msg":"收到蓝牙已打开/蓝牙已关闭指令"
+ # }
+ # }
+ s_msg = "蓝牙已关闭指令"
+ if msg == "1":
+ s_msg = "收到蓝牙已打开"
+ elif msg == "0":
+ s_msg = "蓝牙已关闭指令"
+ switch_bt_state = {
+ "cmd":"dispatch_rest",
+ "ts":time_tmp,
+ "msg":"消息收到响应",
+ "data":{
+ "cmd":"switch_bt_state",
+ "rest":"success",
+ "msg":s_msg
+ }
+ }
+ send_data = b''
+ send_data = protocol_send_total_data(switch_bt_state)
+ print("send_data switch_bt_state{}".format(send_data))
+ EventMesh.publish("CHANNEL_IOT_WEB_SEND", send_data)
+
+ def recv(self, event, msg):
+ """
+
+ @param event:上行下发switch_bt_state
+ @param msg: 接收到的下行数据
+ """
+ s_state = "1"
+ if "data" in msg:
+ data = msg["data"]
+ if data == "0":
+ s_state = "0"
+ EventMesh.publish("set_storage_config",["switch_bt_state","0"])
+ EventMesh.publish("send_bt_switch_toble","0")
+ pass
+ elif data == "1":
+ s_state = "1"
+ EventMesh.publish("set_storage_config",["switch_bt_state","1"])
+ EventMesh.publish("send_bt_switch_toble","1")
+ pass
+ print("recv switch_bt_state{}".format(msg))
+
+ EventMesh.publish(WEB_CMD_ENUM.SWITCH_BT_STATE_S_CMD,s_state)
+
+#蓝牙扫描
+class IOTWeb_bt_scanProtoCol(ProtoCol):
+ """bt_scan"""
+ TYPE = "bt_scan"
+
+ def send(self, event, msg):
+ print("send schedule{}".format(msg))
+ # 通过websocket发送到服务器端
+ date_tmp = utime.localtime()
+ time_tmp = utime.mktime(date_tmp)
+ s_msg = ""
+ if msg == "1":
+ s_msg = "开始扫描附近设备"
+ elif msg == "0":
+ s_msg = "停止扫描附近设备"
+ bt_scan = {
+ "cmd":"dispatch_rest",
+ "ts":time_tmp,
+ "msg":"消息收到响应",
+ "data":{
+ "cmd":"bt_scan",
+ "rest":"success",
+ "msg":s_msg
+ }
+ }
+ send_data = b''
+ send_data = protocol_send_total_data(bt_scan)
+ print("send_data bt_scan{}".format(send_data))
+ EventMesh.publish("CHANNEL_IOT_WEB_SEND", send_data)
+
+ def recv(self, event, msg):
+ """
+
+ @param event:上行下发bt_scan
+ @param msg: 接收到的下行数据
+ """
+ # {
+ # "cmd":"bt_scan",
+ # "ts":1738283829,
+ # "msg":"开始扫描附近设备/停止扫描附近设备",
+ # "data":"0/1"
+ # }
+ s_ret = "1"
+ if "data" in msg:
+ data = msg["data"]
+ if data == "1":
+ s_ret = "1"
+ EventMesh.publish("send_ble_scan","1")
+ elif data == "0":
+ s_ret = "0"
+ EventMesh.publish("send_ble_scan","0")
+
+ pass
+
+ print("recv bt_scan{}".format(msg))
+ EventMesh.publish(WEB_CMD_ENUM.BT_SCAN_S_CMD,s_ret)
+
+#蓝牙当前状态
+class IOTWeb_get_bt_stateProtoCol(ProtoCol):
+ """get_bt_state"""
+ TYPE = "get_bt_state"
+
+ def send(self, event, msg):
+ print("send schedule{}".format(msg))
+ # 通过websocket发送到服务器端
+ date_tmp = utime.localtime()
+ time_tmp = utime.mktime(date_tmp)
+ bt_state ={
+ "cmd":"dispatch_rest",
+ "ts":time_tmp,
+ "msg":"消息收到响应",
+ "data":{
+ "cmd":"get_bt_state",
+ "rest":msg,
+ "msg":"上报蓝牙开关状态"
+ }
+ }
+ send_data = b''
+ send_data = protocol_send_total_data(bt_state)
+ print("send_data bt_state{}".format(send_data))
+ EventMesh.publish("CHANNEL_IOT_WEB_SEND", send_data)
+
+ def recv(self, event, msg):
+ """
+
+ @param event:上行下发bt_state
+ @param msg: 接收到的下行数据
+ """
+ print("recv bt_state{}".format(msg))
+ switch_bt_state = EventMesh.publish("get_storage_config","switch_bt_state")
+ if switch_bt_state == None:
+ switch_bt_state = "1"
+
+ EventMesh.publish(WEB_CMD_ENUM.GET_BT_STATE_S,str(switch_bt_state))
+
+#蓝牙扫描列表
+class IOTWeb_bt_scan_restProtoCol(ProtoCol):
+ """bt_scan_rest"""
+ TYPE = "bt_scan_rest"
+
+ def send(self, event, msg):
+ print("send bt_scan_rest{}".format(msg))
+ # 通过websocket发送到服务器端
+
+ send_data = b''
+ send_data = protocol_send_total_data(msg)
+ print(" bt_scan_rest{}".format(send_data))
+ EventMesh.publish("CHANNEL_IOT_WEB_SEND", send_data)
+
+ def recv(self, event, msg):
+ """
+
+ @param event:上行下发bt_scan_rest
+ @param msg: 接收到的下行数据
+ """
+ print("recv bt_scan_rest{}".format(msg))
+
+
+#连接目标蓝牙设备
+class IOTWeb_connect_btProtoCol(ProtoCol):
+ """connect_bt"""
+ TYPE = "connect_bt"
+
+ def send(self, event, msg):
+ print("send connect_bt{}".format(msg))
+ # 通过websocket发送到服务器端
+ date_tmp = utime.localtime()
+ time_tmp = utime.mktime(date_tmp)
+ s_ret = "success"
+ if msg == 0:
+ s_ret = "error"
+ connect_bt = {
+ "cmd":"dispatch_rest",
+ "ts":time_tmp,
+ "msg":"消息收到响应",
+ "data":{
+ "cmd":"connect_bt",
+ "rest":s_ret,
+ "msg":"收到蓝牙连接请求"
+ }
+ }
+ send_data = b''
+ send_data = protocol_send_total_data(connect_bt)
+ print("send_data bt_state{}".format(send_data))
+ EventMesh.publish("CHANNEL_IOT_WEB_SEND", send_data)
+
+ def recv(self, event, msg):
+ """
+
+ @param event:上行下发connect_bt
+ @param msg: 接收到的下行数据
+ """
+ # {
+ # "cmd":"connect_bt",
+ # "ts":1738283829,
+ # "msg":"连接蓝牙设备",
+ # "data":"目标设备mac地址"
+ # }
+ ok = 1
+ if "data" in msg:
+ mac = msg["data"]
+ # mac = "36:72:cc:e6:dd:e8"#deep
+ # mac = "61:E8:6D:CD:7F:17" #Q36
+ # mac = "75:E8:8C:62:9A:DF" Fineblue Clip
+ if len(mac) == 17:
+ ok = 1
+ EventMesh.publish("send_connect_bt_mac",mac)
+ else:
+ ok = 0
+ EventMesh.publish(WEB_CMD_ENUM.CONNECT_BT_S,ok)
+ print("recv connect_bt{}".format(msg))
+#上报连接记录
+class IOTWeb_bt_connect_record_listProtoCol(ProtoCol):
+ """bt_connect_record_list"""
+ TYPE = "bt_connect_record_list"
+
+ def send(self, event, msg):
+ print("send bt_connect_record_list{}".format(msg))
+ # 通过websocket发送到服务器端
+ send_data = b''
+ send_data = protocol_send_total_data(msg)
+ print("send_data bt_state{}".format(send_data))
+ EventMesh.publish("CHANNEL_IOT_WEB_SEND", send_data)
+
+ def recv(self, event, msg):
+ """
+
+ @param event:上行下发bt_connect_record_list
+ @param msg: 接收到的下行数据
+ """
+ # {
+ # "cmd":"post_rest",
+ # "ts":1738283829,
+ # "msg":"消息收到响应",
+ # "data":{
+ # "cmd":"bt_connect_record_list",
+ # "rest":"success|error",
+ # "msg":"收到蓝牙连接记录列表"
+ # }
+ # }
+ print("recv bt_connect_record_list{}".format(msg))
+#断开设备蓝牙连接
+class IOTWeb_disconnect_btProtoCol(ProtoCol):
+ """disconnect_bt"""
+ TYPE = "disconnect_bt"
+
+ def send(self, event, msg):
+ print("send disconnect_bt{}".format(msg))
+ # 通过websocket发送到服务器端
+ date_tmp = utime.localtime()
+ time_tmp = utime.mktime(date_tmp)
+ disconnect_bt = {
+ "cmd":"dispatch_rest",
+ "ts":time_tmp,
+ "msg":"消息收到响应",
+ "data":{
+ "cmd":"disconnect_bt",
+ "rest":"success",
+ "msg":"断开蓝牙设备连接请求"
+ }
+ }
+ send_data = b''
+ send_data = protocol_send_total_data(disconnect_bt)
+ print("send_data bt_state{}".format(send_data))
+ EventMesh.publish("CHANNEL_IOT_WEB_SEND", send_data)
+
+ def recv(self, event, msg):
+ """
+
+ @param event:上行下发disconnect_bt
+ @param msg: 接收到的下行数据
+ """
+ #{
+ # 'msg': '断开设备蓝牙',
+ # 'data': 'AB:12:34:56:78',
+ # 'ts': 1754555005787,
+ # 'cmd': 'disconnect_bt'}
+ if "data" in msg:
+ mac = msg["data"]
+ EventMesh.publish("send_disconnect_bt_mac",mac)
+ print("recv disconnect_bt{}".format(msg))
+ EventMesh.publish(WEB_CMD_ENUM.DISCONNECT_BT_S)
+class IOTWeb_find_deviceProtoCol(ProtoCol):
+ """find_device"""
+ TYPE = "find_device"
+
+ def send(self, event, msg):
+ # print("c{}".format(msg))
+ # 通过websocket发送到服务器端
+ date_tmp = utime.localtime()
+ time_tmp = utime.mktime(date_tmp)
+ come_trans = {
+ "msg": "查找设备",
+ "data": None,
+ "cmd": "find_device",
+ "ts": time_tmp
+ }
+ send_data = b''
+ send_data = protocol_send_total_data(come_trans)
+ print("send_data find_device{}".format(send_data))
+ EventMesh.publish("CHANNEL_IOT_WEB_SEND", send_data)
+
+ def recv(self, event, msg):
+ """
+ @param event:上行下发translate_app_enter
+ @param msg: 接收到的下行数据
+ """
+ tts_str = "我在这呀,我在这呀,我在这呀 "
+ EventMesh.publish("play_tts", [tts_str, 1, "find_device"])
+
+#接收小程序控制上传设备状态
+class IOTWeb_get_device_stateProtoCol(ProtoCol):
+ """get_device_state"""
+ TYPE = "get_device_state"
+
+ def send(self, event, msg):
+ 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
+ Timeversion = version_util.get_unified_version()
+ ts = utime.mktime(utime.localtime())
+ come_trans = {
+ "data":{
+ "version":Timeversion,#版本号
+ "charge":battery_state,#0表示未充电,1表示充电中
+ "currentRoleName":"",#当前音色的name
+ "volume":str(VC_TTS_volume),#百分比数值
+ "wifiRssi":str(net.csqQueryPoll()//6),#wifi强弱:0,1,2,3,4,5。转成这几个梯度
+ "battery":str(battery),#电量
+ "bargein": "0",#不能手动设置打断模式
+ "deviceId":modem.getDevImei(),#设备号
+ },
+ "cmd":"device_info",
+ "msg": "上报设备信息",
+ "ts": ts
+ }
+ send_data = b''
+ send_data = protocol_send_total_data(come_trans)
+ print("send_data get_device_state{}".format(send_data))
+ EventMesh.publish("CHANNEL_IOT_WEB_SEND", send_data)
+
+ def recv(self, event, msg):
+ """
+ @param event:get_device_state
+ @param msg: 接收到的下行数据
+ """
+ EventMesh.publish(WEB_CMD_ENUM.GET_DEVICE_STATE_S)
+
+#接收小程序控制设备音量
+class IOTWeb_switch_volumeProtoCol(ProtoCol):
+ """switch_volume"""
+ TYPE = "switch_volume"
+
+ def send(self, event, msg):
+ # print("c{}".format(msg))
+ # 通过websocket发送到服务器端
+ date_tmp = utime.localtime()
+ time_tmp = utime.mktime(date_tmp)
+ come_trans = {
+ "msg": "设置音量",
+ "data": None,
+ "cmd": "switch_volume",
+ "ts": time_tmp
+ }
+ send_data = b''
+ send_data = protocol_send_total_data(come_trans)
+ print("send_data switch_volume{}".format(send_data))
+ EventMesh.publish("CHANNEL_IOT_WEB_SEND", send_data)
+
+ def recv(self, event, msg):
+ """
+ @param event:switch_volume
+ @param msg: 接收到的下行数据
+ """
+ volume = int(msg["data"]["target"]) + 100
+ print("音量修改为:{}".format(volume-100))
+ EventMesh.publish("change_volume",volume)
+
+
+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(len(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:
+ playpolad_data(data)
+ # EventMesh.publish(ProtoCol_type, data) #返回协议read
+ except Exception as e:
+ EventMesh.debug_log("handler:ERROR:")
+ usys.print_exception(e)
+ EventMesh.debug_log("handler:error data:{}".format(len(data)))
-# -*- coding: utf-8 -*-\r
-"""按键、电源、USB、按键队列。"""\r
-from common import Abstract\r
-try:\r
- from qp_log import qp_print as print\r
-except Exception:\r
- pass\r
-import EventMesh\r
-import usys\r
-import utime\r
-import audio\r
-import osTimer\r
-import dataCall\r
-import sim\r
-from machine import Pin, ExtInt\r
-from machine import WDT\r
-import modem\r
-import ntptime\r
-import _thread\r
-from queue import Queue\r
-from misc import Power, USB, PowerKey\r
-import constants\r
-try:\r
- import vc_config\r
-except Exception:\r
- vc_config = None\r
-from vc_common import dev_type\r
-from vc_hw import set_ipv4_datacall, _BatteryCfg\r
-from vc_uart import AI_UART\r
-\r
-audio_buf = ['chaobingfatis', 'chenggong', 'didianguanji', 'IMEIhao', 'jianquancuowu', 'key_prompt', 'liuliangtishi', 'Low_power_warning', 'R_CHARGE_FULL', 'R_CHARGE_IN', 'R_CHARGE_OUT', 'R_READ_TIME_0', 'R_READ_TIME_1', 'R_READ_TIME_2', 'R_READ_TIME_3', 'R_READ_TIME_4', 'R_READ_TIME_5', 'R_READ_TIME_6', 'R_READ_TIME_7', 'R_READ_TIME_8', 'R_READ_TIME_9', 'R_READ_TIME_A', 'R_READ_TIME_B', 'R_READ_TIME_C', 'R_READ_TIME_D', 'R_READ_TIME_E', 'R_READ_TIME_F', 'R_READ_TIME_G', 'R_READ_TIME_H', 'R_READ_TIME_I', 'R_READ_TIME_J', 'R_READ_TIME_K', 'R_READ_TIME_L', 'R_READ_TIME_M', 'R_READ_TIME_N', 'R_READ_TIME_O', 'R_READ_TIME_P', 'R_READ_TIME_Q', 'R_READ_TIME_R', 'R_READ_TIME_S', 'R_READ_TIME_T', 'R_READ_TIME_U', 'R_READ_TIME_V', 'R_READ_TIME_W', 'R_READ_TIME_X', 'R_READ_TIME_Y', 'R_READ_TIME_Z', 'send_tone', 'shouhou', 'xinhaoruo1', 'zhengzaiguanji']\r
-class AI_dev(Abstract):\r
- # AI\r
- def __init__(self):\r
- # if(dev_type != "7PIN"):\r
- # set_ipv4_datacall()\r
- self.is_wdt = 0 #是否开启看门狗\r
- #AT+QDAI=1,0,0,1,0,0,1,1PCM音频输出设置为主模式、短同步、16 kHz采样率和256 kHz时钟频率,采样位深为16bit,使用的时间间隙数量为1,并且使用第一个时间间隙。\r
- try:\r
- bt_pm_en = False\r
- pin_bt_on = None\r
- pin_mot = None\r
- qdai_cfg = None\r
- if "vc_config" in globals() and vc_config:\r
- bt_pm_en = bool(vc_config.get_attr("BT_POWER_MOTOR_ENABLED", False))\r
- pin_bt_on = vc_config.get_attr("PIN_BT_ON_GPIO", None)\r
- pin_mot = vc_config.get_attr("PIN_MOT_GPIO", None)\r
- qdai_cfg = vc_config.get_attr("AUDIO_QDAI_CFG", None)\r
- except Exception:\r
- bt_pm_en = False\r
- pin_bt_on = None\r
- pin_mot = None\r
- qdai_cfg = None\r
-\r
- if bt_pm_en:\r
- try:\r
- if pin_bt_on:\r
- self.PIN_BT_ON = Pin(getattr(Pin, pin_bt_on), Pin.OUT, Pin.PULL_DISABLE, 0)\r
- if pin_mot:\r
- self.PIN_MOT = Pin(getattr(Pin, pin_mot), Pin.OUT, Pin.PULL_DISABLE, 1)\r
- except Exception:\r
- pass\r
- try:\r
- utime.sleep_ms(200)\r
- if hasattr(self, "PIN_MOT"):\r
- self.PIN_MOT.write(0)\r
- if hasattr(self, "PIN_BT_ON"):\r
- self.PIN_BT_ON.write(1)\r
- except Exception:\r
- pass\r
- try:\r
- if isinstance(qdai_cfg, (tuple, list)) and len(qdai_cfg) == 8:\r
- audio.set_qdai_cfg(*qdai_cfg) # 用iis做音频输入输出\r
- except Exception:\r
- pass\r
- self.KeyAI_status = 0\r
- self.KeyAI_timer_count = 0\r
- self.KeyAI_long_press = 0\r
- self.KeySos_long_press = 0\r
- self.KeyAI_press = 0\r
- self.last_ai_key_time = 0#让ai按键不要频繁调用\r
- if self.is_wdt == 1:\r
- self.wdt = WDT(30) #开启看门狗\r
- # self.wdt_timer = osTimer()\r
- # self.wdt_timer.start(5000, 1, self.wdt_timer_cb)\r
- \r
- count = 0\r
- while True:\r
- count += 1\r
- if count > 20 :\r
- break\r
- data = dataCall.getInfo(1, 0)\r
- print("data call INFO {}".format(data))\r
- if data[2][0]:\r
- self.network_state = 1\r
- break\r
- print("等待网络 {}...".format(count))\r
- utime.sleep_ms(500)\r
- self.KeyAI_timer = osTimer()\r
- self.KeySOS_timer = osTimer()\r
- self.play_imei_timer = osTimer()\r
- self.play_imei_timer_count=0\r
- self.KeySOS_timer_count = 0\r
- self.KeySOS_timer_flag = 0\r
- self._single_power_ai_merged = False\r
- self._pwk_shutdown_ticks = 30 # 100ms 节拍,默认 3s\r
- try:\r
- ai_gpio = "GPIO22"\r
- pwk_gpio = "GPIO26"\r
- bt_wakeup_en = False\r
- wakeup_cta1_gpio = None\r
- wakeup_bt_gpio = None\r
- if "vc_config" in globals() and vc_config:\r
- raw_ai = vc_config.get_attr("EXTINT_AI_GPIO", "GPIO22")\r
- if raw_ai is None or raw_ai == "":\r
- ai_gpio = None\r
- else:\r
- ai_gpio = raw_ai\r
- pwk_gpio = vc_config.get_attr("PWK_KEY_GPIO", "GPIO26") or "GPIO26"\r
- bt_wakeup_en = bool(vc_config.get_attr("BT_WAKEUP_4G_ENABLED", False))\r
- wakeup_cta1_gpio = vc_config.get_attr("EXTINT_WAKEUP_CTA1_GPIO", None)\r
- wakeup_bt_gpio = vc_config.get_attr("PIN_WAKEUP_BT_GPIO", None)\r
- try:\r
- self._single_power_ai_merged = bool(\r
- vc_config.get_bool("SINGLE_POWER_KEY_AI_MERGED", False)\r
- ) or (ai_gpio is None)\r
- except Exception:\r
- self._single_power_ai_merged = ai_gpio is None\r
- try:\r
- _pwk_ms = int(vc_config.get_int("PWK_LONG_PRESS_SHUTDOWN_MS", 3000))\r
- except Exception:\r
- _pwk_ms = 3000\r
- self._pwk_shutdown_ticks = max(1, (_pwk_ms + 99) // 100)\r
- except Exception:\r
- ai_gpio = "GPIO22"\r
- pwk_gpio = "GPIO26"\r
- bt_wakeup_en = False\r
- wakeup_cta1_gpio = None\r
- wakeup_bt_gpio = None\r
-\r
- if ai_gpio:\r
- self.extint_AI = ExtInt(\r
- getattr(ExtInt, ai_gpio),\r
- ExtInt.IRQ_RISING_FALLING,\r
- ExtInt.PULL_PU,\r
- self.keyAI_extint_cb,\r
- )\r
- self.extint_AI.enable()\r
- else:\r
- self.extint_AI = None\r
-\r
- self.pwk_key = ExtInt(getattr(ExtInt, pwk_gpio), ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.pwk_extint_cb)\r
-\r
- if bt_wakeup_en:\r
- try:\r
- if wakeup_cta1_gpio:\r
- self.extint_wakeup_cta1 = ExtInt(getattr(ExtInt, wakeup_cta1_gpio), ExtInt.IRQ_RISING, ExtInt.PULL_DISABLE, self.wakeup_extint_cb)\r
- if wakeup_bt_gpio:\r
- self.PIN_wakeup_bt = Pin(getattr(Pin, wakeup_bt_gpio), Pin.OUT, Pin.PULL_DISABLE, 0)\r
- self.extint_wakeup_cta1_timer = osTimer()\r
- if hasattr(self, "extint_wakeup_cta1"):\r
- self.extint_wakeup_cta1.enable()\r
- except Exception:\r
- pass\r
-\r
- self.pwk_key_status = 0\r
- self.pwk_key_timer_count = 0\r
- self.pwk_key_long_press = 0\r
- self.pwk_key_press = 0\r
- self.powerKey_status = 0\r
- self.pwk_key_timer = osTimer()\r
- self.pwk_is_double_timer = osTimer()\r
- self.double_click_threshold = 1000#双击间隔时间\r
- self.pwk_press_count = 0#按下次数\r
- self.last_key_time = 0 # 上一次有效触发时间\r
- self.key_debounce_interval = 20 # 防抖窗口20ms,标准值\r
- #self.pwk_key = ExtInt(ExtInt.GPIO26, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_DISABLE, self.pwk_extint_cb)\r
- \r
- self.pwk_key.enable() \r
- print("AI_dev:1")\r
- self.btnInfo_queue = Queue(100)\r
- self.btnInfo_queue_count = 0\r
- _thread.stack_size(16*1024)\r
- self.btnInfo_queue_thread_id = _thread.start_new_thread(self.btnInfo_queue_thread, ())\r
- _thread.stack_size(8*1024)\r
- EventMesh.subscribe("publish_AI_btnInfo",self.publish_AI_btnInfo)\r
- EventMesh.subscribe("get_battery",self.get_battery)\r
- EventMesh.subscribe("audio_montage_play",self.audio_montage_play)\r
- # EventMesh.subscribe("paly_iccid_imei",self.paly_iccid_imei)\r
- EventMesh.subscribe("paly_device_res_error",self.paly_device_res_error)\r
- EventMesh.subscribe("Power_off",self.pwk_key_Long_Press)\r
- EventMesh.subscribe("wakeup_BT",self.wakeup_BT)\r
- EventMesh.subscribe("sleep_BT",self.sleep_BT)\r
- EventMesh.subscribe("sys_sleep_cb",self.sys_sleep_cb)#系统休眠前回调\r
- EventMesh.subscribe("sys_up_cb",self.sys_up_cb)#系统唤醒后回调\r
- \r
- EventMesh.subscribe("GET_USB_STATE",self.get_usb_state)\r
- EventMesh.subscribe("SET_SPEECH_RATE",self.set_speech_rate)\r
- EventMesh.subscribe("rest_TB",self.rest_TB)\r
- \r
- print("AI_dev:2")\r
- self.pk = PowerKey()\r
- self.pk.powerKeyEventRegister(self.powerKey_callback)\r
- self.usb = USB()\r
- self.usb.setCallback(self.usb_event_cb)\r
- self.usb_status = self.usb.getStatus()\r
- self.usb_charge_flag = 0\r
- self._usb_evt_last_ms = 0\r
- self._usb_evt_last_state = -1\r
- self.Low_power_warning_timer = 0\r
- self.AI_dev_timer = osTimer()\r
- self.AI_dev_timer.start(10000, 1, self.AI_dev_timer_cb)\r
- print("AI_dev:AI_dev_timer")\r
- self.aud = audio.Audio(0)\r
- self.Low_power_warning_flag = 0\r
- self._low_warn_last_ms = 0\r
- self._empty_shutdown_done = 0\r
- self.VC_TTS_volume = EventMesh.publish("get_storage_config","VC_TTS_volume")#音量配置\r
- if self.VC_TTS_volume == None:\r
- self.VC_TTS_volume = 100\r
- self.aud.setVolume(self.VC_TTS_volume //10)\r
- EventMesh.publish("set_storage_config",["VC_TTS_volume",self.VC_TTS_volume])\r
- #self.aud.play(1,0,'U:/static/xianyikaiji.mp3')#开机音频\r
- #EventMesh.publish("audio_montage_play",["xianyikaiji.mp3"])\r
- #EventMesh.publish("publish_AI_btnInfo",{"func":self.ntptime_cb})\r
- self.check_rest_timer_count = 0\r
- try:\r
- if "vc_config" in globals() and vc_config and vc_config.uart_supported():\r
- self.ai_uart = AI_UART()\r
- except Exception:\r
- pass\r
-\r
- self.Keycall1_press_count = 0\r
- self.ble_switch_flag_time = osTimer()\r
- self.ble_switch_flag_time.start(20000, 0, self.ble_switch_flag_time_init)\r
- # AI_hw_status 先于本模块初始化,开机已插 USB 时需补同步一次\r
- try:\r
- if int(self.usb_status or 0) == 1:\r
- EventMesh.publish("hw_usb_state", 1)\r
- EventMesh.publish("publish_AI_btnInfo", {"func": self.usb_event, "data": 1})\r
- except Exception:\r
- pass\r
- def ble_switch_flag_time_init(self,*args):\r
- EventMesh.publish("publish_AI_btnInfo",{"func":self.ble_switch_flag_time_cb})\r
- def ble_switch_flag_time_cb(self,*args):\r
- bt_switch_flag = EventMesh.publish("get_storage_config","switch_bt_state")#bt开关\r
- if bt_switch_flag == None:\r
- bt_switch_flag = "1"\r
- EventMesh.publish("send_bt_switch_toble",str(bt_switch_flag))\r
- # EventMesh.publish("send_imei_to_ble")\r
- ble_switch_flag = EventMesh.publish("get_storage_config","switch_ble_state")#ble开关\r
- if ble_switch_flag == None:\r
- ble_switch_flag = "1"\r
- EventMesh.publish("send_ble_switch_toble",str(ble_switch_flag))\r
- vc_tts_volume = EventMesh.publish("get_storage_config","VC_TTS_volume")\r
- if vc_tts_volume == None:\r
- vc_tts_volume=100\r
- # EventMesh.publish("adjust_volume_toBle",str(vc_tts_volume))\r
-\r
- pass\r
- print("ble_switch_flag_time_cb!!!!!!!")\r
- def ntptime_cb(self):\r
- #ntptime.settime(8)\r
- print("timer:{}!!!!!!!!\r\n".format(utime.localtime()))\r
- def usb_event_cb(self, state):\r
- # USB 插拔抖动过滤(日志中 powerKey 与 usb_evt 0/1 连跳会导致误播 OUT/IN)\r
- try:\r
- now = utime.ticks_ms()\r
- last_ms = getattr(self, "_usb_evt_last_ms", 0)\r
- last_st = getattr(self, "_usb_evt_last_state", -1)\r
- if last_ms and utime.ticks_diff(now, last_ms) < 800 and last_st != state:\r
- return\r
- self._usb_evt_last_ms = now\r
- self._usb_evt_last_state = state\r
- except Exception:\r
- pass\r
- # 转发给精简硬件监控(AI_hw_status),避免 USB callback 被覆盖导致“后面失效”\r
- try:\r
- EventMesh.publish("hw_usb_state", state)\r
- except Exception:\r
- pass\r
- try:\r
- _BatteryCfg.instance().on_usb_change(1 if state == 1 else 0)\r
- except Exception:\r
- pass\r
- EventMesh.publish("publish_AI_btnInfo",{"func":self.usb_event,"data":state})\r
-\r
- def usb_event(self, state): \r
- status = state\r
- self.usb_charge_flag = 0\r
- if status == 1:#插入USB\r
- print("charge R_CHARGE_in")\r
- self.usb_status = 1\r
- VC_satrt_flag = EventMesh.publish("get_VC_satrt_flag")#获取vc是否在运行\r
- if VC_satrt_flag == None:\r
- VC_satrt_flag = 0\r
- \r
- voice_record_satrt_flag = EventMesh.publish("get_voice_record_flag")#获取静默或者语音留言是否在运行\r
- if voice_record_satrt_flag == None:\r
- voice_record_satrt_flag = 0\r
- if VC_satrt_flag == 0 and voice_record_satrt_flag == 0:\r
- self.aud.stop()\r
- #EventMesh.publish("flicker_led_red")#充电闪灯\r
- #self.aud.play(1,1,'U:/static/R_CHARGE_IN.mp3')\r
- try:\r
- if not ("vc_config" in globals() and vc_config and vc_config.get_bool("USE_MIN_HW_STATUS", True)):\r
- EventMesh.publish("set_led_state", {"charging": "charging"})\r
- except Exception:\r
- pass\r
- EventMesh.publish("audio_montage_play",["R_CHARGE_IN.mp3"])\r
- self.Low_power_warning_flag = 0\r
- try:\r
- self._empty_shutdown_done = 0\r
- except Exception:\r
- pass\r
- pass\r
- elif status == 0:#拨出usbs\r
- self.usb_status = 0\r
- VC_satrt_flag = EventMesh.publish("get_VC_satrt_flag")#获取vc是否在运行\r
- if VC_satrt_flag == None:\r
- VC_satrt_flag = 0\r
- voice_record_satrt_flag = EventMesh.publish("get_voice_record_flag")#获取静默或者语音留言是否在运行\r
- if voice_record_satrt_flag == None:\r
- voice_record_satrt_flag = 0\r
- if VC_satrt_flag == 0 and voice_record_satrt_flag == 0:\r
- self.aud.stop()\r
- try:\r
- if not ("vc_config" in globals() and vc_config and vc_config.get_bool("USE_MIN_HW_STATUS", True)):\r
- EventMesh.publish("set_led_state", {"charging": "none"})\r
- except Exception:\r
- pass\r
- EventMesh.publish("audio_montage_play",["R_CHARGE_OUT.mp3"])\r
- #self.aud.play(1,1,'U:/static/R_CHARGE_OUT.mp3')\r
- def get_usb_state(self,event,msg):\r
- return self.usb_status\r
- \r
- def set_speech_rate(self,event,msg):\r
- #msg的取值是0.5~2.0\r
- #而语速初始值是0,范围是-50~50\r
- rate = 0\r
- if msg == 0.5:\r
- rate = -50\r
- elif msg < 1:\r
- rate = (msg - 1)* 100\r
- elif msg >= 1:\r
- rate = (msg - 1)* 50\r
- rate = round(rate)\r
- print("速率已经设置为:{}".format(rate))\r
- EventMesh.publish("rate_change",rate)\r
- return rate\r
- def btnInfo_queue_thread(self):\r
- while True:\r
- data = self.btnInfo_queue.get()\r
- self.btnInfo_queue_count-=1\r
- #EventMesh.debug_log("Info_queue:data = {}".format(data))\r
- if data != None:\r
- try:\r
- if "data" in data :\r
- data["func"](data["data"])\r
- else :\r
- data["func"]()\r
- except Exception as e:\r
- #EventMesh.debug_log("btnInfo_queue:ERROR:{}".format(e))\r
- if "data" in data :\r
- print(data["data"])\r
- usys.print_exception(e)\r
- def publish_AI_btnInfo(self,event,msg):\r
- #print("publish_AI_btnInfo 1")\r
- self.btnInfo_queue.put(msg)\r
- self.btnInfo_queue_count+=1\r
- if self.btnInfo_queue_count > 80:\r
- self.btnInfo_queue_count =0\r
- print("事件处理线程队列出问题,重启!!!!!!!!!!!!!!")\r
- print("线程:{} 队列:{}".format(_thread.threadIsRunning(self.btnInfo_queue_thread_id),self.btnInfo_queue.size()))\r
- # if _thread.threadIsRunning(self.btnInfo_queue_thread_id):\r
- # _thread.stop_thread(self.btnInfo_queue_thread_id)\r
- # _thread.stack_size(10*1024)\r
- # self.btnInfo_queue_thread_id = _thread.start_new_thread(self.btnInfo_queue_thread, ())\r
- # _thread.stack_size(8*1024)\r
- # self.btnInfo_queue.clear()\r
- # self.btnInfo_queue = Queue(100)\r
- EventMesh.publish("VC_error") #播放报错\r
- utime.sleep_ms(1000)\r
- self.aud.stopPlayStream()\r
- self.aud.stopAll()\r
- Power.powerRestart()\r
- EventMesh.publish("set_storage_config",["powerRestart",1])\r
- #print("publish_AI_btnInfo 2")\r
- \r
- def sys_sleep_cb(self,event=None,msg=None):#休眠前回调\r
- try:\r
- if not ("vc_config" in globals() and vc_config and vc_config.get_bool("BT_WAKEUP_4G_ENABLED", False)):\r
- return\r
- except Exception:\r
- return\r
- print("sys_sleep_cb!!!!!!!!!!!!!!!")\r
- EventMesh.publish("sleep_BT")#休眠蓝牙\r
- self.PIN_wakeup_bt.write(0)\r
- def sys_up_cb(self,event=None,msg=None):#唤醒前回调\r
- try:\r
- if not ("vc_config" in globals() and vc_config and vc_config.get_bool("BT_WAKEUP_4G_ENABLED", False)):\r
- return\r
- except Exception:\r
- return\r
- print("sys_up_cb!!!!!!!!!!!!!!!")\r
- self.wakeup_BT()\r
- self.PIN_wakeup_bt.write(1)\r
- def rest_TB(self,event=None,msg=None):\r
- print("rest_TB!!!!!!!!!!!!!!!")\r
- self.PIN_BT_ON.write(0)\r
- utime.sleep_ms(100)\r
- self.PIN_BT_ON.write(1)\r
- def wakeup_BT(self,event=None,msg=None):#4G唤醒蓝牙\r
- try:\r
- if not ("vc_config" in globals() and vc_config and vc_config.get_bool("BT_WAKEUP_4G_ENABLED", False)):\r
- return\r
- except Exception:\r
- return\r
- print("wakeup_BT!!!!!!!!!!!!!!!")\r
- wakeup_cta1_io = self.extint_wakeup_cta1.read_level()\r
- if wakeup_cta1_io == 1:\r
- return 1\r
- self.PIN_wakeup_bt.write(0)\r
- count = 5\r
- while(True):\r
- count-=1\r
- if count<=0:\r
- return -1\r
- wakeup_cta1_io = self.extint_wakeup_cta1.read_level()\r
- print("bt io状态:{}".format(wakeup_cta1_io))\r
- if wakeup_cta1_io == 1:\r
- self.PIN_wakeup_bt.write(1)\r
- return 1\r
- utime.sleep_ms(100)\r
- if count%2 == 0:\r
- self.PIN_wakeup_bt.write(1)\r
- else:\r
- self.PIN_wakeup_bt.write(0)\r
-\r
- \r
- def sleep_BT(self,event=None,msg=None):#使蓝牙休眠\r
- try:\r
- if not ("vc_config" in globals() and vc_config and vc_config.get_bool("BT_WAKEUP_4G_ENABLED", False)):\r
- return\r
- except Exception:\r
- return\r
- print("sleep_BT!!!!!")\r
- print("sleep_BT!!!!!")\r
- print("sleep_BT!!!!!")\r
- print("sleep_BT!!!!!")\r
- self.PIN_wakeup_bt.write(0)\r
- count = 300\r
- while(True):\r
- count-=1\r
- if count<=0:\r
- return -1\r
- if self.extint_wakeup_cta1.read_level() == 0:\r
- return 1\r
- utime.sleep_ms(1)\r
- \r
- \r
- def wakeup_extint_cb(self,args):#蓝牙唤醒4g\r
- try:\r
- if not ("vc_config" in globals() and vc_config and vc_config.get_bool("BT_WAKEUP_4G_ENABLED", False)):\r
- return\r
- except Exception:\r
- return\r
- print("wakeup_extint_cb:!!!!!!!!!")\r
- EventMesh.publish(constants.EVENT.SYSTEM_UP)#唤醒休眠\r
- self.PIN_wakeup_bt.write(1)\r
- EventMesh.publish("publish_AI_btnInfo",{"func":self.extint_wakeup_cta1_cb})\r
- def extint_wakeup_cta1_cb(self):\r
- #self.extint_wakeup_cta1_timer.start(100, 1, self.extint_wakeup_cta1_timer_cb)\r
- pass\r
- def extint_wakeup_cta1_timer_cb(self, *args, **kwargs):\r
- if self.extint_wakeup_cta1.read_level() == 0:\r
- self.extint_wakeup_cta1_timer.stop()\r
- #self.PIN_wakeup_bt.write(0)\r
-\r
- def powerKey_callback(self, status):\r
- try:\r
- EventMesh.debug_log("==pwr:", status)\r
- except Exception:\r
- print("powerKey_callback:{}".format(status))\r
- self.powerKey_status = status\r
- if self.pwk_key_press == 1:\r
- return\r
-\r
- def pwk_extint_cb(self,args):#pwk\r
- current_time = 0\r
- interval = 0\r
-\r
- try:\r
- #按键电平判断\r
- press_level = 0\r
- current_level = self.pwk_key.read_level()\r
- if current_level != press_level:\r
- return # 非按下状态,直接返回\r
-\r
- #消抖处理\r
- current_time = utime.ticks_ms()\r
- if utime.ticks_diff(current_time, self.last_key_time) < self.key_debounce_interval:\r
- return\r
- self.last_key_time = current_time # 更新最后按键时间\r
- print("pwk 按键按下")\r
-\r
- #仅处理"按下瞬间"事件(避免重复触发)\r
- if len(args) < 2:\r
- print("args参数不足,跳过")\r
- return\r
- self.pwk_key_status = int(args[1])\r
- if self.pwk_key_status != 1:\r
- return\r
-\r
- #双击计数逻辑\r
- self.pwk_press_count += 1\r
- current_time = utime.ticks_ms()\r
-\r
- #第一次按下(启动长按定时器+双击等待)\r
- if self.pwk_press_count == 1:\r
- self.pwk_first_press_time = current_time # 记录首次按下时间\r
- self.pwk_key_long_press = 0 # 重置长按标记\r
- self.pwk_key_timer_count = 0 # 重置定时器计数\r
- self.pwk_key_press = 1 # 标记按键按下\r
- \r
- # 停止旧定时器,启动长按/单击判定定时器(100ms单次触发,循环靠回调自启)\r
- self.pwk_key_timer.stop()\r
- self.pwk_key_timer.start(100, 1, self.pwk_key_timer_cb)\r
- print("第一次按下,等待第二次按下")\r
- if getattr(self, "_single_power_ai_merged", False):\r
- self._merged_pwk_ai_press_start()\r
-\r
- #第二次按下(双击判断)\r
- elif self.pwk_press_count == 2:\r
- # 计算两次按下间隔\r
- interval = utime.ticks_diff(current_time, self.pwk_first_press_time)\r
- \r
- #符合双击阈值:执行双击逻辑\r
- if interval <= self.double_click_threshold:\r
- self.pwk_key_timer.stop() # 停止长按定时器(关键:避免触发长按)\r
- self.pwk_key_double_press() # 执行双击业务\r
- print("双击生效")\r
- # 重置所有状态\r
- self.pwk_press_count = 0\r
- self.pwk_key_press = 0\r
- self.pwk_key_timer_count = 0\r
-\r
- #间隔过长:视为新的第一次按下\r
- else:\r
- self.pwk_first_press_time = current_time # 更新首次按下时间\r
- self.pwk_press_count = 1 # 重置为第一次按下\r
- print("间隔过长,视为新的第一次按下")\r
-\r
- #按下次数超过2次(防计数溢出)\r
- else:\r
- self.pwk_press_count = 0\r
- self.pwk_key_timer.stop()\r
- print("按键次数过多,重置计数")\r
-\r
- except Exception as e:\r
- # 异常时重置所有状态,避免卡死\r
- self.pwk_press_count = 0\r
- self.pwk_key_press = 0\r
- self.pwk_key_timer_count = 0\r
- self.pwk_key_timer.stop()\r
- usys.print_exception(e)\r
-\r
-\r
- def pwk_is_double_judge(self, *args):\r
- # if self.press_count == 1: # 仅一次按下,判定为单击\r
- \r
- # 重置计数(无论何种情况,超时后清零)\r
- self.pwk_press_count = 0\r
-\r
-\r
- def pwk_key_timer_cb(self, *args, **kwargs):\r
- EventMesh.publish("set_wait_first_flag",0)\r
- EventMesh.publish("set_history_board_flag",0)\r
- EventMesh.publish("set_play_new_voice_state",0)\r
- EventMesh.publish("set_history_voice_flag",0)\r
- EventMesh.publish("set_wait_voice_flag",0)\r
- EventMesh.publish("set_stop_play",0)\r
- # EventMesh.publish("publish_AI_btnInfo",{"func":self.pwk_key_timer_cb_})\r
- # def pwk_key_timer_cb_(self) :\r
- try:\r
- self.pwk_key_status = self.pwk_key.read_level()\r
- self.pwk_key_timer_count +=1\r
- if self.pwk_key_timer_count >= self._pwk_shutdown_ticks:\r
- #print("pwk_key_long_press {}".format(self.pwk_key_long_press))\r
- if self.pwk_key_long_press == 0:\r
- self.pwk_key_long_press = 1\r
- #EventMesh.publish("AI_key_long_press")\r
- # EventMesh.publish("audio_montage_play",["zhengzaiguanji.mp3"])\r
- self.aud.play(1,0,'U:/static/zhengzaiguanji.mp3')#关机音频\r
- EventMesh.publish("set_led_state", {"battery": "empty"})\r
- utime.sleep_ms(2000)\r
- self.aud.stopPlayStream()\r
- self.aud.stopAll()\r
- Power.powerDown()\r
- #print("AI_key_release")\r
- #EventMesh.publish("pwk_key_long_press")\r
- #EventMesh.publish("publish_AI_btnInfo",{"func":self.pwk_key_Long_Press}) \r
- if self.pwk_key_status == 1:#松开\r
- #print("pwk_key_timer_cb:{}".format(self.pwk_key_timer_count))\r
- try:\r
- key_count = vc_config.get_int("KEY_RELEASE_DEBOUNCE_COUNT", 5)\r
- except Exception:\r
- key_count = 5\r
- if self.pwk_key_timer_count >= key_count: #防抖200ms\r
- #EventMesh.publish("AI_key_release")\r
- EventMesh.publish("publish_AI_btnInfo",{"func":self.pwk_key_release})\r
- self.pwk_key.enable()\r
- self.pwk_key_timer_count = 0\r
- self.pwk_key_press = 0\r
- self.pwk_press_count = 0#按下次数\r
- self.pwk_key_timer.stop()\r
- \r
- except Exception as e: \r
- usys.print_exception(e) \r
- \r
- def _ai_int_disable_for_hold(self):\r
- if self.extint_AI is not None:\r
- self.extint_AI.disable()\r
-\r
- def _ai_int_enable_after_hold(self):\r
- if self.extint_AI is not None:\r
- self.extint_AI.enable()\r
-\r
- def _key_ai_read_level(self):\r
- if self.extint_AI is not None:\r
- return self.extint_AI.read_level()\r
- return self.pwk_key.read_level()\r
-\r
- def _merged_pwk_ai_press_start(self):\r
- """单电源键:按下瞬间走原 AI 键按下链路(松手走 AI_key_release,不按电源短按 Close)。"""\r
- try:\r
- current_time = utime.ticks_ms()\r
- if utime.ticks_diff(current_time, self.last_ai_key_time) < 1:\r
- return\r
- self.last_ai_key_time = current_time\r
- if EventMesh.publish("get_wait_voice_flag") == 1:\r
- print("播放未读")\r
- EventMesh.publish("set_wait_voicerupt_flag", 1)\r
- return\r
- if EventMesh.publish("get_recv_voice") == 1:\r
- print("收到留言")\r
- EventMesh.publish("set_voicerupt_flag", 1)\r
- return\r
- if self.KeyAI_press == 0:\r
- EventMesh.publish(constants.EVENT.SYSTEM_UP)\r
- if EventMesh.publish("get_play_new_voice_state") == 1:\r
- EventMesh.publish("set_play_new_voice_state", 0)\r
- EventMesh.publish("set_VC_stop_play_audio_flag", 1)\r
- self._ai_int_disable_for_hold()\r
- self.KeyAI_press = 1\r
- self.KeyAI_long_press = 0\r
- self.KeyAI_timer.start(100, 1, self.KeyAI_timer_cb)\r
- self.KeyAI_timer_count = 0\r
- EventMesh.publish("vc_long_dialogue_key_down")\r
- EventMesh.publish("publish_AI_btnInfo", {"func": self.AI_key_press})\r
- except Exception as e:\r
- usys.print_exception(e)\r
-\r
- def keyAI_extint_cb(self,args):#call 2\r
- try:\r
- if self.extint_AI is None:\r
- return\r
- #print("AI_btn:keyAI_extint_cb{}".format(args[1]))\r
- #定义最短触发间隔\r
- MIN_TRIGGER_INTERVAL = 1 # 可根据需求调整,单位ms\r
- #记录上次按键触发时间(初始化放类的__init__里:self.last_ai_key_time = 0)\r
- current_time = utime.ticks_ms() # 获取当前毫秒时间\r
- #重复按下,直接返回\r
- if utime.ticks_diff(current_time, self.last_ai_key_time) < MIN_TRIGGER_INTERVAL:\r
- print("AI按键触发过频,忽略本次操作")\r
- return\r
- #更新上次触发时间\r
- self.last_ai_key_time = current_time\r
-\r
- self.KeyAI_status = int(args[1])\r
- if self.KeyAI_status == 0:\r
- self.KeyAI_status = 1\r
- else:\r
- self.KeyAI_status = 0\r
- \r
- if self.KeyAI_status == 0:#按下\r
- if EventMesh.publish("get_wait_voice_flag") == 1:\r
- print("播放未读")\r
- EventMesh.publish("set_wait_voicerupt_flag",1)\r
- return\r
- if EventMesh.publish("get_recv_voice") == 1:#当处于收到留言的时候\r
- print("收到留言")\r
- EventMesh.publish("set_voicerupt_flag",1)\r
- return\r
- if self.KeyAI_press == 0 :\r
- EventMesh.publish(constants.EVENT.SYSTEM_UP)#唤醒休眠\r
- if EventMesh.publish("get_play_new_voice_state") == 1:\r
- EventMesh.publish("set_play_new_voice_state",0)\r
- \r
- EventMesh.publish("set_VC_stop_play_audio_flag",1)#按键按下不允许播放之前下发的音频数据\r
- self._ai_int_disable_for_hold()\r
- self.KeyAI_press = 1\r
- self.KeyAI_long_press = 0\r
- self.KeyAI_timer.start(100, 1, self.KeyAI_timer_cb)\r
- self.KeyAI_timer_count = 0\r
- #EventMesh.publish("AI_key_press")\r
- # if dev_type == "7PIN":\r
- # self.aud.aud_tone_play(10,100)#播放按键音\r
- \r
- EventMesh.publish("vc_long_dialogue_key_down")\r
- EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_key_press}) \r
- except Exception as e: \r
- usys.print_exception(e)\r
- def KeyAI_timer_cb(self, *args, **kwargs):\r
- # EventMesh.publish("publish_AI_btnInfo",{"func":self.KeyAI_timer_cb_})\r
- # def KeyAI_timer_cb_(self):\r
- try:\r
- self.KeyAI_status = self._key_ai_read_level()\r
- self.KeyAI_timer_count +=1\r
- if self.KeyAI_timer_count >= 10*1 : #长按1s \r
- \r
- if self.KeyAI_long_press == 0:\r
- self.KeyAI_long_press = 1\r
- #EventMesh.publish("AI_key_long_press")\r
- EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_key_long_press}) \r
- try:\r
- _sos_on = vc_config.get_bool("SOS_ENABLED", True)\r
- except Exception:\r
- _sos_on = True\r
- if _sos_on and self.KeyAI_timer_count >= 10*3 : #长按3s 上一次是短按则拨打sos紧急联系人\r
- print("long sos phone:{}".format(self.KeySOS_timer_flag))\r
- \r
- if self.KeySOS_timer_flag == 1:\r
- self.KeySOS_timer_flag=0\r
- self.KeySos_long_press = 1\r
- self.KeySOS_timer.stop()\r
- get_sos_flag = EventMesh.publish("get_sos_flag")\r
- if get_sos_flag == 0:\r
- EventMesh.publish("set_sos_info_call")\r
- pass\r
-\r
- elif self.KeyAI_timer_count >= 10*8:#关机\r
- try:\r
- allow_power_off = vc_config.get_bool("AI_LONG_PRESS_POWER_OFF_ENABLED", False)\r
- except Exception:\r
- allow_power_off = False\r
- if allow_power_off:\r
- EventMesh.publish("audio_montage_play",["zhengzaiguanji.mp3"])\r
- #self.aud.play(1,0,'U:/static/zhengzaiguanji.mp3')#关机音频\r
- EventMesh.publish("set_led_state", {"battery": "empty"})\r
- utime.sleep_ms(2000)\r
- self.aud.stopPlayStream()\r
- print("stopAll:8")\r
- self.aud.stopAll()\r
- Power.powerDown()\r
- if self.KeyAI_status == 1:#松开\r
- #print("KeyAI_timer_cb:{}".format(self.KeyAI_timer_count))\r
- try:\r
- key_count = vc_config.get_int("KEY_RELEASE_DEBOUNCE_COUNT", 5)\r
- except Exception:\r
- key_count = 5\r
- if self.KeyAI_timer_count >= key_count: #防抖200ms\r
- if self.KeySOS_timer_flag == 1:\r
- self.KeySOS_timer_flag = 0\r
- self.KeySos_long_press = 0\r
- self.KeySOS_timer.stop()\r
- print("KeySOS_timer_flag!!!!!!!!!!!!!!!") #短按两次需要清除标识\r
-\r
- if self.KeyAI_long_press == 0:\r
- try:\r
- _sos_on = vc_config.get_bool("SOS_ENABLED", True)\r
- except Exception:\r
- _sos_on = True\r
- if _sos_on and self.KeySOS_timer_flag == 0:\r
- self.KeySOS_timer_flag = 1\r
- self.KeySos_long_press = 0\r
- self.KeySOS_timer.start(5000, 0, self.KeySos_timer_cb) #短按开启5s定时器 5s之内没有长按3s则清除标识 长按3s拨打sos紧急联系人\r
- else:\r
- self.KeySOS_timer_flag = 0\r
- self.KeySos_long_press = 0\r
- self.KeySOS_timer.stop()\r
- \r
- #EventMesh.publish("AI_key_release")\r
- EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_key_release}) \r
- self._ai_int_enable_after_hold()\r
- self.KeyAI_timer.stop()\r
- self.KeyAI_timer_count = 0\r
- self.KeyAI_press = 0\r
- self.KeyAI_long_press=0\r
- \r
- except Exception as e: \r
- usys.print_exception(e) \r
- \r
- def AI_key_press(self):\r
- # EventMesh.publish("wakeup_BT")\r
- \r
- # if dev_type == "7PIN" or dev_type == "7PIN_coze" :\r
- # # self.aud.aud_tone_play(10,60)#播放按键音\r
- # EventMesh.publish("audio_montage_play",["chenggong.mp3"]) \r
- self.check_rest_timer_count = 0\r
- print("AI_key_press")\r
- EventMesh.publish("AI_key_press")\r
- def KeySos_timer_cb(self,*argc):\r
- print("KeySos_timer_cb!!!!!!!!!!{} {}".format(self.KeySos_long_press,self.KeySOS_timer_flag))\r
- \r
- if self.KeySos_long_press == 1 and self.KeySOS_timer_flag == 1: #清空sos标识\r
- self.KeySos_long_press=0\r
- self.KeySOS_timer_flag=0\r
- \r
- self.KeySos_long_press=0\r
- self.KeySOS_timer_flag = 0\r
- return\r
- self.KeySOS_timer_flag = 0\r
- if self.KeySOS_timer_count >= 3:\r
- self.KeySOS_timer_count = 0\r
- get_sos_flag = EventMesh.publish("get_sos_flag")\r
- if get_sos_flag == 0:\r
- EventMesh.publish("set_sos_info_call")\r
- self.KeySOS_timer_count = 0\r
- pass\r
-\r
- def AI_key_long_press(self):\r
- self.check_rest_timer_count = 0\r
- print("AI_key_long_press")\r
-\r
- EventMesh.publish("AI_key_long_press")\r
- \r
- def AI_key_release(self):\r
- print("AI_key_release")\r
- # self.KeySOS_timer_count +=1\r
- # print("self.KeySOS_timer_count:{} {}".format(self.KeySOS_timer_count,self.KeySOS_timer_flag))\r
- # if self.KeySOS_timer_flag == 0:\r
- # self.KeySOS_timer_flag = 1\r
- # self.KeySOS_timer.start(5000, 0, self.KeySos_timer_cb)\r
- EventMesh.publish("AI_key_release")\r
- \r
- def pwk_key_double_press(self):\r
- self.check_rest_timer_count = 0\r
- try:\r
- if getattr(self, "_single_power_ai_merged", False):\r
- try:\r
- self.KeyAI_timer.stop()\r
- except Exception:\r
- pass\r
- self.KeyAI_timer_count = 0\r
- self.KeyAI_press = 0\r
- self.KeyAI_long_press = 0\r
- self._ai_int_enable_after_hold()\r
- except Exception:\r
- pass\r
- print("pwk_key_double_press")\r
- EventMesh.publish("pwk_key_double_press")\r
-\r
- def pwk_key_Long_Press(self,event=None,msg=None):\r
- self.check_rest_timer_count = 0\r
- print("pwk_key_long_press!!!!!!!")\r
- print("pwk_key_long_press!!!!!!!")\r
- \r
- # EventMesh.publish("paly_iccid_imei")\r
- # return\r
- EventMesh.publish("audio_montage_play",["zhengzaiguanji.mp3"])\r
- #self.aud.play(1,0,'U:/static/zhengzaiguanji.mp3')#关机音频\r
- EventMesh.publish("set_led_state", {"battery": "empty"})\r
- utime.sleep_ms(3000)\r
- self.aud.stopPlayStream()\r
- self.aud.stopAll()\r
- Power.powerDown()\r
- #print("AI_key_release")\r
- #EventMesh.publish("pwk_key_long_press")\r
- \r
- def pwk_key_release(self):\r
- self.check_rest_timer_count = 0\r
- #print("pwk_key_release")\r
- EventMesh.publish("pwk_key_release")\r
-\r
- \r
- def wdt_timer_cb(self, *args, **kwargs):\r
- if self.is_wdt == 1:\r
- self.wdt.feed()\r
-\r
- def AI_dev_timer_cb(self, *args, **kwargs):\r
- #print("AI_dev_timer_cb")\r
- EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_dev_timer_event}) \r
- def _battery_empty_shutdown_seq(self):\r
- """REQ-BAT-03:红快闪 3 次 → 灭灯 → 关机提示音 → 关机(btn 线程执行)。"""\r
- try:\r
- EventMesh.publish("battery_priority_mute_vc")\r
- except Exception:\r
- pass\r
- try:\r
- n, ms = 3, 500\r
- if "vc_config" in globals() and vc_config:\r
- n = int(vc_config.get_int("BATTERY_EMPTY_FLASH_COUNT", 3))\r
- ms = int(vc_config.get_int("BATTERY_EMPTY_FLASH_PERIOD_MS", 500))\r
- EventMesh.publish("set_led_state", {"alert": "red_flash_3"})\r
- utime.sleep_ms(n * ms * 2 + 200)\r
- EventMesh.publish("set_led_state", {"ai_state": "idle", "battery": "normal", "charging": "none"})\r
- except Exception:\r
- pass\r
- try:\r
- EventMesh.publish("audio_montage_play", ["didianguanji.mp3"])\r
- utime.sleep_ms(4500)\r
- self.aud.stopPlayStream()\r
- self.aud.stopAll()\r
- except Exception:\r
- pass\r
- try:\r
- Power.powerDown()\r
- except Exception:\r
- pass\r
-\r
- def AI_dev_timer_event(self):\r
- #EventMesh.publish("audio_montage_play",["liuliangtishi.mp3"])\r
- EventMesh.publish("send_power_init_data")\r
- if self.is_wdt == 1:\r
- self.wdt.feed()\r
- VC_satrt_flag = EventMesh.publish("get_VC_satrt_flag")#获取vc是否在运行\r
- if VC_satrt_flag == None:\r
- VC_satrt_flag = 0\r
- voice_record_satrt_flag = EventMesh.publish("get_voice_record_flag")#获取静默或者语音留言是否在运行\r
- if voice_record_satrt_flag == None:\r
- voice_record_satrt_flag = 0\r
- _bcfg = _BatteryCfg.instance()\r
- Vbatt = _bcfg.get_vbatt_mv_charge() if self.usb_status == 1 else _bcfg.get_vbatt_mv()\r
- if self.usb_status == 1 and VC_satrt_flag == 0 and voice_record_satrt_flag == 0:\r
- try:\r
- if not ("vc_config" in globals() and vc_config and vc_config.get_bool("USE_MIN_HW_STATUS", True)):\r
- EventMesh.publish("set_led_state", {"charging": "charging"})#充电红灯常亮\r
- except Exception:\r
- pass\r
- if self.usb_status == 1 and Vbatt >= _bcfg.charge_full_mv and VC_satrt_flag == 0 and voice_record_satrt_flag == 0:\r
- try:\r
- if not ("vc_config" in globals() and vc_config and vc_config.get_bool("USE_MIN_HW_STATUS", True)):\r
- EventMesh.publish("set_led_state", {"charging": "full"})\r
- except Exception:\r
- pass\r
- if self.usb_charge_flag == 0 :\r
- EventMesh.publish("audio_montage_play",["R_CHARGE_FULL.mp3"])\r
- #self.aud.play(1,0,'U:/static/R_CHARGE_FULL.mp3')#充电已满\r
- self.usb_charge_flag = 1\r
- try:\r
- low_soc = int(_bcfg.low_soc)\r
- except Exception:\r
- low_soc = 25\r
- warn_interval_ms = 300000\r
- try:\r
- if "vc_config" in globals() and vc_config:\r
- warn_interval_ms = int(vc_config.get_int("BATTERY_LOW_WARN_INTERVAL_MS", 300000))\r
- except Exception:\r
- pass\r
- soc = None\r
- try:\r
- soc = self.get_battery()\r
- except Exception:\r
- soc = None\r
- if self.usb_status == 0:\r
- if _bcfg.should_shutdown_empty(Vbatt):\r
- if getattr(self, "_empty_shutdown_done", 0) == 0:\r
- self._empty_shutdown_done = 1\r
- try:\r
- print("[BAT] empty shutdown vbatt={} soc={} empty_mv={}".format(\r
- Vbatt, soc, _bcfg.empty_mv))\r
- except Exception:\r
- pass\r
- EventMesh.publish("publish_AI_btnInfo", {"func": self._battery_empty_shutdown_seq})\r
- elif soc is not None and soc < low_soc:\r
- if voice_record_satrt_flag == 0:\r
- try:\r
- now = utime.ticks_ms()\r
- last = getattr(self, "_low_warn_last_ms", 0)\r
- if (not last) or utime.ticks_diff(now, last) >= warn_interval_ms:\r
- self._low_warn_last_ms = now\r
- try:\r
- print("[BAT] low warn soc={} interval_ms={}".format(soc, warn_interval_ms))\r
- except Exception:\r
- pass\r
- EventMesh.publish("audio_montage_play", ["Low_power_warning.mp3"])\r
- except Exception:\r
- pass\r
- else:\r
- try:\r
- self._low_warn_last_ms = 0\r
- self._empty_shutdown_done = 0\r
- except Exception:\r
- pass\r
- if VC_satrt_flag == 0 and Vbatt is not None and Vbatt >= int(_bcfg.low_mv):\r
- try:\r
- if not ("vc_config" in globals() and vc_config and vc_config.get_bool("USE_MIN_HW_STATUS", True)):\r
- EventMesh.publish("set_led_state", {"charging": "none", "battery": "normal"})\r
- except Exception:\r
- pass\r
-\r
- self.check_rest_timer_count += 1\r
- if self.check_rest_timer_count >= 8640:#24小时没按键,则关机\r
- self.pwk_key_Long_Press()\r
- \r
- def get_battery(self, event=None, msg=None):\r
- # SoC 基于 _BatteryCfg 10 点滑动平均电压,与 protocol 心跳/AI_hw 一致\r
- try:\r
- return _BatteryCfg.instance().soc_now()\r
- except Exception:\r
- return 0\r
- def _audio_is_battery_priority(self, msg):\r
- try:\r
- for i in (msg or []):\r
- n = str(i)\r
- if ("Low_power" in n) or ("didianguanji" in n):\r
- return True\r
- except Exception:\r
- pass\r
- return False\r
-\r
- def audio_montage_play(self,event,msg):\r
- self.wakeup_BT()\r
- bat_pri = self._audio_is_battery_priority(msg)\r
- if bat_pri:\r
- try:\r
- EventMesh.publish("battery_priority_mute_vc")\r
- except Exception:\r
- pass\r
- else:\r
- # 仅服务端 TTS PCM 在播时跳过;低电/关机提示优先级更高(见上)\r
- try:\r
- if EventMesh.publish("get_vc_tts_playback_active") == 1:\r
- print("[audio-arb] skip local montage_play during tts_pcm")\r
- return\r
- except Exception:\r
- pass\r
- self.aud.stopPlayStream()\r
- self.aud.stopAll()\r
- str_data='mp3files='\r
- for i in msg:\r
- try:\r
- str_tmp = i.replace(".mp3","")\r
- str_data+="{}.mp3+".format(audio_buf.index(str_tmp))\r
- except Exception as e:\r
- usys.print_exception(e) \r
- str_data = str_data[:-1]\r
- print("audio_montage_play:{}".format(str_data))\r
- self.aud.montage_play('U:/static/audio.bin',1,1,str_data)\r
- self.play_imei_timer_count=1\r
- self.play_imei_timer.stop()\r
- self.play_imei_timer.start(1000,1,self.play_imei_timer_cb)\r
- \r
- def paly_iccid_imei(self,event,msg):\r
- \r
- self.wakeup_BT()\r
- self.aud.stopPlayStream()\r
- self.aud.stopAll()\r
- str_data = 'mp3files={}.mp3+'.format(audio_buf.index("liuliangtishi"))#流量提示\r
- imei = modem.getDevImei()\r
- iccid = sim.getIccid()\r
- print("paly_iccid_imei:ICCID:{}".format(iccid))\r
- if iccid != -1 and len(iccid) > 5:\r
- iccid = iccid.upper()\r
- if len(iccid) <20:\r
- for i in range(20-len(iccid)):\r
- iccid = "0"+iccid\r
- str_data += '{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+'.format(audio_buf.index("R_READ_TIME_{}".format(iccid[0]))\\r
- ,audio_buf.index("R_READ_TIME_{}".format(iccid[1])),audio_buf.index("R_READ_TIME_{}".format(iccid[2])),audio_buf.index("R_READ_TIME_{}".format(iccid[3])),\\r
- audio_buf.index("R_READ_TIME_{}".format(iccid[4])),audio_buf.index("R_READ_TIME_{}".format(iccid[5])),audio_buf.index("R_READ_TIME_{}".format(iccid[6])),audio_buf.index("R_READ_TIME_{}".format(iccid[7])),\\r
- audio_buf.index("R_READ_TIME_{}".format(iccid[8])),audio_buf.index("R_READ_TIME_{}".format(iccid[9])),audio_buf.index("R_READ_TIME_{}".format(iccid[10])),audio_buf.index("R_READ_TIME_{}".format(iccid[11])),\\r
- audio_buf.index("R_READ_TIME_{}".format(iccid[12])),audio_buf.index("R_READ_TIME_{}".format(iccid[13])),audio_buf.index("R_READ_TIME_{}".format(iccid[14])),audio_buf.index("R_READ_TIME_{}".format(iccid[15])),\\r
- audio_buf.index("R_READ_TIME_{}".format(iccid[16])),audio_buf.index("R_READ_TIME_{}".format(iccid[17])),audio_buf.index("R_READ_TIME_{}".format(iccid[18])),audio_buf.index("R_READ_TIME_{}".format(iccid[19])))\r
- str_data += '{}.mp3+'.format(audio_buf.index("shouhou"))#可联系售后解决,联系方式见售后客服电话是400-886-8777或到微信公众号柒牌SEVENBRAND自行充值:\r
- self.aud.montage_play('U:/static/audio.bin',1,1,str_data)\r
- #开定时器不让系统休眠\r
- self.play_imei_timer_count=1\r
- self.play_imei_timer.stop()\r
- self.play_imei_timer.start(1000,1,self.play_imei_timer_cb)\r
-\r
- def play_imei_timer_cb(self,event=None,msg=None):\r
- if self.play_imei_timer_count == 1:\r
- if EventMesh.publish("get_audio_play_state") == 0:\r
- print("音频文件播放完成")\r
- self.play_imei_timer_count=0\r
- self.play_imei_timer.stop()\r
- return\r
- EventMesh.publish(constants.EVENT.SYSTEM_UP)#唤醒休眠\r
-\r
- #鉴权出错,播放imei号\r
- def paly_device_res_error(self,event,msg):\r
- self.wakeup_BT()\r
- EventMesh.publish(constants.EVENT.SYSTEM_UP)#唤醒休眠\r
- str_data = 'mp3files={}.mp3+'.format(audio_buf.index("jianquancuowu"))#AI功能异常,请联系客户查询,设备号为:\r
- imei = modem.getDevImei()\r
- imei = imei.upper()\r
- str_data += '{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(imei[0]))\\r
- ,audio_buf.index("R_READ_TIME_{}".format(imei[1])),audio_buf.index("R_READ_TIME_{}".format(imei[2])),audio_buf.index("R_READ_TIME_{}".format(imei[3])),\\r
- audio_buf.index("R_READ_TIME_{}".format(imei[4])),audio_buf.index("R_READ_TIME_{}".format(imei[5])),audio_buf.index("R_READ_TIME_{}".format(imei[6])),audio_buf.index("R_READ_TIME_{}".format(imei[7])),\\r
- audio_buf.index("R_READ_TIME_{}".format(imei[8])),audio_buf.index("R_READ_TIME_{}".format(imei[9])),audio_buf.index("R_READ_TIME_{}".format(imei[10])),audio_buf.index("R_READ_TIME_{}".format(imei[11])),\\r
- audio_buf.index("R_READ_TIME_{}".format(imei[12])),audio_buf.index("R_READ_TIME_{}".format(imei[13])),audio_buf.index("R_READ_TIME_{}".format(imei[14])))\r
- #print("str_data:{}".format(str_data))\r
- self.aud.montage_play('U:/static/audio.bin',1,1,str_data)\r
- self.play_imei_timer_count=1\r
- self.play_imei_timer.stop()\r
- self.play_imei_timer.start(1000,1,self.play_imei_timer_cb)\r
-\r
+# -*- coding: utf-8 -*-
+"""按键、电源、USB、按键队列。"""
+from common import Abstract
+try:
+ from qp_log import qp_print as print
+except Exception:
+ pass
+import EventMesh
+import usys
+import utime
+import audio
+import osTimer
+import dataCall
+import sim
+from machine import Pin, ExtInt
+from machine import WDT
+import modem
+import ntptime
+import _thread
+from queue import Queue
+from misc import Power, USB, PowerKey
+import constants
+try:
+ import vc_config
+except Exception:
+ vc_config = None
+from vc_common import dev_type
+from vc_hw import set_ipv4_datacall, _BatteryCfg
+from vc_uart import AI_UART
+
+audio_buf = ['chaobingfatis', 'chenggong', 'didianguanji', 'IMEIhao', 'jianquancuowu', 'key_prompt', 'liuliangtishi', 'Low_power_warning', 'R_CHARGE_FULL', 'R_CHARGE_IN', 'R_CHARGE_OUT', 'R_READ_TIME_0', 'R_READ_TIME_1', 'R_READ_TIME_2', 'R_READ_TIME_3', 'R_READ_TIME_4', 'R_READ_TIME_5', 'R_READ_TIME_6', 'R_READ_TIME_7', 'R_READ_TIME_8', 'R_READ_TIME_9', 'R_READ_TIME_A', 'R_READ_TIME_B', 'R_READ_TIME_C', 'R_READ_TIME_D', 'R_READ_TIME_E', 'R_READ_TIME_F', 'R_READ_TIME_G', 'R_READ_TIME_H', 'R_READ_TIME_I', 'R_READ_TIME_J', 'R_READ_TIME_K', 'R_READ_TIME_L', 'R_READ_TIME_M', 'R_READ_TIME_N', 'R_READ_TIME_O', 'R_READ_TIME_P', 'R_READ_TIME_Q', 'R_READ_TIME_R', 'R_READ_TIME_S', 'R_READ_TIME_T', 'R_READ_TIME_U', 'R_READ_TIME_V', 'R_READ_TIME_W', 'R_READ_TIME_X', 'R_READ_TIME_Y', 'R_READ_TIME_Z', 'send_tone', 'shouhou', 'xinhaoruo1', 'zhengzaiguanji']
+class AI_dev(Abstract):
+ # AI
+ def __init__(self):
+ # if(dev_type != "7PIN"):
+ # set_ipv4_datacall()
+ self.is_wdt = 0 #是否开启看门狗
+ #AT+QDAI=1,0,0,1,0,0,1,1PCM音频输出设置为主模式、短同步、16 kHz采样率和256 kHz时钟频率,采样位深为16bit,使用的时间间隙数量为1,并且使用第一个时间间隙。
+ try:
+ bt_pm_en = False
+ pin_bt_on = None
+ pin_mot = None
+ qdai_cfg = None
+ if "vc_config" in globals() and vc_config:
+ bt_pm_en = bool(vc_config.get_attr("BT_POWER_MOTOR_ENABLED", False))
+ pin_bt_on = vc_config.get_attr("PIN_BT_ON_GPIO", None)
+ pin_mot = vc_config.get_attr("PIN_MOT_GPIO", None)
+ qdai_cfg = vc_config.get_attr("AUDIO_QDAI_CFG", None)
+ except Exception:
+ bt_pm_en = False
+ pin_bt_on = None
+ pin_mot = None
+ qdai_cfg = None
+
+ if bt_pm_en:
+ try:
+ if pin_bt_on:
+ self.PIN_BT_ON = Pin(getattr(Pin, pin_bt_on), Pin.OUT, Pin.PULL_DISABLE, 0)
+ if pin_mot:
+ self.PIN_MOT = Pin(getattr(Pin, pin_mot), Pin.OUT, Pin.PULL_DISABLE, 1)
+ except Exception:
+ pass
+ try:
+ utime.sleep_ms(200)
+ if hasattr(self, "PIN_MOT"):
+ self.PIN_MOT.write(0)
+ if hasattr(self, "PIN_BT_ON"):
+ self.PIN_BT_ON.write(1)
+ except Exception:
+ pass
+ try:
+ if isinstance(qdai_cfg, (tuple, list)) and len(qdai_cfg) == 8:
+ audio.set_qdai_cfg(*qdai_cfg) # 用iis做音频输入输出
+ except Exception:
+ pass
+ self.KeyAI_status = 0
+ self.KeyAI_timer_count = 0
+ self.KeyAI_long_press = 0
+ self.KeySos_long_press = 0
+ self.KeyAI_press = 0
+ self.last_ai_key_time = 0#让ai按键不要频繁调用
+ if self.is_wdt == 1:
+ self.wdt = WDT(30) #开启看门狗
+ # self.wdt_timer = osTimer()
+ # self.wdt_timer.start(5000, 1, self.wdt_timer_cb)
+
+ count = 0
+ while True:
+ count += 1
+ if count > 20 :
+ break
+ data = dataCall.getInfo(1, 0)
+ print("data call INFO {}".format(data))
+ if data[2][0]:
+ self.network_state = 1
+ break
+ print("等待网络 {}...".format(count))
+ utime.sleep_ms(500)
+ self.KeyAI_timer = osTimer()
+ self.KeySOS_timer = osTimer()
+ self.play_imei_timer = osTimer()
+ self.play_imei_timer_count=0
+ self.KeySOS_timer_count = 0
+ self.KeySOS_timer_flag = 0
+ self._single_power_ai_merged = False
+ self._pwk_shutdown_ticks = 30 # 100ms 节拍,默认 3s
+ try:
+ ai_gpio = "GPIO22"
+ pwk_gpio = "GPIO26"
+ bt_wakeup_en = False
+ wakeup_cta1_gpio = None
+ wakeup_bt_gpio = None
+ if "vc_config" in globals() and vc_config:
+ raw_ai = vc_config.get_attr("EXTINT_AI_GPIO", "GPIO22")
+ if raw_ai is None or raw_ai == "":
+ ai_gpio = None
+ else:
+ ai_gpio = raw_ai
+ pwk_gpio = vc_config.get_attr("PWK_KEY_GPIO", "GPIO26") or "GPIO26"
+ bt_wakeup_en = bool(vc_config.get_attr("BT_WAKEUP_4G_ENABLED", False))
+ wakeup_cta1_gpio = vc_config.get_attr("EXTINT_WAKEUP_CTA1_GPIO", None)
+ wakeup_bt_gpio = vc_config.get_attr("PIN_WAKEUP_BT_GPIO", None)
+ try:
+ self._single_power_ai_merged = bool(
+ vc_config.get_bool("SINGLE_POWER_KEY_AI_MERGED", False)
+ ) or (ai_gpio is None)
+ except Exception:
+ self._single_power_ai_merged = ai_gpio is None
+ try:
+ _pwk_ms = int(vc_config.get_int("PWK_LONG_PRESS_SHUTDOWN_MS", 3000))
+ except Exception:
+ _pwk_ms = 3000
+ self._pwk_shutdown_ticks = max(1, (_pwk_ms + 99) // 100)
+ except Exception:
+ ai_gpio = "GPIO22"
+ pwk_gpio = "GPIO26"
+ bt_wakeup_en = False
+ wakeup_cta1_gpio = None
+ wakeup_bt_gpio = None
+
+ if ai_gpio:
+ self.extint_AI = ExtInt(
+ getattr(ExtInt, ai_gpio),
+ ExtInt.IRQ_RISING_FALLING,
+ ExtInt.PULL_PU,
+ self.keyAI_extint_cb,
+ )
+ self.extint_AI.enable()
+ else:
+ self.extint_AI = None
+
+ self.pwk_key = ExtInt(getattr(ExtInt, pwk_gpio), ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.pwk_extint_cb)
+
+ if bt_wakeup_en:
+ try:
+ if wakeup_cta1_gpio:
+ self.extint_wakeup_cta1 = ExtInt(getattr(ExtInt, wakeup_cta1_gpio), ExtInt.IRQ_RISING, ExtInt.PULL_DISABLE, self.wakeup_extint_cb)
+ if wakeup_bt_gpio:
+ self.PIN_wakeup_bt = Pin(getattr(Pin, wakeup_bt_gpio), Pin.OUT, Pin.PULL_DISABLE, 0)
+ self.extint_wakeup_cta1_timer = osTimer()
+ if hasattr(self, "extint_wakeup_cta1"):
+ self.extint_wakeup_cta1.enable()
+ except Exception:
+ pass
+
+ self.pwk_key_status = 0
+ self.pwk_key_timer_count = 0
+ self.pwk_key_long_press = 0
+ self.pwk_key_press = 0
+ self.powerKey_status = 0
+ self.pwk_key_timer = osTimer()
+ self.pwk_is_double_timer = osTimer()
+ self.double_click_threshold = 1000#双击间隔时间
+ self.pwk_press_count = 0#按下次数
+ self.last_key_time = 0 # 上一次有效触发时间
+ self.key_debounce_interval = 20 # 防抖窗口20ms,标准值
+ #self.pwk_key = ExtInt(ExtInt.GPIO26, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_DISABLE, self.pwk_extint_cb)
+
+ self.pwk_key.enable()
+ print("AI_dev:1")
+ self.btnInfo_queue = Queue(100)
+ self.vc_prio_queue = Queue(32)
+ self.btnInfo_queue_count = 0
+ _thread.stack_size(16*1024)
+ self.btnInfo_queue_thread_id = _thread.start_new_thread(self.btnInfo_queue_thread, ())
+ _thread.stack_size(8*1024)
+ EventMesh.subscribe("publish_AI_btnInfo",self.publish_AI_btnInfo)
+ EventMesh.subscribe("vc_orchestrator_purge", self._vc_orchestrator_purge)
+ EventMesh.subscribe("get_battery",self.get_battery)
+ EventMesh.subscribe("audio_montage_play",self.audio_montage_play)
+ # EventMesh.subscribe("paly_iccid_imei",self.paly_iccid_imei)
+ EventMesh.subscribe("paly_device_res_error",self.paly_device_res_error)
+ EventMesh.subscribe("Power_off",self.pwk_key_Long_Press)
+ EventMesh.subscribe("wakeup_BT",self.wakeup_BT)
+ EventMesh.subscribe("sleep_BT",self.sleep_BT)
+ EventMesh.subscribe("sys_sleep_cb",self.sys_sleep_cb)#系统休眠前回调
+ EventMesh.subscribe("sys_up_cb",self.sys_up_cb)#系统唤醒后回调
+
+ EventMesh.subscribe("GET_USB_STATE",self.get_usb_state)
+ EventMesh.subscribe("SET_SPEECH_RATE",self.set_speech_rate)
+ EventMesh.subscribe("rest_TB",self.rest_TB)
+
+ print("AI_dev:2")
+ self.pk = PowerKey()
+ self.pk.powerKeyEventRegister(self.powerKey_callback)
+ self.usb = USB()
+ self.usb.setCallback(self.usb_event_cb)
+ self.usb_status = self.usb.getStatus()
+ self.usb_charge_flag = 0
+ self._usb_evt_last_ms = 0
+ self._usb_evt_last_state = -1
+ self.Low_power_warning_timer = 0
+ self.AI_dev_timer = osTimer()
+ self.AI_dev_timer.start(10000, 1, self.AI_dev_timer_cb)
+ print("AI_dev:AI_dev_timer")
+ self.aud = audio.Audio(0)
+ self.Low_power_warning_flag = 0
+ self._low_warn_last_ms = 0
+ self._empty_shutdown_done = 0
+ self.VC_TTS_volume = EventMesh.publish("get_storage_config","VC_TTS_volume")#音量配置
+ if self.VC_TTS_volume == None:
+ self.VC_TTS_volume = 100
+ self.aud.setVolume(self.VC_TTS_volume //10)
+ EventMesh.publish("set_storage_config",["VC_TTS_volume",self.VC_TTS_volume])
+ #self.aud.play(1,0,'U:/static/xianyikaiji.mp3')#开机音频
+ #EventMesh.publish("audio_montage_play",["xianyikaiji.mp3"])
+ #EventMesh.publish("publish_AI_btnInfo",{"func":self.ntptime_cb})
+ self.check_rest_timer_count = 0
+ try:
+ if "vc_config" in globals() and vc_config and vc_config.uart_supported():
+ self.ai_uart = AI_UART()
+ except Exception:
+ pass
+
+ self.Keycall1_press_count = 0
+ self.ble_switch_flag_time = osTimer()
+ self.ble_switch_flag_time.start(20000, 0, self.ble_switch_flag_time_init)
+ # AI_hw_status 先于本模块初始化,开机已插 USB 时需补同步一次
+ try:
+ if int(self.usb_status or 0) == 1:
+ EventMesh.publish("hw_usb_state", 1)
+ EventMesh.publish("publish_AI_btnInfo", {"func": self.usb_event, "data": 1})
+ except Exception:
+ pass
+ def ble_switch_flag_time_init(self,*args):
+ EventMesh.publish("publish_AI_btnInfo",{"func":self.ble_switch_flag_time_cb})
+ def ble_switch_flag_time_cb(self,*args):
+ bt_switch_flag = EventMesh.publish("get_storage_config","switch_bt_state")#bt开关
+ if bt_switch_flag == None:
+ bt_switch_flag = "1"
+ EventMesh.publish("send_bt_switch_toble",str(bt_switch_flag))
+ # EventMesh.publish("send_imei_to_ble")
+ ble_switch_flag = EventMesh.publish("get_storage_config","switch_ble_state")#ble开关
+ if ble_switch_flag == None:
+ ble_switch_flag = "1"
+ EventMesh.publish("send_ble_switch_toble",str(ble_switch_flag))
+ vc_tts_volume = EventMesh.publish("get_storage_config","VC_TTS_volume")
+ if vc_tts_volume == None:
+ vc_tts_volume=100
+ # EventMesh.publish("adjust_volume_toBle",str(vc_tts_volume))
+
+ pass
+ print("ble_switch_flag_time_cb!!!!!!!")
+ def ntptime_cb(self):
+ #ntptime.settime(8)
+ print("timer:{}!!!!!!!!\r\n".format(utime.localtime()))
+ def usb_event_cb(self, state):
+ # USB 插拔抖动过滤(日志中 powerKey 与 usb_evt 0/1 连跳会导致误播 OUT/IN)
+ try:
+ now = utime.ticks_ms()
+ last_ms = getattr(self, "_usb_evt_last_ms", 0)
+ last_st = getattr(self, "_usb_evt_last_state", -1)
+ if last_ms and utime.ticks_diff(now, last_ms) < 800 and last_st != state:
+ return
+ self._usb_evt_last_ms = now
+ self._usb_evt_last_state = state
+ except Exception:
+ pass
+ # 转发给精简硬件监控(AI_hw_status),避免 USB callback 被覆盖导致“后面失效”
+ try:
+ EventMesh.publish("hw_usb_state", state)
+ except Exception:
+ pass
+ try:
+ _BatteryCfg.instance().on_usb_change(1 if state == 1 else 0)
+ except Exception:
+ pass
+ EventMesh.publish("publish_AI_btnInfo",{"func":self.usb_event,"data":state})
+
+ def usb_event(self, state):
+ status = state
+ self.usb_charge_flag = 0
+ if status == 1:#插入USB
+ print("charge R_CHARGE_in")
+ self.usb_status = 1
+ VC_satrt_flag = EventMesh.publish("get_VC_satrt_flag")#获取vc是否在运行
+ if VC_satrt_flag == None:
+ VC_satrt_flag = 0
+
+ voice_record_satrt_flag = EventMesh.publish("get_voice_record_flag")#获取静默或者语音留言是否在运行
+ if voice_record_satrt_flag == None:
+ voice_record_satrt_flag = 0
+ if VC_satrt_flag == 0 and voice_record_satrt_flag == 0:
+ self.aud.stop()
+ #EventMesh.publish("flicker_led_red")#充电闪灯
+ #self.aud.play(1,1,'U:/static/R_CHARGE_IN.mp3')
+ try:
+ if not ("vc_config" in globals() and vc_config and vc_config.get_bool("USE_MIN_HW_STATUS", True)):
+ EventMesh.publish("set_led_state", {"charging": "charging"})
+ except Exception:
+ pass
+ EventMesh.publish("audio_montage_play",["R_CHARGE_IN.mp3"])
+ self.Low_power_warning_flag = 0
+ try:
+ self._empty_shutdown_done = 0
+ except Exception:
+ pass
+ pass
+ elif status == 0:#拨出usbs
+ self.usb_status = 0
+ VC_satrt_flag = EventMesh.publish("get_VC_satrt_flag")#获取vc是否在运行
+ if VC_satrt_flag == None:
+ VC_satrt_flag = 0
+ voice_record_satrt_flag = EventMesh.publish("get_voice_record_flag")#获取静默或者语音留言是否在运行
+ if voice_record_satrt_flag == None:
+ voice_record_satrt_flag = 0
+ if VC_satrt_flag == 0 and voice_record_satrt_flag == 0:
+ self.aud.stop()
+ try:
+ if not ("vc_config" in globals() and vc_config and vc_config.get_bool("USE_MIN_HW_STATUS", True)):
+ EventMesh.publish("set_led_state", {"charging": "none"})
+ except Exception:
+ pass
+ EventMesh.publish("audio_montage_play",["R_CHARGE_OUT.mp3"])
+ #self.aud.play(1,1,'U:/static/R_CHARGE_OUT.mp3')
+ def get_usb_state(self,event,msg):
+ return self.usb_status
+
+ def set_speech_rate(self,event,msg):
+ #msg的取值是0.5~2.0
+ #而语速初始值是0,范围是-50~50
+ rate = 0
+ if msg == 0.5:
+ rate = -50
+ elif msg < 1:
+ rate = (msg - 1)* 100
+ elif msg >= 1:
+ rate = (msg - 1)* 50
+ rate = round(rate)
+ print("速率已经设置为:{}".format(rate))
+ EventMesh.publish("rate_change",rate)
+ return rate
+ def _vc_orchestrator_drop_stale(self, data):
+ if not data or "vc_track_gen" not in data:
+ return False
+ try:
+ cur = EventMesh.publish("vc_turn_gen_get")
+ if cur is None:
+ return False
+ if int(data["vc_track_gen"]) != int(cur):
+ print("[ORCH] skip stale queue gen={} cur={}".format(
+ data["vc_track_gen"], cur))
+ return True
+ except Exception:
+ pass
+ return False
+
+ def _vc_orchestrator_drain_queue_gen(self, q, min_gen):
+ try:
+ n = q.size()
+ except Exception:
+ return
+ kept = []
+ for _ in range(n):
+ try:
+ item = q.get()
+ except Exception:
+ break
+ if (
+ item
+ and "vc_track_gen" in item
+ and int(item["vc_track_gen"]) < int(min_gen)
+ ):
+ continue
+ kept.append(item)
+ for item in kept:
+ try:
+ q.put(item)
+ except Exception:
+ pass
+
+ def _vc_orchestrator_purge(self, event=None, msg=None):
+ try:
+ min_gen = int(msg) if msg is not None else 0
+ except Exception:
+ min_gen = 0
+ self._vc_orchestrator_drain_queue_gen(self.btnInfo_queue, min_gen)
+ self._vc_orchestrator_drain_queue_gen(self.vc_prio_queue, min_gen)
+
+ def _vc_btn_queue_dispatch(self, data):
+ if data is None:
+ return
+ if self._vc_orchestrator_drop_stale(data):
+ return
+ try:
+ if "data" in data:
+ data["func"](data["data"])
+ else:
+ data["func"]()
+ except Exception as e:
+ if "data" in data:
+ print(data["data"])
+ usys.print_exception(e)
+
+ def btnInfo_queue_thread(self):
+ while True:
+ data = None
+ try:
+ if self.vc_prio_queue.empty() != True:
+ data = self.vc_prio_queue.get()
+ else:
+ data = self.btnInfo_queue.get()
+ except Exception:
+ try:
+ data = self.btnInfo_queue.get()
+ except Exception:
+ continue
+ self.btnInfo_queue_count -= 1
+ self._vc_btn_queue_dispatch(data)
+ def publish_AI_btnInfo(self,event,msg):
+ #print("publish_AI_btnInfo 1")
+ try:
+ if msg and msg.get("vc_prio"):
+ self.vc_prio_queue.put(msg)
+ else:
+ self.btnInfo_queue.put(msg)
+ except Exception:
+ self.btnInfo_queue.put(msg)
+ self.btnInfo_queue_count+=1
+ if self.btnInfo_queue_count > 80:
+ self.btnInfo_queue_count =0
+ print("事件处理线程队列出问题,重启!!!!!!!!!!!!!!")
+ print("线程:{} 队列:{}".format(_thread.threadIsRunning(self.btnInfo_queue_thread_id),self.btnInfo_queue.size()))
+ # if _thread.threadIsRunning(self.btnInfo_queue_thread_id):
+ # _thread.stop_thread(self.btnInfo_queue_thread_id)
+ # _thread.stack_size(10*1024)
+ # self.btnInfo_queue_thread_id = _thread.start_new_thread(self.btnInfo_queue_thread, ())
+ # _thread.stack_size(8*1024)
+ # self.btnInfo_queue.clear()
+ # self.btnInfo_queue = Queue(100)
+ EventMesh.publish("VC_error") #播放报错
+ utime.sleep_ms(1000)
+ self.aud.stopPlayStream()
+ self.aud.stopAll()
+ Power.powerRestart()
+ EventMesh.publish("set_storage_config",["powerRestart",1])
+ #print("publish_AI_btnInfo 2")
+
+ def sys_sleep_cb(self,event=None,msg=None):#休眠前回调
+ try:
+ if not ("vc_config" in globals() and vc_config and vc_config.get_bool("BT_WAKEUP_4G_ENABLED", False)):
+ return
+ except Exception:
+ return
+ print("sys_sleep_cb!!!!!!!!!!!!!!!")
+ EventMesh.publish("sleep_BT")#休眠蓝牙
+ self.PIN_wakeup_bt.write(0)
+ def sys_up_cb(self,event=None,msg=None):#唤醒前回调
+ try:
+ if not ("vc_config" in globals() and vc_config and vc_config.get_bool("BT_WAKEUP_4G_ENABLED", False)):
+ return
+ except Exception:
+ return
+ print("sys_up_cb!!!!!!!!!!!!!!!")
+ self.wakeup_BT()
+ self.PIN_wakeup_bt.write(1)
+ def rest_TB(self,event=None,msg=None):
+ print("rest_TB!!!!!!!!!!!!!!!")
+ self.PIN_BT_ON.write(0)
+ utime.sleep_ms(100)
+ self.PIN_BT_ON.write(1)
+ def wakeup_BT(self,event=None,msg=None):#4G唤醒蓝牙
+ try:
+ if not ("vc_config" in globals() and vc_config and vc_config.get_bool("BT_WAKEUP_4G_ENABLED", False)):
+ return
+ except Exception:
+ return
+ print("wakeup_BT!!!!!!!!!!!!!!!")
+ wakeup_cta1_io = self.extint_wakeup_cta1.read_level()
+ if wakeup_cta1_io == 1:
+ return 1
+ self.PIN_wakeup_bt.write(0)
+ count = 5
+ while(True):
+ count-=1
+ if count<=0:
+ return -1
+ wakeup_cta1_io = self.extint_wakeup_cta1.read_level()
+ print("bt io状态:{}".format(wakeup_cta1_io))
+ if wakeup_cta1_io == 1:
+ self.PIN_wakeup_bt.write(1)
+ return 1
+ utime.sleep_ms(100)
+ if count%2 == 0:
+ self.PIN_wakeup_bt.write(1)
+ else:
+ self.PIN_wakeup_bt.write(0)
+
+
+ def sleep_BT(self,event=None,msg=None):#使蓝牙休眠
+ try:
+ if not ("vc_config" in globals() and vc_config and vc_config.get_bool("BT_WAKEUP_4G_ENABLED", False)):
+ return
+ except Exception:
+ return
+ print("sleep_BT!!!!!")
+ print("sleep_BT!!!!!")
+ print("sleep_BT!!!!!")
+ print("sleep_BT!!!!!")
+ self.PIN_wakeup_bt.write(0)
+ count = 300
+ while(True):
+ count-=1
+ if count<=0:
+ return -1
+ if self.extint_wakeup_cta1.read_level() == 0:
+ return 1
+ utime.sleep_ms(1)
+
+
+ def wakeup_extint_cb(self,args):#蓝牙唤醒4g
+ try:
+ if not ("vc_config" in globals() and vc_config and vc_config.get_bool("BT_WAKEUP_4G_ENABLED", False)):
+ return
+ except Exception:
+ return
+ print("wakeup_extint_cb:!!!!!!!!!")
+ EventMesh.publish(constants.EVENT.SYSTEM_UP)#唤醒休眠
+ self.PIN_wakeup_bt.write(1)
+ EventMesh.publish("publish_AI_btnInfo",{"func":self.extint_wakeup_cta1_cb})
+ def extint_wakeup_cta1_cb(self):
+ #self.extint_wakeup_cta1_timer.start(100, 1, self.extint_wakeup_cta1_timer_cb)
+ pass
+ def extint_wakeup_cta1_timer_cb(self, *args, **kwargs):
+ if self.extint_wakeup_cta1.read_level() == 0:
+ self.extint_wakeup_cta1_timer.stop()
+ #self.PIN_wakeup_bt.write(0)
+
+ def powerKey_callback(self, status):
+ try:
+ EventMesh.debug_log("==pwr:", status)
+ except Exception:
+ print("powerKey_callback:{}".format(status))
+ self.powerKey_status = status
+ if self.pwk_key_press == 1:
+ return
+
+ def pwk_extint_cb(self,args):#pwk
+ current_time = 0
+ interval = 0
+
+ try:
+ #按键电平判断
+ press_level = 0
+ current_level = self.pwk_key.read_level()
+ if current_level != press_level:
+ return # 非按下状态,直接返回
+
+ #消抖处理
+ current_time = utime.ticks_ms()
+ if utime.ticks_diff(current_time, self.last_key_time) < self.key_debounce_interval:
+ return
+ self.last_key_time = current_time # 更新最后按键时间
+ print("pwk 按键按下")
+
+ #仅处理"按下瞬间"事件(避免重复触发)
+ if len(args) < 2:
+ print("args参数不足,跳过")
+ return
+ self.pwk_key_status = int(args[1])
+ if self.pwk_key_status != 1:
+ return
+
+ #双击计数逻辑
+ self.pwk_press_count += 1
+ current_time = utime.ticks_ms()
+
+ #第一次按下(启动长按定时器+双击等待)
+ if self.pwk_press_count == 1:
+ self.pwk_first_press_time = current_time # 记录首次按下时间
+ self.pwk_key_long_press = 0 # 重置长按标记
+ self.pwk_key_timer_count = 0 # 重置定时器计数
+ self.pwk_key_press = 1 # 标记按键按下
+
+ # 停止旧定时器,启动长按/单击判定定时器(100ms单次触发,循环靠回调自启)
+ self.pwk_key_timer.stop()
+ self.pwk_key_timer.start(100, 1, self.pwk_key_timer_cb)
+ print("第一次按下,等待第二次按下")
+ if getattr(self, "_single_power_ai_merged", False):
+ self._merged_pwk_ai_press_start()
+
+ #第二次按下(双击判断)
+ elif self.pwk_press_count == 2:
+ # 计算两次按下间隔
+ interval = utime.ticks_diff(current_time, self.pwk_first_press_time)
+
+ #符合双击阈值:执行双击逻辑
+ if interval <= self.double_click_threshold:
+ self.pwk_key_timer.stop() # 停止长按定时器(关键:避免触发长按)
+ self.pwk_key_double_press() # 执行双击业务
+ print("双击生效")
+ # 重置所有状态
+ self.pwk_press_count = 0
+ self.pwk_key_press = 0
+ self.pwk_key_timer_count = 0
+
+ #间隔过长:视为新的第一次按下
+ else:
+ self.pwk_first_press_time = current_time # 更新首次按下时间
+ self.pwk_press_count = 1 # 重置为第一次按下
+ print("间隔过长,视为新的第一次按下")
+
+ #按下次数超过2次(防计数溢出)
+ else:
+ self.pwk_press_count = 0
+ self.pwk_key_timer.stop()
+ print("按键次数过多,重置计数")
+
+ except Exception as e:
+ # 异常时重置所有状态,避免卡死
+ self.pwk_press_count = 0
+ self.pwk_key_press = 0
+ self.pwk_key_timer_count = 0
+ self.pwk_key_timer.stop()
+ usys.print_exception(e)
+
+
+ def pwk_is_double_judge(self, *args):
+ # if self.press_count == 1: # 仅一次按下,判定为单击
+
+ # 重置计数(无论何种情况,超时后清零)
+ self.pwk_press_count = 0
+
+
+ def pwk_key_timer_cb(self, *args, **kwargs):
+ EventMesh.publish("set_wait_first_flag",0)
+ EventMesh.publish("set_history_board_flag",0)
+ EventMesh.publish("set_play_new_voice_state",0)
+ EventMesh.publish("set_history_voice_flag",0)
+ EventMesh.publish("set_wait_voice_flag",0)
+ EventMesh.publish("set_stop_play",0)
+ # EventMesh.publish("publish_AI_btnInfo",{"func":self.pwk_key_timer_cb_})
+ # def pwk_key_timer_cb_(self) :
+ try:
+ self.pwk_key_status = self.pwk_key.read_level()
+ self.pwk_key_timer_count +=1
+ if self.pwk_key_timer_count >= self._pwk_shutdown_ticks:
+ #print("pwk_key_long_press {}".format(self.pwk_key_long_press))
+ if self.pwk_key_long_press == 0:
+ self.pwk_key_long_press = 1
+ #EventMesh.publish("AI_key_long_press")
+ # EventMesh.publish("audio_montage_play",["zhengzaiguanji.mp3"])
+ self.aud.play(1,0,'U:/static/zhengzaiguanji.mp3')#关机音频
+ EventMesh.publish("set_led_state", {"battery": "empty"})
+ utime.sleep_ms(2000)
+ self.aud.stopPlayStream()
+ self.aud.stopAll()
+ Power.powerDown()
+ #print("AI_key_release")
+ #EventMesh.publish("pwk_key_long_press")
+ #EventMesh.publish("publish_AI_btnInfo",{"func":self.pwk_key_Long_Press})
+ if self.pwk_key_status == 1:#松开
+ #print("pwk_key_timer_cb:{}".format(self.pwk_key_timer_count))
+ try:
+ key_count = vc_config.get_int("KEY_RELEASE_DEBOUNCE_COUNT", 5)
+ except Exception:
+ key_count = 5
+ if self.pwk_key_timer_count >= key_count: #防抖200ms
+ #EventMesh.publish("AI_key_release")
+ EventMesh.publish("publish_AI_btnInfo",{"func":self.pwk_key_release})
+ self.pwk_key.enable()
+ self.pwk_key_timer_count = 0
+ self.pwk_key_press = 0
+ self.pwk_press_count = 0#按下次数
+ self.pwk_key_timer.stop()
+
+ except Exception as e:
+ usys.print_exception(e)
+
+ def _ai_int_disable_for_hold(self):
+ if self.extint_AI is not None:
+ self.extint_AI.disable()
+
+ def _ai_int_enable_after_hold(self):
+ if self.extint_AI is not None:
+ self.extint_AI.enable()
+
+ def _key_ai_read_level(self):
+ if self.extint_AI is not None:
+ return self.extint_AI.read_level()
+ return self.pwk_key.read_level()
+
+ def _merged_pwk_ai_press_start(self):
+ """单电源键:按下瞬间走原 AI 键按下链路(松手走 AI_key_release,不按电源短按 Close)。"""
+ try:
+ current_time = utime.ticks_ms()
+ if utime.ticks_diff(current_time, self.last_ai_key_time) < 1:
+ return
+ self.last_ai_key_time = current_time
+ if EventMesh.publish("get_wait_voice_flag") == 1:
+ print("播放未读")
+ EventMesh.publish("set_wait_voicerupt_flag", 1)
+ return
+ if EventMesh.publish("get_recv_voice") == 1:
+ print("收到留言")
+ EventMesh.publish("set_voicerupt_flag", 1)
+ return
+ if self.KeyAI_press == 0:
+ EventMesh.publish(constants.EVENT.SYSTEM_UP)
+ if EventMesh.publish("get_play_new_voice_state") == 1:
+ EventMesh.publish("set_play_new_voice_state", 0)
+ EventMesh.publish("set_VC_stop_play_audio_flag", 1)
+ self._ai_int_disable_for_hold()
+ self.KeyAI_press = 1
+ self.KeyAI_long_press = 0
+ self.KeyAI_timer.start(100, 1, self.KeyAI_timer_cb)
+ self.KeyAI_timer_count = 0
+ EventMesh.publish("vc_long_dialogue_key_down")
+ EventMesh.publish("publish_AI_btnInfo", {"func": self.AI_key_press})
+ except Exception as e:
+ usys.print_exception(e)
+
+ def keyAI_extint_cb(self,args):#call 2
+ try:
+ if self.extint_AI is None:
+ return
+ #print("AI_btn:keyAI_extint_cb{}".format(args[1]))
+ #定义最短触发间隔
+ MIN_TRIGGER_INTERVAL = 1 # 可根据需求调整,单位ms
+ #记录上次按键触发时间(初始化放类的__init__里:self.last_ai_key_time = 0)
+ current_time = utime.ticks_ms() # 获取当前毫秒时间
+ #重复按下,直接返回
+ if utime.ticks_diff(current_time, self.last_ai_key_time) < MIN_TRIGGER_INTERVAL:
+ print("AI按键触发过频,忽略本次操作")
+ return
+ #更新上次触发时间
+ self.last_ai_key_time = current_time
+
+ self.KeyAI_status = int(args[1])
+ if self.KeyAI_status == 0:
+ self.KeyAI_status = 1
+ else:
+ self.KeyAI_status = 0
+
+ if self.KeyAI_status == 0:#按下
+ if EventMesh.publish("get_wait_voice_flag") == 1:
+ print("播放未读")
+ EventMesh.publish("set_wait_voicerupt_flag",1)
+ return
+ if EventMesh.publish("get_recv_voice") == 1:#当处于收到留言的时候
+ print("收到留言")
+ EventMesh.publish("set_voicerupt_flag",1)
+ return
+ if self.KeyAI_press == 0 :
+ EventMesh.publish(constants.EVENT.SYSTEM_UP)#唤醒休眠
+ if EventMesh.publish("get_play_new_voice_state") == 1:
+ EventMesh.publish("set_play_new_voice_state",0)
+
+ EventMesh.publish("set_VC_stop_play_audio_flag",1)#按键按下不允许播放之前下发的音频数据
+ self._ai_int_disable_for_hold()
+ self.KeyAI_press = 1
+ self.KeyAI_long_press = 0
+ self.KeyAI_timer.start(100, 1, self.KeyAI_timer_cb)
+ self.KeyAI_timer_count = 0
+ #EventMesh.publish("AI_key_press")
+ # if dev_type == "7PIN":
+ # self.aud.aud_tone_play(10,100)#播放按键音
+
+ EventMesh.publish("vc_long_dialogue_key_down")
+ EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_key_press})
+ except Exception as e:
+ usys.print_exception(e)
+ def KeyAI_timer_cb(self, *args, **kwargs):
+ # EventMesh.publish("publish_AI_btnInfo",{"func":self.KeyAI_timer_cb_})
+ # def KeyAI_timer_cb_(self):
+ try:
+ self.KeyAI_status = self._key_ai_read_level()
+ self.KeyAI_timer_count +=1
+ if self.KeyAI_timer_count >= 10*1 : #长按1s
+
+ if self.KeyAI_long_press == 0:
+ self.KeyAI_long_press = 1
+ #EventMesh.publish("AI_key_long_press")
+ EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_key_long_press})
+ try:
+ _sos_on = vc_config.get_bool("SOS_ENABLED", True)
+ except Exception:
+ _sos_on = True
+ if _sos_on and self.KeyAI_timer_count >= 10*3 : #长按3s 上一次是短按则拨打sos紧急联系人
+ print("long sos phone:{}".format(self.KeySOS_timer_flag))
+
+ if self.KeySOS_timer_flag == 1:
+ self.KeySOS_timer_flag=0
+ self.KeySos_long_press = 1
+ self.KeySOS_timer.stop()
+ get_sos_flag = EventMesh.publish("get_sos_flag")
+ if get_sos_flag == 0:
+ EventMesh.publish("set_sos_info_call")
+ pass
+
+ elif self.KeyAI_timer_count >= 10*8:#关机
+ try:
+ allow_power_off = vc_config.get_bool("AI_LONG_PRESS_POWER_OFF_ENABLED", False)
+ except Exception:
+ allow_power_off = False
+ if allow_power_off:
+ EventMesh.publish("audio_montage_play",["zhengzaiguanji.mp3"])
+ #self.aud.play(1,0,'U:/static/zhengzaiguanji.mp3')#关机音频
+ EventMesh.publish("set_led_state", {"battery": "empty"})
+ utime.sleep_ms(2000)
+ self.aud.stopPlayStream()
+ print("stopAll:8")
+ self.aud.stopAll()
+ Power.powerDown()
+ if self.KeyAI_status == 1:#松开
+ #print("KeyAI_timer_cb:{}".format(self.KeyAI_timer_count))
+ try:
+ key_count = vc_config.get_int("KEY_RELEASE_DEBOUNCE_COUNT", 5)
+ except Exception:
+ key_count = 5
+ if self.KeyAI_timer_count >= key_count: #防抖200ms
+ if self.KeySOS_timer_flag == 1:
+ self.KeySOS_timer_flag = 0
+ self.KeySos_long_press = 0
+ self.KeySOS_timer.stop()
+ print("KeySOS_timer_flag!!!!!!!!!!!!!!!") #短按两次需要清除标识
+
+ if self.KeyAI_long_press == 0:
+ try:
+ _sos_on = vc_config.get_bool("SOS_ENABLED", True)
+ except Exception:
+ _sos_on = True
+ if _sos_on and self.KeySOS_timer_flag == 0:
+ self.KeySOS_timer_flag = 1
+ self.KeySos_long_press = 0
+ self.KeySOS_timer.start(5000, 0, self.KeySos_timer_cb) #短按开启5s定时器 5s之内没有长按3s则清除标识 长按3s拨打sos紧急联系人
+ else:
+ self.KeySOS_timer_flag = 0
+ self.KeySos_long_press = 0
+ self.KeySOS_timer.stop()
+
+ #EventMesh.publish("AI_key_release")
+ EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_key_release})
+ self._ai_int_enable_after_hold()
+ self.KeyAI_timer.stop()
+ self.KeyAI_timer_count = 0
+ self.KeyAI_press = 0
+ self.KeyAI_long_press=0
+
+ except Exception as e:
+ usys.print_exception(e)
+
+ def AI_key_press(self):
+ # EventMesh.publish("wakeup_BT")
+
+ # if dev_type == "7PIN" or dev_type == "7PIN_coze" :
+ # # self.aud.aud_tone_play(10,60)#播放按键音
+ # EventMesh.publish("audio_montage_play",["chenggong.mp3"])
+ self.check_rest_timer_count = 0
+ print("AI_key_press")
+ EventMesh.publish("AI_key_press")
+ def KeySos_timer_cb(self,*argc):
+ print("KeySos_timer_cb!!!!!!!!!!{} {}".format(self.KeySos_long_press,self.KeySOS_timer_flag))
+
+ if self.KeySos_long_press == 1 and self.KeySOS_timer_flag == 1: #清空sos标识
+ self.KeySos_long_press=0
+ self.KeySOS_timer_flag=0
+
+ self.KeySos_long_press=0
+ self.KeySOS_timer_flag = 0
+ return
+ self.KeySOS_timer_flag = 0
+ if self.KeySOS_timer_count >= 3:
+ self.KeySOS_timer_count = 0
+ get_sos_flag = EventMesh.publish("get_sos_flag")
+ if get_sos_flag == 0:
+ EventMesh.publish("set_sos_info_call")
+ self.KeySOS_timer_count = 0
+ pass
+
+ def AI_key_long_press(self):
+ self.check_rest_timer_count = 0
+ print("AI_key_long_press")
+
+ EventMesh.publish("AI_key_long_press")
+
+ def AI_key_release(self):
+ print("AI_key_release")
+ # self.KeySOS_timer_count +=1
+ # print("self.KeySOS_timer_count:{} {}".format(self.KeySOS_timer_count,self.KeySOS_timer_flag))
+ # if self.KeySOS_timer_flag == 0:
+ # self.KeySOS_timer_flag = 1
+ # self.KeySOS_timer.start(5000, 0, self.KeySos_timer_cb)
+ EventMesh.publish("AI_key_release")
+
+ def pwk_key_double_press(self):
+ self.check_rest_timer_count = 0
+ try:
+ if getattr(self, "_single_power_ai_merged", False):
+ try:
+ self.KeyAI_timer.stop()
+ except Exception:
+ pass
+ self.KeyAI_timer_count = 0
+ self.KeyAI_press = 0
+ self.KeyAI_long_press = 0
+ self._ai_int_enable_after_hold()
+ except Exception:
+ pass
+ print("pwk_key_double_press")
+ EventMesh.publish("pwk_key_double_press")
+
+ def pwk_key_Long_Press(self,event=None,msg=None):
+ self.check_rest_timer_count = 0
+ print("pwk_key_long_press!!!!!!!")
+ print("pwk_key_long_press!!!!!!!")
+
+ # EventMesh.publish("paly_iccid_imei")
+ # return
+ EventMesh.publish("audio_montage_play",["zhengzaiguanji.mp3"])
+ #self.aud.play(1,0,'U:/static/zhengzaiguanji.mp3')#关机音频
+ EventMesh.publish("set_led_state", {"battery": "empty"})
+ utime.sleep_ms(3000)
+ self.aud.stopPlayStream()
+ self.aud.stopAll()
+ Power.powerDown()
+ #print("AI_key_release")
+ #EventMesh.publish("pwk_key_long_press")
+
+ def pwk_key_release(self):
+ self.check_rest_timer_count = 0
+ #print("pwk_key_release")
+ EventMesh.publish("pwk_key_release")
+
+
+ def wdt_timer_cb(self, *args, **kwargs):
+ if self.is_wdt == 1:
+ self.wdt.feed()
+
+ def AI_dev_timer_cb(self, *args, **kwargs):
+ #print("AI_dev_timer_cb")
+ EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_dev_timer_event})
+ def _battery_empty_shutdown_seq(self):
+ """REQ-BAT-03:红快闪 3 次 → 灭灯 → 关机提示音 → 关机(btn 线程执行)。"""
+ try:
+ EventMesh.publish("battery_priority_mute_vc")
+ except Exception:
+ pass
+ try:
+ n, ms = 3, 500
+ if "vc_config" in globals() and vc_config:
+ n = int(vc_config.get_int("BATTERY_EMPTY_FLASH_COUNT", 3))
+ ms = int(vc_config.get_int("BATTERY_EMPTY_FLASH_PERIOD_MS", 500))
+ EventMesh.publish("set_led_state", {"alert": "red_flash_3"})
+ utime.sleep_ms(n * ms * 2 + 200)
+ EventMesh.publish("set_led_state", {"ai_state": "idle", "battery": "normal", "charging": "none"})
+ except Exception:
+ pass
+ try:
+ EventMesh.publish("audio_montage_play", ["didianguanji.mp3"])
+ utime.sleep_ms(4500)
+ self.aud.stopPlayStream()
+ self.aud.stopAll()
+ except Exception:
+ pass
+ try:
+ Power.powerDown()
+ except Exception:
+ pass
+
+ def AI_dev_timer_event(self):
+ #EventMesh.publish("audio_montage_play",["liuliangtishi.mp3"])
+ EventMesh.publish("send_power_init_data")
+ if self.is_wdt == 1:
+ self.wdt.feed()
+ VC_satrt_flag = EventMesh.publish("get_VC_satrt_flag")#获取vc是否在运行
+ if VC_satrt_flag == None:
+ VC_satrt_flag = 0
+ voice_record_satrt_flag = EventMesh.publish("get_voice_record_flag")#获取静默或者语音留言是否在运行
+ if voice_record_satrt_flag == None:
+ voice_record_satrt_flag = 0
+ _bcfg = _BatteryCfg.instance()
+ Vbatt = _bcfg.get_vbatt_mv_charge() if self.usb_status == 1 else _bcfg.get_vbatt_mv()
+ if self.usb_status == 1 and VC_satrt_flag == 0 and voice_record_satrt_flag == 0:
+ try:
+ if not ("vc_config" in globals() and vc_config and vc_config.get_bool("USE_MIN_HW_STATUS", True)):
+ EventMesh.publish("set_led_state", {"charging": "charging"})#充电红灯常亮
+ except Exception:
+ pass
+ if self.usb_status == 1 and Vbatt >= _bcfg.charge_full_mv and VC_satrt_flag == 0 and voice_record_satrt_flag == 0:
+ try:
+ if not ("vc_config" in globals() and vc_config and vc_config.get_bool("USE_MIN_HW_STATUS", True)):
+ EventMesh.publish("set_led_state", {"charging": "full"})
+ except Exception:
+ pass
+ if self.usb_charge_flag == 0 :
+ EventMesh.publish("audio_montage_play",["R_CHARGE_FULL.mp3"])
+ #self.aud.play(1,0,'U:/static/R_CHARGE_FULL.mp3')#充电已满
+ self.usb_charge_flag = 1
+ try:
+ low_soc = int(_bcfg.low_soc)
+ except Exception:
+ low_soc = 25
+ warn_interval_ms = 300000
+ try:
+ if "vc_config" in globals() and vc_config:
+ warn_interval_ms = int(vc_config.get_int("BATTERY_LOW_WARN_INTERVAL_MS", 300000))
+ except Exception:
+ pass
+ soc = None
+ try:
+ soc = self.get_battery()
+ except Exception:
+ soc = None
+ if self.usb_status == 0:
+ if _bcfg.should_shutdown_empty(Vbatt):
+ if getattr(self, "_empty_shutdown_done", 0) == 0:
+ self._empty_shutdown_done = 1
+ try:
+ print("[BAT] empty shutdown vbatt={} soc={} empty_mv={}".format(
+ Vbatt, soc, _bcfg.empty_mv))
+ except Exception:
+ pass
+ EventMesh.publish("publish_AI_btnInfo", {"func": self._battery_empty_shutdown_seq})
+ elif soc is not None and soc < low_soc:
+ if voice_record_satrt_flag == 0:
+ try:
+ now = utime.ticks_ms()
+ last = getattr(self, "_low_warn_last_ms", 0)
+ if (not last) or utime.ticks_diff(now, last) >= warn_interval_ms:
+ self._low_warn_last_ms = now
+ try:
+ print("[BAT] low warn soc={} interval_ms={}".format(soc, warn_interval_ms))
+ except Exception:
+ pass
+ EventMesh.publish("audio_montage_play", ["Low_power_warning.mp3"])
+ except Exception:
+ pass
+ else:
+ try:
+ self._low_warn_last_ms = 0
+ self._empty_shutdown_done = 0
+ except Exception:
+ pass
+ if VC_satrt_flag == 0 and Vbatt is not None and Vbatt >= int(_bcfg.low_mv):
+ try:
+ if not ("vc_config" in globals() and vc_config and vc_config.get_bool("USE_MIN_HW_STATUS", True)):
+ EventMesh.publish("set_led_state", {"charging": "none", "battery": "normal"})
+ except Exception:
+ pass
+
+ self.check_rest_timer_count += 1
+ if self.check_rest_timer_count >= 8640:#24小时没按键,则关机
+ self.pwk_key_Long_Press()
+
+ def get_battery(self, event=None, msg=None):
+ # SoC 基于 _BatteryCfg 10 点滑动平均电压,与 protocol 心跳/AI_hw 一致
+ try:
+ return _BatteryCfg.instance().soc_now()
+ except Exception:
+ return 0
+ def _audio_is_battery_priority(self, msg):
+ try:
+ for i in (msg or []):
+ n = str(i)
+ if ("Low_power" in n) or ("didianguanji" in n):
+ return True
+ except Exception:
+ pass
+ return False
+
+ def audio_montage_play(self,event,msg):
+ self.wakeup_BT()
+ bat_pri = self._audio_is_battery_priority(msg)
+ if bat_pri:
+ try:
+ EventMesh.publish("battery_priority_mute_vc")
+ except Exception:
+ pass
+ else:
+ # 仅服务端 TTS PCM 在播时跳过;低电/关机提示优先级更高(见上)
+ try:
+ if EventMesh.publish("get_vc_tts_playback_active") == 1:
+ print("[audio-arb] skip local montage_play during tts_pcm")
+ return
+ except Exception:
+ pass
+ self.aud.stopPlayStream()
+ self.aud.stopAll()
+ str_data='mp3files='
+ for i in msg:
+ try:
+ str_tmp = i.replace(".mp3","")
+ str_data+="{}.mp3+".format(audio_buf.index(str_tmp))
+ except Exception as e:
+ usys.print_exception(e)
+ str_data = str_data[:-1]
+ print("audio_montage_play:{}".format(str_data))
+ self.aud.montage_play('U:/static/audio.bin',1,1,str_data)
+ self.play_imei_timer_count=1
+ self.play_imei_timer.stop()
+ self.play_imei_timer.start(1000,1,self.play_imei_timer_cb)
+
+ def paly_iccid_imei(self,event,msg):
+
+ self.wakeup_BT()
+ self.aud.stopPlayStream()
+ self.aud.stopAll()
+ str_data = 'mp3files={}.mp3+'.format(audio_buf.index("liuliangtishi"))#流量提示
+ imei = modem.getDevImei()
+ iccid = sim.getIccid()
+ print("paly_iccid_imei:ICCID:{}".format(iccid))
+ if iccid != -1 and len(iccid) > 5:
+ iccid = iccid.upper()
+ if len(iccid) <20:
+ for i in range(20-len(iccid)):
+ iccid = "0"+iccid
+ str_data += '{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+'.format(audio_buf.index("R_READ_TIME_{}".format(iccid[0]))\
+ ,audio_buf.index("R_READ_TIME_{}".format(iccid[1])),audio_buf.index("R_READ_TIME_{}".format(iccid[2])),audio_buf.index("R_READ_TIME_{}".format(iccid[3])),\
+ audio_buf.index("R_READ_TIME_{}".format(iccid[4])),audio_buf.index("R_READ_TIME_{}".format(iccid[5])),audio_buf.index("R_READ_TIME_{}".format(iccid[6])),audio_buf.index("R_READ_TIME_{}".format(iccid[7])),\
+ audio_buf.index("R_READ_TIME_{}".format(iccid[8])),audio_buf.index("R_READ_TIME_{}".format(iccid[9])),audio_buf.index("R_READ_TIME_{}".format(iccid[10])),audio_buf.index("R_READ_TIME_{}".format(iccid[11])),\
+ audio_buf.index("R_READ_TIME_{}".format(iccid[12])),audio_buf.index("R_READ_TIME_{}".format(iccid[13])),audio_buf.index("R_READ_TIME_{}".format(iccid[14])),audio_buf.index("R_READ_TIME_{}".format(iccid[15])),\
+ audio_buf.index("R_READ_TIME_{}".format(iccid[16])),audio_buf.index("R_READ_TIME_{}".format(iccid[17])),audio_buf.index("R_READ_TIME_{}".format(iccid[18])),audio_buf.index("R_READ_TIME_{}".format(iccid[19])))
+ str_data += '{}.mp3+'.format(audio_buf.index("shouhou"))#可联系售后解决,联系方式见售后客服电话是400-886-8777或到微信公众号柒牌SEVENBRAND自行充值:
+ self.aud.montage_play('U:/static/audio.bin',1,1,str_data)
+ #开定时器不让系统休眠
+ self.play_imei_timer_count=1
+ self.play_imei_timer.stop()
+ self.play_imei_timer.start(1000,1,self.play_imei_timer_cb)
+
+ def play_imei_timer_cb(self,event=None,msg=None):
+ if self.play_imei_timer_count == 1:
+ if EventMesh.publish("get_audio_play_state") == 0:
+ print("音频文件播放完成")
+ self.play_imei_timer_count=0
+ self.play_imei_timer.stop()
+ return
+ EventMesh.publish(constants.EVENT.SYSTEM_UP)#唤醒休眠
+
+ #鉴权出错,播放imei号
+ def paly_device_res_error(self,event,msg):
+ self.wakeup_BT()
+ EventMesh.publish(constants.EVENT.SYSTEM_UP)#唤醒休眠
+ str_data = 'mp3files={}.mp3+'.format(audio_buf.index("jianquancuowu"))#AI功能异常,请联系客户查询,设备号为:
+ imei = modem.getDevImei()
+ imei = imei.upper()
+ str_data += '{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(imei[0]))\
+ ,audio_buf.index("R_READ_TIME_{}".format(imei[1])),audio_buf.index("R_READ_TIME_{}".format(imei[2])),audio_buf.index("R_READ_TIME_{}".format(imei[3])),\
+ audio_buf.index("R_READ_TIME_{}".format(imei[4])),audio_buf.index("R_READ_TIME_{}".format(imei[5])),audio_buf.index("R_READ_TIME_{}".format(imei[6])),audio_buf.index("R_READ_TIME_{}".format(imei[7])),\
+ audio_buf.index("R_READ_TIME_{}".format(imei[8])),audio_buf.index("R_READ_TIME_{}".format(imei[9])),audio_buf.index("R_READ_TIME_{}".format(imei[10])),audio_buf.index("R_READ_TIME_{}".format(imei[11])),\
+ audio_buf.index("R_READ_TIME_{}".format(imei[12])),audio_buf.index("R_READ_TIME_{}".format(imei[13])),audio_buf.index("R_READ_TIME_{}".format(imei[14])))
+ #print("str_data:{}".format(str_data))
+ self.aud.montage_play('U:/static/audio.bin',1,1,str_data)
+ self.play_imei_timer_count=1
+ self.play_imei_timer.stop()
+ self.play_imei_timer.start(1000,1,self.play_imei_timer_cb)
+