Asteriskで電話が切れた後に処理をしたい(その3)

Asteriskで電話が切れた後に処理をしたい

Interface 2016年3月号の記事「オレ流LINEづくり」の記事をベースに、長いことしたかったAsterisk収容の携帯電話の切るボタンを押すという処理についての記事となります。

Asteriskで電話が切れた後に処理をしたい(その2)でAGIスクリプトではどうやら切断後の処理はできないようだと考え直し、再度インターネット駆使して調べまくりました。

求めよ、そうすれば与えられる
探せ、そうすれば見出す。
たたけ、そうすれば開かれる。(マタイ福音書七章7~8)

こういう時には集中力だけが衰えることが無い脳を持っているせいか、早朝までインターネットを駆使して調べまくりました。判らない英語をgoogle翻訳で訳しながら調べていると何か見つかりました。

DeadAGIという処理を発見!

googleを使ってズバリ “電話切断後の処理をしたい asterisk”というキーワードで検索すると、次のサイトが一番目に表示されました。

アスタリスクノート(Asterisk Note) AGIで回線切断時の処理をしたい(DeadAGI)

内容を読むと、同じように回線切断後の処理をしたいということ、その処理としてPHPスクリプトが記載されています。phpは全然理解できないのですが、どうやらDeadAGIを使えば、私が希望している処理は可能かもしれない

DeadAGIを試してみる

DeadAGIをgoogleで検索すると

voip-info.info Asterisk cmd DeadAGI というサイト

が1番目に表示されます。

“DeadAGI is a variant of AGI that you use when the channel is hung up.”
google翻訳で訳してもらうと
“DeadAGIは、チャンネルが切断されたときに使用するAGIの変種です。”

と記載されていますが、実際の利用方法の記載はありません。

続いて検索を繰り返すと

DeadAGIのリファレンス?のようなページが見つかりました。

http://www.asteriskdocs.org/en/2nd_Edition/asterisk-book-html-chunk/asterisk-APP-B-51.html

このページにはコマンドが記載されていて

 

 exten => h、1、DeadAGI(agi-test)

おお、これぞまさに私が探していたものと思い早速テストを開始しました。

着信したらLEDを点灯し、受話器を置いたらLEDを消灯するという順序です。
今までと同じようにextensions.confを以下のようにDeadagiの処理を追加してみました。

;内線呼び出し
exten => _20Z,1,NoOp(内線呼出)
exten => _20Z,n,agi(agi_led_ON.agi)
exten => _20Z,n,Dial(SIP/${EXTEN},60)
exten => h,1,DeadAGI(agi_led_OFF.agi)
exten => _20Z,n,Hangup

extensions.confの変更後は
sudo service asterisk restart
をコマンドで入力した後に、内線202から内線201に発信しました、LED点灯、鳴動、受話器を取る、置く、LED点灯しっぱなし。
実験失敗です。

判っているのは

 exten => h、1、DeadAGI(agi-test)

だけなので手も足もでません。どうやってagiスクリプトを定義するのかも不明なままでこの日はギブアップとなりました。

ただ、この中で

 exten => h、1

の部分に見慣れない”h”と言うものがあるのでこれに注目してみた。

hは回線切断後に処理される

hについては以下の書籍のP.155に記載がある。

exten => h, 1, Hangup

“h”も特殊なエクステンションで、コマンドがハングアップ、すなわち電話を切ったという条件で終了した場合に処理がここに飛んでくるものです。つまりすべてのコマンドでダイヤルした側、着信した側のいずれでもハングアップを検出したならば、処理がここへ飛ぶためHangupコマンドで強制的に切断してしまいます。

どうやら

exten => h , 1, 〇〇〇〇〇

〇〇〇〇〇〇の部分にLEDを消灯するためのスクリプトを書けば良いようだという目処が立ちました。

 

ついに判明! Asterisk切断後の処理の方法

ここの判明!というのは、自分なりに判明したということです(プロの方からは「あれは違うよ、判明なんかしていないよ」と言われてももうこれで精一杯です)。

