iOS蓝牙小知识——mac地址

iOS蓝牙小知识——mac地址,第1张

iOS搜索到蓝牙时,蓝牙的mac地址已经被隐藏了,我们打印出来的外设信息中是没有mac地址的,苹果提供给我们识别蓝牙的是identifier

但是安卓的是有mac地址的,客户就要求我们iOS也必须显示mac地址,可是我们的应用层无法实现该功能。通过查阅网上的资料发现有的说可以在服务里添加MAC地址,可是这样的话还是无法实现搜索的时候显示MAC地址,与客户的需求不符合。

然后我们的同事找到一个同牌子开发版的手环可以实现显示MAC地址,然后我拿来他们的手环进行测试,发现他们的MAC地址是放在了广播包里面。

然后将这个告知了需求方,让硬件配合开发此功能,现在我们的硬件也实现了该功能:

这样的话,我们可以通过获得广播包里的MAC地址来展示给用户。

所以如果有这个需求的要跟硬件的沟通,让他们把MAC地址加入到广播包中,我们iOS才可以实现这个功能。

在iOS蓝牙开发当中,现在的主流是使用蓝牙40,使用CoreBluetooth来进行开发,蓝牙40的好处就不多说了,大家自行google,HID也是一种蓝牙协议,单向传输数据,主要是做蓝牙键盘用的,比如罗技的蓝牙键盘k480。

那么我们可以像蓝牙40一样直接获取HID的设备信息,跟发送的数据吗?很可惜,这是不行的,HID是系统层的,我们在应用层是没办法获取到她的任何数据跟信息的 参考这里

答案是:有两种方法

1使用IOKIT库是可以拿到的,但是这个库比较底层,而且使用了这个库的话,发布apple store 会被拒(只是搜索到有人这么说,楼主并没有验证真实性);

2另外一种是在楼主玩弄公司的蓝牙键盘时想到的,键盘上有音乐控制键,可以控制iPhone的音乐播放,让我想到了apple耳机的线控,那么会不会两种控制的方法是一样的呢?话不多说,赶快验证一下;

4使用AVAudioPlayer获取键值

首先我们需要成为第一响应者,而且开始接受远程控制事件

然后初始化播放器

设置事件监听

最后播放器开始播放之后, *** 作耳机线控或者蓝牙键上的音乐控制,就可以获得相应的值,然后做你想执行的 *** 作,但是eventsubtype只有十个键值,这也算是一个小小的限制吧,以上!

我的目标是世界和平!

参考资料点击这里

talk is cheap, show me the code

一、相关介绍

CoreBluetooth专门用于与BLE设备通讯。并且现在很多蓝牙设备都支持40,40以其低功耗著称,所以一般也叫BLE(Bluetooth low energy),所以也是在iOS比较推荐的一种开发方法。

Central(中心设备);

Peripheral(外围设备);

advertising(广告);

Services(服务);

Characteristic(特征)

CoreBluetooth介绍

在CoreBluetooth中有两个主要的部分,Central和Peripheral,CBPeripheralManager 作为外围设备。CBCentralManager作为中心设备。所有可用的iOS设备可以作为外围(Peripheral)也可以作为中央(Central),但不可以同时既是周边也是中央。

外围设备(Peripheral)设备是广播设备的数据,中央设备(Central)是管理并且使用这些数据的设备。

