みちびき災危通報をデコードしてみる

# みちびき災危通報をデコードしてみる

## はじめに

みちびき災害・危機管理通報サービスってご存知ですか？

内閣府のホームページから抜粋
> 災害・危機管理通報サービス
https://qzss.go.jp/overview/services/sv08_dc-report.html
> 
防災機関から、地震、津波などの災害情報、避難勧告などの発令状況について、みちびきから送信するサービスです。このサービスは、利用者に災害情報などのメッセージを届けるサービスで、L1S信号を受信することができる端末で利用することができます。L1S信号は、衛星測位で一般的に利用しているGPSやみちびきのL1C/A信号と同じ周波数で同じ波形のため、受信機の価格を安く抑えることができます。

GPSの電波を使って空から災害情報が降ってきているらしい。
いままさに大型台風も来ているしどんな情報が流れているのか確認してみた。

## SPRESENSEボード

ボードはGPS L1S信号受信機なら何でも良かったんですが、
[最近よく耳にするようになったSPRESENSEボード](https://twitter.com/SonyDevJapan)にしました。

購入するまではGPSアンテナも別途用意する必要があると思ってたのですが、GPSチップアンテナ内蔵でした。
しかもこのボード、ソニー製なんですねー。

Arduinoの開発環境がそのまま使えるので、ArduinoにGPSモジュールを別途取り付けるよりお手軽でGood！

### 開発環境構築

開発環境のセットアップ手順は [Spresense Arduino スタートガイド](https://developer.sony.com/develop/spresense/docs/arduino_set_up_ja.html) に詳しく載ってますが、
Arduinoを使ったことがある人なら、

1. ボードマネージャのURLに[package_spresense_index.json](https://github.com/sonydevworld/spresense-arduino-compatible/releases/download/generic/package_spresense_index.json) を追加して
2. ボードマネージャからインストールするだけ

バージョンはv1.4.1以降をインストールする必要があるようです。
![1181020875836907520.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/432852/eaac7c6b-700e-b825-69b2-922186758a43.png)

v2.3.0で性能改善されているので最新版をインストールするのがオススメです。

### GPSサンプル

[Spresense Arduino サンプル＆チュートリアル](https://developer.sony.com/develop/spresense/docs/arduino_tutorials_ja.html) に色々なサンプルが用意されています。

他のサンプルは追々確認するとして、今回のテーマはこちら
[QZSS 災危通報を出力する](https://developer.sony.com/develop/spresense/docs/arduino_tutorials_ja.html#_qzss_災危通報を出力する)

QZQSMというNMEAセンテンスの受信方法が書いてあるけど
実際にデコードしてみないと何が送られてきているのか分からない。

## QZQSMデコードライブラリ

というわけで、QZQSM用ライブラリを自作してデコードしてみました。

### QZQSMフォーマット

* 仕様書はこちらにあります https://qzss.go.jp/technical/download/ps-is-qzss.html

* 災害情報がいくつかのカテゴリに分かれています。災害大国ニッポン...

```cpp
#define QZQSM_ENABLE_DC1  // 緊急地震速報
#define QZQSM_ENABLE_DC2  // 震源
#define QZQSM_ENABLE_DC3  // 震度
#define QZQSM_ENABLE_DC4  // 南海トラフ地震
#define QZQSM_ENABLE_DC5  // 津波
#define QZQSM_ENABLE_DC6  // 北西太平洋津波
#define QZQSM_ENABLE_DC8  // 火山
#define QZQSM_ENABLE_DC9  // 降灰
#define QZQSM_ENABLE_DC10 // 気象
#define QZQSM_ENABLE_DC11 // 洪水
#define QZQSM_ENABLE_DC12 // 台風
#define QZQSM_ENABLE_DC14 // 海上
````

* [@DisasterRept_QZ](https://twitter.com/DisasterRept_QZ) というツイッターを見つけたけど、台風情報が一切出てこない。なんでなんだろう。。

* 国内向けの情報なんだからUTCじゃなくてJSTで送信してくれれば良いのに...＞みちびきさん
 * QZQSMのプロトコル内に西暦情報が無いから厳密には日本時間へ変換できない気が...

* GPSの現在位置をもとに必要な情報をフィルタできるようなフォーマットにしてほしかった
 * サハリン東方で濃霧海上警報とか言われてもピンとこない...

### QZQSMライブラリ

自作ライブラリをGitHubにアップしてます。
仕様書からのコピペ量がハンパないのでバグってる可能性大ですがご自由にお使いください。
https://github.com/baggio63446333/QZQSM

Arduinoのlibraies以下にダウンロードして、DcReportMonitorサンプルを実行してください。
SPRESENSEボードがあればそのまま動かせると思います。

**(2021/2/11追記)**
Arduinoライブラリマネージャに登録されました。
1. Arduino IDEメニューから [ツール] → [ライブラリを管理] を開く
2. ライブラリマネージャを開いて、"QZQSM" を検索する
3. [インストール]する
![QZQSM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/432852/5e87dd80-e2a9-0589-67b5-6f9d48182827.png)

以下、QZQSM受信中
![DCReport.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/432852/8f007cbd-507a-7765-2b51-a1675719a426.png)

**(2021/12/1追記)**

何か最近受信の性能が上がったようなと思ったら、これのおかげかな。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/432852/db63b61e-323c-0bb8-109d-cac6714528fd.png)

**(2022/1/17追記) バージョン1.2.0へ更新**

* チャーリー浜みたいな日本語になっていた問題を修正
 * :no_good: "ただちに避難してくさい。" 
 * :ok_woman: "ただちに避難してください。"
* 既に到達していた津波の到達予想時刻が間違っていた問題を修正 :bow:

**(2024/12/24追記) バージョン1.3.0へ更新**

* 仕様書 Rev.013 に合わせて更新

## さいごに

災害の無い平和な世の中になりますように。