如何使用BlueZ和Python创建EddyStone信标?

如何使用BlueZ和Python创建EddyStone信标?,python,bluetooth,beacon,eddystone,Python,Bluetooth,Beacon,Eddystone,我正在嵌入式Linux板上开发BLE(蓝牙低能)。我们使用BlueZ和Python。我需要创建EddyStone灯塔。我发现有一种方法可以创建iBeacon:。我试过了。成功了。 但我们需要创造埃迪斯通灯塔。所以我使用Beacon数据格式from here()来创建制造商数据。 但是我的代码不起作用。我的代码有什么问题?这是我的密码: def __init__(self, bus, index): eddystone_id = 0xAAFE beacon_type = [0x14

我正在嵌入式Linux板上开发BLE(蓝牙低能)。我们使用BlueZ和Python。我需要创建EddyStone灯塔。我发现有一种方法可以创建iBeacon:。我试过了。成功了。 但我们需要创造埃迪斯通灯塔。所以我使用Beacon数据格式from here()来创建制造商数据。 但是我的代码不起作用。我的代码有什么问题?这是我的密码:

def __init__(self, bus, index):
    eddystone_id = 0xAAFE
    beacon_type = [0x14, 0x16]  # Length = 0x14, EddyStone type = 0x16
    uuid = [0xAA, 0xFE] # EddyStone UUID = 0xAAFE
    frame_type = [0x10] # Frame Type = 0x10
    power = [0x00]      # Power = 0x00
    prefix = [0x02]     # URL scheme = 0x02 (http://)
    url = [0x73, 0x61, 0x6D, 0x70, 0x6C, 0x65, 0x77, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x07]

    Advertisement.__init__(self, bus, index, 'peripheral')
    self.add_manufacturer_data(eddystone_id, beacon_type + uuid + frame_type + power + prefix + url)
    
但是,如果使用此命令,将创建EddyStone信标。我可以看到它在nRF移动应用程序中显示EddyStone信标:

sudo hcitool -i hci0 cmd 0x08 0x0008 1c 02 01 06 03 03 aa fe 14 16 aa fe 10 00 02 73 61 6d 70 6c 65 77 65 62 73 69 74 65 07 00 00 00

如您所见,我在add_manufacturer_data()函数中输入的数据与命令中的数据相同。但是为什么Python代码不起作用呢?

iBeacon使用
制造商数据
,而Eddystone信标使用
服务数据
,因此我希望您的代码看起来更像这样:

def\uuuu初始化(自、总线、索引):
广告。uuu init_uuuuu(自、总线、索引、广播)
self.add_service_uuid('FEAA'))
帧类型=[0x10]#Eddystone帧类型=0x10
功率=[0x00]#信标广播功率=0x00
前缀=[0x02]#URL方案=0x02(http://)
url=[0x73、0x61、0x6D、0x70、0x6C、0x65、0x77、0x65、0x62、0x73、0x69、0x74、0x65、0x07]
eddystone\u数据=帧类型+电源+前缀+url
自添加服务数据('FEAA',eddystone_数据)
作为旁注,
hcitool
是BlueZ开发人员开发的工具之一。当前支持的从命令行创建Eddystone信标的方法是使用
bluetoothctl
。命令的顺序是:

bluetoothctl 
menu advertise
uuids 0xFEAA
service 0xFEAA 0x10 0x00 0x02 0x73 0x61 0x6D 0x70 0x6C 0x65 0x77 0x65 0x62 0x73 0x69 0x74 0x65 0x07
back
advertise broadcast
discoverable on

我将
外围设备
更改为
广播
,因为人们通常不希望信标可连接,但这取决于您的应用程序。

问题在于您正在设置制造商广告,而eddystone是一个16位服务广告。这两种类型的广告非常不同。您需要查看python包装器代码是否可以与服务广告Hanks ukBaz一起使用!你的解决方案似乎奏效了。但在使用上述代码后,设备的Mac地址发生了变化。Mac地址过去大约是00:18:66:AB:12:36。现在是3F:09:3F:42:7A:23-出现在Beacon应用程序中。为什么会这样?有没有办法使用设备的Mac地址?另一个问题:是否有办法在启用信标后禁用它?另一个问题:调用add_service_data()后,似乎无法调用add_manufacturer_data()。如果我这样做了,就没有灯塔了。事实上,甚至没有可以检测到的BLE信号。为什么不能调用add_service_data()和add_manufacturer_data()?谢谢。好的,我把广告类型从“广播”改为“外设”,那么现在Mac地址似乎正确了。你可以用不同类型的蓝牙地址来处理隐私问题。有了信标,你通常不在乎地址。您可以在同一广告中同时包含服务数据和制造商数据。最初的示例代码有:希望您在备忘单上注意到,您总共只能有26个字节。我怀疑你超过了那个总数。你通常会通过两个广告来解决这个问题。如果不清楚如何修改代码来实现这一点,那么创建一个新问题