十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
iOS 蓝牙开发(一)
创新互联专注于企业全网营销推广、网站重做改版、利川网站定制设计、自适应品牌网站建设、H5响应式网站、商城网站建设、集团公司官网建设、成都外贸网站建设公司、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为利川等各大城市提供网站开发制作服务。
iOS 蓝牙开发(二)
iOS 蓝牙开发(四)
前面记录了蓝牙如何进行扫描、链接、以及获取外设的服务和特征,本篇笔记我将记录如何实现 与外设做数据交互(explore and interact) 。
构建方法流程:链接成功-获取指定的服务与特征-订阅指定的特征值-通过具有写权限的特征值来写数据-最后在函数 didUpdateValueForCharacteristic 中获取蓝牙的反馈信息;
总结:
本篇笔记大概就是在接收到服务和特征后对数据进行写入的操作的过程,笔记中的重点在于要熟悉构建特征和服务的方法流程。熟悉流程,我们就能清楚知道当在写入数据时,系统蓝牙会在函数 didUpdateValueForCharacteristic 方法中给我们反馈写入是否成功的反馈信息。
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 的中心管理类,并记录如何实现扫描周边外设、如何链接、获取蓝牙当前状态。
这几年一直在做IOS端的智能穿戴的APP,使用蓝牙开发的频率也比较高,所以对蓝牙开发还是有一定的了解,写篇文章记录总结。
理论知识,我就不详细说了。简单理解:我们手机是CBCentralManager,就是中心。我们的手环等是CBPeripheral,就是外设。
手机APP连接外设需要的步骤:搜索外设—连接外设—-查找外设的服务—-查找外设的服务对应特征。以上都是成功,不包括错误失败。
手机APP收发指令,都是通过 服务+特征 来进行处理。
具体的做法,我们可以看我封装的一个类,拖到项目中就可以用。
封装的类名为:BleOperatorManager
_bleOpt = [BleOperatorManager sharedInstance];
_bleOpt.delegate = self;
_bleOpt.realTimeUpdateDeviceListBlock = ^(NSArray *listArray, NSDictionary *rssiDic, NSDictionary *macDic) {
//实时返回搜索到的外设,listArray存了所有的外设结构(CBPeripheral *),macDic保存了外设的mac地址
};
_bleOpt.gainMacAddress = ^NSString *(NSDictionary *advertisementData) {
//解析mac地址,并返回给原类
NSData *data = advertisementData[@"kCBAdvDataManufacturerData"];
return @"FF:FF:FF:FF";
};
搜索:startScanDevice:(NSArray *)adverUUIDArray
停止搜索:stopScanDevice
连接外设:connectSelectPeripheral:(CBPeripheral *)peripheral
断连:disconnectCurrentPeripheral:(BOOL)hasRecord
前面说过,发送是需要 服务+特征 的,服务和特征,在连接蓝牙的时候,可以得到,当然也可以lightBlue查看。
然后发送就是:sendDataToBand:(NSData *)data WithServiceUUID:(NSString *)serviceUUID WithCharacteristicUUID:(NSString *)characteristicUUID withWriteType:(CBCharacteristicWriteType)writeType
如果发送是CBCharacteristicWriteWithResponse类型,那么发送完成后,就会调用
peripheral:(CBPeripheral *)peripheral didWriteValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error
{
//发送后的代理
}
接收数据:外设主动操作,我们只是对应代理回调:
peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error
{
//收到的数据为:characteristic.value
}
还得有下面的配置:
项目加入CoreBluetooth库
plist文件加入:
Required background modes:App communicates using CoreBluetooth
蓝牙类: GitHub - wulang150/BleManager: 蓝牙模块