了解自定义 BLE UUID
Understanding custom BLE UUIDs
我想创建一个跨平台应用程序,允许我定期发布设备 Mac 地址(虽然我已经意识到出于某种原因我收到了 3 个设备的地址。)这样它就可以被记录并用于参考简短的手动用户广告,以便每个广告都可以被特定用户识别;然而,似乎我陷入了关于 BLE
上 UUID 的问题
搜索了一段时间后,我对BLE服务中的UUID似乎还是有点困惑。最初我决定使用自定义 BLE,它反复失败,要么出现奇怪的错误,要么由于数据包太大,即使数据只有 1 个字节长。我意识到 UUID 必须采用 xxxxxxxx-0000-1000-8000-00805F9B34FB
的形式。超出此范围的任何内容都会发送完整的 UUID,该 UUID 在未连接的情况下进行广告时太大。我还发现我可以在上半部分 (0000XXXX
) 使用任何不在保留范围 0x000E
– 0x01FF
中的 UUID 前缀。
这是一个正确的假设吗?我可以使用任何不与标准冲突的 UUID,即 00000200 - 0000FFFF。我问是因为在选择该范围内的 UUID 时我似乎遇到了问题,据我所知,在范围外创建自定义 UUID 在 BLE 上是一个坏主意,因为它将被迫使用 20-23 个可用字节中的 16 个。对此有任何意见吗?
此外,它们是否是一种预定义的方式来发送用户设备的广告,以便它可以被缓存并用于识别其他用户广告?
编辑:
项目中需要以无连接的方式将手机与其他设备跨平台连接。最初我计划让设备重复宣传其身份以及可用于唯一识别用户消息的名称和唯一 MAC 地址。任何没有缓存用户身份的设备都会简单地丢弃来自该用户的传入数据包。 – kdgwill 9 分钟前
我实际上认为如果我能以某种方式一次连接到 5-10 个设备会更容易;但是,这样做的目的是不要在添加新设备时通过反复提示来打扰用户。因此,我认为使用广告和泛洪会有所帮助,但消息大小会有所不同。是否有可能打扰用户一次连接提示并自动连接每个额外的 BLE 设备。如果我能以某种方式在 1 对 1 的基础上连接多个设备,而不必每次都提示用户,同时仍然扫描其他可能的连接,那将非常有用,但我认为 BLE 不允许这样做。 – kdgwill 8 秒前编辑
使用 identifierForVendor 或 CBAdvertisementDataServiceUUIDsKey 是唯一识别每个用户的好方法;但是,这意味着如果我不使用其中一个已注册的 UUID,我可能暂时只能随机选择一个。开销将是 4-16 + 无论识别每个数据包需要多少字节。
如果您向蓝牙联盟注册设备,则只能使用较短的 4 字节 UUID,否则,您必须使用较长的 16 字节 UUID。
您是正确的,您可以为服务(和特性)选择 16 字节的 UUID。您应该半随机地选择 ID,并且始终为 service/characteristic.
的特定类型使用相同的 UUID
因为您发送的每个数据包都必须包含目标服务 UUID,使用较长的 UUID 会占用负载中的大量可用字节。每个数据包的可用字节较少意味着必须为更大的消息发送更多的数据包,从而增加发送消息所需的时间。如果您不发送消息,而只是使用广告数据,那么这不是问题,尽管您将有更少的字节可用于广告数据。
MAC 地址在使用 iOS 蓝牙框架的代码中不可用。 iOS 8+ 可以发送一个随机的 MAC 地址,所以你不应该指望通过它来识别设备。
由于MAC地址对您不可用,您可能希望通过BLE连接连接并发送一个唯一的ID(例如identifierForVendor
),或者可能在其中包含一个小ID通过 CBAdvertisementDataLocalNameKey
.
的广告数据
我想创建一个跨平台应用程序,允许我定期发布设备 Mac 地址(虽然我已经意识到出于某种原因我收到了 3 个设备的地址。)这样它就可以被记录并用于参考简短的手动用户广告,以便每个广告都可以被特定用户识别;然而,似乎我陷入了关于 BLE
上 UUID 的问题搜索了一段时间后,我对BLE服务中的UUID似乎还是有点困惑。最初我决定使用自定义 BLE,它反复失败,要么出现奇怪的错误,要么由于数据包太大,即使数据只有 1 个字节长。我意识到 UUID 必须采用 xxxxxxxx-0000-1000-8000-00805F9B34FB
的形式。超出此范围的任何内容都会发送完整的 UUID,该 UUID 在未连接的情况下进行广告时太大。我还发现我可以在上半部分 (0000XXXX
) 使用任何不在保留范围 0x000E
– 0x01FF
中的 UUID 前缀。
这是一个正确的假设吗?我可以使用任何不与标准冲突的 UUID,即 00000200 - 0000FFFF。我问是因为在选择该范围内的 UUID 时我似乎遇到了问题,据我所知,在范围外创建自定义 UUID 在 BLE 上是一个坏主意,因为它将被迫使用 20-23 个可用字节中的 16 个。对此有任何意见吗?
此外,它们是否是一种预定义的方式来发送用户设备的广告,以便它可以被缓存并用于识别其他用户广告?
编辑:
项目中需要以无连接的方式将手机与其他设备跨平台连接。最初我计划让设备重复宣传其身份以及可用于唯一识别用户消息的名称和唯一 MAC 地址。任何没有缓存用户身份的设备都会简单地丢弃来自该用户的传入数据包。 – kdgwill 9 分钟前
我实际上认为如果我能以某种方式一次连接到 5-10 个设备会更容易;但是,这样做的目的是不要在添加新设备时通过反复提示来打扰用户。因此,我认为使用广告和泛洪会有所帮助,但消息大小会有所不同。是否有可能打扰用户一次连接提示并自动连接每个额外的 BLE 设备。如果我能以某种方式在 1 对 1 的基础上连接多个设备,而不必每次都提示用户,同时仍然扫描其他可能的连接,那将非常有用,但我认为 BLE 不允许这样做。 – kdgwill 8 秒前编辑
使用 identifierForVendor 或 CBAdvertisementDataServiceUUIDsKey 是唯一识别每个用户的好方法;但是,这意味着如果我不使用其中一个已注册的 UUID,我可能暂时只能随机选择一个。开销将是 4-16 + 无论识别每个数据包需要多少字节。
如果您向蓝牙联盟注册设备,则只能使用较短的 4 字节 UUID,否则,您必须使用较长的 16 字节 UUID。
您是正确的,您可以为服务(和特性)选择 16 字节的 UUID。您应该半随机地选择 ID,并且始终为 service/characteristic.
的特定类型使用相同的 UUID因为您发送的每个数据包都必须包含目标服务 UUID,使用较长的 UUID 会占用负载中的大量可用字节。每个数据包的可用字节较少意味着必须为更大的消息发送更多的数据包,从而增加发送消息所需的时间。如果您不发送消息,而只是使用广告数据,那么这不是问题,尽管您将有更少的字节可用于广告数据。
MAC 地址在使用 iOS 蓝牙框架的代码中不可用。 iOS 8+ 可以发送一个随机的 MAC 地址,所以你不应该指望通过它来识别设备。
由于MAC地址对您不可用,您可能希望通过BLE连接连接并发送一个唯一的ID(例如identifierForVendor
),或者可能在其中包含一个小ID通过 CBAdvertisementDataLocalNameKey
.