Python Bleak BLE 没有得到 UUID
Python Bleak BLE not getting UUID
我有一个 respberry 服务器和一个 windows 客户端,都在 Python 中实现。服务器像iBeacon信号一样传输BLE信号。
服务器代码如下:
import time
from bluetooth.ble import BeaconService
service = BeaconService()
uuid = "11111111-2222-3333-4444-555555555555"
major = 2 # 1 - 65535
minor = 1 # 1 - 65535
txpower = 1
interval = 200
service.start_advertising(uuid, major, minor, txpower, interval)
try:
time.sleep(300)
service.stop_advertising()
except KeyboardInterrupt:
print("cancelled")
finally:
service.stop_advertising()
print("Done.")
此代码运行良好。我通过安装 android 应用程序进行了检查,我可以找到包含该信息的设备。
现在我需要在 windows 客户端中获取该信息。在 windows 客户端中,我使用的是 Bleak 库。
我有以下代码来扫描信标设备:
import asyncio
from bleak import discover
async def run():
devices = await discover()
for d in devices:
#if d.address == "B8:27:EB:03:5A:D6":
print(d.address, d.name, d.metadata, d.rssi)
loop = asyncio.get_event_loop()
loop.run_until_complete(run())
问题是当我检查控制台时,我没有看到主要、次要和 UUID 信息:
显示了其他设备,我可以在其中一个设备中看到 UUID 是可读的。
我在这里做错了什么?是惨淡得不到我想要的信息吗? (次要,主要)还是我以错误的方式传输?我不这么认为,因为移动应用程序读取正常。 windows 是否有其他图书馆可以获取此信息?
谢谢您的帮助。祝你有个美好的一天。
不要将 bleak 返回的 GATT 服务 UUID 列表与您想要的 iBeacon ProximityUUID 混淆。它们是两个完全不同的标识符。 iBeacon ProximityUUID 编码在 bleak 返回的制造商数据中。它不会为您解析它,但您可以自己编写一个解析器。如果您将制造商数据字节打印为十六进制,您将看到该模式。
我写了一个 Windows Beacon Library 可以满足您的要求。它是 Android Beacon Library for Windows 10 的一个端口。但是文档非常缺乏。如果您遇到困难,我可以帮助您使用它,但它设计用于 Visual Studio 语言而不是 Python。
使用该库,您可以在 C# 中解析来自 BluetoothLEAdvertisementReceivedEventArgs
的 iBeacon 帧,如下所示:
var beaconParser = new BeaconParser();
beaconParser.SetBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24");
Beacon beacon = beaconParser.FromAdvertisement(args.Advertisement, args.RawSignalStrengthInDBm, args.BluetoothAddress);
if (beacon != null)
{
OLogger.Debug("Found iBeacon: UUID=" + beacon.Id1 + " major=" + beacon.Id2 + " minor=" + beacon.Id3 + " rssi: " + beacon.Rssi);
}
我有一个 respberry 服务器和一个 windows 客户端,都在 Python 中实现。服务器像iBeacon信号一样传输BLE信号。
服务器代码如下:
import time
from bluetooth.ble import BeaconService
service = BeaconService()
uuid = "11111111-2222-3333-4444-555555555555"
major = 2 # 1 - 65535
minor = 1 # 1 - 65535
txpower = 1
interval = 200
service.start_advertising(uuid, major, minor, txpower, interval)
try:
time.sleep(300)
service.stop_advertising()
except KeyboardInterrupt:
print("cancelled")
finally:
service.stop_advertising()
print("Done.")
此代码运行良好。我通过安装 android 应用程序进行了检查,我可以找到包含该信息的设备。
现在我需要在 windows 客户端中获取该信息。在 windows 客户端中,我使用的是 Bleak 库。
我有以下代码来扫描信标设备:
import asyncio
from bleak import discover
async def run():
devices = await discover()
for d in devices:
#if d.address == "B8:27:EB:03:5A:D6":
print(d.address, d.name, d.metadata, d.rssi)
loop = asyncio.get_event_loop()
loop.run_until_complete(run())
问题是当我检查控制台时,我没有看到主要、次要和 UUID 信息:
显示了其他设备,我可以在其中一个设备中看到 UUID 是可读的。 我在这里做错了什么?是惨淡得不到我想要的信息吗? (次要,主要)还是我以错误的方式传输?我不这么认为,因为移动应用程序读取正常。 windows 是否有其他图书馆可以获取此信息? 谢谢您的帮助。祝你有个美好的一天。
不要将 bleak 返回的 GATT 服务 UUID 列表与您想要的 iBeacon ProximityUUID 混淆。它们是两个完全不同的标识符。 iBeacon ProximityUUID 编码在 bleak 返回的制造商数据中。它不会为您解析它,但您可以自己编写一个解析器。如果您将制造商数据字节打印为十六进制,您将看到该模式。
我写了一个 Windows Beacon Library 可以满足您的要求。它是 Android Beacon Library for Windows 10 的一个端口。但是文档非常缺乏。如果您遇到困难,我可以帮助您使用它,但它设计用于 Visual Studio 语言而不是 Python。
使用该库,您可以在 C# 中解析来自 BluetoothLEAdvertisementReceivedEventArgs
的 iBeacon 帧,如下所示:
var beaconParser = new BeaconParser();
beaconParser.SetBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24");
Beacon beacon = beaconParser.FromAdvertisement(args.Advertisement, args.RawSignalStrengthInDBm, args.BluetoothAddress);
if (beacon != null)
{
OLogger.Debug("Found iBeacon: UUID=" + beacon.Id1 + " major=" + beacon.Id2 + " minor=" + beacon.Id3 + " rssi: " + beacon.Rssi);
}