カスタムCBUUIDのCant検索

私は自分のiOSデバイスをbluetooth arduinoに接続するのに役立つ(これまでのところとても良い)アプリを持っています、今のところこれはほとんど練習のためですが、今私は自分が接続することになっている本物を受け取りました。 > 問題は私がそれを見つけることができないということです! (私がそれを探すとき) scanwithservices:nilを実行すると、デバイスを確認して接続できます。しかし私がwithwith servicesをスキャンするなら:[device'sCBUUID]それから私は何も得ません。 他のアプリを使って、自分のアプリを使って、デバイスのドキュメントを見ながら、ダブル/トリプル/四重項チェックを行いました。 これはカスタムのCBUUIDを持っています、私が読んだものから標準ではない、CBUUIDは次のとおりです。

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

これを検索しても何も得られませんが、nilをスキャンしても見つけられ、Bluefruitアプリ(Adafruitから)を使用して特性を確認しても、サービスと特性IDがわかり、ここで投稿した文字列と一致します。 私は友人に話しました、そして、彼はそれが(カスタムCBUUIDに関して)長い間存在していたBLEバグであると言いました、これは本当ですか?これに対する修正は本当にありませんか?

EDIT adding the full scanning code just 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)
    }
2
そうではありません。特定のカスタムUUIDをスキャンできます。あなたは、オブジェクトから「繰り返しスキャン応答」を得たいかもしれません、あなたのものは一度だけ現れたのでしょうか?下記のコードを試してください。let bleQueue = DispatchQueue(ラベル: "BLEQueue"、属性:[]、target:nil)letオプション= [CBCentralManagerScanOptionAllowDuplicatesKey:true] let cbManager = CBCentralManager(デリゲート:self、キュー:bleQueue)let let CBUUID(文字列: "4D494B45-414c-5741-5953-524F434B5321")] cbManager.scanForPeripherals(withServices:serviceUUID、options:オプション)
追加された 著者 Lepidopteron,
さらに、Core Bluetoothレイヤがどのように設定されることになっているのかをよりよく理解するために、より多くのコードを提供してください。
追加された 著者 Lepidopteron,
まず最初に、nilサービスでスキャンし、didFindPeripheralメソッドの広告データを印刷すると、あなたのサービスは表示されますか?そうでない場合は、 scanWithServices:[someService] はアドバタイズされた場合にのみ機能するため、見つかりません。広告データが表示されている場合は、ログを見せてください。私は、iOSのCBUUIDが大文字と小文字を区別するかどうかわからない(あなたの上には小文字の "c"があり、他の文字は大文字である)。
追加された 著者 Larme,
要求に応じてコードを追加しました。 Thingはすでに他のBluetoothモジュール(nRF8001)で動作するコードですが、これは当社が開発中のカスタムデバイスであり、独自のカスタムCBUUIDを持っています。私はスキャンしていたCBUUIDを置き換えることができると思いました、そしてそれはそれの終わりになるでしょうが、それはうまくいかないようです。 nilをスキャンするとデバイスが検出されますが、特にそれを検索してもデバイスは検出されません。
追加された 著者 dvd.Void,
Lepidopteron、あなたが提案したそのコードについて詳しく教えてもらえますか?それをどこに実装しますか?
追加された 著者 dvd.Void,

4 答え

私はたまたまBLEファームウェアとiOSアプリの両方に同時に取り組んでいます。 私はフィルタが機能しないという同じ問題を抱えていた。

iOSがUUIDを持つデバイスを見つけることができなかった理由は、それが広告を出しているときにデバイスがUUIDを含まないということです。

広告データパケットにサービスUUIDを追加するために、デバイスのファームウェアを変更する必要がありました。 UUIDをアドバタイズするデバイスでは、UUIDフィルタは予想どおりに機能しました。

2
追加された

私もこの問題を抱えていましたが、私はいくつかのトリッキーな方法を見つけました。

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)
              }
            }
        }
    }
}

この方法でうまくいかない場合は、もう1つあります。

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

1
追加された
これはバグだとは思わない。周辺に何か設定するべきだと思います。私はハードウェア面での練習はしていないので、正確には答えられません。
追加された 著者 Dmitry,
ありがとう、私は最初の提案がうまくいくと思います。これは単にソフトウェアにバグがあることを示していますか?それともハードウェア?だからあなたは直接デバイスをスキャンすることはできませんか?後でそれらを除外する必要がありますか?
追加された 著者 dvd.Void,

スイフト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")
            }
        }
   }
 }
0
追加された

私は全く同じ問題を抱えています。現在私はここの人々によって提案された同じ解決策をやるかもしれません!しかし、これはハードウェア側からの問題だと思います。

私はあなたのEEがサービスUUIDを放送していないということが起こっていると信じています!あなたがadvertisedInfoを印刷した場合、その情報には以下のキーと値のペアは表示されません。

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

あなたは名前のKey-Valueや他のものを見るかもしれませんが、間違いなく私が指定したものではありません。

そのため、もし彼がサービスのUUIDをブロードキャストすることで自分の役割を果たすことができれば、次の方法でそれをスキャンすることができます。

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

そして、あなたはそれを見るでしょう:)

0
追加された