swift3.0 Bluetooth開発(2)
8313 ワード
前編のswift 3を引き継ぐ.0 Bluetooth開発(1)
三.コードディスプレイ
1.エージェントCBCentralManagerDelegateセンターのエージェントCBPeripheralDelegate外付けエージェントを設定する
2.グローバルのハブオブジェクトの定義
3.イニシャルセンタオブジェクト(最初のパラメータはエージェントの設定、2番目のパラメータはキュー、言うまでもなく、マルチスレッド開発に関する)
4.センターオブジェクトを初期化すると、以下の方法がコールバックされます.つまり、センターオブジェクトを初期化する文のコードが実行された後、携帯電話(センター)のBluetooth状態をチェックする方法です.例えば、開いているかどうか、Bluetooth 4.0をサポートしているかどうかなどです.
5.上記の方法のBluetoothが開いている制御フローブランチでは、周辺の周辺機器をスキャンし、正常に周辺機器をスキャンすると、以下の方法に移行する
以下のメソッドパラメータ://-central:センタデバイスインスタンスオブジェクト//-peripheral:周辺インスタンスオブジェクト//-advertisementData:ブロードキャストおよびスキャン応答データを含む辞書////-RSSI:周辺機器のBluetooth情報強度
6.外部機器の接続に成功すると、外部機器の接続に成功するコールバック方法に来ます.失敗するコールバック方法もあります.
7.上記の接続に成功したコールバックメソッドでは、外付けのサービスをスキャンし、スキャンに成功すると、外付けのサービスを発見する方法が以下のようになります.
ここで注意したいのは
8.以上がサービス発見のコールバック方法ですが、上記の方法では、サービス下の特徴を発見する方法を使うことができます.なぜ、私が特徴を発見する方法は必ずこの発見サービスの方法に書かなければなりませんか.私は直接発見特徴を書くことができませんか.
答え:他の場所に行って書いてみてください.peripheral.discoverCharacteristics(nil,for:service)これは特徴を発見する方法で、この方法の2番目のパラメータはサービスを記入するので、私たちはこの発見サービスのコールバック方法でしかこのサービスの対象を得ることができないので、この方法サービスの方法にしか書くことができません.
フィーチャーを検出するメソッドを実行すると、フィーチャーを検出するコールバックメソッドが表示されます.
上記の方法では、いつ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メソッド
三.コードディスプレイ
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