電話アプリを開発していたらなぜか違うものが出来た
さて、電話アプリではあるが、まずは音声をデータ化する必要がある。
ネットワークの物理層では特定の周波数のデータを一定時間受信したら起動キーが呼び出されるようにしたが、音声サンプリングは一定時間でその時の波形を記録する必要がある。
なので起動キーは一定時間ごと。
音のデータは空気の圧力差で検知し、データがゼロの時無音になるように調整。
±の最大値なら最大音量ということになる。
ここまでがいわゆるアナログ・デジタル・コンバーターだ。
デジタルデータに変換されたデータは電話交換サーバに送られる。
電話交換サーバでは、指定の回線にデータを転送するだけなので、実際にやることはメールサーバより少ない。
その他、電話交換サーバに必要なのは、電話番号と個別IDを紐付ける機能だろう。
まず電話番号が送信元からサーバに送られる。
サーバはその電話番号から個別IDを参照し、そのIDに向けて、接続要求パケットを送る。
受信側は着信可否のウィンドウを即座に表示し、バイブなり音声なりで知らせる。
着信可を選択したら回線をつなぐ。
音声は双方向なんで、パケットは短めにしたほうがいいだろう。
一チャンネルに流れるデータは常に一パケットなので、誰かが専有すると音声が途切れてしまう。
あとできれば無音時はパケットを送らないようにしたい。
音楽ならともかく音声通話なら無音の時間は多い。
無音時データを送らないようにできれば、同時通話数が増やせる。
まあその場合、途中で飽和すると音声がとぎれとぎれになるんだけど。
最初から弾くほうがいいか、これも後で検討だ。
後問題になるのが、受信側で再生した時に音を拾わないようにすることだ。
これもネットワークの物理層を作ったときと同じように、自分の発声した音と同じものは無視するようにしないといけない。
音を出したり検知したりするのは魔石部分なので、出した音の大きさと検知した音の大きさに違いはないはずだから、その数値分マイナスした差分がその他の音になるはずだ。
「さて、これで大体の仕様は決まったが、電話番号はどうしようかな?」
電話といえば電話番号だが、ひとつ違っただけで間違い電話になるし、電話番号順にかけてくる無差別セールスとか問題も多い。
ここはメールアドレスのようにユーザー名を指定できるようにすべきか?
いっそのことメールアドレスと同じにするか。
アプリを統合するならその方が都合がいい。
同じメールアドレスでメールも送れるし電話もできる。
そのうち掲示板やグループウェアなんかもできれば同じメールアドレスで使えれば面倒がない。
今はメールアドレスにドメイン名とかないけど、複数サーバを経由できるようになったらつければいいだけだ。
まあ、その辺はずっと先の話だ。
まずは最低限の機能を実装しよう。
送信側に必要なのはアナログ・デジタル変換部とパケット送信部。
受信側はパケット受信部とデジタルアナログ変換部。
サーバがなくてもこの二端末間なら電話ができるはずだ。
まずは電話の呼び出しも受け取りもなしに音声を単純に変換し一パケット分溜まったら送信。
受信側でそれを受信したら、デジタルアナログ変換して送信側のサンプリング速度に合わせて再生。
これは電話というより無線機に近いか。
組み立て済みのUSBパソコンは一台しかないから、USBと自分のパソコンとで音声をやり取りできるようにしていく。
「アンジェリカ、これを持って廊下に出てちょっとなにか話してみて」
「いきなり『えふしーえす』が暴発したりしませんよね?」
「大丈夫。それには『FCS』は入れてないから」
「ならいいですけど。ではちょっと行ってきます」
アンジェリカはUSBパソコンを持って部屋を出てドアを締める。
『今廊下に出ました』
パソコンからアンジェリカの声が聞こえてくる。
22kHzの八ビットデータなのでちょっと雑音は有るが気になるほどでもない。
「アンジェリカ、僕の声が聞こえますか?」
「はい聞こえます。ですが廊下で独り言ブツブツ言っているみたいで、居心地は悪いです」
「さもありなん」
ハンズフリーで話しながら歩いてる人を見ると、ちょっと危ない人なんじゃないかと思っちゃうよね。
この世界だと電話すらないから、完全に怪しい人だ。
「不審者として捕まる前に戻っておいで」
「は、はい」
アンジェリカが慌てて戻ってくる。
「今警備の担当が見回りに来ました。危なく捕まるところでした」
「それは良かった。もし捕まったら秘密保持のため見捨てるしかありませんでしたから」
「そんなぁ」
「まあ、冗談ですけど」
すぱーん!
「いた、くない」
「冗談でもよしてください。縁起悪いです」
「僕も今切実に思うよ」
いきなりハリセン食らうとは思わなかったよ。
どこに隠し持ってた?
アンジェリカ、恐ろしい子。
「さて、気を取り直して先に進めましょう。音声通話が出来ましたんで次はサーバと回線の振り分けですね。ですが、四倍速『パソコン』は『メールサーバ』で使ってしまっているので、普通のパソコンで開発するしかないわけですが、騎士だけが使うのであれば、サーバを通さずに、直接でもいいのではないでしょうか?」
携帯電話がなかった頃、警察官が持っていたのは無線機だ。
今でも持っているはず。
警察組織なら周辺の警官に応援を求めるとかそういった用途が多いはずだ。
サーバを通すと一対一でしか通話できないが、USBパソコン同士であればブロードキャスト通信を使えば全員に送信が可能だ。
一対一で話したいときはサーバを通して通話すればいいだろう。
となると無線機みたいに話すときだけ送信がONになる機能がほしいな。
無線機って基本繋ぎっぱなしだから周りの環境音を拾って、パケットが飽和する。
とりあえずトランシーバーモードと電話モードが切り替えできるようにしとけばいいだろう。
トランシーバーだと話すのは基本一人だから送信のONOFF機能があればパケットが飽和することもないだろうし。
ただ、騎士の無線を文官が聞けるのは良くないし、文官の無線を騎士が聞くのもだめだから、これをすると回線を分けるしかなくなるな。
ブロードキャストだと全員に届くからね。
しかしトランシーバと電話のチャンネルを分けると、両方のパケットを拾わないといけなくなるので無線関係の処理負担が二倍になってしまう。
かと言ってUSBパソコンを二台持ち運ぶとなるとコストが単純に二倍になる。
なにかいい方法はないだろうか?
ああ、そうだ。
メールも別チャンネルだった。
三チャンネル同時受信?
やばい。
処理能力の二〇%ほどを目安に回線速度を設定したから、三チャンネルで六〇%も処理能力を使うぞ。
そのチャンネルでパケットが飛び交っている限り、受信処理が走っちゃうからね。
自分宛じゃなければそのまま捨てればいいとはいえ、電波が来れば割り込みがかかる。
やっぱり電話だけにするか?
ちょっとコストがかかるがトランシーバーと電話を分けるという手もあるな。
一台で全部やろうとするから無理が出る。
トランシーバー機能に限定すれば、シーケンス代も節約できるし。
OSとトランシーバ機能だけだからね。
エディタや表計算は結構でかいけど、トランシーバーには必要ないから、原価は半分以下になるか?
騎士にはメールと電話機能が入ったUSBパソコンと、トランシーバー限定のUSBパソコンの二台持ち。
文官は普通のパソコンと電話の二台持ちにすれば不公平感もあるまい。
騎士団長と副団長には普通のパソコンを配布した方がいいかもだけど。
上の方は文官仕事も結構あると聞いているし。
この間の仕返しもできるしいいんじゃないだろうか。
パソコン教室ならぬパソコンブートキャンプでも開いてやるか。
「アルカイト様。悪い顔になっていますよ?」
「おっと、いけない。つい楽しい妄想にふけってしまいました」
気を取り直してまずはトランシーバー機能から作ってしまいましょうか。
送信はすべて全送信のブロードキャスト。
送信時は魔石に指を当てながらということにして指を離している間は受信モード。
トランシーバー用のチャンネルはいくつか設定できるほうがいいだろうか?
隊長用と一般騎士用とで分けるとかは考えられるけど、チャンネル変更できるようにすると他のチャンネルが聞けてしまうことになる。
まあ、昔は警察無線だって聞こうと思えば聞けたわけだから、いいといえばいいのかな?
やろうと思えばグループ間で暗号化する手もあるか。
同じチャンネルを使っても、グループ名とグループパスワードが違ったらパケットを捨てるという手もあるか。
まてよ。
グループ化できれば電話とトランシーバーのチャンネルを分ける必要もないか。
PCMデータの他にグループ名をヘッダに入れてパスワードで暗号化して送信する。
自分がそのグループだったら設定されているパスワードを使って復号化。
ネゴシエーション時、復号化出来なかったら、接続は拒否する。
自分のグループでなければパケットは捨てる。
これなら同じチャンネルで特定のグループに送れるし、グループ名とパスワードを知るところとなら通話が可能となる。
通常の電話はグループ名ではなく個人名にして暗号化は無しにすればいい。
グループ名と個人名で命名規則を変えれば、同じフォーマットで送受信できるはずだ。
「いける!」
まず作るのはアドレス帳だ。
これに個人名とグループ名&パスワードを登録できるようにする。
送信側は個人あるいはグループを選択し、個人ならつながるのを待つ。
グループならそのまま通信状態に移行して、登録されているパスワードで暗号化して送る。
受信側は個人宛なら受信可否ウィンドウを表示し選択を促す。
受信可を選択されたら送受信モードへ移行する。
グループ宛ならアドレス帳に登録されたグループを検索して登録のパスワードで復号化し音声を出力する。
まあ、ざっとこんな感じであろう。
サーバが出来ていないから、電話というよりトランシーバーだけどね。
あれ、電話アプリを作ってたはずなのにいつの間にかトランシーバーアプリを作ってたよ。
あるアプリを開発していたらなぜか違うものが出来たって経験はありませんでしょうか?
自分はプログラムのランチャーを開発してたら、どうせ常駐させるのであれば、スケジューラやら、クリップボードに定型文をセットする機能やらまとめちゃえばいいんじゃ? とか思って、色々入れてしまい、
ランチャーより別機能のほうがメインになったりしたことがありますw
特に趣味で開発していると、あれも入れようこれも入れようと、最初の設計時とはぜんぜん違うものになってたりします。
まあ趣味だからいいんですけどねw