通过蓝牙接收字符串数据

时间:2017-10-03 05:46:13

标签: ios swift bluetooth core-bluetooth cbcentralmanager

我正在创建一个与单个外围设备通信的简单BLE应用。电话充当中心。我有一台iPad,我用它作为测试的外围设备。它安装了应用LightBlue来模拟外围设备。外围设备应该以这种格式发送一串数据。

  

TEM:25.11 | HUM:70 | PM10:43 | PM25:32

所以我用LightBlue在一个服务中创建了一个空白虚拟外设。

enter image description here

enter image description here

以下是我的蓝牙连接处理代码。

import UIKit
import CoreBluetooth

class ViewController: UIViewController {

    fileprivate let serviceUUID = CBUUID(string: "19B10010-E8F2-537E-4F6C-D104768A1214")
    fileprivate let characteristicUUID = CBUUID(string: "19B10011-E8F2-537E-4F6C-D104768A1214")

    fileprivate var manager: CBCentralManager!
    fileprivate var peripheral: CBPeripheral!
    fileprivate var characteristic: CBCharacteristic!

    override func viewDidLoad() {
        super.viewDidLoad()
        manager = CBCentralManager(delegate: self, queue: nil)
    }

    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        stopScan()
    }

    fileprivate func startScan() {
        manager.scanForPeripherals(withServices: [serviceUUID], options: nil)
    }

    fileprivate func stopScan() {
        manager.stopScan()
    }

    fileprivate func disconnectFromDevice() {
        guard let peripheral = peripheral else { return }
        manager.cancelPeripheralConnection(peripheral)
    }

    fileprivate func restoreCentralManager() {
        manager.delegate = self
    }

}

// MARK: - CBCentralManagerDelegate
extension ViewController: CBCentralManagerDelegate {
    func centralManagerDidUpdateState(_ central: CBCentralManager) {
        switch central.state {
        case .unsupported:
            print("Unsupported")
        case .unauthorized:
            print("Unauthorized")
        case .poweredOn:
            print("Powered On")
            startScan()
        case .resetting:
            print("Resetting")
        case .poweredOff:
            print("Powered Off")
        case .unknown:
            print("Unknown")
        }
    }

    func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {
        print("Discovered \(String(describing: peripheral.name)) at \(RSSI)")

        if peripheral.name == nil || peripheral.name == "" {
            return
        }

        if self.peripheral == nil || self.peripheral.state == .disconnected {
            stopScan()

            self.peripheral = peripheral
            central.connect(peripheral, options: nil)
        }
    }

    func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {
        peripheral.delegate = self
        peripheral.discoverServices([serviceUUID])
    }

    func centralManager(_ central: CBCentralManager, didDisconnectPeripheral peripheral: CBPeripheral, error: Error?) {

        self.peripheral = nil
        central.scanForPeripherals(withServices: nil, options: nil)
    }

    func centralManager(_ central: CBCentralManager, didFailToConnect peripheral: CBPeripheral, error: Error?) {
        self.peripheral = nil
    }

    func centralManager(_ central: CBCentralManager, willRestoreState dict: [String : Any]) {
    }
}

// MARK: - CBPeripheralDelegate
extension ViewController: CBPeripheralDelegate {
    func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?) {
        guard let services = peripheral.services else { return }
        print("No. of services: \(services.count)")

        for service in services {
            print(service.uuid)
            if service.uuid == serviceUUID {
                peripheral.discoverCharacteristics(nil, for: service)
            }
        }
    }

    func peripheral(_ peripheral: CBPeripheral, didDiscoverCharacteristicsFor service: CBService, error: Error?) {
        guard let characteristics = service.characteristics else { return }

        for characteristic in characteristics {
            print("characteristic: \(characteristic.uuid)")
            if characteristic.uuid == characteristicUUID {
                self.characteristic = characteristic
                peripheral.setNotifyValue(true, for: characteristic)
                peripheral.readValue(for: characteristic)
            }
        }
    }

    func peripheral(_ peripheral: CBPeripheral, didWriteValueFor characteristic: CBCharacteristic, error: Error?) {
        print(error)
    }

    func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic, error: Error?) {        
        if characteristic.uuid == characteristicUUID {
            print("Got reply from: \(characteristic.uuid)")
            print(characteristic.value)
            if let data = characteristic.value, let string = String(data: data, encoding: String.Encoding.utf8) {
                print(string)
            } else {
                print("No response!")
            }
        }
    }

}

发现和连接部分工作得很好。问题是我没有从外围设备接收该数据字符串。

方法peripheral(_:didUpdateValueFor:error:)确实被解雇了。我从控制台输出得到回复:19B10011-E8F2-537E-4F6C-D104768A1214 。但是,当我通过打印characteristic.value来查看是否有任何数据时,它会返回nil

不确定我的代码是否有问题。或者我在LightBlue上配置了外围设备错误。 LightBlue会自动发送数据吗?我在任何地方都看不到任何发送按钮。

我上传了一个演示项目here

1 个答案:

答案 0 :(得分:1)

您的LightBlue配置显示您只能在该特定特征上写入值您必须同时阅读