swift3.0 Bluetooth開発(2)

8313 ワード

前編のswift 3を引き継ぐ.0 Bluetooth開発(1)
三.コードディスプレイ
1.エージェントCBCentralManagerDelegateセンターのエージェントCBPeripheralDelegate外付けエージェントを設定する
class ViewController: UIViewController,CBCentralManagerDelegate,CBPeripheralDelegate

2.グローバルのハブオブジェクトの定義
    ///      
    var central: CBCentralManager
    ///     
    var peripheralArray = NSMutableArray.init()

3.イニシャルセンタオブジェクト(最初のパラメータはエージェントの設定、2番目のパラメータはキュー、言うまでもなく、マルチスレッド開発に関する)
     ///        
    func initBluetooth() {
        //MARK: -1.           
        central = CBCentralManager.init(delegate: self, queue: nil)
        }

4.センターオブジェクトを初期化すると、以下の方法がコールバックされます.つまり、センターオブジェクトを初期化する文のコードが実行された後、携帯電話(センター)のBluetooth状態をチェックする方法です.例えば、開いているかどうか、Bluetooth 4.0をサポートしているかどうかなどです.
      func centralManagerDidUpdateState(_ central: CBCentralManager) {
        self.writeToTextView(string: "      ,  centralManagerDidUpdateState")
        switch central.state {
        case .unknown:
            print("CBCentralManager state:", "unknown")
            break
        case .resetting:
            print("CBCentralManager state:", "resetting")
            break
        case .unsupported:
            print("CBCentralManager state:", "unsupported")
            break
        case .unauthorized:
            print("CBCentralManager state:", "unauthorized")
            break
        case .poweredOff:
            print("CBCentralManager state:", "poweredOff")
            break
        case .poweredOn:
            print("CBCentralManager state:", "poweredOn")
            
           
            //MARK: -3.      (    )
            //      ,   uuid, nil,        
            central.scanForPeripherals(withServices: nil, options: nil) 
            //                   centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber)
            
            
           
            break
        }


5.上記の方法のBluetoothが開いている制御フローブランチでは、周辺の周辺機器をスキャンし、正常に周辺機器をスキャンすると、以下の方法に移行する
以下のメソッドパラメータ://-central:センタデバイスインスタンスオブジェクト//-peripheral:周辺インスタンスオブジェクト//-advertisementData:ブロードキャストおよびスキャン応答データを含む辞書////-RSSI:周辺機器のBluetooth情報強度
     func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {
     
        
        //          (                            ,              ,         ,      ,        )
        //                    
        // MAKE: -    
        peripheralArray.add(peripheral)
        
        //   ,              。  
//        self.peripheral = peripheral                 ,                        
        
        //MARK: -5.    
        //     ,       
        central.connect(peripheral, options: nil) //        ,    ,  ,         
        
        
        //           ,        ,       
//        if peripheral.name == "A" {
//            //     
//             central.connect(peripheral, options: nil)
//        }        
        
    }


6.外部機器の接続に成功すると、外部機器の接続に成功するコールバック方法に来ます.失敗するコールバック方法もあります.
    //     
    func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {
        
        
        //      ,                      ,              ,                  
        peripheral.delegate = self
        
        //     ,          
        //     nil,       ,            UUID,          UUID
        peripheral.discoverServices(nil) //       peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?)                 
    }


//     
    func centralManager(_ central: CBCentralManager, didFailToConnect peripheral: CBPeripheral, error: Error?) {
        
    }


7.上記の接続に成功したコールバックメソッドでは、外付けのサービスをスキャンし、スキャンに成功すると、外付けのサービスを発見する方法が以下のようになります.
 //        
    func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?) {
        for service in peripheral.services! {
            peripheral.discoverCharacteristics(nil, for: service)//     ,             ,              
            print("  UUID:\(service.uuid.uuidString)")
        }
    }


ここで注意したいのは
peripheral.services!     
    
peripheral.services.uuid        

