重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
iOS BLE开发调用的是CoreBluetooth系统原生库,基本用到的类有:
创新互联建站专注于多伦网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供多伦营销型网站建设,多伦网站制作、多伦网页设计、多伦网站官网定制、小程序定制开发服务,打造多伦网络公司原创品牌,更为您提供多伦网站排名全网营销落地服务。
CBCentralManager //系统蓝牙设备管理对象
CBPeripheral //外围设备
CBService //外围设备的服务或者服务中包含的服务
CBCharacteristic //服务的特性
CBDescriptor //特性的描述符
myCentralManager = CBCentralManager()
myCentralManager.delegate = self
myCentralManager.scanForPeripherals(withServices: nil, options: nil)
func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {
central.connect(self.myPeripheral, options: nil)
}
func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {
}
func centralManager(_ central: CBCentralManager, didDisconnectPeripheral peripheral: CBPeripheral, error: Error?) {
}
func centralManager(_ central: CBCentralManager, didFailToConnect peripheral: CBPeripheral, error: Error?){
}
func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?) {
for s in peripheral.services!{
peripheral.discoverCharacteristics(nil, for: s)
}
}
func peripheral(_ peripheral: CBPeripheral, didDiscoverCharacteristicsFor service: CBService, error: Error?) {
print("----发现特征------")
for c in service.characteristics! {
if c.uuid.uuidString == CHARACTERISTIC{
self.writeCharacteristic = c
peripheral.setNotifyValue(true, for: c)
}
}
}
func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic, error: Error?){
}
func writeToPeripheral(_ bytes:[UInt8]) {
if writeCharacteristic != nil {
let data1:Data = dataWithHexstring(bytes)
self.myPeripheral.writeV alue(data1, for: writeCharacteristic, type: CBCharacteristicWriteType.withResponse)
} else{
}
}
func peripheral(_ peripheral: CBPeripheral, didWriteValueFor characteristic: CBCharacteristic, error: Error?) {
print("didWriteValueForCharacteristic")
}
以上只是作为蓝牙从连接打到发送数据接收数据的一个简单流程,蓝牙也可以作为多连接,在数据返回的方法可以对返回的蓝牙设备和你连接的所有蓝牙设备进行一个判断,根据判断来断定是哪个蓝牙设备返回过来的信息。
另外关于蓝牙的UUID,听说是每个手机连接同一个蓝牙设备的UUID会不同,这方面安卓那边比较简单的能获取到蓝牙的Mac地址,iOS好像要和厂家那边协商一下,我以为你懒得去弄 了所有就暂时这样;手上我也只有1个手机所有没有做这方面的测试,有看到这篇文件的朋友或者知道的大神可以留言告诉我是否是这样的。
只连接到最好的
蓝牙开发连接最好用Mac地址
iOS获取蓝牙外设的Mac地址的两种方法
iOS 获取蓝牙外设的Mac地址的两种方法 -
iOS 蓝牙开发(一)
iOS 蓝牙开发(二)
iOS 蓝牙开发(四)
前面记录了蓝牙如何进行扫描、链接、以及获取外设的服务和特征,本篇笔记我将记录如何实现 与外设做数据交互(explore and interact) 。
构建方法流程:链接成功-获取指定的服务与特征-订阅指定的特征值-通过具有写权限的特征值来写数据-最后在函数 didUpdateValueForCharacteristic 中获取蓝牙的反馈信息;
总结:
本篇笔记大概就是在接收到服务和特征后对数据进行写入的操作的过程,笔记中的重点在于要熟悉构建特征和服务的方法流程。熟悉流程,我们就能清楚知道当在写入数据时,系统蓝牙会在函数 didUpdateValueForCharacteristic 方法中给我们反馈写入是否成功的反馈信息。
GAP(Generic Access Profile):它用来控制设备连接和广播,GAP 使你的设备被其他设备可见,并决定了你的设备是否可以或者怎样与合同设备进行交互。
GATT(Generic Attribute Profile):BLE连接都是建立在GATT协议之上的。GATT 是一个在蓝牙连接之上的发送和接收很短的数据段的通用规范,这些很短的数据段被称为属性(Attribute)。
BLE中主要有两个角色:外围设备(Peripheral)和中心设备(Central)。一个中心设备可以连接多个外围设备,一个外围设备包含一个或多个服务(services),一个服务包含一个或多个特征(characteristics)。
使用CoreBluetooth库,创建CBPeripheralManager,实现CBPeripheralManagerDelegate代理
创建完该对象,会回调peripheralManagerDidUpdateState:方法判断蓝牙状态,蓝牙可用,给外设配置服务和特征
注意CBAttributePermissions
当中心设备读写设置CBAttributePermissionsReadEncryptionRequired/CBAttributePermissionsWriteEncryptionRequired权限的Characteristic时,会弹出弹框,请求建立安全连接
给外设配置服务特征后,会调用peripheralManager:didAddService:error: 服务特征全部添加完后发起广播,如果在广播时设置CBAdvertisementDataServiceUUIDsKey,会把该service广播出去,中心设备在扫描时可根据该uuid找到该设备。外围设备靠不断发广播,使中心设备发现它。
当中央端连接上了此设备并订阅了特征时会回调 didSubscribeToCharacteristic:
当接收到中央端读的请求时会调用didReceiveReadRequest:
创建CBCentralManager对象,实现CBCentralManagerDelegate代理
回调centralManagerDidUpdateState:代理方法,当central.state==CBManagerStatePoweredOn时,开启扫描,设置serviceUUIDs可扫描特定外设,CBCentralManagerScanOptionAllowDuplicatesKey设为NO不重复扫描已发现设备,YES是允许
扫描到设备会回调centralManager:didDiscoverPeripheral:advertisementData:RSSI:,RSS绝对值越大,表示信号越差,设备离的越远
关闭扫描
连接设备
发现服务
发现特征
iOS 蓝牙开发(二)
iOS 蓝牙开发(三)
iOS 蓝牙开发(四)
在iOS中蓝牙相关实现都是在CoreBluetooth这个framework中的,所以我们创建一个单例类中需要先导入 #import CoreBluetooth/CoreBluetooth.h ,再后即可使用这个单例类进行管理我们蓝牙的扫描、连接、状态等实现。
当 central.state 为CBManagerStatePoweredOn即可开始扫描, 具体方法 [self.centralManager 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的值)
蓝牙的连接是当中心设备扫描到可用外设后, 利用函数 [self.centralManager connectPeripheral:peripheral options:nil]; 进行链接, 当函数被调用后, 就会回调其对应的代理函数。
本篇笔记主要是记录如何初始化蓝牙的 CBCentralManager 的中心管理类,并记录如何实现扫描周边外设、如何链接、获取蓝牙当前状态。