92
98

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

iOSでBluetoohLE アプリを作るための基礎知識

Last updated at Posted at 2014-02-19

Bluetooth LEとは

従来のバージョンに比べ大幅に省電力化(Bluetooth LE)。ボタン電池1つのみでも数年駆動可能。

転送速度は1Mbps、データパケットサイズが8 - 27オクテットと非常に小さい。

以前のバージョンとの互換性を持たないが、ホスト側は2.1もしくは3.0を組み込んだ「デュアルモード」を実装可能。

→基本的には家電製品などなど組み込みむけの仕様

iOSでのBluetooth実装

Game KitのPtoP機能をつかう

Core Bluetoothによる実装
    Bluetooth LEを扱うためのフレームワーク

Bluetooth LE の概念

ハード的にはiPhone4S以降より対応。
iOS5まではiPhoneはセントラルのみになれる
iOS6からは、iPhoneがセントラルにもペリフェラルにもなれる
iOS7からは、APIがさらに強化されている

セントラル、ペリフェラル?

セントラルとペリフェラル

セントラル (Central)
    サービス提供しているデバイスを扱う側

ペリフェラル (peripheral)
    サービスを提供するデバイス側

が役割ごとの名前となります。

例えば家電の情報をBluetooth LEによりiPhoneなどでチェックできるものがあったとしたら

家電がペリフェラルとしてサービスを提供
iPhoneがセントラルとしてそのサービスを利用する

となります。

次に実際にbluetooth LEでのサービス提供には、さらにサービスとキャラクタリスティックという概念を知る必要があります。

プロファイルとサービスとキャラクタリスティック

Bluetoothでのデータをやり取りするにあたりプロファイル、サービスとキャラクタリスティックという概念が存在します。

サービス(Service)      
    提供するサービスの集合。提供するサービスに複数の種類のキャラクタリスティックを用いて、サービスを提供します。

キャラクタリスティック (Characteristic)
    提供するサービスで扱うデータや情報のやり取りをする振る舞いごとの単位。
プロファイル(Profile)
    これらサービス、キャラクタリスティックのあつかって提供する機能のまとまり

例としてはバッテリー情報を提供するデバイスがあったとしたら

例えばバッテリーの残量情報,バッテリー情報の通知キャラクタリスティックの単位となります。
サービスは複数のキャラクタリスティックを使ってサービス提供します。
バッテリー情報の読み出し、パッテリー情報を通知など機能単位がサービス

  またそれらサービスをまとめて一つのバッテリーを扱う集合として、まとめたのがプロファイルとなります。

下記にBluetooth LEのプロファイル、サービスリストがあります。
https://developer.bluetooth.org/TechnologyOverview/Pages/Profiles.aspx

キャラクタリスティックの振る舞い

キャラクタリスティックはそれぞれで、どう振る舞うかを決めます。

ざっくりとした振る舞いの種類として

データ読み込みを提供
    特定のデータをセントラルへ渡す
データ書き込みを受け付ける
    セントラルからデータを受け取り、何らかの処理をする。
イベントの通知機能を提供
    このキャラクタリスティックをオブサーブしたセントラルへ通知イベントをfireしたり、一緒にデータを送信したり。

の3種類があります。細かく分けるともっとありますが、基本的にこの3つのタイプです。

これらを組み合わせてサービスを作ります。

キャラクタリスティックは単体でデータを保持したり、さらにディスクリプタという値を保持するものを複数もってやり取りする場合もあります。

利用シーン考察

一回でおくれるパケットサイズが非常に小さいため、大容量のデータの転送にはむかないので、細かい情報のやり取りでいかに有意義なサービスが作れるかが肝か。ただしiOS7では転送量を変更できたと思うのでiOSデバイス同士ではその限りではないかも。

また、組み込みでの利用はこの通信使用内で制限されますが、iPhoneでペリフェラルの実装を行った場合は、ほかの通信手段とも組み合わせられるのでデータの転送自体は別でやるといったことが考えられます。iOS6ならペリフェラルになれることと今までのBluetoothを扱うときの用に接続自体にユーザーの確認等が必要ないので、工夫次第でいろいろな用途に使える。すれ違い通信とか行ける。

iOSでの実装方法

GameKit

GKPeerPickerController
1対1のみ対応。接続に確認が必要。用途絞れば使える。
GKSession
複数接続も対応可能。CoreBluetoothを抽象化してくれているので、CoreBluetoothよりは断然つかいやすい。

Core Bluetooth

GKSessionより、さらに細かくハンドリングできる。おそらくRSSIとかの電波レベルを取得したり、細かいBluetooth LEの仕様の機能を使えるのはこちらだが、仕様自体をちゃんと把握しないといけないので面倒。

Multipeer Connectivity framework

iOS7からのframework。bluetoothだけの実装ではないが、簡単にピアコネクションが行えるそう。

Core Bluetoothやってみて

backgroundでの継続処理はiOS7で強化されている(ちゃんとためしてないけど)

アプリを急に落としたりして、ちゃんとハンドリングしないと、接続が残るのか、頻繁にエラーが発生する。一旦Bluetoothのon/offしないとだめになったり。

Core Bluetoothだと接続の流れとか仕様をちゃんと理解するのが面倒。GameKitにすればよかった感。

Bluetoothテストアプリで仕様とかを確認した。
https://itunes.apple.com/jp/app/lightblue/id557428110?mt=8
これを使うとテストがとってもやりやすい

iOS6のときに試しただけなのでiOS7での検証と具体的な実装例を以後説明していこうと思います。

92
98
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
92
98

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?