核心蓝牙如何确定新的外围设备是唯一的?
我有设备。每个设备都有服务。每项服务都有特色。
当我们测试基于蓝牙的应用程序时,似乎某些(不同的)设备具有相同的uid(peripheral.identifiers
)。
我认为这是因为设备上缺少广告信息(设备不是广告服务,而是融合到一个外围设备中)。
我认为设备之间的服务可能不同(可能/应该是相同的),具有相同特征的故事。
那么,哪些信息足以让蓝牙确定新的外围设备是唯一的?
我们的实验
我们有两个设备,一个名字' oldboy'和另一个名字' newone'。
此外,我们在每个设备上都有相同的服务(服务具有相同的结构和相同的uuids。服务uid和特征uid在所有设备上都是相同的)
设备名称不同。
很遗憾,设备不会通过nil到适当的方法scanServices: options:
而不是服务uids数组的广告服务和应用扫描所有服务。它可以完成,但它在后台没有帮助,对能源效率似乎非常不利。
服务器发送有关可以找到的所有设备的信息。
我们认为,uid不是由系统生成的,我们可以对设备的uid进行硬编码,并在此特征上设置不同的设备(peripheral.identifier
)
一个iDevice已经使用名为“oldboy'”的perihperal设备测试了应用程序。很长。
而这个iDevice应该与另一个名为“newone”的设备一起使用。
当它开始扫描时,它找到了一个name = 'newone' and 'peripheral.identifier = peripheral(oldboy).identifier'
的设备。
同样,它不可能是真的,因此,我们会断开除“新手”之外的所有设备。并重新启动实验。好的,同样的问题。 最后的检查是关于互动。我们连接到设备(' newone')并尝试向其发送命令。什么都没发生。但是,当我们尝试向“老男孩”发送命令时设备,我们赢了!
我深入研究了这个问题,发现连接的“新手”和#39;设备标识符某种程度上等于' oldboy'设备标识符。
它发生在didDiscoverPeripheral处理程序中。因此,在连接系统识别出“新手”之前,外围设备作为一个老人'外围设备(他们的外围设备标识符相同)
- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI {
// take peripheral info ?
// check that peripheral identifier is valid for us
BOOL identifierIsOk = YES;
DDLogDebug(@"we found! peripheral: %@ ", peripheral);
DDLogDebug(@"and data: %@",advertisementData);
if (identifierIsOk) {
// put peripheral into dictionary storage and try to connect and discover services and characteristics
[self centralManager:central safeConnectToPeripheral:peripheral];
}
}
BUG
最后,我们解决了麻烦。 我们发现不同设备上的MAC地址相同! 后记,我想将此文章添加为core bluetooth understanding tool