Files

119 lines
3.3 KiB
Python
Raw Permalink Normal View History

2023-06-08 23:30:33 +08:00
import serial
import os
import time
def survive_cmd(ser):
send = [0x0A, 0x01, 0xF1]
ser.write(send)
read = ser.read(4)
2023-08-11 08:52:49 +08:00
print("recv: " + " ".join("%02X" % b for b in read))
2023-06-08 23:30:33 +08:00
2023-08-11 08:52:49 +08:00
def scan_cmd(ser, is_raw_data=True):
2023-06-08 23:30:33 +08:00
send = [0x03, 0x01, 0xF1]
ser.write(send)
2023-08-11 08:52:49 +08:00
peer_addr = []
2023-06-08 23:30:33 +08:00
for i in range(10):
hci_packet_event = ser.read(2)
if int.from_bytes(hci_packet_event, "little") != 0x0004:
continue
len = ser.read(1)
payload = ser.read(int.from_bytes(len, "little"))
peer_addr = payload[0:6]
if is_raw_data:
print(
"recv: "
+ " ".join("0x%02X" % b for b in hci_packet_event)
+ " "
+ " ".join("0x%02X" % b for b in len)
+ " "
+ " ".join("0x%02X" % b for b in payload)
)
else:
print("-" * 100)
print(" peer address: " + ":".join("%02X" % b for b in payload[0:6]))
print("product module: " + str(payload[6:10], "utf-8"))
print(" hw version: " + " ".join("%02X" % b for b in payload[10:14]))
print(" build time: " + " ".join("%02X" % b for b in payload[14:16]))
print(" Parameter1: " + str(payload[16:19], "utf-8"))
2023-08-11 08:52:49 +08:00
print(
" battery volt: "
+ str(int.from_bytes(payload[19:21], "big") / 1000.0)
+ "V"
)
print(" device name: " + str(payload[21:], "utf-8"))
2023-06-08 23:30:33 +08:00
return peer_addr
2023-08-11 08:52:49 +08:00
def connect(ser, peer_addr=[]):
2023-06-08 23:30:33 +08:00
send = [0x05, 0x08, 0x00]
send += peer_addr
send += [0xF1]
ser.write(send)
2023-08-11 08:52:49 +08:00
read = ser.read(4)
print("recv: " + " ".join("%02X" % b for b in read))
2023-06-08 23:30:33 +08:00
def disconnect(ser):
send = [0x08, 0x01, 0xF1]
ser.write(send)
read = ser.read(4)
2023-08-11 08:52:49 +08:00
print("recv: " + " ".join("%02X" % b for b in read))
def write_char(ser: serial.Serial, handle: int, write_data: tuple):
send = [0x06, len(write_data)+2, handle]
send += write_data
send += [0xF1]
ser.write(send)
def read_char(ser: serial.Serial, handle: int):
send = [0x07, 0x02, handle, 0xF1]
ser.write(send)
read = ser.read(0xFFFF)
print("recv: " + " ".join("%02X" % b for b in read))
2023-06-08 23:30:33 +08:00
def main():
# set comport
2023-08-11 08:52:49 +08:00
ser = serial.Serial("COM15", 57600, 8, inter_byte_timeout=0.01)
2023-06-08 23:30:33 +08:00
# send survive cmd
2023-08-11 08:52:49 +08:00
survive_cmd(ser)
2023-06-08 23:30:33 +08:00
# send scan cmd
2023-08-11 08:52:49 +08:00
peer_addr = scan_cmd(ser, False)
time.sleep(10)
return
2023-06-08 23:30:33 +08:00
# send connect cmd with peer addr
connect(ser, peer_addr)
2023-08-11 08:52:49 +08:00
time.sleep(3)
# send write char to enable notify
write_char(ser, 0x0024, [0xc4,0xf0,0xf1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00])
time.sleep(0.1)
write_char(ser, 0x0024, [0x74,0x10,0xf1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00])
time.sleep(0.1)
read_char(ser, 0x0021)
# 130500040000000000000000000000000000001c
time.sleep(0.2)
# send write char to enable notify
#write_char(ser, 0x0028, 1)
#time.sleep(5)
# send write char to disable notify
#write_char(ser, 0x0028, 0)
# send read char to disable notify
#read_char(ser, 0x0027)
2023-06-08 23:30:33 +08:00
# send disconnect cmd
disconnect(ser)
ser.close()
if __name__ == "__main__":
main()