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
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
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",
#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):
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')
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"])
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
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")
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上传
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:
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
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)})
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()
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" :#配置更新中,需要停止录音
return 0
+
if text.find("音量调整") != -1:
text = cmd["command"]["params_json"]
text = ujson.loads(text)
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":#柒牌
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"
# 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())
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()
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)
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"
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):
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类型
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
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)
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
self.voice_id = ""
self.deviceReadState = ""
self.reconnect_count = 0
+ self.test_id = 0
self.bt_connect_list = []
self.new_voice_list = [
{
}
]
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
# "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): #更新播放语音留言信息
"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
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
token = EventMesh.publish("get_dev_token")
print("token:{}".format(token))
- token = "957119d6b67b89dc1bc533d2e0c058d559"
+ # token = "957119d6b67b89dc1bc533d2e0c058d559"
# token = "951b74498eabe241e8a8c644a4f07531ef"
try:
_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
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 = "#@{}@#;"
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"""
"msg":"消息收到响应",
"data":{
"cmd":"ringtone_list",
- "rest":"success|error",
+ "rest":"success",
"msg":"收到闹钟铃声列表."
}
}
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("开始录音")
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):
# "msg":"收到请求新语音列表."
# }
# }
+ print("recv send_data{}".format(msg))
class IOTWeb_new_voice_msg_listProtoCol(ProtoCol):
"""new_voice_msg_list"""
@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"""
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):
# 通过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":"收到蓝牙连接请求"
}
}
# "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):
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)
@param msg: 接收到的下行数据
"""
# {
- # "cmd":"bt_connect_record_list",
- # "ts":1738283829,
- # "msg":"连接蓝牙设备",
- # "data":"目标设备mac地址"
- # }
- # {
# "cmd":"post_rest",
# "ts":1738283829,
# "msg":"消息收到响应",
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):
"""链路保持"""
# 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:
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:
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
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