#
云里物里 把数据房子service data里。而且是sdat 16uuid的service data里,这个地方是蓝牙给设备商放自己数据的地方。 详情可以参考minew的解析代码
#---------------------------------------------------------------------
# 云里物理的蓝牙设备的MAC地址就是这样开头的,它有的设备是要自己解析的。
# {'flags': '06', 'sdat2': 'e1ffa10364001700f3000568a9a13f23ac', 'suid2': 'e1ff'}
# 电池容量 0x64表示100%
# minew_beacon+
# suid2:2字节 e1ff
# frametype:1字节 03:加速度传感器
# battery:2字节
#---------------------------------------------------------------------
if dev_mac.startswith("AC23"):
dev["man"] = "minew"
if "sdat2" in ad_summary and ad_summary["suid2"] == "E1FF":
sdat2 = ad_summary["sdat2"]
frameTypeAndVersion = sdat2[4:8]
frameData = sdat2[8:]
if frameTypeAndVersion == "A103":
dev["frame"] = "ACC"
dev["battery"] = int(frameData[:2],16)
accx = decodeBytes(frameData[2:6])
accy = decodeBytes(frameData[6:10])
accz = decodeBytes(frameData[10:14])
#因为云里雾里的加速度带有一个重力加速度,单位为g,所以我要减去1
acca = math.sqrt(accx*accx+accy*accy+accz*accz)
dev["acca"] = round(acca-1,6)
elif frameTypeAndVersion == "A103":
#温湿度已经解析好了,其实就是S1传感器,云里物理自动解析
dev["type"] = "Humiture"
elif frameTypeAndVersion == "A108":
#云里物里beacon+的INF通道
dev["frame"] = "INF"
dev["battery"] = int(frameData[:2],16)
dev["mac"] = frameData[2:14]
dev["name"] = binascii.unhexlify(frameData[14:]).decode()
if "sdat2" in ad_summary and ad_summary["suid2"] == "AAFE":
sdat2 = ad_summary["sdat2"]
frameType = sdat2[4:6]
frameData = sdat2[6:]
#URL通道,AAFE是uuid,10是frametype表示URL,E8是range,
#"0201060303AAFE1016AAFE10E8006D696E65777465636800",
#参考云里物里英文版PDF:`BeaconPlus Frame Define.pdf`
if frameType == "10":
dev["frame"] = "URL"
path_hex = frameData[4:-2]
path_bin = binascii.unhexlify(path_hex)
path_str = path_bin.decode()
head_dict= {"00": "http://www.","01": "https://www.","02": "http://","03": "https://"}
tail_dict= {"00":".com/","01":".org/","02":".edu/","03":".net/","04":".info/","05":".biz/","06":".gov/","07":".com","08":".org","09":".edu","0a":".net","0b":".info","0c":".biz","0d":".gov"}
url = head_dict[frameData[2:4]]+path_str + tail_dict[frameData[-2:]]
dev["url"] = url
elif frameType == "20":
dev["frame"] = "TLM"
#Battery Voltage 单位mv
dev["vol"] = int(frameData[:4], 16)
dev["temp"] = decodeBytes(frameData[4:8])
#历史上广播次数
dev["advts"] = int(frameData[8:16],16)
dev["secs"] = int(frameData[16:24],16)
elif frameType == "00":
dev["frame"] = "UID"
elif frameType == "30":
dev["frame"] = "EID"
白皮书
广播包有37个字节
参考: https://blog.csdn.net/zwc1725/article/details/52786644
广播报文:长度域包含6个比特,有效值的范围是6~37。 数据报文:长度域包含5个比特,有效值的范围是0~31。 广播报文和和数据报文的长度域有所不同,主要原因是:广播报文除了最多31个字节的数据之外,还必须要包含6个字节的广播设备地址。6+31=37,所以需要6比特的长度域。
再次强调:广播时必须要包含6个字节的广播设备地址。