iOS 蓝牙开发 Mac地址问题
发布日期:2022-04-05 00:52:17 浏览次数:3 分类:博客文章

本文共 3463 字,大约阅读时间需要 11 分钟。

在蓝牙开发中,经常会遇到蓝牙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特征值,再去进行剪切和拼接来获取(必须先链接上外设)

 

详情参考: 

但这个方案有大弊端

1、就是我必须先链接上然后再去获取这个Mac地址,太消耗成本,且效率不高。

假如有很多设备的话,我必须一一验证,不是再断开,远没有在扫描阶段(扫描的过程是很快的,可以在短短几秒钟内就可以找到周围的上百台设备),确认是再链接高效。

2、这样会有莫名其妙的问题

3、从链接的角度来讲有点本末倒置,本来我是用Mac地址来链接的,但现在变成了,先链接再获取Mac地址,验证是否正确。

4、仅限某些设备,如果你的蓝牙设备不支持这样获取,你需要跟硬件工程师沟通,说白了并不通用

 

iOS如何链接呢?

一般我们可以通过名称、厂商数据来链接。

当手机蓝牙(此地将手机蓝牙作为中心设备)扫描到外设(譬如手环之类的)后,会进入这个方法

/*! *  @method centralManager:didDiscoverPeripheral:advertisementData:RSSI: * *  @param central              The central manager providing this update. *  @param peripheral           A CBPeripheral object. *  @param advertisementData    A dictionary containing any advertisement and scan response data. *  @param RSSI                 The current RSSI of peripheral, in dBm. A value of 127 is reserved and indicates the RSSI *                                was not available. * *  @discussion                 This method is invoked while scanning, upon the discovery of peripheral by central. 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 advertisementData keys, see {@link CBAdvertisementDataLocalNameKey} and other similar constants. * *  @seealso                    CBAdvertisementData.h * */- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary
*)advertisementData RSSI:(NSNumber *)RSSI;

名称、厂商数据可以从advertisementData(广告数据)中读取

/*! *  @constant CBAdvertisementDataLocalNameKey * *  @discussion A NSString containing the local name of a peripheral. * */CB_EXTERN NSString * const CBAdvertisementDataLocalNameKey;
/*! *  @constant CBAdvertisementDataManufacturerDataKey * *  @discussion A NSData 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、如果名称相同,又要确定唯一性,那我们就需要通过厂商数据来约定了。

具体这个规则要怎么来约定唯一性,就靠彼此约定了,这个规则随意,只要彼此双方约定好就可以。

 

综上:

比较好的链接方案就是,苹果、安卓、硬件大家约定好一个规则,不论是通过名称或者厂商数据都可以确定唯一性通用性

 

转载地址:https://www.cnblogs.com/lijianyi/p/14761020.html 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:iOS 蓝牙开发详解(基本知识、相关类图、交互流程)
下一篇:AFNetwork监听网络失效

发表评论

最新留言

路过按个爪印,很不错,赞一个!
[***.219.124.196]2024年04月15日 06时53分41秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章