各国の接触確認アプリを探索してみよう

プログラムを書く時に、どのような目的でそのアプリあるいはシステムが使われるのか?を定義しないとあらぬところに労力を掛け過ぎてしまいがちです。労力も時間も有限なのだから(時には無限の場合もあるけど)、注力するべきところに注力して仕上げをしたいところです。

規模の大きいITプロジェクトの場合、なかなか全容を把握するのは難しく、新人の頃は各工程(要件定義や設計工程)の全容が見ないままプロジェクトが終わることも度々あります。
今回の「接触確認アプリ」ですが、実はひと通りITプロジェクトの工程が見えてくる「好例」です。

  • 要件定義&概要設計
  • 必要な API
  • クライアント(Android, iOSアプリ)
  • サーバーサイド

という組み合わせでがあり、しかも各国のソースコードが github に公開されています。実装の違いも含めて、比較できることは珍しいことなので、ざっとでも情報を見ておくと今後に役立つでしょう。という訳で、いくつか見た範囲内での実例をリンクを記述しておきましょう。

接触確認アプリの目的

「接書確認アプリ」の目的は中国などを含めると様々な理由が含められますが、日本版のものは、5/9の有志気概者会議で明確に定義されています。

第1回 接触確認アプリに関する有識者検討会合 開催 | 政府CIOポータル

スマートフォンを活用して、

  1. 自らの行動変容を確認できる、
  2. 自分が感染者と分かったときに、プライバシー保護と本人同意を前提に、濃厚接触者に通知し、濃厚接触者自ら国の新型コロナウイルス感染者等把握・管理支援システム(仮称)に登録できるようにすることで、健康観察への円滑な移行等も期待できる。

これは「定義」なので、これ以上でもこれ以下でもありません。実際にはこの目的から提案依頼書(RFP)や要件定義書に落として「契約」を結ぶわけですが、今回は政府筋なので必要はないでしょう。発注先とは結ばれているとは思うのですが、ここでは問いません。

接触確認(暴露通知)の仕様

接触確認アプリの仕様は有識者会議と厚生労働省が作っています。

第1回 接触確認アプリに関する有識者検討会合 開催 | 政府CIOポータル
第2回 接触確認アプリに関する有識者検討会合 開催 | 政府CIOポータル
接触確認アプリに関する仕様書等の公表 | 政府CIOポータル

「接触確認アプリ及び関連システム仕様書」を見ると、詳細設計まで書いてあるのはさておき、官庁系のものとしては丁寧に書かれているので、これをもとに接触確認アプリとサーバーサイドを作ります。

このシーケンスと内部構造は、Google/Apple の仕様書にも書かれているものなので、そこは一致してますね。陽性患者の登録部分は日本独自なので、ここが作成時の肝となるところです。設計書や実装サイドとしては、この「仕様書」に従ってシステムを構築します。

いくつか興味深い「非機能要件」が定義されてます。

運用に関しては72時間以内(3日間)の復旧程度なので、即時復旧は意味しませんが、それなりに運用体制が必要です。あと、データは「クラウドを利用」しリージョンが「日本国内あること」の記述があります。この辺りも踏まえて受注と運用を検討します。

接触確認アプリの仕様

接触確認アプリは当初は GPS を利用した行動追跡が必須になっていたのですが、Google と Apple が共同で仕様を合わせた Exposure Notification(暴露通知)を使うことで、Bluetooth/BLE を利用したものに置き得られています。

アップルとグーグルが新型コロナ暴露通知アプリのサンプルコードやUI、詳細ポリシーを公開 | TechCrunch Japan

仕様の詳細は、Google/Apple の各サイトを見て貰うことにして、いくつか限定条件があります。

  • 暴露通知アプリは1国1アプリとする
  • 暴露通知とGPSを共有してはいけない
  • 暴露通知を他のアプリにバンドルしてはいけない

1国1アプリの理由は提供元が各国の保険省となるためです。複数出したり、保険省(日本では厚生労働省)以外が出すと審査で落ちるでしょう。
暴露通知とGPSとを共有しないのは、もともとGPSを使わないためなので、それが理由です。逆に言えば、組み合わせて詳細な行動追跡アプリを作ることも可能(昔の彼ログのような)なのですが、これに関しては駄目ですね。
暴露通知は、主に単機能で扱います。おそらくできるだけ許可を少なくする目的と、変な形で企業がバンドルできないようにするためでしょう。実質、厚生労働省以外は出せないので、ここは厚生労働省の要件定義次第になります。1国1アプリとのことなので、自治体が独自に使うことできません。大阪で予定してクーポン付きとかも駄目ですね。

Exposure Notifications: Helping fight COVID-19 – Google

ExposureNotification | Apple Developer Documentation

Googleのほうには、Android アプリの(Kotlin)とサーバーサイド(Java)の例があります。Apple のほうは API リファレンスだけなのですが、各国それなりに Swift で作ったコードがあるので参考にしやすいでしょう。

