4
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

updated at

Swift愛好会 Advent Calendar 2016 23日目 Swift3 Bluetoothライブラリーの紹介

こんにちは、iosフリーランスエンジニアの永田大祐と申します。
機械学習の技術を高めて、iosのモバイルに、機械学習を繋げるエンジニアになります。
よろしくお願いします。

Swift愛好会

Swift愛好会23日目を担当させていただきます。僕とは関係ありませんが、昔々親戚のお祖父さんが天皇家の料理人をしていたという事で、この日の担当にさせてもらいました。Swift愛好会には、合宿に参加させていただいたり、登壇をさせていただき、感謝しています。

なぜBluetoothか?

デバイス接続が、無線になるからです。Bluetoothだけではありませんが、今のうちにこのような知見を深めて、技術レベルを上げていきたいと考えています。

参考文献

初めは通信の概念や方式などの詳細が記載されています。3章が超絶難しいです。 
3章でやばいと思ったところで、4章がObjective-cとSwiftで書かれているサンプルプログラミングがあります。大量にあります。
BLE通信をiosで実施する上での共通のメソッドが多数あるので、使い方を習得すれば、共通で使えるようになると思います。
初めに始めた方々は凄いと思いました。鉄の意志かと思いました。

スクリーンショット 2016-12-21 午前0.48.08.png

Swift3Xcode8でBluetoothライブラリーの紹介

こちらがリンク先になります。
https://github.com/daisukenagata/BLEView

ライブラリーを使用すれば、これだけでBLE通信ができてしまいます。

スクリーンショット 2016-12-20 午後11.03.25.png

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?) {

今回は使用していませんが、書き込み時の判定ができます。

以上が主な仕様になります。

BLEライブラリーの通信設計図

スクリーンショット 2016-12-22 午後8.08.39.png

今後の目標

今年の最後にはBluetooth案件の業務に携わり、長年のメーカー経験のあるCTOの方のアーキテクチャはさすがだなと感動しました。

Bluetooth開発を自らも技術を高めていく上で、品質を高める。アーキテクチャを高いレベルで構築していき、安定したアプリケーションを構築していきたいと思います。

現在のライブラリーは、機能として、繋いで、通信をするだけなので、アーキテクチャも高めて通信周りのアップデートを重ねていきたいと思います。

         

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
4
Help us understand the problem. What are the problem?