在蓝牙开发中,常常会遇到蓝牙Mac地点(物理地点-->唯一标志)链接的题目:
对于安卓来说,可以通过Mac地点来链接,由于他们可以获取到外设的Mac地点。
对于苹果而言,是不可以通过Mac地点链接的,由于我们无法获取外设的Mac地点。
固然苹果给我们提供了一个外设的UUID,但是这个UUID是通过外设的Mac地点和手机的Mac地点举行加密盘算得来的。
换言之,差别手机链接同一外设这个值是差别的,以是这个值并不能取代Mac地点作为唯一标志,何况安卓是没有这个UUID的。
peripheral.identifier.UUIDString;*! * @property identifier * * @discussion The unique, persistent identifier associated with the peer. */@property(readonly, nonatomic) NSUUID *identifier NS_AVAILABLE(10_13, 7_0);/* Return a string description of the UUID, such as "E621E1F8-C36C-495A-93FC-0C247A3E6E5F" */@property (readonly, copy) NSString *UUIDString;那iOS怎样获取Mac地点呢?
方案A:硬件工程师将Mac地点写到厂商数据中,然后我们获取(扫描阶段就可以获取到)
方案B本质就是读取固定指令获取)读取外设的180A服务里的2A23特性值,再去举行剪切和拼接来获取(必须先链接上外设)
详情参考:https://www.jianshu.com/p/1d6a8fc8134f
但这个方案有大弊端:
1、就是我必须先链接上然后再去获取这个Mac地点,太斲丧本钱,且服从不高。
如果有很多装备的话,我必须逐一验证,不是再断开,远没有在扫描阶段(扫描的过程是很快的,可以在短短几秒钟内就可以找到附近的上百台装备),确认是再链接高效。
2、如许会有莫名其妙的题目。
3、从链接的角度来讲有点本末倒置,原来我是用Mac地点来链接的,但现在变成了,先链接再获取Mac地点,验证是否正确。
4、仅限某些装备,如果你的蓝牙装备不支持如许获取,你必要跟硬件工程师沟通,说白了并不通用
那iOS怎样链接呢?
一样平常我们可以通过名称、厂商数据来链接。
当手机蓝牙(此地将手机蓝牙作为中心装备)扫描到外设(譬如手环之类的)后,会进入这个方法
/*! * @method centralManager:didDiscoverPeripheral:advertisementData:RSSI: * * @param central The central manager providing this update. * @param peripheral A <code>CBPeripheral</code> object. * @param advertisementData A dictionary containing any advertisement and scan response data. * @param RSSI The current RSSI of <i>peripheral</i>, in dBm. A value of <code>127</code> is reserved and indicates the RSSI * was not available. * * @discussion This method is invoked while scanning, upon the discovery of <i>peripheral</i> by <i>central</i>. A discovered peripheral must * be retained in order to use it; otherwise, it is assumed to not be of interest and will be cleaned up by the central manager. For * a list of <i>advertisementData</i> keys, see {@link CBAdvertisementDataLocalNameKey} and other similar constants. * * @seealso CBAdvertisementData.h * */- (void)centralManagerCBCentralManager *)central didDiscoverPeripheralCBPeripheral *)peripheral advertisementDataNSDictionary<NSString *, id> *)advertisementData RSSINSNumber *)RSSI;名称、厂商数据可以从advertisementData(广告数据)中读取
/*! * @constant CBAdvertisementDataLocalNameKey * * @discussion A <code>NSString</code> containing the local name of a peripheral. * */CB_EXTERN NSString * const CBAdvertisementDataLocalNameKey;/*! * @constant CBAdvertisementDataManufacturerDataKey * * @discussion A <code>NSData</code> object containing the manufacturer data of a peripheral. * */CB_EXTERN NSString * const CBAdvertisementDataManufacturerDataKey;//advertisementData中可以发送的数据有约定 如下17 /*18 对应设置NSString范例的广播名19 NSString *const CBAdvertisementDataLocalNameKey;20 外设制造商的NSData数据21 NSString *const CBAdvertisementDataManufacturerDataKey;22 外设制造商的CBUUID数据23 NSString *const CBAdvertisementDataServiceDataKey;24 服务的UUID与其对应的服务数据字典数组25 NSString *const CBAdvertisementDataServiceUUIDsKey;26 附加服务的UUID数组27 NSString *const CBAdvertisementDataOverflowServiceUUIDsKey;28 外设的发送功率 NSNumber范例29 NSString *const CBAdvertisementDataTxPowerLevelKey;30 外设是否可以毗连31 NSString *const CBAdvertisementDataIsConnectable;32 服务的UUID数组33 NSString *const CBAdvertisementDataSolicitedServiceUUIDsKey;34 */详细怎样包管唯一性,这个就必要和蓝牙硬件工程师约定了。
1、如果名称是唯一的,我们就可以用名称来约定唯一性。
2、如果名称相同,又要确定唯一性,那我们就必要通过厂商数据来约定了。
详细这个规则要怎么来约定唯一性,就靠相互约定了,这个规则随意,只要相互双方约定好就可以。
综上:
比力好的链接方案就是,苹果、安卓、硬件大家约定好一个规则,岂论是通过名称或者厂商数据都可以确定唯一性通用性。
来源:http://t.zoukankan.com/lijianyi-p-14761020.html |