From: dxy <1731678236qq.com> Date: Fri, 15 Aug 2025 01:43:55 +0000 (+0800) Subject: IOT语音留言消息协议 X-Git-Url: http://git.snicker.com.cn/?a=commitdiff_plain;h=cd9049b2f2848b0f3428da9239e6cc9a3604819e;p=mirrors%2FASR1603_G5.git IOT语音留言消息协议 --- diff --git a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/ai_VC.py b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/ai_VC.py index 2f02ca4f..cd3f295e 100644 --- a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/ai_VC.py +++ b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/ai_VC.py @@ -230,7 +230,10 @@ class AI_UART(): EventMesh.subscribe("send_connect_bt_mac",self.send_connect_bt_mac) EventMesh.subscribe("send_disconnect_bt_mac",self.send_disconnect_bt_mac) EventMesh.subscribe("send_imei_to_ble",self.send_imei_to_ble) + EventMesh.subscribe("send_get_connect_bt_state",self.send_get_connect_bt_state) self.uart_timer = osTimer() + self.get_bt_connect_timer = osTimer() + self.get_bt_connect_flag = 0 self.uart_timer_count = 0 self.bt_ota_flag = 0 self.read_ack_flag = 0 @@ -348,6 +351,11 @@ class AI_UART(): EventMesh.publish("send_bt_scan_list",jsload_data) elif jsload_data["event"]=="bt_connect_single": EventMesh.publish("save_bt_connect_list",jsload_data) + elif jsload_data["event"]=="need_send_bt_connect_list": + self.get_bt_connect_timer.stop() + self.get_bt_connect_flag = 0 + EventMesh.publish("save_bt_connect_list",jsload_data) + EventMesh.publish("send_bt_connect_list") elif jsload_data["event"] == "ack" :#电源按键按下 self.read_ack_flag = 1 @@ -379,6 +387,23 @@ class AI_UART(): print("send_ble_adv_switch{}".format(json_str)) self.send_data(json_str) pass + def send_get_connect_bt_state(self,event,msg): + json_data = \ + { + + "event": "get_connect_bt_state" + } + json_str =ujson.dumps(json_data) + print("send_get_connect_bt_state{}".format(json_str)) + self.send_data(json_str) + self.get_bt_connect_flag = 1 + self.get_bt_connect_timer.start(2000,0,self.get_bt_connect_timer_cb) + def get_bt_connect_timer_cb(self,*agrc): + if self.get_bt_connect_flag == 1: + EventMesh.publish("send_bt_connect_list") + pass + self.get_bt_connect_flag = 0 + pass def send_ble_scan(self,event,msg): # // { # // "event":"switch_bt_state", @@ -672,6 +697,7 @@ class AI_dev(Abstract): #EventMesh.publish("publish_AI_btnInfo",{"func":self.ntptime_cb}) self.check_rest_timer_count = 0 self.ai_uart = AI_UART() + self.Keycall1_press_count = 0 self.ble_switch_flag_time = osTimer() self.ble_switch_flag_time.start(5000, 0, self.ble_switch_flag_time_cb) def ble_switch_flag_time_cb(self,*args): @@ -697,7 +723,11 @@ class AI_dev(Abstract): VC_satrt_flag = EventMesh.publish("get_VC_satrt_flag")#获取vc是否在运行 if VC_satrt_flag == None: VC_satrt_flag = 0 - if 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 or voice_record_satrt_flag == 0: self.aud.stop() #EventMesh.publish("flicker_led_red")#充电闪灯 #self.aud.play(1,1,'U:/static/R_CHARGE_IN.mp3') @@ -710,7 +740,10 @@ class AI_dev(Abstract): VC_satrt_flag = EventMesh.publish("get_VC_satrt_flag")#获取vc是否在运行 if VC_satrt_flag == None: VC_satrt_flag = 0 - if 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 or voice_record_satrt_flag == 0: self.aud.stop() EventMesh.publish("close_led") EventMesh.publish("audio_montage_play",["R_CHARGE_OUT.mp3"]) @@ -1163,8 +1196,9 @@ class device_res_author(Abstract): EventMesh.subscribe("dev_sign_in", self.dev_sign_in) EventMesh.subscribe("dev_NTP", self.dev_NTP) EventMesh.subscribe("post_iccid_user", self.post_iccid_user) - self.post_iccidd_token_timer = osTimer() - self.post_iccidd_token_timer.start(10000, 0, self.post_iccidd_token_timer_cb) + # self.post_iccidd_token_timer = osTimer() + # self.post_iccidd_token/_timer.start(10000, 0, self.post_iccidd_token_timer_cb) + self.connect_web_flag = 0 #EventMesh.publish_async("dev_NTP",thread_size = 8192) # count = 0 @@ -1182,7 +1216,7 @@ class device_res_author(Abstract): self.dev_active() #设备激活 self.dev_sign_in() #设备登入 - self.connect_web_flag = 0 + print("device_res_author __init__ end !!!!!!!!!!!!!!!!!") def post_iccidd_token_timer_cb(self,*argc): EventMesh.publish("post_iccid_user") @@ -1488,7 +1522,9 @@ class device_res_author(Abstract): if EventMesh.publish("get_dev_token") != None: if len(EventMesh.publish("get_dev_token")) != 0: if self.connect_web_flag == 0: + EventMesh.publish("post_iccid_user") EventMesh.publish("connect_iot_websocket_cb") + self.connect_web_flag = 1 print("dev_sign_in end") #ICCID上传 @@ -1791,7 +1827,7 @@ class AI_VC(Abstract): self.asr_taskid = "" self.VC_taskid = "" self.VC_server = 2 #0柒牌正式服务器,1:测试服务器1,2:测试服务器2 - + self.voice_flag = 0 EventMesh.publish("AI_alarm_open")# self.server_ip = EventMesh.publish("get_storage_config","server_ip")# if self.server_ip == None: @@ -2636,6 +2672,11 @@ class AI_VC(Abstract): print('audio-play finish.!!!!!!') def AI_key_press(self, event, msg):#按键按下 + if self.voice_flag == 1: #语音留言模式 + # EventMesh.publish("stop_AI_record") + self.Close() + EventMesh.publish("start_voice_record",2)#停止静默录音 + return EventMesh.publish("stop_voice_record") #开启静默需要关闭 print("AI_key_press") self.get_config_timer_count = 0 @@ -2682,6 +2723,10 @@ class AI_VC(Abstract): def AI_key_release(self, event, msg):#按键弹起 print("AI_key_release123") self.key_state = 0 + if self.voice_flag == 1: + self.voice_flag=0 + EventMesh.publish("stop_voice_record")#停止静默录音 + return if self.AI_key_long_press_flag == 1 :#有长按 #self.AI_client_VC_end_speech() #EventMesh.publish("publish_AI_btnInfo",{"func":utime.sleep_ms,'data':(1000)}) @@ -3359,7 +3404,15 @@ class AI_VC(Abstract): EventMesh.publish("open_led_blue") print("VC:Started!!!!!!!!\r\n") - if self.AI_TTS_str == "": + + if self.AI_TTS_str == "" and self.AI_new_voice_url != "": + EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_new_voice}) + elif self.AI_TTS_str != "" and self.AI_new_voice_url == "": + EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_VC_synthesis}) + elif self.AI_TTS_str != "" and self.AI_new_voice_url != "": + EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_new_voice}) + self.AI_TTS_str = "" + else: #开始上传语音 if dev_type != "7PIN_coze": self.chenggong_tone() @@ -3367,13 +3420,10 @@ class AI_VC(Abstract): self.VC_record_state_flag =2 else: EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_VC_send_speech}) - - else: - EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_VC_synthesis}) - if self.AI_new_voice_url != "": - EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_new_voice}) + # if self.AI_new_voice_url != "": + # EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_new_voice}) self.VC_state = VC_State_None elif jsload_data["event"] == "config.update" :#配置更新中,需要停止录音 @@ -3680,6 +3730,7 @@ class AI_VC(Abstract): return 0 + if text.find("音量调整") != -1: text = cmd["command"]["params_json"] text = ujson.loads(text) @@ -4092,7 +4143,13 @@ class AI_VC(Abstract): else: self.AI_TTS_str = "当前已是最新版本" return 0 - + if text.find("语音留言") != -1: + self.voice_flag = 1 + self.AI_TTS_str = "已进入语音留言模式,长按按钮开始录音,松开按钮结束" + self.Close_flag = 1 + + print("语音留言!!!!!!!!!!") + return 0 if len(text)<16 and (text.find("再见") != -1 or text.find("拜拜") != -1 or text.find("关闭对话") != -1): #EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) if dev_type != "7PIN" and dev_type != "7PIN_coze":#柒牌 @@ -4409,8 +4466,8 @@ class AI_VC(Abstract): json_data["payload"]["outbound_attributes"]["provider"]=self.outbound_attributess_provider#TTS音色服务选择,火山 json_data["payload"]["inbound_attributes"]["provider"]=self.inbound_attributess_provider#ASR服务选择,火山 if dev_type == "7PIN_BK"or dev_type == "7PIN_BK_coze"or dev_type == "G10":#小瑞 - json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["bot_id"]="7518964489061072911"#语言助手 - json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["workflow_id"]="7518975730094243894" + json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["bot_id"]="7411071327182438412"#语言助手 + json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["workflow_id"]="7468577560454496295" json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["use_workflow"]=True # json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["bot_id"]="7486697248416989193"#极简 # json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["workflow_id"]="7486698347416649778" diff --git a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/main_init.py b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/main_init.py index 81848c3e..f8135d15 100644 --- a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/main_init.py +++ b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/main_init.py @@ -155,27 +155,13 @@ def main_init(): # app.append_manager(mgr.vedioInforManager()) try: try: - import usr.ai_VC_t as _ai + import usr.ai_VC as _ai except Exception as e: usys.print_exception(e) - try: - import usr.ai_VC as _ai + import ai_VC as _ai except Exception as e: usys.print_exception(e) - - try: - import usr.ai_VC_7PIN as _ai - except Exception as e: - usys.print_exception(e) - try: - import usr.ai_VC_G15 as _ai - except Exception as e: - usys.print_exception(e) - try: - import ai_VC as _ai - except Exception as e: - usys.print_exception(e) #app.append_manager(intervManager()) try: app.append_manager(_ai.getStorageDataManager()) @@ -219,7 +205,7 @@ def main_init(): usys.print_exception(e) import protocol as pro try: - # app.append_manager(pro.IOTSendCmdManager()) + app.append_manager(pro.IOTSendCmdManager()) app.append_manager(pro.IOTWebLocationManager()) app.append_manager(pro.sosInfoCallManager()) pcr = pro.ProtoColResolver() @@ -253,6 +239,9 @@ def main_init(): pcr.add_support(pro.IOTWeb_new_voice_msg_listProtoCol()) pcr.add_support(pro.IOTWeb_get_new_voice_msgProtoCol()) pcr.add_support(pro.IOTWeb_new_voice_msgProtoCol()) + pcr.add_support(pro.IOTWeb_get_bt_connect_record_listProtoCol()) + pcr.add_support(pro.IOTWeb_bt_connect_record_listProtoCol()) + pcr.add_support(pro.IOTWeb_fence_sosProtoCol()) sm = pro.SockMangager() sm.add_support_resolver(pcr) diff --git a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/protocol.py b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/protocol.py index 2650b7b6..7029bdb0 100644 --- a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/protocol.py +++ b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/protocol.py @@ -629,9 +629,6 @@ class WEB_CMD_ENUM: BT_SCAN_REST_R_CMD = "bt_scan_rest_R" BT_SCAN_REST_S_CMD = "bt_scan_rest_S" - BT_CONNECT_RECORD_LIST_R="bt_connect_record_list_R" - BT_CONNECT_RECORD_LIST_S="bt_connect_record_list_S" - CONNECT_BT_R="connect_bt_R" CONNECT_BT_S="connect_bt_S" @@ -653,6 +650,12 @@ class WEB_CMD_ENUM: 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" + class IOTSendCmdManager(Abstract): # def __init__(self): @@ -824,10 +827,14 @@ def playpolad_data(data): cmd = data_dict['cmd'] if cmd != None: if cmd == DEVICE_REPORT_RETURN_STRING: - data_cmd = data_dict['data']['cmd'] - # {"cmd":"post_rest","ts":1753870158426,"data":{"cmd":"post_heart_beat","rest":"success","msg":"."}} - print("设备主动上报后台返回的数据 设备不需要回复") - EventMesh.publish(data_cmd+"_R",data_dict) + 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类型 @@ -855,16 +862,28 @@ def protocol_send_total_data(data): return heards_infor #音频流数据格式 #magic+version+type+msgid+playload_len+playload -def protocol_audio_playload_data(data,msgid): +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+DATA_LEN+data + 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 class sosInfoCallManager(Abstract): def __init__(self): self.num = 0 @@ -1127,7 +1146,8 @@ class SockMangager(Abstract): EventMesh.subscribe("screen_get_battery",self.get_battery) EventMesh.subscribe("CHANNEL_IOT_WEB_SEND",self.user_send) EventMesh.subscribe("GET_IOT_PROTOCOL_CILENT",self.get_iot_protoclo_client) - EventMesh.subscribe("SEND_AUDIO_TO_IOT",self.send_audio_to_iot) + 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("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) @@ -1138,6 +1158,7 @@ class SockMangager(Abstract): EventMesh.subscribe("update_play_new_voice_info",self.update_play_new_voice_info) 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) # count = 0 # while True: # count += 1 @@ -1156,6 +1177,7 @@ class SockMangager(Abstract): self.voice_id = "" self.deviceReadState = "" self.reconnect_count = 0 + self.test_id = 0 self.bt_connect_list = [] self.new_voice_list = [ { @@ -1212,26 +1234,48 @@ class SockMangager(Abstract): } ] def save_bt_connect_list(self,event,msg): - data = {"event":"bt_connect_single","data":{"name":"yeiwyei","mac":"89:89:78:78:98:67"}} + 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"] - mac = data["mac"] - need_save = 0 - for i,_alarm in enumerate(self.bt_connect_list): - mac_tmp = _alarm["mac"] - - if mac_tmp == mac: - need_save = 1 - break - self.bt_connect_list[i]["state"] ="disconnected" - - if need_save == 0: #列表里面没有才需要保存 - self.bt_connect_list.append(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 @@ -1250,16 +1294,18 @@ class SockMangager(Abstract): # "md5": "md5", # "fileName": "文件名" # } + print("play_new_voice_list:{}".format(len(self.new_voice_list))) if len(self.new_voice_list) != 0: - print("play_new_voice_list") + for i,data in enumerate(self.new_voice_list): print("play_new_voice_list:{}".format(data)) self.voice_index = i self.voice_id = data["id"] url = data["url"] + # url = "http://qipaiai-oss1.tos-cn-beijing.volces.com/qi_pai_ringtone/2025_08_11/742659759219544064test.mp3" EventMesh.publish("play_new_voice",[url,1]) - self.new_voice_list.pop(i) + break pass def update_play_new_voice_info(self,event,msg): #更新播放语音留言信息 @@ -1271,7 +1317,7 @@ class SockMangager(Abstract): "msg":"修改语音消息阅读状态", "data":self.voice_id } - + self.new_voice_list.pop(self.voice_index) EventMesh.publish(WEB_CMD_ENUM.PUT_VOICE_MSG_STATE_S,put_voice_msg_state) pass @@ -1293,9 +1339,17 @@ class SockMangager(Abstract): usys.print_exception(e) pass - def send_audio_to_iot(self,event,msg): + def send_jm_audio_to_iot(self,event,msg): + send_data = b'' + send_data = protocol_audio_ji_playload_data(msg[0],msg[1],msg[2]) + print("jm:{}".format(send_data[9])) + EventMesh.publish("CHANNEL_IOT_WEB_SEND",send_data) + pass + + def send_yuyin_audio_to_iot(self,event,msg): send_data = b'' - send_data = protocol_audio_playload_data(msg[0],msg[1]) + 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 @@ -1477,7 +1531,7 @@ class SockMangager(Abstract): token = EventMesh.publish("get_dev_token") print("token:{}".format(token)) - token = "957119d6b67b89dc1bc533d2e0c058d559" + # token = "957119d6b67b89dc1bc533d2e0c058d559" # token = "951b74498eabe241e8a8c644a4f07531ef" try: @@ -1498,6 +1552,8 @@ class SockMangager(Abstract): _thread.stack_size(self.thread_buf_size+8*1024) self.iot_web_protoclo_recv_id = _thread.start_new_thread(self.iot_protocol_recv, ()) _thread.stack_size(8*1024) + + EventMesh.publish("publish_AI_btnInfo",{"func":self.hr_report_publish_event,"data":0}) else: print("self.iot_protocol_client init!!!!!!!!!") self.reconnect_count+=1 @@ -1724,7 +1780,8 @@ class NetManager(Abstract): def get_network_state(self, topic, msg): return self.network_state - +#http://220.160.104.34:30800/ws-bus/test/test/voice-record/876226211472149?state=0/1,这个是录音开关的。 +#http://220.160.104.34:30800/ws-bus/test/876226211472149?testType=sosList class ProtoCol(Abstract): TYPE = "" HEADER = "#@{}@#;" @@ -1756,6 +1813,34 @@ class ProtoCol(Abstract): def recv(self, event, msg): pass + +#上报心跳 +class IOTWeb_fence_sosProtoCol(ProtoCol): + """fence_sos""" + TYPE = "fence_sos" + + def send(self, event, msg): + print("send fence_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: 心跳成功 + @param msg: 接收到的下行数据 + """ + 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""" @@ -2273,7 +2358,7 @@ class IOTWeb_ringtone_listProtoCol(ProtoCol): "msg":"消息收到响应", "data":{ "cmd":"ringtone_list", - "rest":"success|error", + "rest":"success", "msg":"收到闹钟铃声列表." } } @@ -2336,13 +2421,26 @@ class IOTWeb_voice_recordProtoCol(ProtoCol): if data == "0": s_rest = "0" EventMesh.publish(WEB_CMD_ENUM.VOICE_RECORD_S_CMD,s_rest) - EventMesh.publish("stop_voice_record") - print("停止录音") + record_mode = EventMesh.publish("get_voice_record_mode") + if record_mode == None: + record_mode = 0 + if record_mode == 2:#语音留言不允许打断 + pass + else: + EventMesh.publish("stop_voice_record",1) + print("停止录音") elif data == "1": s_rest = "1" EventMesh.publish(WEB_CMD_ENUM.VOICE_RECORD_S_CMD,s_rest) - EventMesh.publish("start_voice_record") + record_mode = EventMesh.publish("get_voice_record_mode") + if record_mode == None: + record_mode = 0 + if record_mode == 2:#语音留言不允许打断 + pass + else: + EventMesh.publish("start_voice_record",1) + print("开始录音") @@ -2496,20 +2594,25 @@ class IOTWeb_get_new_voice_msgProtoCol(ProtoCol): TYPE = "get_new_voice_msg" def send(self, event, msg): - print("send get_new_voice_msg{}".format(msg)) # 通过websocket发送到服务器端 - # date_tmp = utime.localtime() - # time_tmp = utime.mktime(date_tmp) - # get_new_voice_msg = { + date_tmp = utime.localtime() + time_tmp = utime.mktime(date_tmp) + # { # "cmd":"get_new_voice_msg", - # "ts":time_tmp, + # "ts":1738283829, # "msg":"请求未读的语音消息列表", - # "data":None + # "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 send_data{}".format(send_data)) + 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",msg) def recv(self, event, msg): @@ -2528,6 +2631,7 @@ class IOTWeb_get_new_voice_msgProtoCol(ProtoCol): # "msg":"收到请求新语音列表." # } # } + print("recv send_data{}".format(msg)) class IOTWeb_new_voice_msg_listProtoCol(ProtoCol): """new_voice_msg_list""" @@ -2613,6 +2717,47 @@ class IOTWeb_put_voice_msg_stateProtoCol(ProtoCol): @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,None) + print("recv get_bt_connect_record_list{}".format(msg)) + #蓝牙开关 class IOTWeb_switch_bt_stateProtoCol(ProtoCol): """switch_bt_state""" @@ -2751,7 +2896,7 @@ class IOTWeb_get_bt_stateProtoCol(ProtoCol): if switch_bt_state == None: switch_bt_state = 0 - EventMesh.publish(WEB_CMD_ENUM.BT_STATE_S_CMD,str(switch_bt_state)) + EventMesh.publish(WEB_CMD_ENUM.GET_BT_STATE_S,str(switch_bt_state)) #蓝牙扫描列表 class IOTWeb_bt_scan_restProtoCol(ProtoCol): @@ -2786,13 +2931,16 @@ class IOTWeb_connect_btProtoCol(ProtoCol): # 通过websocket发送到服务器端 date_tmp = utime.localtime() time_tmp = utime.mktime(date_tmp) + s_ret = "success" + if msg == 0: + s_ret = "error" connect_bt = { "cmd":"post_rest", "ts":time_tmp, "msg":"消息收到响应", "data":{ "cmd":"connect_bt", - "rest":"success", + "rest":s_ret, "msg":"收到蓝牙连接请求" } } @@ -2813,11 +2961,16 @@ class IOTWeb_connect_btProtoCol(ProtoCol): # "msg":"连接蓝牙设备", # "data":"目标设备mac地址" # } + ok = 1 if "data" in msg: mac = msg["data"] - mac = "75:e8:8c:62:9a:df" - EventMesh.publish("send_connect_bt_mac",mac) - EventMesh.publish(WEB_CMD_ENUM.CONNECT_BT_S,None) + # mac = "75:e8:8c:62:9a:df" + 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): @@ -2827,44 +2980,8 @@ class IOTWeb_bt_connect_record_listProtoCol(ProtoCol): def send(self, event, msg): print("send bt_connect_record_list{}".format(msg)) # 通过websocket发送到服务器端 - # { - # "cmd":"bt_connect_record_list", - # "ts":1738283829, - # "msg":"上报蓝牙连接列表", - # "data":[ - # { - # "name":"蓝牙名称", - # "mac":"蓝牙地址", - # "state":"connected/disconnected/connecting" - # } - # ] - # } - date_tmp = utime.localtime() - time_tmp = utime.mktime(date_tmp) - bt_connect_record_list = { - "cmd":"bt_connect_record_list", - "ts":time_tmp, - "msg":"上报蓝牙连接列表", - "data":[ - { - "name":"蓝牙名称", - "mac":"12:34:56:78:78:87", - "state":"connected" - }, - { - "name":"蓝牙名称", - "mac":"12:34:56:78:78:86", - "state":"connecting" - }, - { - "name":"蓝牙名称", - "mac":"12:34:56:78:78:85", - "state":"connecting" - } - ] - } send_data = b'' - send_data = protocol_send_total_data(bt_connect_record_list) + send_data = protocol_send_total_data(msg) print("send_data bt_state{}".format(send_data)) EventMesh.publish("CHANNEL_IOT_WEB_SEND", send_data) @@ -2875,12 +2992,6 @@ class IOTWeb_bt_connect_record_listProtoCol(ProtoCol): @param msg: 接收到的下行数据 """ # { - # "cmd":"bt_connect_record_list", - # "ts":1738283829, - # "msg":"连接蓝牙设备", - # "data":"目标设备mac地址" - # } - # { # "cmd":"post_rest", # "ts":1738283829, # "msg":"消息收到响应", @@ -2931,7 +3042,7 @@ class IOTWeb_disconnect_btProtoCol(ProtoCol): mac = msg["data"] EventMesh.publish("send_disconnect_bt_mac",mac) print("recv disconnect_bt{}".format(msg)) - EventMesh.publish(DISCONNECT_BT_S,None) + EventMesh.publish(WEB_CMD_ENUM.DISCONNECT_BT_S,None) class LK_ProtoCol(ProtoCol): """链路保持""" diff --git a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/voice_record.py b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/voice_record.py index b5a6e7c7..cc7df050 100644 --- a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/voice_record.py +++ b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/voice_record.py @@ -36,106 +36,54 @@ class VOICE_RECORD(Abstract): #静默录音 # VOICE_RECORD def __init__(self): - self.AI_record_tmp_queue = Queue(100) - self.AI_ASR_send_data_queue = Queue(200) - self.AI_VC_send_data_queue = Queue(100) - self.AI_audio_queue = Queue(100) #self.AI_WS_connect_Queue = Queue(100) #释放用 - self.AI_TTS_str = "" - self.AI_ASR_str = "" - self.AI_ASR_flag = 0 - self.AI_ASR_str_tmp = "" - self.AI_ASR_send_buf_len = 0 - self.AI_ASR_text_tmp = "" - self.AI_ASR_text_repet_count = 0 - - self.VC_dialog_id = ""# - self.VC_message_id=None - self.VC_task_id =None - self.AI_client_VC = None - self.AI_client_VC_recv_id = 0 - self.AI_client_VC_recv_lock = 0 - self.AI_client_VC_isconnect =0 - self.AI_client_VC_debug =0 - - self.key_state = 0 - - self.AI_client_asr = None - self.AI_client_asr_recv_id = 0 - self.AI_client_asr_recv_lock = 0 - self.AI_client_asr_isconnect =0 - self.AI_ASR_timer = osTimer() - self.AI_ASR_timer_count = 0 - self.AI_client_asr_debug =0 - self.AI_ASR_check_timeout = 0 - self.AI_ASR_error_timeout = 0 - self.VC_Thinking_timerout = 0 - - self.record_pcm = None - self.play_pcm = None - self.voice_record_thread_id = 0 - self.VC_record_thread_lock = 0 - self.VC_pingping_timerout = 0 - self.asr_pingping_timerout = 0 - self.factory_timer = osTimer() - self._1S_timer = osTimer() self.Audio_buf_size = 16*1024 self.record = audio.Record() #self.record.end_callback(self.record_callback) self.record.gain_set(4,10) #self.record.gain_set(4,12) self.aud = audio.Audio(0) - #self.aud.setVolume(self.VC_TTS_volume //10) - self.audio_play_state = 1 #音频播放完状态 - self.close_timerout = 0 - self.LocalRespondingEnded_timerout = 0 - - self.VC_Play_flag = 0 - self.play_flag = 0 - self.VC_record_state_flag = 0 - self.AI_key_long_press_flag = 0 - self.websocket_error_count = 0 - - self.tts_in_data_len = 0 - self.tts_out_data_len = 0 - self.VC_satrt_flag = 0 - self.session_id = "" self.start_voice_record_flag = 0 self.connect_web_count = 0 self.iot_protocol_client = None - self.VC_record_samplerate = 16000 self.msgid_int = 0 - self.AI_audio_queue_thread_id = 0 self.open_start = 0 #是否需要超时关闭静默录音 self.voice_timer_out = osTimer() + self.voice_mode = 0 def post_processor_after_instantiation(self): EventMesh.subscribe("start_voice_record", self.start_voice_record)#开始静默录音 EventMesh.subscribe("stop_voice_record", self.stop_voice_record)#停止静默录音 EventMesh.subscribe("get_voice_record_flag", self.get_voice_record_flag)#停止静默录音 + EventMesh.subscribe("get_voice_record_mode", self.get_voice_record_mode)#停止静默录音 + def get_voice_record_flag(self,event,msg): return self.start_voice_record_flag + + def get_voice_record_mode(self,event,msg): + return self.voice_mode def start_voice_record(self,event,msg): 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 == 1: - EventMesh.publish("stop_AI_record") #停止AI录音 - self.start_voice_record_flag = 0 + if get_VC_satrt_flag == 1: #在AI对话不允许静默录音 + return -1 if self.start_voice_record_flag == 1: return -1 #开启线程 #开启录音 EventMesh.publish("stop_voice_record") + self.voice_mode = msg #录音模式 1静默录音 2 语音留言 + self.start_voice_record_flag = 1 self.connect_web_count = 0 if self.voice_record_thread_id == 0: _thread.stack_size((9+2)*1024) self.voice_record_thread_id = _thread.start_new_thread(self.Voice_record_thread,()) _thread.stack_size(8*1024) - self.msgid_int = urandom.getrandbits(32)#随机生成32位的随机数 + self.msgid_int = urandom.getrandbits(32)#随机生成32位的随机数 print(self.msgid_int) - self.start_voice_record_flag = 1 + try: self.record.stream_start(audio.Record.WAV, self.VC_record_samplerate, 0) except Exception as e: @@ -151,7 +99,8 @@ class VOICE_RECORD(Abstract): #静默录音 def stop_voice_record(self,event,msg): if self.start_voice_record_flag == 1: - + self.start_voice_record_flag=0 + utime.sleep_ms(150) try: if self.voice_record_thread_id != 0: try: @@ -171,54 +120,22 @@ class VOICE_RECORD(Abstract): #静默录音 print("Record_len:!!!!!!{}".format(Record_len)) if Record_len <= 0: break + self.voice_mode=0 self.start_voice_record_flag = 0 self.voice_record_thread_id = 0 - self.AI_audio_queue_thread_id = 0 - self.start_voice_record_flag self.connect_web_count = 0 if self.open_start == 1: self.voice_timer_out.stop() print("stop_voice_record") - # 音频队列 - def AI_audio_queue_thread(self): - print("AI_audio_queue_thread start") - while True: - if self.start_voice_record_flag == 0: - break - if self.AI_audio_queue.empty() == False: - data = self.AI_audio_queue.get() - if data != None: - try: - signal = net.csqQueryPoll() - if signal == -1 or sim.getStatus() != 1:#网络正常 - EventMesh.publish("stop_voice_record") - break - if self.iot_protocol_client != None: - self.iot_protocol_client.send(data) - else: - EventMesh.publish("stop_voice_record") - EventMesh.publish("start_voice_record") - - except Exception as e: - usys.print_exception(e) - EventMesh.publish("stop_voice_record") - EventMesh.publish("start_voice_record") - break - pass - print("AI_audio_queue_thread exit") - self.AI_audio_queue_thread_id = 0 - - #获取录音数据 def Voice_record_thread(self): while True: try: - if self.start_voice_record_flag == 0: - break + # 死循环接收数据 Record_read_buf = bytearray(self.Audio_buf_size) Record_len = 0 @@ -227,15 +144,20 @@ class VOICE_RECORD(Abstract): #静默录音 read_buf = bytes(Record_read_buf[:Record_len]) try: #发送静默录音数据到iot平台 - EventMesh.publish("SEND_AUDIO_TO_IOT",[read_buf,self.msgid_int]) + if self.voice_mode == 1: #静默录音开始发送 + EventMesh.publish("SEND_JINMOAUDIO_TO_IOT",[read_buf,self.msgid_int,self.start_voice_record_flag]) + + elif self.voice_mode == 2: #语音留言开始 + EventMesh.publish("SEND_YUYINAUDIO_TO_IOT",[read_buf,self.msgid_int,self.start_voice_record_flag]) + if self.start_voice_record_flag == 0: + break except Exception as e: usys.print_exception(e) print("voice Record_len:{}".format(Record_len)) - - except Exception as e: usys.print_exception(e) utime.sleep_ms(100) + self.start_voice_record_flag = 0 print("Voice_record_thread:exit") self.voice_record_thread_id = 0