没有从ios中的BLE设备获取数据/服务

时间:2016-01-18 13:50:04

标签: ios swift bluetooth-lowenergy core-bluetooth

我需要连接BLE设备,然后根据其中的不同按钮发送数据 为此,我写了下面的代码。

import CoreBluetooth
class HomeViewController: UIViewController,CBPeripheralDelegate,CBCentralManagerDelegate 
{
    var centralManager : CBCentralManager!
    var peri : CBPeripheral!
    override func viewDidLoad()
    {
        super.viewDidLoad()
        centralManager = CBCentralManager(delegate: self, queue: nil)
    }
    func centralManagerDidUpdateState(central: CBCentralManager) {
        if central.state == .Unknown
        {
            print("Unknown")
        }
        else if central.state == .Unsupported
        {
            print("Unsupported")
        }
        else if central.state == .Unauthorized
        {
            print("Unauthorized")
        }
        else if central.state == .Resetting
        {
            print("Resetting")
        }
        else if central.state == .PoweredOn
        {
            print("Powered On")
            startScan()
        }
        else if central.state == .PoweredOff
        {
            print("Powered Off")
        }
    }
    func centralManager(central: CBCentralManager, didDiscoverPeripheral peripheral: CBPeripheral, advertisementData: [String : AnyObject], RSSI: NSNumber) {
        print("Discovered: \(peripheral.name) at \(RSSI)")
        print("AdvertisementData:\(advertisementData)")

        if peri != peripheral
        {
            peri = peripheral
            centralManager.connectPeripheral(peripheral, options: nil)
        }
    }
    func centralManager(central: CBCentralManager, didFailToConnectPeripheral peripheral: CBPeripheral, error: NSError?) {
        print("Failed to connect \(peripheral) cause of \(error)")
    }

    func centralManager(central: CBCentralManager, didConnectPeripheral peripheral: CBPeripheral) {
        print("connected to \(peripheral)")
//        centralManager.stopScan()
        print("Available services:\(peripheral.services)")
    }
    func peripheral(peripheral: CBPeripheral, didDiscoverIncludedServicesForService service: CBService, error: NSError?) {
        print("Services\(service) and error\(error)")
    }
    func peripheral(peripheral: CBPeripheral, didDiscoverServices error: NSError?) {
        print("Services and error\(error)")
    }
    func startScan(){
        print("Scanning...")
        centralManager.scanForPeripheralsWithServices(nil, options: nil)
    }
}

这是我的代码日志。

Powered On
Scanning...
Discovered: Optional("**** BLE") at 127
AdvertisementData:["kCBAdvDataIsConnectable": 1, "kCBAdvDataServiceUUIDs": (
    1802
)]
connected to <CBPeripheral: 0x12756d910, identifier = 6197****-EB0A-F1E8-BEF4-1AFAC629C5BC, name = **** BLE, state = connected>
Available services:nil

从BLE设备单击一个按钮时会生成此输出。但是,当单击另一个按钮时,我无法接收或读取数据 同一个应用程序的Android开发人员已与两个按钮集成 所以设备没有任何问题 任何人都可以帮我指导我在这段代码中出错的地方吗?

3 个答案:

答案 0 :(得分:7)

Pandafox的答案是完美的,只是遗漏了一件事。
哪个是设置外围代表。

以下是发现外设,连接外设并发现其服务和特性的完整代码。

1.连接外围设备

func centralManager(central: CBCentralManager, didDiscoverPeripheral peripheral: CBPeripheral, advertisementData: [String : AnyObject], RSSI: NSNumber) {
    print("Discovered: \(peripheral.name) at \(RSSI)")
    print("AdvertisementData:\(advertisementData)")

    if peri != peripheral
    {
        peri = peripheral
        peri.delegate = self
        centralManager.connectPeripheral(peri, options: nil)
    }
}
  1. 连接失败或成功

    func centralManager(central: CBCentralManager, didFailToConnectPeripheral peripheral: CBPeripheral, error: NSError?) {
        print("Failed to connect \(peripheral) cause of \(error)")
    }
    
    func centralManager(central: CBCentralManager, didConnectPeripheral peripheral: CBPeripheral) {
        print("connected to \(peripheral)")
    //        centralManager.stopScan()
        peripheral.discoverServices(nil)
    }
    
  2. 3.DiscoverServices

    func peripheral(peripheral: CBPeripheral, didDiscoverServices error: NSError?) {
            print("Services:\(peripheral.services) and error\(error)")
            if let services = peripheral.services {
                for service in services {
                    peripheral.discoverCharacteristics(nil, forService: service)
                }
            }
        }
    
    1. 发现特征并设置通知

      func peripheral(peripheral: CBPeripheral, didDiscoverCharacteristicsForService service: CBService, error: NSError?)
          {
              print("peripheral:\(peripheral) and service:\(service)")
              for characteristic in service.characteristics!
              {
                  peripheral.setNotifyValue(true, forCharacteristic: characteristic)
              }
          }
      
    2. 处理特征更新值的通知

      func peripheral(peripheral: CBPeripheral, didUpdateValueForCharacteristic characteristic: CBCharacteristic, error: NSError?)
          {
              print("characteristic changed:\(characteristic)")
          }
      

答案 1 :(得分:3)

连接到设备后,您还必须发现服务和特性。

例如,在“didConnectPeripheral”方法中,您必须执行以下操作:

 func centralManager(central: CBCentralManager, didConnectPeripheral peripheral: CBPeripheral) {
    print("connected to \(peripheral)")
    peripheral.delegate = self
    peripheral.discoverServices(nil)
    print("Discovering services!")
}

然后:

func peripheral(peripheral: CBPeripheral, didDiscoverServices error: NSError?) {
    print("Discovered services: \(peripheral.services), Error\(error)")
    if let services = peripheral.services {
        for service in services {
            peripheral.discoverCharacteristics(nil, forService: service)
        }
    }
}

然后你必须处理每个特征:

 func peripheral(peripheral: CBPeripheral, didDiscoverCharacteristicsForService service: CBService, error: NSError)

您必须记住手动存储每个特征,否则将取消分配。

要接收流式数据(通知),您必须为每个特性启用通知。

peripheral.setNotifyValue(true, forCharacteristic: characteristic)

您还必须实施:

 func peripheral(peripheral: CBPeripheral, didUpdateValueForCharacteristic characteristic: CBCharacteristic, error: NSError)

命令处理传入的值。

正如您所看到的,开始时需要相当多的样板代码。

答案 2 :(得分:1)

连接到外围设备后,您必须使用要发现的服务的UUID在外围设备上呼叫discoverServices,然后您必须发现该服务的特征。如果您想在单击按钮时进行更新,则必须打开与该按钮对应的特征的通知

如果您仍需要帮助,我强烈推荐苹果提供此链接以供后续阅读。它以一种比我在这里描述的更好的方式逐步描述你需要做的事情。

Apple BLE Guide