コンテンツにスキップ
JA

Address の仕組み

Hapbeat の通信は UDP broadcast が基本です。複数のデバイスを同じネットワークに混在させたとき、どのパケットを誰が再生するか を決めるのが address です。このページは address 文字列の組み立て方と、その背景にある設計判断を説明します。

仕様の正式定義は Contracts: device-addressing を参照。

[prefix/] player_{N} / {position} [/group_{M}]
  • prefix — 任意 (0 段以上)。チーム / アプリ識別など自由文字列 (例: red/alpha)
  • player_{N}必須N は 1..99
  • {position}必須。装着部位を示す定義済み語彙 (例: chest / band / left_upper_arm)
  • group_{M} — 任意 (0 または 1 段)。{position} の直後 に置く。M は 1..99

セグメント区切りは / (スラッシュ)、使用可能文字は [a-zA-Z0-9_-]、address 全体の最大長は 64 bytes (null 終端含む) です。

構成address
シンプル (1 人 1 台)player_1/chest
マルチプレイヤーplayer_1/chest, player_2/left_upper_arm
チーム制red/player_1/chest
チーム + 小隊red/alpha/player_3/chest
グループ分離player_1/chest/group_1, player_1/chest/group_2

group_{M}付けない address は全グループのデバイスが受信 します。1 人で使うときは省略して構いません。

概念用途値域
Player 番号同じ “プレイヤー” に属する複数デバイスをまとめる単位。1 人が首掛けと腰の 2 台を装着する場合、両方に同じ player 番号を割り当てる1..99
Group IDプレイヤー同士を分離する単位。同じ Wi-Fi 上の別グループ (別ブース・別チーム) が混信しないようにする1..99

OLED 表示 (Gr:01..99 / P:01..99) と整合させるため、Player / Group とも 1..99 固定 です (DEC-030)。技術的には uint8_t で 255 まで保持できるため、将来必要になれば拡張可能です。

なぜ broadcast + デバイス側フィルタにしたか

Section titled “なぜ broadcast + デバイス側フィルタにしたか”
設計判断理由
デバイス IP を管理しないDHCP で IP が変わってもアドレス指定の更新は不要
1 台でも複数台でも送信コードが同じunicast / broadcast の切替や宛先テーブルが不要
PC / Quest / スマホで同一の動作各プラットフォームの UDP socket API だけで完結
Bridge / 中継サーバ不要アプリ起動だけで触覚が出る、オフラインでも動く

このため Hapbeat は「中央サーバが存在しない / クラウド不要」設計が成立しています。詳細は 通信モデル を参照。

シナリオPlayerGroup
単独プレイヤー LAN1(省略 — 全グループ受信)
マルチプレイヤー LANプレイヤー毎に固有プレイヤー毎に固有
Hapbeat SoftAP (HMD など)1(省略)
展示ブース隔離1ブース毎に固有

他人と混信させないために Group を使う」「1 人の複数装着を区別するために {position} を使う」と覚えれば運用は単純です。

過去には address とは別に target_group (uint8) フィールドが wire protocol 上に存在していました。これは 2026-05-09 の DEC-030 で廃止され、Group は address 末尾の /group_{M} suffix に統合 されました。1 つの文字列で完結することで spec が単純化し、firmware / SDK / Studio の 3 リポでの整合性も取りやすくなりました。