参考1:SIP,RTPのポートについて考慮すればAsteriskと同居させることはできます。サーバ内でpjsuaを動かすのもアリですが、電波状況の良い場所に設置することを考えると単独のゲートウェイ式の方が良いと思います。2B+でも動作を確認しました。32bit版OSとなりますが動作に問題はなさそうです。今回の接続は下図のようになります。pjsuaソフトフォンとしてPjSIPのUA、pjsuaを使います。いえばpjproject自体のコンパイル等はVoIP-Infoで説明していない(AsteriskのPjSIPだけ)ことに今更気付きました。Piをセットアップします。Imagerで最新のものを入れてください。OSを例にしています。インストールしたら最低限のセットアップ/アップデートを行っておきます。ソフトフォンとして使うのでIPアドレスを固定する必要はありません。Asteriskに対してREGISTERして使います。OSの場合デフォルトのインストールでほとんどのものは足りているはずなのですが、pjsuaでALSAを使いたいのでALSAとPortaudioの開発ライブラリを入れておいてください。やる必要はないと思います。Piの設定を変更します。以下の2か所を例のように修正し、BCMオーディオ(ヘッドフォン)とHDMIオーディオを無効にします。speedPjSIPコンパイルPjSIP自体はPjProjectのページからダウンロードして展開します。https://www.pjsip.org/あるいはPjprojectのgithubから入手することもできます。https://github.com/pjsip/pjproject展開するとバージョンに応じたディレクトリ(pjproject-2.14.1)ができるので、その下で作業します。cloneした場合には単にpjprojectというディレクトリになります。depmakeするとコンパイルできます。いう名前でコピーしておきます。pjsua設定ファイル以下のような内容でAsteriskに対してREGISTERするソフトフォンとして動作させます。無線機と接続するのでオートアンサモードにしておきます。設定ファイルを使用しての起動は以下のようにします。出力される情報を変更します。pjsua側のSIPポートなので他のものと被らない値を指定してください。--capture-devと--playback-devで指定しますが、これはpjsua(pjsip)が認識しているオーディオデバイスのIDです。speeとなっているので、ALSAの認識では0,1,2(hw:0,0、hw:1,0とか)になるのですが、pjsuaはこの通りには認識しません。pjsuaが認識しているデバイスIDを確認するにはpjsip-apps/binの下にあるpjsystestを使います。pjsystest-aarch64-unknown-linux-gnupjsystest-aarch64-unknown-linux-gnuがそれにあたりますので(pjsua同様にアーキテクチャ名とかが付く)、これを実行します。Devices"を実行します。言い訳け:--capture-devで指定できるのがどうもALSAデバイスではないというのには気付いてたんですが、sndinfoで見ろってコマンドラインのヘルプに書いてあるのにsndinfoが無いんで悩んでましたが、今のバージョンだとpjsystestで見られるというのにようやく気付いた次第。上の例だとたぶんPA(Portaudio)経由の認識で、HDMIサウンドは「使えない」と判断してるようです。テストここまでで動作を確認できます。Asteriskに対するREGISTERが確認できれば、エンドポイント(ここの例ではphone10)に対してダイヤルすれば無線機と繋がります。1234,1,Dial(PJSIP/phone10)を行えばpjsuaは自動で応答し繋がりますので、無線で何か喋ると電話側で聞こえるはずです。音量の調整は無線機のボリュームとマイクゲイン、pjsua側設定やalsamixerでよしなに調整してください。電話機から喋りたい場合にはpjsuaに繋いだ無線機のPTTを手で押します。このPTTをソフト的に制御するのが次の課題です。注意:初期公開版から変更し、PTT制御をsocket対応としました。必要な処理が減ります。pttctl自体がかなりザルなので注意して使用してください。インターネット上に公開なんてしてはいけません。セキュリティを高める手段は他の方法を併用して行ってください。音声の入出力ができるようになったので、後はPTTを制御するだけです。前述のようにDigiRigはUSBシリアルも内蔵しており、RTSでPTTが制御できるようになっています。RTSを制御すればいいので簡単ですねと言いたいところですが、デバイスに対するIOCTLを発行しないとなのでちょいと面倒です。この部分は書いておきました。Asteriskサンプル設定ファイルと同じところにpttctrlというプログラムを置いておきます。5091のように引数に対象のデバイスと、使うポート番号を指定して起動します。このプログラム自体はデーモン(常駐)化して使用します。やり方は後で説明しますが、とりあえずフォアグラウンドで試してみてください。PTTを制御するにはTCPで指定のポートに対して書き込みを行います。前置詞として"NETPTT:"を付けます。書き込みはnetcat(nc)が簡単です。ローカルで試すならnetcat-traditionalパッケージをインストールしてください。5091を実行します。これだけだと押したかどうかを判断するのが面倒なので、状態反転も持たせてあります。5091で現在の状態を反転します。オフならオンに、オンならオフになります。特小の場合には連続送信は3分未満となっている(無線機が勝手に切る)ので、このプログラムでは送信状態になってから170秒でオフにするようにしています。まとめるここまでの作業をまとめて無線ゲートウェイをつくります。以下を書いて再起動しても無線ゲートウェイとして動くようにします。0pjsuaはttyから切り離されたがらないのでscreenでバックグラウンド起動させます(デフォルトで入っていない場合はaptでscreenを入れて)。これで無線ゲートウェイ、要するにSIPを喋る無線機アダプタのできあがりです。zero系でもかまわないと思うのですが、OTGケーブルが要るのがちょっと面倒かも。Asteriskから使うこのシステムの完成図は次のようになります。無線ゲートウェイができたのでAsteriskから使いましょう。無線区間と"通話"するだけなら単にSIPの電話機として扱うだけです。Dialしてやれば無線の区間で何が話されているのかは聞くことができます。こちらから発話しようとするとPTTを押さないといけないので、PTT制御が必要になります。PTT制御するAsteriskのハンドラを書きます。これはnetcat(nc)で無線ゲートウェイに対して制御を投げます。IPアドレスを明示指定して書いてしまうと無線ゲートウェイのIPアドレスが変わった場合に書き換えが必要になってしまうので、Asteriskが『知っている』エンドポイント名で指定できるようにします。DBがIPアドレスを含むコンタクトを持っているので、そこからIPアドレスだけ取り出します。netcat(nc)する場合のポート番号はpttctlの引数で指定したものと同じものを設定してください。無線ゲートウェイのエンドポイント名が変わった場合にはphone10の部分を書き換える必要があります。s,n,Returnダイヤルして無線ゲートウェイと通話中に、このハンドラを使えるようにします。DYNAMIC_FEATUREで指定します。features.confに以下のようにハンドラを登録します。登録するのはapplicationmapになります。**,self/caller,Gosub(sub-pttctl,s,1("NETPTT:ALT"))内線のextenとしては以下のような感じになります。内線8890を無線機区間用として例示します。8890,n,HangupDYNAMIC_FEATUREを登録したので、無線ゲートウェイに対して通話中に"**"を押すとPTTのオン、オフを行うことができます。これで無線でしゃべることもできるようになります。これは少し問題があります。PTTをオンにしたままAsterisk側の電話機を切ってしまうとPTTホールド状態で終了してしまい電波を掴んだままになってしまい、pttctlのタイムアウト(170秒)まで送信状態が続いてしまうので、電話を切ったらPTTをオフにしてやらなくてはいけません。次のように修正します。8890,n,HangupハングアップハンドラとしてPTTオフを登録します。電話機側も無線みたいに入りたい電話機側も複数入って無線区間とやりとりしたい場合には音声会議につっこむ手段があります。無線ゲートウェイを以下のコマンドで会議、radioに参加させます。radioこれでConfBridge(radio)に電話機側から参加すれば無線区間同様に同時に通話できます。PTTの制御ができないので少し工夫します。音声会議の場合、DTMFが音声会議のメニュー制御に取られるのでDYNAMIC_FEATURESの方法が使えないため、ConfBridgeのメニューでPTTを制御します。このとき引数を受け付けないようなので、まずPTT制御用のextenを以下のように書きます。5091)次にconfbridge.confには以下のような無線用メニューを書きます[radiomenu]type=menu**=dialplan_exec(sub-pttctl2,s,1)*1=toggle_mute*4=decrease_listening_volume*6=increase_listening_volume*7=decrease_talking_volume*8=leave_conference*9=increase_talking_volume"**"以外はまあ適当に。8891,n,Hangupこれで会議"radio"に参加するとPTTの制御もできるようになります。『誰か』がPTTをオンにすると会議内の全員の声が無線に飛びますから、あまりわいわいしないようにとか、オンにしたのとは別な人がオフにもできるので運用上で注意してください。上の例ではPTTで発話中に誰かが回線を切るとPTTがオフになります。→どうも無線機のせいかも。無線機の電源を切る/ケーブルを抜く、で止まる。Piのヘッドフォンジャックも使いたいじゃないですか。外付けでアンプが必要にはなりますが、これをページングスピーカーとして使うこともできます。pjsuaをもうひとつ起動し、自動着信にしておけばDialするだけでページング用に使えます。その場合、もうひとつのpjsuaは以下の例のような設定ファイルを作ります。設定するところがポイントです。Piは無線ゲートウェイ兼ページング用として使うことができます。プライバシー・ポリシーVoIP-Info.jpについて免責事項モバイルビュ。