
理论知识,我就不详细说了。简单理解:我们手机是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: 蓝牙模块
1、通过lightblue软件 可以得到蓝牙设备的属性,例如:write、read、write withoutResponse、notify;
write、write withoutResponse:用于写数据的,但是值得注意的是:通过lightblue软件,看是哪个值,并在type上做出相应的选择
read 、notify:用于接受数据;往往writewithoutResponse会通过notify的数据取得结果;
今日踩坑:原因是新设备的属性不一样 ,新设备读:WriteWithoutResponse 通过notify取到数据;旧设备是通过Write (相当于WriteWithResponse)和read ;read和notify 得到数据,项目源码已经完成了,所以只要在write的时候,把属性改为WriteWithoutResponse就好了;
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)