こんにちは、iosフリーランスエンジニアの永田大祐と申します。
機械学習の技術を高めて、iosのモバイルに、機械学習を繋げるエンジニアになります。
よろしくお願いします。
#Swift愛好会
Swift愛好会23日目を担当させていただきます。僕とは関係ありませんが、昔々親戚のお祖父さんが天皇家の料理人をしていたという事で、この日の担当にさせてもらいました。Swift愛好会には、合宿に参加させていただいたり、登壇をさせていただき、感謝しています。
#なぜBluetoothか?
デバイス接続が、無線になるからです。Bluetoothだけではありませんが、今のうちにこのような知見を深めて、技術レベルを上げていきたいと考えています。
#参考文献
https://www.amazon.co.jp/iOS×BLE-Core-Bluetoothプログラミング-堤-修一/dp/4883379736
初めは通信の概念や方式などの詳細が記載されています。3章が超絶難しいです。
3章でやばいと思ったところで、4章がObjective-cとSwiftで書かれているサンプルプログラミングがあります。大量にあります。
BLE通信をiosで実施する上での共通のメソッドが多数あるので、使い方を習得すれば、共通で使えるようになると思います。
初めに始めた方々は凄いと思いました。鉄の意志かと思いました。
#Swift3Xcode8でBluetoothライブラリーの紹介
こちらがリンク先になります。
https://github.com/daisukenagata/BLEView
ライブラリーを使用すれば、これだけでBLE通信ができてしまいます。
#Cocoa Advent Calendar 2016 23日目openCVをiOS Swift3.0.1で活用する。
podsインストールの詳細はこちらに記載しましたので、合わせてお読み願います。
#仕様は?
Appleの既存のCoreBluetoothを使用。
###1.初回起動時にCBPeripheralManagerとCBCentralManagerを初期化
####CBPeripheralManagerペリフェラルとは発信する方式
ハード機器をつなげる周辺機器と使われている物です。iosでもハードに搭載されていて、プログラムコードを記述する事で、実行できます。
####CBCentralManagerセントラルとは受信する方式
ハード機器につなげる上で受信する方で、機器の中央部に搭載されています。
###2.centralManagerDidUpdateState(_ central:CBCentralManager){}メソッド
####DidUpdateStateします。ここで何か処理をしたい場合は、独自の実装ができます。こちらを実装しないとプロトコル設定でエラーが出ます。
###3.peripheralManagerDidUpdateState{}メソッド
####ペリフェラルマネージャの状態が変化すると呼ばれます。
BLE通信をする場合の認証に必要です。
switch文で、poweredOn,poweredOffなどのメソッドが用意されています。
switch peripheral.state {
case .poweredOn:
// サービス登録開始
publishservice()
default:
break
}
###4.func publishservice(){}
####サービスを作成します。
BLEで端末情報や状態などを通信するデータです。
CBMutableServiceというメソッドでCBUUIDという独自の文字列設定をします。
let characteristicUUID = CBUUID(string: "45088E4B-B847-4E20-ACD7-0BEA181075C2")
認証系を実装したら、
// キャラクタリスティックをサービスにセット
service.characteristics = [characteristicCBC]
キャラクタリスティックはデータや情報のやり取り行う単位で、複数のキャラクタリスティックを用いて、サービスを提供します。
###5.func peripheralManager(_ peripheral: CBPeripheralManager, didAdd service: CBService, error: Error?) {}
サービス追加処理が完了すると呼ばれるので、アドバタイズ開始メソッドを実施します。
// アドバタイズ開始メソッドを呼ぶ。
startAdvertise()
アドバタイズメントデータとは、サービスの付加情報です。
// アドバタイズ開始
peripheralManager.startAdvertising(advertisementData)
###6.func peripheralManagerDidStartAdvertising(_ peripheral: CBPeripheralManager, error: Error?) {}
アドバタイズ開始処理が完了すると呼ばれます。
ここでスキャン開始メソッドを実装します。
self.centralManager.scanForPeripherals(withServices: [serviceUUID], options: nil)
###7.func centralManager(_central:CBCentralManager,didDiscover peripheral: CBPeripheral,advertisementData: [String : Any],rssi RSSI: NSNumber) {
####Swift3からメソッドが新しくなりました。
常に動作してperipheralを探し続けます。peripheralを検出できましたら、自分の場合はalertControllerで接続をユーザーが選択する仕様にしました。内部的に自動接続する対応でも良いかもしれません。
###8.func pushStart(){}
接続開始
self.centralManager.connect(peripheral, options: option)
###9. func centralManager(_ central:CBCentralManager,peripheral:CBPeripheral,error: NSError!){
####接続失敗時に呼ばれます。
ここで再接続の処理やエラーハンドリングの実装を行えばリカバリー可能です。
###10.func peripheralManager(_ peripheral: CBPeripheralManager, didReceiveWrite requests: [CBATTRequest]) {}
通信リクエスト受信時に呼ばれる
こちらで文字列を変換させたり、仕様によって実施できる作業があると思います。
自分の場合は通信している端末より、文字列を受け取り、音声に変換させました。
###11.public func peripheral(_ peripheral: CBPeripheral,didWriteValueFor characteristic:CBCharacteristic,error: Error?){}
通信が成功したかどうかを判定できます。ここでもエラーハンドリングで再度取得など対応ができると思います。
###12.func peripheral(_ peripheral: CBPeripheral,didUpdateValueFor characteristic: CBCharacteristic,error: Error?) {
今回は使用していませんが、書き込み時の判定ができます。
###以上が主な仕様になります。
#今後の目標
今年の最後にはBluetooth案件の業務に携わり、長年のメーカー経験のあるCTOの方のアーキテクチャはさすがだなと感動しました。
Bluetooth開発を自らも技術を高めていく上で、品質を高める。アーキテクチャを高いレベルで構築していき、安定したアプリケーションを構築していきたいと思います。
現在のライブラリーは、機能として、繋いで、通信をするだけなので、アーキテクチャも高めて通信周りのアップデートを重ねていきたいと思います。