我正在使用scanForPeripheralsWithServices按服务UUID扫描设备。当我使用某些标准服务UUID值时,它有时会起作用。
当我尝试使用自定义服务UUID时,它通常不会找到任何设备,但是如果我使用nil作为服务UUID列表,它将找到那些在我使用其服务UUID时找不到的相同设备。 / p>
发生了什么事?可能是因为设备的广告包只能宣传它的一些服务吗?
答案 0 :(得分:1)
外围设备公布的服务集通常小于其提供的服务。这是因为广告中的空间有限,因此仅宣传" primary"服务。
来自Apple Core Bluetooth Programming Guide -
广告时可以使用的空间也有限制 数据。当您的应用程序位于前台时,它最多可以使用28个字节 初始广告数据中的空间用于两者的任何组合 支持的广告数据密钥。如果这个空间用完了,那就有了 扫描响应中可以使用的另外10个字节的空间 仅限本地名称。任何不适合的服务UUID 分配的空间被添加到一个特殊的“溢出”区域;他们可以 仅由显式扫描它们的iOS设备发现。 当您的应用程序在后台时,不会公布本地名称 并且所有服务UUID都放在溢出区域中。
为了帮助您保持这些空间限制,请限制服务 您向那些标识您的主要服务的人宣传的UUID。
例如,心率设备可以提供心率服务,设备信息服务,电池服务等等,但它只会宣传心率服务,因为这是其他设备将提供的服务。 ;感兴趣的"因为它将此设备与其他类设备区分开来。
识别设备并建立连接后,如果需要,可以发现其他服务。