Bluetoothで地球の裏側まで ─ すれ違いアプリKontaの中身
きっかけ お酒を飲みながら友達と「こういうアプリあったら面白いよね」みたいな話をすることってあると思うんですが、今回はなぜか本当に作ることになりました。流れはあんまり覚えていません。 元々はもっと大きいアプリを作ろうとしていて、その機能の一つにBluetoothを使う想定がありました。その話をしているときに「Kontaみたいなアプリがあってもいいよね」という感じになって、じゃあとりあえずこっちから作るか、と。 (Kontaという名前の由来については、また今度書きます笑) それでBluetoothについて調べていたら、だんだん妄想がふくらんできました。 アプリを入れた人が増えれば増えるほど、その人たちが中継機になって、いつか地球の裏側の人とも繋がるんじゃないか。 日本にいるAさんと、ブラジルにいるBさん。この2人は直接は知り合いません。でも間にいる人たちが少しずつメッセージを運んでくれれば、いつかは届くんじゃないかなと。会話には出てこない人たちが橋になるイメージです。 サーバーもいらないし、通信キャリアもいらない。人がいればそれでネットワークになる、みたいなことを考えていました。 結果としては、まだ全然そこまで行っていません。作ったのは、目の前ですれ違った人と1対1で話すだけのアプリ(Konta)です。サーバーは使っていないので圏外でも動きますが、届く範囲は十数メートルくらいです。 どんなアプリか Konta というアプリです。紹介ページはこちらです。 https://konta.world/ やることはシンプルで、 「接続する」を押すと、近くで同じアプリを開いている人をBluetoothで探しはじめる 見つかった相手とお互いに「会話する」を押すと、そこでマッチングが成立する あとはニックネームと絵文字だけで1対1のチャットをする 相手と離れると会話は終わり、履歴も残らない 電話番号もメールアドレスも要りませんし、アカウント登録もありません。サーバーを持っていないので、そもそも会話がどこかに保存されることもないです。 iOSで公開しています。 https://apps.apple.com/jp/app/konta/id6797600072 どうやって作っていたか 恵比寿の「いいオフィス」というレンタルスペースにこもって、半日くらいずっと開発する、というのをリリースまでに2回やりました。 平日は、僕はClaudeを使って開発を進めていました。友達はエンジニアではないんですが、機能要件とか利用規約とかを中心に進めてくれていました。 僕が詰まっているときも、いろんなユースケースを考えてくれたり、アイディアをくれたりして、突破するきっかけを常にくれていました。すごく楽しかったです。 スペシャルサンクス 友達と奥さんが、家の中や通勤のときに実際に動かして検証してくれました。これが本当に助かりました。 すれ違いのアプリなので、1人だとそもそも動作確認ができません。シミュレータではBluetoothが使えないので実機が2台以上必要ですし、手元のiPhoneとMacを並べて動いたところで、通勤中の人混みでちゃんと見つかるのか、部屋の壁を挟んだらどうなるのかは分かりません。 生活の中で普通に使ってもらえたのが、一番のテストでした🙏 この記事について Bluetoothの実装は今回が初めてでした。作る前は「近くの端末を見つけて繋ぐだけでしょ」と思っていたのですが、実際に触ってみると、想像していたのとは全然違うところでつまずき続けました。 この記事は、1周目でハマったところと、後からドキュメントを読み直して「そう書いてあったのか」となった箇所をまとめたものです。同じように「BLE何もわからん」から始める人の参考になれば嬉しいです。 つまずいたのは大きく3か所でした。 BLEの「繋がっている」「相手がいる」という状態が、仕様レベルでけっこう曖昧 サーバーを持たないので、暗号化は自分で設計するしかない E2EE(端末間暗号化)にすると、モデレーションの前提が変わってしまう 根拠になる部分は、できるだけAppleの公式ドキュメントとRFCを引用しました。自分の思い込みと、公式に書いてあることを混ぜたくなかったためです。 あと、記事を書くために検証し直したら、自分の理解が間違っていた箇所がいくつも出てきました。それも正直に書いています。いくつかの箇所は、書きながらAIに壁打ちして「そこ違うのでは」と言われ、調べ直して書き直したものです。まだ間違いが残っているかもしれないので、見つけたら教えてください。 長めなので、興味のある章だけ拾ってもらえれば大丈夫です。近接検知や1対1マッチングを作る予定がある方の参考になれば嬉しいです。 ✓ この記事はメッシュ(マルチホップ)ではなく、直接繋がった2台の1対1の話です。冒頭に書いた「橋になる」アイデアを今回入れなかった理由は、最後の章に書きました。 0. 先に用語だけ BLE の記事を読み始めたとき、僕は用語で最初につまずきました。同じものが文脈によって違う呼ばれ方をするので、先に整理しておきます。 ...