IOT语音留言消息协议
authordxy <1731678236qq.com>
Fri, 15 Aug 2025 01:43:55 +0000 (09:43 +0800)
committerdxy <1731678236qq.com>
Fri, 15 Aug 2025 01:43:55 +0000 (09:43 +0800)
2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/ai_VC.py
2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/main_init.py
2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/protocol.py
2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/voice_record.py

index 2f02ca4..cd3f295 100644 (file)
@@ -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"
index 81848c3..f8135d1 100644 (file)
@@ -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)
index 2650b7b..7029bdb 100644 (file)
@@ -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):
     """链路保持"""
index b5a6e7c..cc7df05 100644 (file)
@@ -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