匿名

差分

Asterisk+Radio

236 バイト追加, 2024年10月19日 (土)
編集の要約なし
ここでいうRadioは無線機のことなのです。<br>
注:当初、レピータと表記していましたが、うちらの業界的にはゲートウェイだろうってことでゲートウェイに改めました。
<br>
=ニーズ=
さて、シカケは揃いました。あとはAsteriskに接続して・・・と、やってみたのですが上手くないです。理由がどうにもこうにもわからないので諦めました。<br>
当初の目論見ではAsteriskのConsoleデバイスで繋ごうと思ってたのですが、どうもオーディオがおかしくなりまともに音が出ないことが多くあります。たまに出ても数秒しか持たないなどさんざんでした。おそらくALSA+Pulseaudio+chan_consoleの組み合わせが悪いのか何なのかなのですが、もし解決方法を気付いた人がいたら教えてください。[[chan_console]] のテストをやっていて発見しました。USBオーディオの種類を変えてみても症状が治まらないので諦めました。
=無線レピータを作る無線ゲートウェイを作る=というわけで、Asteriskで直収するのは諦めてSIPを喋る無線レピータをつくりましょう。話は簡単です。SIPのソフトフォンを入れたSBC等を用意して、それにDigiRigで無線機を繋ぎ、ヘッドセット等の代わりが無線機になっていればOKです。というわけで、Asteriskで直収するのは諦めてSIPを喋る無線ゲートウェイをつくりましょう。話は簡単です。SIPのソフトフォンを入れたSBC等を用意して、それにDigiRigで無線機を繋ぎ、ヘッドセット等の代わりが無線機になっていればOKです。<br>
でまあ、今回はとりあえずRaspberry Pi 3B+を使いました。ソフトフォンを動かすだけなら余ってるRaspberry Piとかでいけます。<br>
参考:SIP,RTPのポートについて考慮すればAsteriskと同居させることはできます。なので、サーバ内でpjsuaを動かすのもアリです。<br>
==まとめる==
ここまでの作業をまとめて無線レピータをつくります。Raspberry ここまでの作業をまとめて無線ゲートウェイをつくります。Raspberry Pi(3b+)の場合ですが
*オンボードのオーディオデバイスを全て無効化しDigiRigだけ使うようにする
*pjsuaをコンパイルし、/usr/local/bin/pjsua とする
*PTT制御プログラムをコンパイルし /usr/local/bin/pttctl とする
*PTTをネットワークから制御するため netrwを入れ、シェルスクリプトを /usr/local/etc/netptt.sh とする
以上を行い、/etc/rc.local に以下を書いて再起動しても無線レピータとして動くようにします。に以下を書いて再起動しても無線ゲートウェイとして動くようにします。
#!/bin/sh -e
#
exit 0
pjsuaはttyから切り離されたがらないのでscreenでバックグラウンド起動させます(デフォルトで入っていない場合はaptでscreenを入れて)。<br>
これで無線レピータ、要するにSIPを喋る無線機アダプタのできあがりです。これで無線ゲートウェイ、要するにSIPを喋る無線機アダプタのできあがりです。<br>
性能的にはpi zero系でもかまわないと思うのですが、OTGケーブルが要るのがちょっと面倒かも。
=Asteriskから使う=
無線レピータができたのでAsteriskから使いましょう。無線区間と無線ゲートウェイができたのでAsteriskから使いましょう。無線区間と"通話"するだけなら単にSIPの電話機として扱うだけです。Dialしてやれば無線の区間で何が話されているのかは聞くことができます。ですが、こちらから発話しようとするとPTTを押さないといけないので、PTT制御が必要になります。<br>まず、PTT制御するハンドラを書きます。これはnetwriteで無線レピータに対して制御を投げます。ただし、IPアドレスを明示指定して書いてしまうと無線レピータのIPアドレスが変わった場合に書き換えが必要になってしまうので、Asteriskが『知っている』エンドポイント名で指定できるようにします。まず、PTT制御するハンドラを書きます。これはnetwriteで無線ゲートウェイに対して制御を投げます。ただし、IPアドレスを明示指定して書いてしまうと無線ゲートウェイのIPアドレスが変わった場合に書き換えが必要になってしまうので、Asteriskが『知っている』エンドポイント名で指定できるようにします。<br>PJSIP_CONTACTS DBがIPアドレスを含むコンタクトを持っているので、そこからIPアドレスだけ取り出します。netwriteする場合のポート番号はnetreadで指定したものと同じものを設定してください。無線レピータのエンドポイント名が変わった場合にはphone10の部分を書き換える必要があります。DBがIPアドレスを含むコンタクトを持っているので、そこからIPアドレスだけ取り出します。netwriteする場合のポート番号はnetreadで指定したものと同じものを設定してください。無線ゲートウェイのエンドポイント名が変わった場合にはphone10の部分を書き換える必要があります。
[sub-pttctl]
exten => s,1,NoOp
exten => s,n,System(echo ${ARG1} | /usr/bin/netwrite ${RCONTACT} 5091)
exten => s,n,Return
これをダイヤルして無線レピータと通話中に使えるようにします。DYNAMIC_FEATUREで指定します。これをダイヤルして無線ゲートウェイと通話中に使えるようにします。DYNAMIC_FEATUREで指定します。<br>
features.confに以下のようにハンドラを登録します。登録するのはapplicationmapになります。
[applicationmap]
exten => 8890,n,Dial(PJSIP/phone10)
exten => 8890,n,Hangup
DYNAMIC_FEATUREを登録したので、無線レピーターに対して通話中にDYNAMIC_FEATUREを登録したので、無線ゲートウェイに対して通話中に"**"を押すとPTTのオン、オフを行うことができます。これで無線でしゃべることもできるようになります。<br>
ただし、これは少し問題があります。PTTをオンにしたままAsterisk側の電話機を切ってしまうとPTTホールド状態で終了してしまい電波を掴んだままになってしまい、pttctlのタイムアウト(170秒)まで送信状態が続いてしまうので、電話を切ったらPTTをオフにしてやらなくてはいけません。次のように修正します。
exten => 8890,1,NoOp
ハングアップハンドラとしてPTTオフを登録します。
==電話機側も無線みたいに入りたい==
電話機側も複数入って無線区間とやりとりしたい場合には音声会議につっこむ手段があります。例えば無線レピータを以下のコマンドで会議、radioに参加させます。電話機側も複数入って無線区間とやりとりしたい場合には音声会議につっこむ手段があります。例えば無線ゲートウェイを以下のコマンドで会議、radioに参加させます。
channel originate PJSIP/phone10 application ConfBridge radio
これでConfBridge(radio)に電話機側から参加すれば無線区間同様に同時に通話できます。が、しかしPTTの制御ができないので少し工夫します。音声会議の場合、DTMFが音声会議のメニュー制御に取られるのでDYNAMIC_FEATURESの方法が使えないため、ConfBridgeのメニューでPTTを制御します。ただこのとき引数を受け付けないようなので、まずPTT制御用のextenを以下のように書きます。