print("data类型错误")\r
return\r
\r
- if data[0] != 0xff or data[1] !=0xfe:\r
- print("data格式错误,重新登录")\r
- # EventMesh.publish("login_IOT")#登录IOT\r
- return\r
- # payload_len_bytes = data [7:5]\r
- # payload_len = ustruct.unpack ('H', payload_len_bytes)[0]\r
- # # print ("解析到 Payload 长度:{} 字节".format(payload_len))\r
+ # if data[0] != 0xff or data[1] !=0xfe:\r
+ # print("data格式错误,重新登录")\r
+ # # EventMesh.publish("login_IOT")#登录IOT\r
+ # return\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 [8 : ]\r
try:\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
+ ts = utime.ticks_ms()\r
json_str = {\r
"cmd":"post_heart_beat",\r
- "ts":1738283829,\r
+ "ts":ts,\r
"msg":"心跳",\r
"data":{\r
"battery": 20\r
payload = json_str.encode('utf-8')\r
payloadLen = ustruct.pack('H', len(payload))\r
#拼接\r
- heart_packet = header + packet_type + payloadLen + payload#+ crc\r
+ heart_packet = b"\xff\xfe" + b"\x01"+ b"\x03" + b"\x00" * 3+ payloadLen + payload#+ crc\r
EventMesh.publish("CHANNEL_IOT_SEND", heart_packet)\r
# print("心跳发送数据包:{}".format(heart_packet))\r
\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
- packet_type = ustruct.pack('B', 0x03)\r
- #字典转为json字符串\r
- json_str = EventMesh.publish("GET_IOT_SEND_CMD", data)\r
- json_str = ujson.dumps(json_str)\r
- #字符串转为二进制数据Payload\r
- payload = json_str.encode('utf-8')\r
- #PayloadLen\r
- payloadLen = ustruct.pack('H', len(payload))\r
- #CRC16(2字节,基于pay字段计算)\r
- crc = self.crc16(payload)\r
- print("crc的长度为{}".format(len(crc)))\r
- #拼接\r
- full_packet = header + packet_type + payloadLen + payload#+ crc\r
- EventMesh.publish("CHANNEL_IOT_SEND", full_packet)\r
- print("发送更新数据包:{}".format(full_packet))\r
+ MAGIC = (0xfffe).to_bytes(2,"big")\r
+ VERSION = (0x01).to_bytes(1,"big")#"03".encode('utf-8')\r
+ TYPE = (0x03).to_bytes(1,"big")\r
+ HR_JSON = ujson.dumps(EventMesh.publish("GET_IOT_SEND_CMD", data))\r
+ GPS_JSON_b = HR_JSON.encode('utf-8')\r
+ DATA_LEN = (len(HR_JSON)).to_bytes(4,"big")\r
+ heards_infor = b''\r
+ heards_infor = MAGIC+VERSION+TYPE+DATA_LEN+GPS_JSON_b\r
+ EventMesh.publish("CHANNEL_IOT_SEND", heards_infor)\r
+ print("发送更新数据包:{}".format(heards_infor))\r
\r
def login_IOT(self,event,msg):\r
print("登录中")\r
- #Header\r
- header = ustruct.pack('>H', 0xFFFE) # 使用大端模式\r
- #Type\r
- packet_type = ustruct.pack('B', 0x00)\r
#设备ID\r
device_id_bytes = modem.getDevImei().encode('utf-8')[:20] # 转为字节并截断到20字节\r
device_id = bytes_ljust(device_id_bytes, 20, b'\x00')\r
token_bytes = EventMesh.publish("get_dev_token").encode('utf-8')[:36] # 转为字节并截断\r
token_padded = bytes_ljust(token_bytes, 36, b'\x00')\r
#拼接\r
- body = header + packet_type + device_id + token_padded\r
+ body = b"\xff\xfe" + b"\x01"+ b"\x03" + device_id + token_padded\r
#CRC16(2字节,基于上述所有字段计算)\r
crc = self.crc16(body)\r
# 完整数据包\r