iBeacon 是否必须使用 Apple 的公司 ID?如果不是,如何识别 iBeacon?
Does an iBeacon have to use Apple's company ID? If not, how to identify an iBeacon?
根据iBeacon spec, iBeacons have to broadcast 0x004C as the company ID in the advertisement's manufacturer data. 0x004c
is Apple's company ID as assigned by the Bluetooth SIG。
我对此感到困惑,因为除了公司 ID 之外,似乎没有任何其他数据可以明确地将 BLE 设备标识为 iBeacon。接下来的两个字节固定为 0x02 和 0x15,其余字节取决于配置。
有一次我认为如果制造数据的前四个字节是 0x4c 0x00 0x02 0x15
,那么它就是一个 iBeacon。然后,我发现了使用其他公司 ID 的 iBeacons。例如,我有 Nordic Semiconductor iBeacon 样本,它使用 0x59 0x00
,这是 Nordic 的公司 ID。
即使我想确保 0x02
和 0x15
在它们所在的位置,并且设备无法连接,并且制造数据是准确的长度,但这似乎确定性。
如何明确识别 iBeacon?
由于没有标准定义"beacon",不同的制造商有自己的广告格式。因此,您必须列出要抢购的广告模式。每个公司都定义了他们的数据的含义,因此仅查看制造商数据中的前 2 个字节是行不通的,因为某些公司可能将前缀 0x02、0x15 用于其他用途。
您可以下载 iBeacon 规范here(需要接受许可协议)。
规范规定公司 ID:
Must not be used for any purposes not specified by Apple.
将这 2 个字节用于识别制造商的预期目的是可以接受的。使用这 2 个字节来广播附加信息可能不在许可协议范围内。
规范中包含的信息应该足以帮助您。如果在各自的位置看到长度为0x1A,0x02,0x15,那很有可能是iBeacon数据包。
可以看到the byte sequence of an iBeacon transmission in my answer here.
最重要的是 必须为 iOS 指定确切的 header(包括公司代码)才能将广告解释为 iBeacon 传输并 return 使用 iOS CoreLocation API 的结果。 如果使用不同的公司代码,这些 API 将无法检测到。尽管不同的公司生产符合 iBeacon 规范的信标,但它们都使用 Apple 公司代码。
一些芯片制造商使用不同的公司标识符(例如 Nordic Semiconductor 0x59 0x00)提供示例代码这一事实可能只是绕过知识 属性 限制的一种方式。 Apple 坚持要求那些将其产品作为 iBeacon 兼容产品进行营销的人签署一份协议,表示他们不会透露规格。 Nordic 可能试图通过更改其示例代码中的公司标识符来遵守此协议。不管是什么原因,事实是 iOS 设备不会将此类传输解释为带有意外公司代码的 iBeacon 数据包。
根据iBeacon spec, iBeacons have to broadcast 0x004C as the company ID in the advertisement's manufacturer data. 0x004c
is Apple's company ID as assigned by the Bluetooth SIG。
我对此感到困惑,因为除了公司 ID 之外,似乎没有任何其他数据可以明确地将 BLE 设备标识为 iBeacon。接下来的两个字节固定为 0x02 和 0x15,其余字节取决于配置。
有一次我认为如果制造数据的前四个字节是 0x4c 0x00 0x02 0x15
,那么它就是一个 iBeacon。然后,我发现了使用其他公司 ID 的 iBeacons。例如,我有 Nordic Semiconductor iBeacon 样本,它使用 0x59 0x00
,这是 Nordic 的公司 ID。
即使我想确保 0x02
和 0x15
在它们所在的位置,并且设备无法连接,并且制造数据是准确的长度,但这似乎确定性。
如何明确识别 iBeacon?
由于没有标准定义"beacon",不同的制造商有自己的广告格式。因此,您必须列出要抢购的广告模式。每个公司都定义了他们的数据的含义,因此仅查看制造商数据中的前 2 个字节是行不通的,因为某些公司可能将前缀 0x02、0x15 用于其他用途。
您可以下载 iBeacon 规范here(需要接受许可协议)。
规范规定公司 ID:
Must not be used for any purposes not specified by Apple.
将这 2 个字节用于识别制造商的预期目的是可以接受的。使用这 2 个字节来广播附加信息可能不在许可协议范围内。
规范中包含的信息应该足以帮助您。如果在各自的位置看到长度为0x1A,0x02,0x15,那很有可能是iBeacon数据包。
可以看到the byte sequence of an iBeacon transmission in my answer here.
最重要的是 必须为 iOS 指定确切的 header(包括公司代码)才能将广告解释为 iBeacon 传输并 return 使用 iOS CoreLocation API 的结果。 如果使用不同的公司代码,这些 API 将无法检测到。尽管不同的公司生产符合 iBeacon 规范的信标,但它们都使用 Apple 公司代码。
一些芯片制造商使用不同的公司标识符(例如 Nordic Semiconductor 0x59 0x00)提供示例代码这一事实可能只是绕过知识 属性 限制的一种方式。 Apple 坚持要求那些将其产品作为 iBeacon 兼容产品进行营销的人签署一份协议,表示他们不会透露规格。 Nordic 可能试图通过更改其示例代码中的公司标识符来遵守此协议。不管是什么原因,事实是 iOS 设备不会将此类传输解释为带有意外公司代码的 iBeacon 数据包。