IOS BLE从入门到精通

**系统要求: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的支持还是比较到位,基本没什么坑,没什么需要特别注意的点

猜你喜欢

转载自blog.csdn.net/fangqiangqi/article/details/52068259