Asteriskで電話が切れた後に処理をしたい
携帯電話機の切るボタンを自動的に押したい
Asteriskを使っていて、電話が切れた後に処理をしたいと常々思っていた。
具体的にはAsterisk経由での通話が完了した後、あるいは電話呼び出しが切れた後にリレーをONにして、リレーに接続したプッシュ型ソレノイドで携帯電話の切るボタンを押したいと言うことです。
Asteriskで電話が切れた後に処理をしたい、その理由
どうして携帯電話の切るボタンを押す必要があるのかと言うと、Asteriskサーバー(実際にはRaspberry Pi2 B)とbluetoothゲートウエイを使って携帯電話にアクセスしているのだが、この携帯電話機に大きな罠が隠されていました。
それはbluetooth経由だと通話(着信だけで通話が成り立たなくても)が終了しても、携帯電話機の切るボタンを押したのと同じ処理にならないため(具体的には切れたあと通話終了の画面が表示され約30秒待たないと何も操作ができなくなる、特にbluetoothからの操作だけでは発着信は絶対できない状態となってしまう)、例えば、相手からの通話が何かの原因で切れた場合に相手がいくらリダイヤルで電話をかけ直しても相手側からは約30秒間は話中のままとなってしまい、さらにこちらからの発信も不可能という状態となります。
携帯電話の近くに居るときには、切るボタンを押せば即座に電話のかけなおしに対応できるので、携帯電話の近くにいない場合でも、なんとかして通話(着信だけでも)が終了したら切るボタンを押したいと考えていました。
Bluetoothでは切るボタンを押したのと同じにならない理由
当初は携帯電話会社に何か変なのではないか?と、法人窓口に質問してみたところ以下の回答を得ることができました。
そういう仕様です
窓口の方では、「仕様」という説明をしてくれましたが、それと同時に携帯電話製造メーカーの窓口の電話番号を教えてくれました。
教えてもらった携帯電話の製造メーカーに問い合わせたところ、「ここの製品、ここではbluetoothの仕様というのは携帯電話のキャリアーが独自の仕様書を作成し、その仕様書に基づいて携帯電話機を作るから製造メーカーではどうしてそういう仕様になっているのかは判らないが、他社はそういう仕様にはなっていないからどうしてそういう仕様になったのかは判らないな~」と言う回答でした。
まぁ、そういう仕様ではいたか仕方ないので仕様を回避する方法を考えたわけです。
どうすれば仕様を回避できるのだろう?
どうにも切るボタンを押すのが面倒なのと、Asteriskに収容していても切るボタンを押さないと、かけ直しに対応できないことから苦情もあったので収容から外しての利用となりました。
海外に2週間程遊(学)していた時には、この携帯電話機をAsteriskに収容して、一方的にボイスメールで受けてしまい、後から電話をかけ直すという方法で対応していました(もちろん海外からはAsterisk経由の日本の固定電話を使って発信するという方法になりました:しかし固定電話からの発信だと携帯電話宛の通話料気が高いということに気が付かなかった…)。
どんな場合でもbluetooth経由だと切るボタンを押さないとダメなのだろうか何か抜け道は無いだろうか?と携帯電話機2台、bluetoothヘッドセット、bluetoothゲートウエイ、bluetooth対応カーナビを使って色々と実験をかさねましたが、結局のところ「携帯電話の切るボタン」を押さない限り連続受発信の通話はできないのだという結論となりました。
つまり「切るボタンを押す」ことでこの仕様を回避できるという結論に達しました。
Raspberry pi サーバーで切るボタンを押す方法を考える
AsteriskサーバーはRaspberry pi上で動作しているので、Raspberry piで何かのプログラムを使えば切るボタンを押す方法は見つかるであろうということはすぐに思いつきました。
だけど具体的にどうすればよいかは思いつきませんでした。
例えば、Raspberry Piにカメラをつけて携帯電話の液晶画面を撮影しておき、「通話終了」の画面になった場合にはリレーをONにしてプッシュ型ソレノイドで切るボタンを押すという方法が一番最初に思いつきました。
この場合にはAsteriskとは全く別の切るボタンを押す専用Raspberry piで処理をすれば汎用的(bluetooth経由以外にも例えば通話時間が9分55秒などの無料通話サービスの限界時間を設定しておきその時間が近くなったら自動的に切るボタンを押するなど)考えていました。しかし、プログラム的に、画面が切り替わったタイミングをどうやって取り込めば良いかとか「通話終了」という画像の比較をどうすれば良いか(虚ろながらOpenCVを使えば良さそうだ程度)など、よく判っている人には簡単ですが、私にはよく判らなかった。
そんなことを考えながら紀伊国屋書店で次の本を立ち読みしました。
内容的にはAsteriskサーバーを構築し、内線番号をルーター外部から使えるように設定し、得的の内線番号に着信させるとRaspberry PiのGPIOに接続しているLEDを点けたり、消したりできるというもので、
おおおおおおおおおぉぉぉ~ 正にこれこそ私が探し求めていたものだ~!ついに発見!
しかしながら、当日老眼鏡を忘れてしまったためタイトルと大きな文字以外の内容はちっともわからず購入せずに帰ってきて、早速調べてみたところ、この記事の元は
Interface 2015年10月号、Interface 2016年3月号に掲載されていることが判りましたので、早速、新宿紀伊国屋書店に行ってInterfaceのバックナンバー(新宿紀伊国屋にはバックナンバーが揃っておいてある) 2016年3月号を購入(後日Interface2015年10月号も購入)して帰ってきました。
記事を読むと、AsteriskにはAGI(Asterisk Gateway Interface)という処理があり、Asteriakの機能を拡張することができるということ。
実際にLEDを点灯、消灯させるスクリプトが書かれており、それ以外にも日本語文字列を喋らせるための音声合成エンジンOpen J_Talkを使った音声メッセージ再生の方法が書かれていました。
長くなったので、いったんここで次の投稿にします。