しろかい!

アプリ開発や機械学習などの開発Tips.

SwiftでBluetoothによるP2P通信を簡単に実現する方法

SwiftBluetoothによるP2P通信を簡単に実現する方法を紹介します.

f:id:shun9167:20150121135152p:plain

参考にさせていただいたのは以下の記事です.

英語ですが非常に丁寧に説明されており,簡単なチャットアプリケーションのサンプルもあるので理解が進みます.
とはいえ英語なので,以下に簡単に日本語でまとめておこうと思います.

使用するライブラリ

今回使用するのは「Multipeer Connectivity」というライブラリで,標準で入っています. Multipeer Connectivityを使うことにより,近距離でのデータ通信をネットワークに接続されたサーバを介さずに行うことができます.
本エントリのタイトルに「Bluetoothで」と書いていますが,同じSSIDWi-Fiに接続されている端末同士の接続もできるようです.
Multipeer ConnectivityではNSData型のデータの送受信が可能です.そのため,文字列だけでなく,画像や音声などのデータの送受信も可能だそうです.

チャットアプリケーションを実装する

実装と言っても上記のエントリにコードが用意されているので,DLしてきて少し修正するだけです.

  1. Xcodeを起動し,File -> New -> Project から,iOSのSingle View applicationプロジェクトを「MultipeerChat」という名前で新規作成します.
  2. MultipeerConnectivity framework を Linked Frameworks and Libraries に追加します.
  3. ViewController.swiftを開き,上記のエントリ内にあるViewController.swiftソースコードをコピーします.
  4. Main.storyboardを開き,以下を配置していきます.
    • UITextView: このViewにチャットの内容が表示されます.
    • UITextField: チャットの送信フォームになります.
    • UIButton: 2つ配置します.1つはメッセージ送信(Send)用,もう1つは通信相手検索(Browse)用です.
  5. Main.storyboardとViewController.swiftの間で以下を関連付けます.
    • UITextViewchatView
    • UITextFieldmessageField
    • UIButton(Browse)とshowBrowse関数
    • UIButton(Send)とsendChat関数

これでチャットアプリケーションは完成です!

チャットアプリケーションを動かしてみる

チャットアプリケーションではBluetooth通信を行うので,当然ですが実機が2台以上必要になります.
また,iOS Developperにも登録しておかなければ,実機デバックができません.
それか,以下のような方法でiOSシミュレータ上で動かすこともできるようです.

  1. 2台の実機のBluetoothをONにしておきます.
  2. 2台の実機にアプリをインストールして起動します.
  3. 片方の端末で「Browse」ボタンを押します.近くでアプリを起動している人が表示されるので,タップして接続要求を行います.
  4. もう1台の端末に接続要求を許可するかを尋ねるアラートが表示されるので,「Accept」を押します.
  5. しばらくすると接続が確立するので,Browse画面を開いている場合はDoneを押してチャット画面に戻ります.
  6. 色々メッセージを送信してみてください.チャットができていることが分かるかと思います.

これだけでチャットができるなんて面白いですね.
しかも,サーバーとの通信は一切行っていないのがポイントです.
応用すれば色々おもしろいアプリが作れそうです!

ちなみに,ソースコードの詳細は英語ですがソースコード中にも丁寧にコメントが記述されています.
また,上記のエントリの下の方の「This code does the following things:」の部分にも詳しく記述されています.

おまけ

Multipeer Connectivityの詳細については下記の記事が参考になるかと思います(ただしObjective-Cです).

また,一口にBluetooth通信と言っても種類があるようで,それぞれにメリットとデメリットがあります.
以下のスライドが参考になるかと思います.

このエントリで紹介したのは「MultipeerConnectivity」ですが,用途によっては電池消費の少ないBLEの方がいいようです.