【Android】Bluetoothについて | Bluetooth Classicのいろいろ

## Androidには、二種類のBluetoothが組み込まれている

- AndroidのBluetoothには、 `Bluetooth Classic` と、 `Bluetooth Low Energy(BLE)` の二種類がある。

### Bluetooth Classic の特徴
- Bluetoot Classic は、高速なデータの転送が可能、音声や動画のストリーミングなどの用途に適している　
- Bluetoot Classicは、スマホとワイヤレスイヤホンをペアリングするのに使われる

:point_up: 生活の中でよく聞くBluetoothは Bluetooth Classic を指しているのね


### Bluetooth Low Energy(BLE)の特徴
- Bluetoothと言われるより、BLE(びーえるいー)と言われることが多い
- 省電力生が高く、小さなデータの送受信に適している
- 小型のデバイスでも長時間の動作が可能
- センサーによる温度や、湿度の収集に使用される
- ビーコンによる場所情報の提供に使用される

:point_up: BLEの方がインターネット上情報が多いイメージ (Classicの方は調べても情報が少ない気がする)

## 本記事では、Bluetooth Classicについてまとめる

### Bluetooth Classic はどのようにして接続するか
- スマートフォンは、ピコネットという、小さなネットワークを発していている
![pico.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917260/7404167f-d8d2-c314-c625-d0ab6227c6c7.png)


- ピコネットはスマホを中心に、イヤホンなど最大7つまでのBluetoothデバイスが接続することができる
![pico2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917260/508ceb19-12f7-27fe-2d67-82fda761758d.png)


- 例えば、スマートフォンとBluetoothイヤホンを接続する場合、スマートフォンがピコネットの「マスター」となり、イヤホンが「スレーブ」となる
![pico3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917260/c7a8917a-55a3-65ab-e7fb-d536f7eb44eb.png)


- 接続が確立されると、スマートフォンとイヤホンの間で「コネクション」が行われて、このコネクションを通じて、スマートフォンとイヤホンは「サービス」と「プロファイル」と呼ばれる機能や設定をやりとりする
![pico4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917260/7e797da6-3959-f5dc-5739-072c4fde41c5.png)

:frowning2: サービスとプロファイルがちょっと難しいポイント


### サービスとは
- サービスは、Bluetoothデバイスの役割を定義し、他のBluetoothデバイスと通信するためのルールや方法を提供するもの
- サービスは、UUIDによって一意に識別される
- スマホなどのマスターは、そのUUIDを使用して、Bluetooth サービスに接続する

### プロファイルとは
- プロファイルは、どのように通信を行うかを定義するもの
- プロファイルには、いろいろなものがある

:point_down: こんな感じで、たくさんのプロファイルが用意されている
https://ja.wikipedia.org/wiki/Bluetooth%E3%83%97%E3%83%AD%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E4%B8%80%E8%A6%A7

ちょっと難しいけど、サービスは、Bluetoothのデバイス間で通信するために必要な機能を定義するものであり、プロファイルは、Bluetoothデバイスがどのように通信を行うかを定義するものって感じ。



## ワイヤレスイヤホンを例に、サービスとプロファイルの説明をしてみる
- 例えば、`A2DPプロファイル`は、音楽や音声を高品質でストリーミングするために使用されるプロファイルのことで、このサービスは、スマートフォンがイヤホンに送信する音声データを処理し、イヤホンから音声を再生することができる
- `HFPプロファイル`は、「通話サービス」を定義しており、 スマートフォンは、このサービスを使用して、通話関連のデータをイヤホンに送信し、イヤホンが通話関連の機能を提供することができる
- これらのサービスを使用するために、スマートフォンは、Bluetooth搭載機器の持っている`UUID`を使用する
![uuid.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917260/ab097926-9f44-5947-6a15-3b846a55868b.png)

:point_up: サービスは、Bluetoothデバイスが提供する機能の種類を示すもの

:v: プロファイルは、Bluetoothの機能をどのように実現するかを定義するもの


:fist: う〜〜ん簡潔に言うと・・・
Bluetoothデバイスは、UUIDによって提供されるサービスを特定する！

ワイヤレスイヤホンが、指定されたUUIDをサポートしている場合、それはデータの送受信が可能であると認識することができる！



## Bluetoothクラシックの接続手順
1 スキャン
2 ペアリング
3 接続
4 切断


#### ちなみに、スキャンとペアリングの違いについて
`ペアリング`は、
デバイス同士が初めて出会ったときに、お互いを認識し合い、信頼関係を築くプロセスのこと。
このタイミングで鍵とかを交換しているらしい。

`接続`は、
デバイス同士が既にペアリング済みの場合に行うもので、実際にデータを送受信するための通信路が開かれる。接続が確立されると、データのやり取りが可能になる。

:point_up: これが、最初の方に言っていたマスターとスレーブのコネクションのこと。



## 実装で必要なこと
**BluetoothAdapterの取得**
- Bluetoothデバイスにアクセスするために、`BluetoothAdapter`を取得する

**スキャン**
- Bluetoothデバイスを検索するためには、`BluetoothAdapter.startDiscovery()`メソッドを使用する

**ペアリング**
- ペアリングは、2つのBluetoothデバイス間で信頼関係を確立することで、Bluetooth接続のために必要
- `BluetoothDevice.createBond()`メソッドを使用して、デバイスをペアリングする

**接続**
- `BluetoothSocketオブジェクト`を使用して、Bluetoothデバイスに接続する
- `BluetoothSocket.connect()`メソッドを使用して、Bluetoothデバイスに接続する

**通信**
- `BluetoothSocketオブジェクト`を使用して、Bluetoothデバイスと通信を行う
- `BluetoothSocket.getInputStream()`と`BluetoothSocket.getOutputStream()`メソッドを使用して、データを送受信する

**切断**
- `BluetoothSocket.close()`メソッドを使用して、Bluetoothデバイスとの接続を切断する



## 以上です
いずれ、実際のコードも載せたいと思ってます！(綺麗に整えたら・・・)

BLEの方が需要あるのに、Bluetooth Classicでごめんなさい・・・。

Bluetoothむずかしい・・・・。
がんばるぞい！！

## 参考記事
- 用語
https://monomonotech.jp/kurage/webbluetooth/ble_guide.html
- AndroidでBluetooth通信を行おう
https://developers.wonderpla.net/entry/2014/08/12/142721
- データ送受信の概念について
https://ja.stackoverflow.com/questions/55446/android-ios-classic-bluetooth-ble%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6