google/exposure-notifications-android: Exposure Notifications Android Reference Design

試してみるならば、Android のコードを使うのが便利です。Android Studio を使うと簡単にビルドができます。

google/exposure-notifications-server: Exposure Notification Reference Server | Covid-19 Exposure Notifications

サーバーサイドは試してはいませんが docker で動くようです。多分、ローカル環境で Android アプリとサーバーの動作環境を作れると思います。

ドイツの場合

ドイツの接触確認アプリが GitHub で公開されています。

Corona-Warn-App

いくつかのプロジェクトがありますが、Android, iOS, Server を見ておけばよいでしょう。

ドイツの corona-warn-app はドキュメントが綺麗に整備されていて、こんな風にシーケンス図やユースケースが残されています。

cwa-documentation/solution_architecture.md at master · corona-warn-app/cwa-documentation

この手のものが残されていると、ソースコードを修正するときに何が目的なのかが分かりやすいですね。

ちなみに、サーバーサイドは Java + PostgreSQL なので、日本の要件定義に合致しません。

フランスの場合

フランス版は GitLib で公開されています。

StopCovid sources · GitLab

ちょっと、興味深いのは「ROBERT」の文字が入っているところです。

これ、ロベルト・コッホの「ROBERT」なんですね。

ロベルト・コッホ研究所 – Wikipedia
RKI – Startseite

シンガポールの場合

シンガポールですが、コードは公開されてません(多分)。
シンガポール版は、実はハードウェアで実装されていて、不必要になったら捨てることができます。

なぜ新型コロナの追跡はアプリではなくハードウェアで行うべきなのか? – GIGAZINE

子供や高齢者にも利用してもらうことを考えると、こんな形でハードを配布するのがいいんですけどね。今回は、要件定義的に「スマホアプリ」となっているので割愛します。

日本の場合(Covid19Radar)

日本版のベースは Github で公開されています。
基本は Xamrin.Forms(C#) を利用していて、サーバーでは Azure Functions+CosomsDB になります。

Covid-19Radar/Covid19Radar: Open Source / Internationalization/ iOS Android Cross Platform Contact Tracing App by exposure notification framework Xamarin App and Server Side Code

settings.json でアップロード先のURL(API_URL_BASE)やAPI_SECRETが書き替えになっているので、これをローカル環境で動かすようにすれば、ローカルでの実験が可能です。

{
  "appVersion": "APP_VERSION",
  "apiSecret": "API_SECRET",
  "apiUrlBase": "https://API_URL_BASE/api",
  "supportedRegions": "440",
  "blobStorageContainerName": "c19r",
  "androidSafetyNetApiKey": "ANDROID_SAFETYNETKEY",
  "cdnUrlBase": "https://CDN_URL_BASE/",
  "licenseUrl": "https://covid19radarjpnprod.z11.web.core.windows.net/license.html",
  "appStoreUrl": "https://itunes.apple.com/jp/app/id1516764458?mt=8",
  "googlePlayUrl": "https://play.google.com/store/apps/details?id=jp.go.mhlw.covid19radar",
  "supportEmail": "SUPPORT_EMAIL"
}

サーバーサイドの Azure Functions と CosmosDB はローカル版もあるので、ローカル環境を構築して運用試験をすることも可能です。

実際には陽性者番号との突き合わせがサーバーサイドで発生するので、そこは自前で補ってやらないといけないのですが、複数の Android 機を使って一律通知のテスト位はできるかなと思います。

あと電力消費の問題も、複数台の Android に入れて1週間位実験すれば実情がわかるんじゃないでしょうか。

日本の場合(まもりあいJapan)

1国1アプリということで、開発は止まってしまったのですが、まもりあいJapan版も GitHub で公開されています。

まもりあいJapan

もともと Google/Appleの暴露通知ができる前からスタートしているのでGPS利用だった訳ですが、Exposure Notifications版に直して、通知先を Azure Functions に直せばローカルでは動かせるようになるかなと思っています。ちょっと試してみたいところですね。
サーバーサイドは nodejs + Firebase が使われています。

おまけ

接触確認アプリは BLE の近接距離を測っている(実際は電波強度)だけなので、もともと BLE を使うと実装できる話なのです。

接触確認アプリが有効になっているかを調べるアプリです。数十センチ程度まで近づくと素早く点滅します。M5 Atom 用です。https://twitter.com/ksasao/status/1274385507565178885 参照。

だから、本当はアップロードはフリーWiFiなどを利用すれば、ハードウェアでもいいはずなんですよね。とりあえず、皆様がBTを常時有効にし始めるので、データ調査が捗ってしまうという面もあったりなかったり。

すれちがいフレームワークのためのBLEを用いた近接検知機構の実装と評価

BLEはその名の通り低電力で動くのでボタン電池で1年間とか動いたりします。それを利用した近接検知はBLEが出た当初から研究されているので、色々調べると面白いですよ。

カテゴリー: 開発 パーマリンク