**系统要求:IOS7.0开始支持BLE,但是这里使用swift语言,swift是需要IOS8.0以上,所以,这里系统都是IOS8.0以上
硬件要求:iphone 4s以上(包含4s),才有BLE硬件。**
1.先获取到一个蓝牙的manager:
// BLE需要蓝牙库支持,所以,需要导入蓝牙框架
import CoreBluetooth
manager = CBCentralManager(delegate: self, queue: nil);
这里delegate需要实现以下方法:
// 蓝牙启用状态,这个回调会在创建manger时回调
func centralManagerDidUpdateState(central: CBCentralManager){
if(central.state == CBCentralManagerState.PoweredOn){ // 可以使用
}
}
2.扫描蓝牙:
manager?.scanForPeripheralsWithServices(nil, options: nil); // 这里是没有设置过滤方法,如果需要过滤特定设备,可以在这里添加特定的uuid
// 扫描回调
func centralManager(central: CBCentralManager, didDiscoverPeripheral peripheral: CBPeripheral, advertisementData: [String : AnyObject], RSSI: NSNumber){
// peripheral是扫描到的设备对象
// advertisementData广播数据
// RSSI信号强度,是个整数(负数越大,信号越弱),通常这样取值:RSSI.integerValue
}
3.停止扫描:
manager?.stopScan();
4.连接BLE(在安卓上面,连接前需要停止扫描,IOS虽然不需要,但是也建议停止扫描)
manager.connectPeripheral(peripheral, options: nil);
// 连接成功回调
func centralManager(central: CBCentralManager, didConnectPeripheral peripheral: CBPeripheral) {
}
// 连接失败回调
func centralManager(central: CBCentralManager, didFailToConnectPeripheral peripheral: CBPeripheral, error: NSError?) {
}
5.断开连接
manager.cancelPeripheralConnection(peripheral);
// 断开连接回调
func centralManager(central: CBCentralManager, didDisconnectPeripheral peripheral: CBPeripheral, error: NSError?) {
}
6.判断手机蓝牙是否开启
// 查看是否使能
func isEnable() -> Bool{
return (manager!.state == CBCentralManagerState.PoweredOn);
}
连接成功后->需要发现服务->再发现服务里面的特征值(服务相当于一个文件夹,特征值相当于里面的文件,每个特征值就是一个通信通道,BLE的通信就是通过这些特征值通信的)
7.设置设备的代理方法
peripheral.delegate = self;
8.发现服务,特征值
peripheral.discoverCharacteristics(nil, forService: (task as! DiscoverServicesAction).getService()!);
// 发现服务回调
func peripheral(peripheral: CBPeripheral, didDiscoverServices error: NSError?){
//如果error是nil就说明是正常,如果不是nil就说明发现服务失败了,需要断开重新连接
// 遍历所有服务,并且发现服务里面的特征值(实际使用无需全部发现,只需要发现需要用到的特征值就行了)
for service in peripheral.services! as [CBService]{
peripheral.discoverCharacteristics(nil, forService: service);
}
}
// 发现特征值回调,并且记录下后面需要用到的特征值
func peripheral(peripheral: CBPeripheral, didDiscoverCharacteristicsForService service: CBService, error: NSError?){
for charact in (service?.characteristics)! { // 遍历此服务里面的所有特征值
}
}
9.写数据(往某个特征值写入数据,通常是在20字节以内)
peripheral.writeValue(senddata!, forCharacteristic: characteristic, type: CBCharacteristicWriteType.WithoutResponse);
// 写特征值回调
func peripheral(peripheral: CBPeripheral, didWriteValueForCharacteristic characteristic: CBCharacteristic, error: NSError?){
}
10.开启通道的接收数据功能(notify),BLE里面接收数据,一般使用notify,也有使用其他方式,这里使用notify作为代表
peripheral.setNotifyValue(task2.isEnable(), forCharacteristic: characteristic);
// 更新notify回调
func peripheral(peripheral: CBPeripheral, didUpdateNotificationStateForCharacteristic characteristic: CBCharacteristic, error: NSError?){
}
11.接收数据(notify)
// 更新特征值,设备主动发数据,和手机主动去读某个特征值,结果都是走这个回调
func peripheral(peripheral: CBPeripheral, didUpdateValueForCharacteristic characteristic: CBCharacteristic, error: NSError?){
}
12.手机主动读取某个特征值数据
peripheral.readValueForCharacteristic(characteristic); // 结果走上面那个回调
13.手机主动读取此时的设备信号强度
peripheral.readRSSI();
// 读取rssi回调
func peripheral(peripheral: CBPeripheral, didReadRSSI RSSI: NSNumber, error: NSError?){
}
14.判断设备是否连接
peripheral.state == CBPeripheralState.Connected;
IOS对BLE的支持还是比较到位,基本没什么坑,没什么需要特别注意的点