📞

スマホで音響カプラっぽいことをしてみた

2024/02/24に公開

はじめに

誰でも一生のうちに一度は夢見る公衆電話からのインターネット接続。公衆電話でのISDNサービス終了に伴い、そのハードルはかなり高くなりつつあります。この記事では、「モデムや音響カプラを必要としない、手軽に公衆電話からインターネットに接続する方法はないかな」という願望から作り始めたAndroidアプリ(Toy Coupler)の紹介と、現在直面している課題についてお話します。

デモ動画

まずは以下の動画をご覧ください。Toy Couplerは音響カプラのように送受信するデータを音声に変換します。

仕組み

動画で行ったpingを題材に、このアプリが何をやっているかを説明します。

①VpnServiceの開始

HOME画面のスイッチを押すと、Toy Couplerはスマホに指定したIPアドレスを割り当て、VpnServiceを開始し、SETTING画面で設定したアプリの通信(IPパケット)を取得し始めます。動画では右側のスマホに169.254.0.1、左側のスマホに169.254.0.2のリンクローカルアドレスを割り当てています。VpnServiceを利用する利点は2つあり、1つは他のアプリからは透過的に通信を音声に変換できること、もう1つはアプリの開発者が通常は送受信できないIPパケットを扱えるようになることです[1]。Toy Couplerの理論上の通信速度は100bpsなので、音声変換の対象となるアプリを限定するのは非常に重要です。

②pingコマンドの実行

ターミナルアプリを起動し、pingコマンドを実行します。ICMPのペイロードの大きさは往復時間を計測できる最小の16Byteを指定しています(-s 16オプション)。ターミナルアプリから生成されたIPパケットはToy Couplerに渡されます。

③IPパケットの変調

ターミナルアプリからIPパケットを受け取ったToy Couplerは当該パケットを音声に変換します(変調)。変調方法は単純で、まず、パケットの頭にプリアンブル(1Byte)と長さ(2Byte)、後にチェックサム(1Byte)をくっつけます。その後、1ビットごとに0であれば500Hz、1であれば1000Hzの10msの音声に変換して出力します。

④IPパケットの復調

もう一方のスマホは変調された音声を聞き取り、IPパケットに復元します(復調)。復調ではサンプリング周波数4000Hzで録音した音声データを以下の要領で処理していきます。

  1. 0.25(=1/4000)msごとに10ms分の音声データに対してGoertzelアルゴリズムでフーリエ変換を行い、1000Hz成分の時系列を生成する
  2. 1000Hz成分の音圧レベルがHOME画面で設定したThresholdを超えた場合、以降10msを監視して信号のピークを決定し、ビット列に同期する
  3. 以降、10msごとに1000Hz成分を取得し、Thresholdを超えれば1、そうでなければ0というルールでビット列(バイト列)を復元する
  4. バイト列のチェックサムを計算し、それが受信したものと一致すれば、バイト列を誤りがないIPパケットとしてOS側に引き渡す

以後、OSから生成された応答パケットが同様の手順で送り返されます。

課題

Toy Couplerの多くの技術的な問題が山積しています。例えば、

  • 通信速度が遅すぎる(シンボルレート << サンプリング周波数)
  • 通常の"インターネット"に接続できない[2]
  • シンボルの識別がThereshold設定頼みなので検出の誤りが多い
  • 受話器に接続する場合の減衰を考慮していない(何らかのアタッチメントやスペクトラム拡散が必要?)

などが挙げられます。

とはいえ、IPパケットを交換しているなら"インターネットしている"と言えなくもなさそうなので、早速公衆電話で実験してみたい気持ちになりますが、ここで最大の問題に直面します。それは、このアプリ(正確にはこのアプリを入れたスマホ)が、音声を使った通信について電気通信事業法上の技術基準適合認定(技適[3])を取得していないことです。

「え?電気を使った通信じゃないのに技適が必要なの?」と思われる方もいらっしゃるかもしれません(私も最初勘違いしていました)。例えば、昭和60年郵政省告示第244号では工事担任者を要しない端末機器との接続方式として以下のように定められています[4]

技術基準適合認定等を受けた端末機器であって次の方式による接続の場合

  • プラグ・ジャック方式
  • アダプタ式ジャック方式
  • 音響結合方式
  • 電波

音響結合方式とは正に音響カプラやToy Couplerが行っている音声による通信方法を指します。よってこの告示が示唆するように、公衆電話にToy Couplerを接続するには技適を取得する、あるいは、NTTさんの適合検査[5]をクリアする必要があります。

あとがき

ということで前項の課題の解決をするのが今の私には難しくなったので、一旦このアプリを公開することにしました。

https://github.com/kittoku/Toy-Coupler

特に変調方式はデジタル信号処理にお詳しい方からしたら山程改善点があると思います。我こそはという方はModulator.ktDemodulator.ktなどから手を加えてみてください。

最後にもう一度お伝えしますが、絶対に公衆電話に接続しないでください。よろしくお願いいたします。

脚注
  1. root化させればIPパケットを扱えるかもしれませんが、それは"手軽"ではないと感じます。 ↩︎

  2. 実は、当初は一方のスマホを中継機にして外部のVPNサーバーに接続する仕組みにしていましたが、DHCP等の通信で帯域幅を消費してしまうのでこの方法は断念しました。 ↩︎

  3. 電波法のやつ(技術基準適合証明)じゃない方。 ↩︎

  4. できれば原文を引用したかったのですが見つかりませんでした。間接的な資料としてこちらの総務省作成のもの(p.9)を紹介しておきます。 ↩︎

  5. ちなみに私が住んでいる地域を所管する法のNTTさんに具体的な申請方法を聞いてみたところ、ソフトフォン適合検査の方を受けるよう回答がありました。 ↩︎

Discussion