心拍のリアルタイムデータを取得し外部サーバーへ転送する方法を考察

リアルタイムで心拍数を取得しその値を元にフィードバックする方法を考察する機会があったので、実現ができる可能性がありそうな方法をメモ

転送頻度など実際に使ってみないと不明な箇所があります、追加調査すればわかるかもですが。。。
まずは方法をリストアップしています

懸念事項

- データを外部サーバに転送する頻度を高めた場合のバッテリー持ち時間
- 外部サーバーに毎分転送は厳しいと感じる、異常値のみの場合は転送などであれば、まだよさそう

### 方法案１　ウェアラブルデバイスがリアルタイム計測値を外部サーバへ送信

Cellular モデルがある場合、Watch 用の APP を開発することで、ウェアラブルデバイス単体でリアルタイム計測値を外部サーバーへ送信することができそう。

データやり取り構造案

![image01.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48015/12112b29-8895-7e1d-eab6-f6b8226b0a26.png)


#### Apple Watch の Cellular モデルの利用

|            |                                                                                                             |
| ---------- | ----------------------------------------------------------------------------------------------------------- |
| 測定データ | Watch 用の APP なので直接参照                                                                               |
| データ頻度 | Apple Watch は通常 10 分おき、ワークアウト時は常時らしい、参考サイト(「Apple Watch」で心拍数を計測する)より |
| 転送頻度   | WatchAPP の仕様に準拠なので最短は不明、外部サーバなどへのアクセスが可能かも調査必要                         |

https://support.apple.com/ja-jp/HT207578
https://developer.apple.com/jp/watchos/

Cellular モデルがあるようなので、Watch 用の APP を開発することで、ウェアラブルデバイス単体でリアルタイム計測値を外部サーバーへ送信することができそう。
スマホに companion な APP なしで動作するようなので、単体動作によさそうですね

### 方法案２ ウェアラブルデバイスでリアルタイム計測値を判定し異常の場合に外部サーバーへ送信

Watch 用の APP ではリアルタイム計測値が参照できるはずなので、その APP で異常値を設定し、以上が合った場合にスマホを介して外部サーバーにデータを送信することができそう。

データやり取り構造案

![image02.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48015/0e1e6ab5-7b03-599f-3359-3210d0044540.png)


#### Fitbit Ionic に APP 開発

https://dev.fitbit.com/getting-started/

Fitbit の公式 APP にコミュニケーション用の companion を開発しウェアラブルデバイスにも APP を開発することで外部サーバにデータ送信できる可能性ありそう
異常値が合った場合など送信頻度が少ないと良さそうと感じる
リアルタイム送信は、どこまで対応するか作ってみないと不明

|            |                                                                           |
| ---------- | ------------------------------------------------------------------------- |
| 測定データ | Watch 用の APP なので DeviceAPI から直接参照                              |
| データ頻度 | Fitbit Ionic は WebAPI 上では 1 分おきデータだったので 1 分おきと思われる |
| 転送頻度   | companionAPP 準拠になるので最短は不明                                     |

#### Apple Watch に APP 開発

https://developer.apple.com/jp/watchos/

上記の Fitibit と同じ用に companionApp をスマホに追加し、ウェアラブルデバイスにも APP を開発する方式
リアルタイム送信は、どこまで対応するか作ってみないと不明

|            |                                                                                                             |
| ---------- | ----------------------------------------------------------------------------------------------------------- |
| 測定データ | Watch 用の APP なので直接参照                                                                               |
| データ頻度 | Apple Watch は通常 10 分おき、ワークアウト時は常時らしい、参考サイト(「Apple Watch」で心拍数を計測する)より |
| 転送頻度   | companionAPP 準拠になるので最短は不明                                                                       |

### 方法案３　ウェアラブルデバイスのリアルタイム計測値をスマホから外部サーバへ送信

スマホにウェアラブルデバイスと通信する APP を導入しスマホから外部サーバーへデータを送信する

データやり取り構造案

![image03.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48015/d08744c1-d832-df36-b4d6-327905278fb6.png)


#### BLE 通信する自作 APP の開発

ウェアラブルデバイスの通信仕様が公開されている場合、それに則った APP を開発することで、ある程度自由にリアルタイム転送などが可能そう

##### 通信仕様が公開されていると思われるウェアラブルデバイス

SDK for Polar sensors
https://github.com/polarofficial/polar-ble-sdk

|            |                               |
| ---------- | ----------------------------- |
| 測定データ | BLE を利用して参照            |
| データ頻度 | ウェアラブルデバイス由来      |
| 転送頻度   | 独自 APP なので毎分が可能そう |