也就是说外围(Peripheral)向周围发送广播,告诉周围的中央设备(Central)它(周边(Peripheral)这里有数据,并且说明了能提供的服务和特征值(连接之后才能获取),

其实蓝牙传值相当于网络接口,硬件的service的UUID加上characteristic的UUID,

打一个比喻:service的UUID相当于主地址,characteristic的UUID相当于短链接,短链接必须是主地址的分支,拼在一起的是接口,你和硬件设定的蓝牙传输格式类似于json,双方可识别的数据,因为蓝牙只能支持16进制,而且每次传输只能20个字节,所以要把信息流转成双方可识别的16进制。

|

二、中心设备CBCentralManager

CBCentralManager是管理中心设备的管理类,其中重要方法如下:

其中state是一个枚举,有关蓝牙是否可用的状态如下:

下面这些方法用于初始化管理中心:

三、外设CBPeripheralManager

从上面我们知道,中心设备是用来扫描周围的外设,两台设备的通讯中,必须有一个充当中心设备,一个充当外设,外设是由CBPeripheralManager进行管理,主要方法如下:

四、中心设备与外设对象CBCentral与CBPeripheral

上面介绍了中心设备管理类与外设管理类,这些类用于将设备连接建立起来,器具的数据交换的服务和一些信息则是在对应的设备对象中。

五、服务对象CBService

服务对象是用来管理外设提供的一些数据服务的,其中属性如下:

六、服务的特征值CBCharacteristic

通过绑定服务中的特征值来进行数据的读写 *** 作,其中属性如下:

七、读写请求对象CBATTRequest

服务对象是外设向中心设备提供的相关数据服务,获取到相应服务后,中心设备可以进行读写请求,读写对象属性如下:

八、开发流程

1 新建Central Manager实例并进行监听蓝牙设备状态

2 开始搜索外围设备,通过delegate获得数据

3 连接外围设备,delegate通知连接结果

4 获得外围设备的服务,delegate获得结果

5 获得服务的特征,delegate获得结果

6 根据服务和特征给外围设备发送数据

7 根据delegate回调,从外围设备读数据

创建项目,设置plist实现delegate方法,判断蓝牙状态,如成功则扫描指定UUID设备(如不指定UUID,则无法后台持续连接)实现delegate方法,当发现指定设备后,连接该设备实现delegate方法,当连接指定外围设备成功,编写定时器,每秒读取1次RSSI实现delegate方法,当监听到失去和外围设备连接,重新建立连接实现delegate方法,当读取到RSSI值,打印出它的值

iOS 蓝牙开发(二)

iOS 蓝牙开发(三)

iOS 蓝牙开发(四)

在iOS中蓝牙相关实现都是在CoreBluetooth这个framework中的,所以我们创建一个单例类中需要先导入 #import <CoreBluetooth/CoreBluetoothh> ,再后即可使用这个单例类进行管理我们蓝牙的扫描、连接、状态等实现。

当 centralstate 为CBManagerStatePoweredOn即可开始扫描, 具体方法 [selfcentralManager scanForPeripheralsWithServices:nil options:nil] 当调用 scanForPeripheralsWithServices:options: 函数时就会实时调用其代理方法 - (void)centralManager:(CBCentralManager )central didDiscoverPeripheral:(CBPeripheral )peripheral advertisementData:(NSDictionary )advertisementData RSSI:(NSNumber )RSSI

peripheral 是外设类 advertisementData 是广播的值,一般携带设备名, serviceUUID 等信息。 RSSI 绝对值越大,表示信号越差,设备离的越远。如果想装换成百分比强度, (RSSI+100)/1001 (这是一个约数,蓝牙信号值并不一定是-100 - 0的值)

蓝牙的连接是当中心设备扫描到可用外设后, 利用函数 [selfcentralManager connectPeripheral:peripheral options:nil]; 进行链接, 当函数被调用后, 就会回调其对应的代理函数。

本篇笔记主要是记录如何初始化蓝牙的 CBCentralManager 的中心管理类,并记录如何实现扫描周边外设、如何链接、获取蓝牙当前状态。

可以看看这个,希望对你有帮助

>

以上就是关于iOS蓝牙小知识——mac地址全部的内容,包括:iOS蓝牙小知识——mac地址、iOS BlueTooth HID(Human Interface Device) 键值获取方法、iOS蓝牙实现汇总等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9277640.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-26
下一篇2023-04-26

发表评论

登录后才能评论

评论列表(0条)

    保存