8.以上がサービス発見のコールバック方法ですが、上記の方法では、サービス下の特徴を発見する方法を使うことができます.なぜ、私が特徴を発見する方法は必ずこの発見サービスの方法に書かなければなりませんか.私は直接発見特徴を書くことができませんか.
答え:他の場所に行って書いてみてください.peripheral.discoverCharacteristics(nil,for:service)これは特徴を発見する方法で、この方法の2番目のパラメータはサービスを記入するので、私たちはこの発見サービスのコールバック方法でしかこのサービスの対象を得ることができないので、この方法サービスの方法にしか書くことができません.
フィーチャーを検出するメソッドを実行すると、フィーチャーを検出するコールバックメソッドが表示されます.

 //         
    func peripheral(_ peripheral: CBPeripheral, didDiscoverCharacteristicsFor service: CBService, error: Error?) {
        for characteristic in service.characteristics! {
            print("\(service.uuid.uuidString)      :\(characteristic)")
            if characteristic.uuid == CBUUID (string: "FFF0")  {
                //MARK: -9.         
                //      
                peripheral.readValue(for: characteristic)//       didUpdate     
            }
            
            if  characteristic.uuid == CBUUID (string: "FFF0") {
                //    
                /**
                 --                  ,                  ,             ,  app       
                 --                
                 --        didUpdateNotificationStateForCharacteristic
                 --    characteristic            didUpdateValueForCharacteristic
                 --     :  setNotifyValue NO
                 */
                //        readValueForCharacteristic:     。          ,     setNotifyValue:forCharacteristic:         ,   。
                peripheral.setNotifyValue(true, for: characteristic)
            }
            
            //    
            /**
             --      characteristic       。(                  ,         )
             --    characteristic descriptor,  didDiscoverDescriptorsForCharacteristic
             */
            peripheral.discoverDescriptors(for: characteristic)
            
            
        }
        
    
    }


上記の方法では、いつdidUpdateNotificationStateForCharacteristicメソッドを呼び出すのか、このメソッドは何の役に立つのか、このメソッドは外付けで携帯電話に送信されたデータを取得し、何の購読特徴があるのか疑問に思うはずです.
答:d i d U p d a t e N o t i f i c a t ionStateForCharacteristicこの方法は、(1).特徴を購読するときperipheral.setNotifyValue(true,for:characteristic)(2).データを読み取るときperipheral.readValue(for:characteristic)
サブスクリプションフィーチャーとは?
答え:例えば今私の外付けは1つのBluetoothのスピーカーで、中に1つの特徴が次の歌の特徴で、それではこのような特徴に対して、私达は購読の特徴の方法を採用して、この購読は何の役に立ちますか、もし私がこの特徴を購読したら、この特徴はデータを更新します.D i d UpdateNotificationStateForCharacteristicメソッドでデータを取得できます
次の歌の開発構想1.私は次の歌の特徴を决めました.ユーザーはBluetoothスピーカーの次の曲3を押した.私はこの特徴を購読したので、didUpdateNotificationStateForCharacteristicメソッドでユーザーが次の曲というボタンを押した情報を入手することができます.プログラムの次の歌を呼び出す方法は、5を実行します.D i d U p d a t e N o t i f i c a t i o n S t o n S t e ForCharacteristicメソッドでBluetoothにデータを書くのは速いので、私はここでデータの次の歌を手に入れて、私はすぐに応答して次の歌を切り替えるべきで、そしてBluetoothのもう一つの特徴にデータを書いて、彼に教えて、私は歌を切りました
9.didUpdateNotificationStateForCharacteristicメソッド

/**
     -- peripheral  readValueForCharacteristic         
     -- peripheral  setNotifyValue ,             
     */
    func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic, error: Error?) {
        //    ,      data     ,             ,             CBCharacteristicWriteWithResponse                                                   CBCharacteristicWriteWithoutResponse;
//        peripheral.writeValue(, for: , type: )
    }


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

#     demo
https://github.com/ChenZeBin/CoreBluetoothDemo.git

demo      ,   demo