なかなか、”h”エクステンションの処理方法が判らず、これは無理かなぁと思いつつ、VOIP-info.jpで開発したPIASTの装置のグリーン表示のLEDがかっこいいなぁと思いながらインターネットホームページを読んでいました。
この処理の中の「PIAST ページング」という処理を読んでいると、

チャネルが切断するとhエクステンションに飛ぶのを利用し、切断後にConsoleに対して音声ファイルを流します。
アンプをリレーで制御したい場合には以下の例のようにします。

;ハングアップ後に音声を流す
exten => h,1,NoOp(Paging Hangup)
exten => h,n,System(asterisk -rx 'channel originate Console/0 application Playback hello-world')
exten => h,n,System(/home/piast/relayoff.sh)

と言うエクステンションが記載されています。どうやら「リレーで制御したい場合には以下の例のようにします」というのは抜き出した以下部分のことではないか!?

exten => h,n,System(/home/piast/relayoff.sh)

実験をしないと判明はしませんが、ついに見つかりました。電話が切れた後に処理をする方法ではありませんか!

“/home/piast/relayoff.sh”という部分は私の場合にはLEDを消灯するものに書き換える必要がありそうです。shというのはシェルスクリプトの拡張子だそうです。

インターネットを使って、シェルスクリプトを使ってLEDを消すための処理をしているホームページを検索して参照したところ、どうやらAGIスクリプトとほぼ同じような内容なので、agi_led_OFF.agiを書き換えてシェルスクリプトの拡張子(.sh)で/usr/local/sbin/led_off.shのファイル名で保存しました。

LEDを消灯するシェルスクリプト(led_off.sh)

#!/bin/sh
sleep 1
echo "4" > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio4/direction
sleep 1
echo "1" > /sys/class/gpio/gpio4/value
sleep 1

早速extensions.confを書き換えます。

;内線呼び出し
exten => _20Z,1,NoOp(内線呼出)
exten => _20Z,n,AGI(agi_led_ON.agi)
exten => _20Z,n,Dial(SIP/${EXTEN},60)
exten => _20Z,n,Hangup

exten => h,1,System(/usr/local/sbin/led_off.sh)

extensions.confに3行目と7行目を追加しただけです。3行目は着信したらLEDを点灯させ、7行目は切断したらLEDを消灯させるという処理に該当します。
extensions.confを書き換えたのでsudo service asterisk restartを実行しテスト開始です。

内線202から内線201に電話をかけます。LED点灯、鳴動、受話器を取る、受話器を置く、LEDが消えた!
やりました。ついに切断後にLEDを消すことができました。

ついに電話を切るとLEDを消すという処理が動きました。内線電話を使ってLEDの点灯と消灯をすることができました。
ただ副作用として、内線391に電話をすると点灯後、電話が切れると消灯するようになってしまいました。
“exten => h,1,”の処理は全ての切断後、hエクステンションに処理がうつるということなので致し方ないのだろうと思います。

現時点はここまでの処理が完了したところです。

実験はまだ続く

翌日、リレーとソレノイドを購入してきて、実験を繰り返そうとしましたが、まず、リレーが小さすぎるためブレッドボードに直接挿すことができません。更にリレーの足に刺すためのメスのリードがありません。これも購入する必要があります。
ソレノイドを5V電源で動かし、電流を測ったところ1Aも流れました。基本モーターなので結構電流を喰います。ためしにRaspberry piの+5V端子から電源を取ったところ、Raspberry Piの電源LEDが消えてしまいます。これも直接電源供給できないことが判明したので、スマホ充電器2口のものが必要となりそうです(Raspberry Piとソレノイド用電源)。
更に、携帯電話の切るボタンを正確に押すことができる押さえ(柱)が必要です。これは木かアルミかアクリル板で作る必要があります。

とりあえず、リレー制御処理は今までの流れで処理はできるだろうと思われます。あとは手作業で実際に装置を組み立てて、丁度良い切るボタンの時間を実機でテストすること、何よりも一番不得意な組み立てを進めたいと思います。

とりあえず終了。