#### Device Web API Manager の利用

https://gclue.io/dwa/index.html

この APP が対応しているウェアラブルデバイスである必要があることと、心拍数のみの取得のようなので、歩数などのデータが取得できない可能性がある

|            |                                  |
| ---------- | -------------------------------- |
| 測定データ | BLE を利用して参照（心拍数のみ） |
| データ頻度 | ウェアラブルデバイス由来         |
| 転送頻度   | 独自 APP なので毎分が可能そう    |

##### 動作確認済みのウェアラブルデバイス

Garmin は認識しないでした

|                           |           |                                                                           |
| ------------------------- | --------- | ------------------------------------------------------------------------- |
| セイコーエプソン          | PULSENSE  | https://go-wellness.epson.com/sensing/pulsense/                           |
| Wahoo Fitness             | Blue HR   | https://www.amazon.co.jp/dp/B009LVPJAA/ref=cm_sw_em_r_mt_dp_NSXyFbH8MPQ1Z |
| POLAR                     | H7        | https://support.polar.com/ja/support/h7                                   |
| Physical Enterprises Inc. | MIO Alpha | https://www.amazon.co.jp/dp/B00DU4EB4E/ref=cm_sw_em_r_mt_dp_0VXyFb4ZV8BT4 |

### 方法案４ 　ウェアラブルデバイスのデータサーバーに外部サーバから参照

ウェアラブルデバイスと公式の APP が独自のサーバーにデータを保持する仕組みを構築する場合、外部サーバーからデータを参照

データやり取り構造案

![image04.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48015/286baf55-efce-c9a1-2d39-942d8ea53cf6.png)


#### Fitbit API

https://dev.fitbit.com/build/reference/web-api/

ウェブ API が公開されているので開発者登録すればアクセストークン利用して参照が可能
外部サーバから参照する際に、独自サーバーにアップロードされるまで遅延があるようなので、リアルタイム性は低くなるのが懸念事項

|            |                                           |
| ---------- | ----------------------------------------- |
| 測定データ | BLE を利用して参照している                |
| データ頻度 | ウェアラブルデバイス由来                  |
| 転送頻度   | ウェアラブルデバイスメーカーの APP に準拠 |

### 各デバイスのデータ頻度などまとめ（調査不足。。）

#### Apple Watch

https://support.apple.com/ja-jp/HT204666

|            | 心拍                         | 行動量     | 睡眠       |
| ---------- | ---------------------------- | ---------- | ---------- |
| 測定データ | 心拍数                       | 歩数       | 睡眠レベル |
| 元データ   | LED 反射光量                 | 加速度かな | 不明       |
| データ頻度 | 通常 10 分、ワークアウト常時 | 不明       | 不明       |
| 転送頻度   | ３分で何回かと参考サイトより | 不明       | 不明       |

#### Fitbit Charge 4

Fitbit Charge 4 でのデータ頻度が１分だったので、Ionic も同じかなと。。

|            | 心拍                         | 行動量     | 睡眠       |
| ---------- | ---------------------------- | ---------- | ---------- |
| 測定データ | 心拍数                       | 歩数       | 睡眠レベル |
| 元データ   | LED 反射光量                 | 加速度かな | 不明       |
| データ頻度 | １分                         | １分       | １分       |
| 転送頻度   | ３分で何回かと参考サイトより | 不明       | 不明       |

#### Fitbit Ionic

Fitbit Charge 4 でのデータ頻度が１分だったので、Ionic も同じかなと。。

|            | 心拍                         | 行動量     | 睡眠       |
| ---------- | ---------------------------- | ---------- | ---------- |
| 測定データ | 心拍数                       | 歩数       | 睡眠レベル |
| 元データ   | LED 反射光量                 | 加速度かな | 不明       |
| データ頻度 | １分                         | １分       | １分       |
| 転送頻度   | ３分で何回かと参考サイトより | 不明       | 不明       |

## 参考サイト

Apple Watchで心拍計を表示するアプリを開発してみた
https://www.tdi.co.jp/miso/apple-watch

「Apple Watch」で心拍数を計測する
https://link-man.net/tips/59706/#:~:text=%E5%B9%B3%E5%B8%B8%E6%99%82%E3%81%AF10%E5%88%86,%E7%B7%91%E3%81%AB%E5%85%89%E3%81%A3%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82

Intraday Access Requests
https://dev.fitbit.com/build/reference/web-api/intraday-requests/

Rate Limits
1時間あたり150のAPIリクエスト
https://dev.fitbit.com/build/reference/web-api/basics/#rate-limits

Accessing the Fitbit API
https://dev.fitbit.com/build/reference/web-api/oauth2/