VC_TTS_volume =100\r
sourceVersion =versions.Build_Time\r
Timeversion ="JSWM-"+sourceVersion\r
+ ts = utime.ticks_ms()\r
infor_send_data = {\r
"data":{\r
"version":Timeversion,#版本号\r
"charge":battery_state,#0表示未充电,1表示充电中\r
- "current_role_name":"",#当前音色的name\r
+ "currentRoleName":"",#当前音色的name\r
"volume":str(VC_TTS_volume),#百分比数值\r
- "wifi_rssi":str(net.csqQueryPoll()//6),#wifi强弱:0,1,2,3,4,5。转成这几个梯度\r
+ "wifiRssi":str(net.csqQueryPoll()//6),#wifi强弱:0,1,2,3,4,5。转成这几个梯度\r
"battery":str(battery),#电量\r
- "device_id":modem.getDevImei(),#设备号\r
+ "bargein": "打断模式:0",#不能手动设置打断模式\r
+ "deviceId":modem.getDevImei(),#设备号\r
},\r
- "cmd":"device_info"\r
+ "cmd":"device_info",\r
+ "msg": "上报设备信息",\r
+ "ts": ts\r
}\r
return infor_send_data\r
\r
#设备上报VC状态\r
def device_report_state_send_data(self):\r
ai_status = EventMesh.publish("screen_get_ai")\r
+ ts = utime.ticks_ms()\r
if EventMesh.publish("get_VC_satrt_flag") == 1:#获取vc是否在运行\r
if ai_status < 6 :\r
target_status = "listening"\r
\r
device_report_data ={\r
"data":{\r
- "device_id":modem.getDevImei(),\r
+ "deviceId":modem.getDevImei(),\r
"state":target_status\r
},\r
- "cmd":"chat_state"\r
+ "cmd":"chat_state",\r
+ "msg": "当前服务状态上传",\r
+ "ts": ts\r
}\r
return device_report_data\r
def extract_target_number(json_str):\r
\r
if data[0] != 0xff or data[1] !=0xfe:\r
print("data格式错误,重新登录")\r
- EventMesh.publish("login_IOT")#登录IOT\r
+ # EventMesh.publish("login_IOT")#登录IOT\r
return\r
- payload_len_bytes = data [3:5]\r
- payload_len = ustruct.unpack ('H', payload_len_bytes)[0]\r
- # print ("解析到 Payload 长度:{} 字节".format(payload_len))\r
+ # payload_len_bytes = data [7:5]\r
+ # payload_len = ustruct.unpack ('H', payload_len_bytes)[0]\r
+ # # print ("解析到 Payload 长度:{} 字节".format(payload_len))\r
\r
- payload = data [5 : 5+ payload_len]\r
+ payload = data [8 : ]\r
try:\r
json_str = payload.decode ('utf-8')\r
except UnicodeDecodeError:\r
except UnicodeDecodeError:\r
print ("Payload 解码失败")\r
return\r
+ print ("JSON 字符串:{}".format(json_str))\r
# json_str = "\"" + json_str + "\""\r
if type(json_str) is str and len(json_str)>5:\r
print ("解析出的 JSON 字符串:{}".format(json_str) + "-"*50)\r
EventMesh.subscribe("CHANNEL_IOT_SEND",self.user_send)#发送数据的函数!!重要\r
EventMesh.subscribe("GET_IOT_PROTOCOL_CILENT",self.get_IOT_sock)\r
EventMesh.subscribe("close_socket_timer",self.close_socket_timer)\r
- EventMesh.subscribe("connect_iot_socket",self.connect_iot_socket_cb)#使用socket连接iot平台\r
+ EventMesh.subscribe("connect_iot_websocket",self.connect_iot_websocket_cb)#使用socket连接iot平台\r
EventMesh.subscribe("login_IOT",self.login_IOT)#登录iot平台\r
EventMesh.subscribe("heart_IOT",self.heart_IOt)#心跳包\r
EventMesh.subscribe("send_device_information",self.send_device_information)#上报设备信息\r
\r
def initialization(self, *args):\r
pass\r
- def connect_iot_socket_cb(self,event,msg):\r
- self.connect_iot_socket()\r
+ def connect_iot_websocket_cb(self,event,msg):\r
+ self.connect_iot_websocket()\r
def add_support_resolver(self, resolver):\r
self.resolver = resolver\r
def hr_report_event(self, *args, **kwargs):\r
EventMesh.publish("publish_AI_btnInfo",{"func":self.send_packet_iot,"data":WEB_CMD_ENUM.POST_DEVICE_INFOR_S_CMD})#上报设备信息\r
\r
def iot_connect_timerCb(self,*argc):\r
- self.connect_iot_socket()\r
+ self.connect_iot_websocket()\r
\r
- def connect_iot_socket(self):\r
+ def connect_iot_websocket(self):\r
if EventMesh.publish("get_voice_record_flag") == 1:\r
EventMesh.publish("stop_voice_record")\r
- print("connect_iot_socket !!!!")\r
+ print("connect_iot_websocket !!!!")\r
\r
stagecode, subcode = checknet.wait_network_connected(30)\r
if stagecode == 3 and subcode == 1:\r
self.start_voice_flag = 1\r
else:\r
self.start_voice_flag = 0\r
- \r
+ print("iot没连上1111!!!!")\r
print("self.iot_protocol_client {} self.start_voice_flag:{}".format(self.iot_protocol_client,self.start_voice_flag))\r
if self.iot_protocol_client != None:\r
if self.timer_id == 0:\r
pass\r
except Exception as e: \r
self.iot_protocol_client = None\r
- print("connect_iot_socket error")\r
+ print("connect_iot_websocket error")\r
def heart_IOt(self,event,msg):\r
print("heart_IOT.....")\r
#Header\r
header = ustruct.pack('>H', 0xFFFE) # 使用大端模式\r
#Type\r
packet_type = ustruct.pack('B', 0x02)\r
+ #心跳帧\r
+ json_str = {\r
+ "cmd":"post_heart_beat",\r
+ "ts":1738283829,\r
+ "msg":"心跳",\r
+ "data":{\r
+ "battery": 20\r
+ }\r
+ }\r
+ json_str = ujson.dumps(json_str)\r
+ #字符串转为二进制数据Payload\r
+ payload = json_str.encode('utf-8')\r
+ payloadLen = ustruct.pack('H', len(payload))\r
#拼接\r
- heart_packet = header + packet_type\r
+ heart_packet = header + packet_type + payloadLen + payload#+ crc\r
EventMesh.publish("CHANNEL_IOT_SEND", heart_packet)\r
# print("心跳发送数据包:{}".format(heart_packet))\r
\r
def send_packet_iot(self,data):#发送数据给iot,data为接口json数据\r
- if sim.getStatus() != 1 or self.start_voice_flag == 1:#网络正常\r
+ if sim.getStatus() != 1 :#网络正常\r
+ print("网络不正常")\r
return\r
+ if self.start_voice_flag == 0:\r
+ print("iot不在线")\r
+ EventMesh.publish("publish_AI_btnInfo",{"func":self.connect_iot_websocket}) \r
+ return \r
#Header\r
header = ustruct.pack('>H', 0xFFFE) # 使用大端模式\r
#Type\r
crc = self.crc16(payload)\r
print("crc的长度为{}".format(len(crc)))\r
#拼接\r
- full_packet = header + packet_type + payloadLen + payload+ crc\r
+ full_packet = header + packet_type + payloadLen + payload#+ crc\r
EventMesh.publish("CHANNEL_IOT_SEND", full_packet)\r
print("发送更新数据包:{}".format(full_packet))\r
\r
#CRC16(2字节,基于上述所有字段计算)\r
crc = self.crc16(body)\r
# 完整数据包\r
- full_packet = body + crc\r
+ full_packet = body #+ crc\r
EventMesh.publish("CHANNEL_IOT_SEND", full_packet)\r
print("登录发送数据包:{}".format(full_packet))\r
\r
# print("iot断线重连")\r
# self.login_statu = 0\r
# self.iot_close_therad()\r
- # EventMesh.publish("publish_AI_btnInfo",{"func":self.connect_iot_socket})\r
+ # EventMesh.publish("publish_AI_btnInfo",{"func":self.connect_iot_websocket})\r
# EventMesh.publish("login_IOT")#登录IOT\r
# else:\r
# if self.login_statu == 0:\r
print("iot断线重连")\r
self.login_statu = 0\r
self.iot_close_therad()\r
- EventMesh.publish("publish_AI_btnInfo",{"func":self.connect_iot_socket})\r
- EventMesh.publish("login_IOT")#登录IOT\r
+ EventMesh.publish("publish_AI_btnInfo",{"func":self.connect_iot_websocket})\r
+ # EventMesh.publish("login_IOT")#登录IOT\r
\r
self._1scnt = 0\r
\r
# EventMesh.debug_log("发送线程") \r
self.reconnect_count = 0\r
else:\r
- EventMesh.publish("publish_AI_btnInfo",{"func":self.connect_iot_socket})\r
+ EventMesh.publish("publish_AI_btnInfo",{"func":self.connect_iot_websocket})\r
print("socket关闭退出send线程")\r
return\r
- EventMesh.debug_log("socket:send data2 len:{}".format(len(data),self.iot_protocol_client)) \r
+ EventMesh.debug_log("websocket:send data2 len:{}".format(len(data),self.iot_protocol_client)) \r
except Exception as e:\r
- EventMesh.debug_log("socket:send error") \r
- EventMesh.publish("publish_AI_btnInfo",{"func":self.connect_iot_socket})\r
+ EventMesh.debug_log("websocket:send error") \r
+ EventMesh.publish("publish_AI_btnInfo",{"func":self.connect_iot_websocket})\r
break\r
\r
\r
def iot_protocol_recv(self):\r
- # 配置超时参数,单位:秒\r
- RECV_TIMEOUT = 30*1000 # 30秒未收到数据则重连\r
- last_recv_time = utime.time() # 初始化最后一次收到数据的时间\r
while True:\r
# 死循环接收数据\r
- # with self.sock_lock: # 警告:不能加锁,不然会导致线程超长延时\r
- try:\r
- data = self.iot_protocol_client.recv()\r
- if isinstance(data, bytes) and len(data)>10:\r
- playload_data(data)\r
- #fffe00010001xxxx\r
- if isinstance(data, bytes) and len(data) == 8:#登录成功\r
- target_bytes = b'\xff\xfe\x00\x01\x00\x01'\r
- if data[:6] == target_bytes:\r
- self.login_statu = 1#登录成功标志位修改\r
- socket_log.info("IOT_recv = {} ,len = {}".format(self.bytes_to_hex(data),len(data)))\r
- #检查socket是否已关闭\r
- if self.iot_protocol_client == None:\r
- print("socket关闭开启重连")\r
- EventMesh.publish("publish_AI_btnInfo",{"func":self.connect_iot_socket}) \r
- return\r
- #超时检查:如果超过设定时间未收到数据,触发重连\r
- # print("接收时间差 = {}".format(utime.time() - last_recv_time))\r
- if utime.time() - last_recv_time > RECV_TIMEOUT:\r
- print("超过{}秒未收到数据,触发重连".format(RECV_TIMEOUT))\r
- # 先关闭现有连接\r
- if self.iot_protocol_client:\r
- self.iot_protocol_client.close()\r
- # 触发重连\r
- EventMesh.publish("publish_AI_btnInfo", {"func": self.connect_iot_socket})\r
- # 重连后短暂延迟再继续循环\r
- utime.sleep(1)\r
- # 重置超时计时器\r
- last_recv_time = utime.time()\r
- except Exception as e:\r
- print("cli break")\r
- print("异常是:{}".format(e))\r
+ try:\r
+ recv_data = self.iot_protocol_client.recv()\r
+ print("recv_data = {}".format(recv_data))\r
+ if recv_data == "websocket close":\r
+ # 服务器关闭连接或客户端关闭连接\r
+ print("对端 服务器强制关闭 cli close")\r
# EventMesh.publish("connect_iot_websocket_cb")\r
- last_recv_time = utime.time()\r
- EventMesh.publish("publish_AI_btnInfo",{"func":self.connect_iot_socket}) \r
+ EventMesh.publish("publish_AI_btnInfo",{"func":self.connect_iot_websocket}) \r
break\r
+ elif recv_data == "":\r
+ print("下发的空数据 不做处理")\r
+ else:\r
+ if len(recv_data) != 0:\r
+ self.reconnect_count = 0\r
+ playload_data(recv_data)\r
+ \r
+ except Exception as e:\r
+ print("cli break")\r
+ # EventMesh.publish("connect_iot_websocket_cb")\r
+ EventMesh.publish("publish_AI_btnInfo",{"func":self.connect_iot_websocket}) \r
+ break\r
self.iot_protoclo_recv_id =None\r
def decode_with_multiple_encodings(self, data):\r
#尝试多种常见编码格式解码,返回第一个成功的结果\r
except Exception as e:\r
print("iot_protoclo_recv_close_therad error!!!!!!!!")\r
self.start_voice_flag = 0\r
+ print("iot没连上222!!!!")\r
print("iot_close_therad")\r
\r
def get_IOT_sock(self,event,msg):\r
else :\r
try:\r
if self.start_voice_flag == 0: #如果关闭了就需要重新再连接\r
- EventMesh.publish("publish_AI_btnInfo",{"func":self.connect_iot_socket}) \r
+ EventMesh.publish("publish_AI_btnInfo",{"func":self.connect_iot_websocket}) \r
return\r
if data != None:\r
if len(data) != 0:\r
EventMesh.publish("publish_AI_btnInfo",{"func":self.iot_protocol_send_cb,"data":data})\r
else:\r
print("reconnect1 {}".format(data))\r
- EventMesh.publish("publish_AI_btnInfo",{"func":self.connect_iot_socket})\r
+ EventMesh.publish("publish_AI_btnInfo",{"func":self.connect_iot_websocket})\r
\r
except Exception as e: \r
print("senc data err reconnect{}".format(data))\r
- EventMesh.publish("publish_AI_btnInfo",{"func":self.connect_iot_socket})\r
+ EventMesh.publish("publish_AI_btnInfo",{"func":self.connect_iot_websocket})\r
\r
def iot_protocol_send_cb(self,data):\r
try:\r
if data != None:\r
- print("socket connect success:{} self.iot_protocol_client:{}".format(data,self.iot_protocol_client))\r
+ print("websocket connect success:{} self.iot_protocol_client:{}".format(data,self.iot_protocol_client))\r
if self.iot_protocol_client != None:\r
self.iot_protocol_client.send(data)\r
self.reconnect_count = 0\r
- print("socket send success")\r
+ print("websocket send success")\r
else:\r
print("reconnect2 {}".format(data))\r
# EventMesh.publish("connect_iot_socket_cb")\r
- EventMesh.publish("publish_AI_btnInfo",{"func":self.connect_iot_socket})\r
+ EventMesh.publish("publish_AI_btnInfo",{"func":self.connect_iot_websocket})\r
except Exception as e:\r
print("发送失败 重新连接")\r
self.reconnect_count+=1\r
# EventMesh.publish("connect_iot_socket_cb")\r
- EventMesh.publish("publish_AI_btnInfo",{"func":self.connect_iot_socket})\r
+ EventMesh.publish("publish_AI_btnInfo",{"func":self.connect_iot_websocket})\r
\r
def bytes_ljust(data, length, fill_byte=b'\x00'):\r
"""\r
# EventMesh.publish(constants.PROTOCOL.H04_RECV, data)\r
try:\r
if len(data) > 0: \r
+ pass\r
#EventMesh.debug_log("handler:{}".format(len(data)))\r
- playload_data(data)\r
+ # playload_data(data)\r
except Exception as e:\r
EventMesh.debug_log("handler:ERROR:")\r
usys.print_exception(e)\r