无法搜索自定义CBUUID

时间:2017-09-25 21:19:02

标签: swift xcode bluetooth-lowenergy

我有一个应用程序可以工作(到目前为止一直很好)将我的iOS设备连接到蓝牙arduino,到目前为止这主要是为了练习,但现在我收到了我应该的真实的东西连接到。
问题是我无法找到它! (当我搜索它时)。 如果我使用scanwithservices:nil,我可以看到设备并连接到它。但是,如果我使用服务扫描:[device' sCBUUID],那么我什么都得不到。 我使用我自己的应用程序并查看设备文档,我使用其他应用程序检查了CBUUID的双/三/四重检查,但无论我无法找到它。
它有一个自定义的CBUUID,根据我所读的标准,CBUUID是:

BLETPodService = CBUUID(string: "4D494B45-414c-5741-5953-524F434B5321")

搜索这个没有产生任何结果,但是如果我扫描nil我找到它并且如果我使用Bluefruit应用程序(来自Adafruit)检查它的特征,我可以看到它的服务和特征ID和它们匹配我在这里发布的字符串!
我告诉一位朋友,他说这是一个多年来一直存在的BLE漏洞(关于自定义CBUUID),这是真的吗?真的没有解决这个问题吗?

编辑仅添加完整扫描代码FYI:

    func centralManagerDidUpdateState(_ central: CBCentralManager) {
        var statusMessage = ""

        switch (central.state)
        {
        case .unsupported:
            statusMessage = "Bluetooth Low Energy is not supported!"
            displayStatusAlert(localmsg: statusMessage)
            print(statusMessage)
        case .unauthorized:
            statusMessage = "Bluetooth Low Energy is not authorized!"
            displayStatusAlert(localmsg: statusMessage)
            print(statusMessage)
        case .unknown:
            statusMessage = "Bluetooth Low Energy is unknown!"
            displayStatusAlert(localmsg: statusMessage)
            print(statusMessage)
        case .poweredOff:
            statusMessage = "Bluetooth Low Energy is powered off!"
            displayStatusAlert(localmsg: statusMessage)
            print(statusMessage)
        case .resetting:
            statusMessage = "Bluetooth Low Energy is resetting!"
            displayStatusAlert(localmsg: statusMessage)
            print(statusMessage)
        case .poweredOn:
            statusMessage = "BLE is ready!" //If BLE is ready then start scanning right away!
            peripheralsFoundNames.removeAll()
            peripheralsFoundCB.removeAll()
            peripheralsFoundRSSIs.removeAll()
            peripheralsFoundData.removeAll() //Remove previous data from previous scans
            central.scanForPeripherals(withServices: nil, options: nil)
        }
    }

//What happens when you discover a peripheral
    func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {
        //What to do when it discovers a peripheral, add it to the array list
        print("Peripheral found: " + (peripheral.name ?? "Unknown Name"))
        peripheralsFoundNames.append((peripheral.name ?? "Unknown Name"))
        peripheralsFoundData.append((advertisementData.description ))
        peripheralsFoundCB.append(peripheral)
        peripheralsFoundRSSIs.append(RSSI)
    }

4 个答案:

答案 0 :(得分:2)

我碰巧同时在BLE固件和iOS App上工作。 我遇到了同样的问题,即过滤器无法正常工作。

iOS找不到具有UUID的设备的原因是,该设备在广告时不包括UUID。

我必须更改设备固件以在广告数据包中添加服务UUID。随着设备发布UUID,UUID过滤器将按预期工作。

答案 1 :(得分:1)

我也有这个问题,但我发现了一些棘手的方法。

您可以尝试直接在didDiscoverPeripheral func中匹配UUID(字符串值):

func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber){
  if let services = peripheral.services {
        for service in services {
            if service.uuid.uuidString.lowercased() == "4D494B45-414c-5741-5953-524F434B5321".lowercased() {
              if !peripheralsFoundCB.contains(peripheral) {
                   peripheralsFoundCB.append(peripheral)
              }
            }
        }
    }
}

如果这种方式不适合你,我还有一个:

func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber){
    peripheral.discoverServices(nil)
}

func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?) {
     if let services = peripheral.services {
        for service in services {
            if service.uuid.uuidString.lowercased() == "4D494B45-414c-5741-5953-524F434B5321".lowercased() {
              if !peripheralsFoundCB.contains(peripheral) {
                   peripheralsFoundCB.append(periphera
              }
            }
        }
    }
}

当然你应该使用

  

scanwithservices:nil

答案 2 :(得分:0)

斯威夫特3:

func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {

    self.selectPeripheral.discoverServices(nil)
}

func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?) {

   let services = peripheral.services as [CBService]!{

        for service in services{

            if service.uuid.uuidString == "4D494B45-414c-5741-5953-524F434B5321"{
               print("service found")
            }
        }
   }
 }

答案 3 :(得分:0)

我有完全相同的问题。目前我可能会在这里提出相同的解决方案!但我认为这是硬件方面的问题。

我相信您的EE不会广播服务UUID的情况!我的意思是,如果您打印advertisedInfo,您将不会在信息中看到以下键值对:

"kCBAdvDataServiceUUIDs": <__NSArrayM 0x14e6f3b0>("Your CBUUID")

您可能会看到名称键值和其他内容,但绝对不是我指定的名称。

出于这个原因,如果他可以通过广播服务UUID来完成他的工作,那么你将能够使用以下方法进行扫描。

scanForPeripherals(withServices: ["Your CBUUID"], options: nil)

你会看到它:)