設計書 · 2026-09-29

Launch

靴・ベルト・Smart Ring に入れる「アプリ」のしくみです。アプリは開いて使うものではありません。入っていれば、それだけで常に働いています (プラグインに近い考え方)。当てる・通る・届く、という出来事に、入っているアプリが自動で応えます。

公開した画面: Launch (本人のスマホ) ・ 読み取り機 (入り口に置く)

1. しくみ

  1. 入れる: 本人のスマホの Launch で、アプリの横のスイッチを入れる (顔・指紋で確かめる)。
  2. 働く: 入り口の読み取り機に靴・ベルト・Smart Ring を当てる → サーバーが「本物のタグか・使い回しでないか・そのアプリが入っているか」を確かめて処理する。
  3. 知らせる: 結果を本人 (と家族) の iPhone に通知。SIM ありの本体には、光や振動の指示が LTE で届く。
  4. 本体の決まり: 入れたアプリに合わせた「出来事 → 動作」の表 (最大 12 個・26 バイト) を本体に入れる。SIM なしの本体には画面の点滅で送る (アプリの数で 20〜55 秒)。
部分どこ
サーバー~/work/kutsu-belt/site/functions/api/launch/[[route]].js, アプリの一覧 _lib/apps.js
本人のスマホの画面/launch/ (ホーム画面に追加して使う)
読み取り機/launch/reader.html — Android の Chrome (Web NFC)。iPhone のブラウザは NFC を読めないので読み取り機にはなれない
先生の画面/launch/room.html#rid=…&view=… — 見る用の合言葉は # の後ろに置き、サーバーへは本文で送る (URL の記録に残らない)。読み取り機が持つ記録用の合言葉とは別
同時に来ても壊れないものCloudflare D1 (SQLite) — タグの回数・回数制限・名簿・在室・ロッカー・つけ払い・すれ違い・本体への指示。表は site/schema.sql
本体のプログラムfirmware/launch_rules.c (決まりの表), pass_id.c (すれ違いの ID), optical_rx.c (点滅の長い形式)

2. アプリ

アプリ使う本体できること今の状態
🚪 入退室靴 (主) ・ Smart Ring ・ ベルト教室の入り口の床のマットを歩いて通る (靴) か、読み取り機に当てると入室・退室が交互に記録され、本人と家族のスマホに届く。先生の画面に在室の一覧。生徒は「参加の番号」で教室に参加した時だけ記録される (本人の同意)動く (本番で確認)
♨️ 温泉Smart Ring ・ 靴 (下足)受付でチェックイン → ロッカー番号。下足箱で靴を当てて下足番号。売店でつけ払い。帰りの受付で精算 (合計と下足番号を知らせる)。財布もスマホも持たずに入れる動く (手元の試験)
👋 すれ違いSmart Ring ・ 靴同じアプリを入れた人と近くを通ると、お互いの名刺 (呼び名とひとこと) を交換サーバーと ID の計算は動く。Bluetooth の部品が要る (次の版)
💬 S2SSmart Ring ・ ベルトS2S にメッセージが届くと Smart Ring が光ってそっと震える受け口は動く。S2S 側からの送信はまだつないでいない
🔊 音ベルト ・ 靴知らせの音と、体に伝える低音 (8 章)部品が要る (次の版)

3. 入退室は靴で (靴向けの最適化)

入退室の主役は靴です。手に持って当てるのではなく、入り口の床に置いたマットの上を歩くだけで記録されるようにしました。

試していないこと: マットの読み取り距離 (試作の PN532 は出力が小さいので、本番は出力の大きい ST25R3916 と大きなアンテナを推奨)、踏んだ時の強さ、歩く速さで読み切れるか (1 回の読み取りは数十〜百ミリ秒の見込みだが測っていない)。URL を取り出す部分だけは、壊れたデータを含む 5 項目の試験に通した。

4. 代わりに当てられないこと (代返の防止)

以下は前の版の説明 (大筋は同じ):

タグは当てるたびに暗号の数字が変わる URL を出します (NTAG 424 DNA の SUN)。サーバーは「前より新しい回数か」を確かめるので、URL を写してほかの人のスマホで開いても「使い回しの URL」として記録されません。本番でも、同じ URL を 2 回送ると 2 回目は断られることを確かめました。ただし、本人の靴そのものを借りて当てることは防げません。

5. すれ違いの ID

同じ 2 人の交換は、別々の本体どうしで聞こえても 1 日 1 回。自分の別の本体 (Smart Ring と靴) とは交換しない。上げられるのは今日と前後 1 日だけ。

6. 本体の決まりの表

1 つの決まり = 2 バイト [出来事 (上 4 ビット) | 動作 (下 4 ビット), 引数]。最大 12 個。光の引数は「色 (上 4 ビット) | 秒 (下 4 ビット)」。転倒の振動は表になくても必ず出る (アプリで消せない)。4 アプリ (入退室・温泉・すれ違い・S2S) を入れた Smart Ring で 10 個・22 バイト。

出来事番号
2 回叩く / 転倒 / すれ違い / 入室 / 退室 / 温泉チェックイン / 温泉チェックアウト / S2S / タイマー / 電池が少ない1〜10
動作番号
光 / 振動 / 電子ペーパーを次へ / タイマー / 音1〜5

7. 確かめたこと

8. 音 (ベルト・靴)

Vision Pro は耳のすぐ横に小さなスピーカー (オーディオポッド) を置いて音を届けます。ベルトや靴は耳から 1 m 近く離れているので、同じ置き方はできません。そこで役割を分けます。

9. S2S を本当につなぐには

Launch 側の受け口 (/api/launch/s2s, 署名つき) はできています。S2S の側で「メッセージが届いた時、つないだ人の番号 (S2S-XXXXXXXX) へ知らせる」処理を足せば、Smart Ring が光ります。s2s.day 本体の変更になるので、まだ手を付けていません。

10. まだのこと