成功连接iot3,有回应
authorazao <821478748@qq.com>
Thu, 8 Jan 2026 13:57:10 +0000 (21:57 +0800)
committerazao <821478748@qq.com>
Thu, 8 Jan 2026 13:57:10 +0000 (21:57 +0800)
但是小程序未显示信息

2.sdk/project/K8/sdk/services/microPython/ports/quectel/core/ai_VC.py
2.sdk/project/K8/sdk/services/microPython/ports/quectel/core/protocol.py

index 6fa1035..a086614 100644 (file)
@@ -1388,7 +1388,7 @@ class AI_VC(Abstract):
         
         EventMesh.publish("connect_iot_socket")#连接IOT
         print("IOT连接成功")
-        EventMesh.publish("login_IOT")#登录IOT
+        # EventMesh.publish("login_IOT")#登录IOT
         EventMesh.publish("send_unbind_dev_to_iot")#开启IOT心跳包
         self.server_ip = EventMesh.publish("get_storage_config","server_ip")#
         if self.server_ip == None:
index d23df45..a3fc338 100644 (file)
@@ -354,23 +354,28 @@ class IOT_socket_SendCmdManager(Abstract):
             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
@@ -383,10 +388,12 @@ class IOT_socket_SendCmdManager(Abstract):
 \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
@@ -424,13 +431,13 @@ def playload_data(data):
 \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
@@ -440,6 +447,7 @@ def playload_data(data):
         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
@@ -551,7 +559,7 @@ class SockMangager(Abstract):
         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
@@ -578,8 +586,8 @@ class SockMangager(Abstract):
     \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
@@ -612,12 +620,12 @@ class SockMangager(Abstract):
             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
@@ -677,7 +685,7 @@ class SockMangager(Abstract):
                     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
@@ -692,21 +700,39 @@ class SockMangager(Abstract):
                 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
@@ -722,7 +748,7 @@ class SockMangager(Abstract):
         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
@@ -743,7 +769,7 @@ class SockMangager(Abstract):
         #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
@@ -779,7 +805,7 @@ class SockMangager(Abstract):
             #         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
@@ -789,8 +815,8 @@ class SockMangager(Abstract):
                 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
@@ -810,58 +836,40 @@ class SockMangager(Abstract):
                             # 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
@@ -927,6 +935,7 @@ class SockMangager(Abstract):
         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
@@ -941,7 +950,7 @@ class SockMangager(Abstract):
         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
@@ -961,29 +970,29 @@ class SockMangager(Abstract):
                     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
@@ -3896,8 +3905,9 @@ class ProtoColResolver(object):
         #     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