諸注意
・zello及びAsteriskの詳しい取扱については解説しません。
【注意】zelloは個人・趣味用途以外での使用は有料です。本記事は個人の実験として書いています。業務用・公共事業用などに利用する場合は約款にしたがい、zello work(有償ライセンス)を契約してください。また、その場合はここに記載された設定内容と異なる場合があることをご承知おきください。
1. やりたいこと
① Asterisk→zello
内線電話から特番をダイヤルするとzelloのチャンネルに接続し、音声をチャンネルに送出する。
→つまり、内線電話機を無線の指令卓みたいに操作できるようにしたい
② zello→Asterisk
zelloがチャンネルに音声を送出すると、Asteriskに登録された端末から音声を流す
→指令電話装置みたいな使い方
どうすればできるか
使用するもの
・RaspberryPi
今回は3B+を用いていますが、これ以降なら大丈夫と思われます。
・Asteriskとzelloを接続するためのブリッジアプリ"asl-zello-bridge"
前提
・Asteriskが構築済で、内線相互通話が可能な状態であること
・zelloのアカウントを取得済であること。なお、ブリッジアプリ側と端末側で2アカウント必要になる。
繰り返しになりますが、zelloは個人・趣味用途以外での使用は有料です。(1アカウント8ドル/月)
ここではAsteriskサーバとzelloブリッジアプリを同一のRaspberryPiに設定しています。
IPアドレスは192.168.1.1としています。
1. Asterisk側設定
1-1. pjsip.confにRPiページング端末を追加
Asteriskサーバ側で編集する。
sudo nano /etc/asterisk/pjsip.conf
以下を追加。
;=====================================================
; Raspberry Pi / Zelloブリッジ・ページング端末
; RPi-2: 192.168.1.1
;=====================================================
[rpi-page]
type=aor
max_contacts=1
remove_existing=yes
[rpi-page-auth]
type=auth
auth_type=userpass
username=rpi-page
password=<<充分つよつよなパスワード>>
[rpi-page]
type=endpoint
transport=transport-udp
context=from-internal
disallow=all
allow=ulaw,alaw
auth=rpi-page-auth
aors=rpi-page
direct_media=no
rtp_symmetric=yes
force_rport=yes
rewrite_contact=yes
password は適宜変更する。
sudo nano /etc/asterisk/extensions.conf
[from-internal] に以下を追加。
;=====================================================
; 内線9:Raspberry Pi / Zelloページング
;=====================================================
exten => 9,1,NoOp(RPi one-way paging to Zello)
same => n,Set(PAGEDEV=${PJSIP_DIAL_CONTACTS(rpi-page)})
same => n,GotoIf($["${PAGEDEV}" = ""]?notregistered)
same => n,Answer()
same => n,Playback(beep)
same => n,Page(PJSIP/rpi-page,q,3600)
same => n,Hangup()
same => n(notregistered),Playback(pbx-invalid)
same => n,Hangup()
same => n,Page(PJSIP/rpi-page,q,3600)
ポイントは Dial() ではなく Page() を使うこと。
Dial() を使うと通常の双方向通話になり、ページング用途では不要な音声が戻ってしまうことがある。
Page() を使うことで、電話機側からページング端末へ音声を送る形にできる。
1-3. Asterisk設定反映
sudo asterisk -rx "pjsip reload"
sudo asterisk -rx "dialplan reload"
確認。
sudo asterisk -rx "pjsip show endpoint rpi-page"
sudo asterisk -rx "pjsip show aor rpi-page"
sudo asterisk -rx "dialplan show 9@from-internal"
2.パッケージ導入
sudo apt update
sudo apt install -y alsa-utils baresip libopus0 libopus-dev
Python仮想環境を作成。
sudo mkdir -p /opt/zello_bridge
sudo chown -R "$USER":"$USER" /opt/zello_bridge
cd /opt/zello_bridge
python3 -m venv venv
source venv/bin/activate
pip install --upgrade pip
pip install websockets python-dotenv opuslib pyjwt cryptography
3. ALSA Loopback設定
3-1. snd-aloopを有効化
sudo modprobe snd-aloop
echo snd-aloop | sudo tee /etc/modules-load.d/snd-aloop.conf
確認。
aplay -l
arecord -l
Loopback が出ればよい。
例:
カード 2: Loopback [Loopback], デバイス 0: Loopback PCM
カード 2: Loopback [Loopback], デバイス 1: Loopback PCM
3-2. .asoundrcを作成
nano ~/.asoundrc
内容。
pcm.pageout {
type plug
slave.pcm "plughw:CARD=Headphones,DEV=0"
}
pcm.pagein {
type null
}
pcm.looptx {
type plug
slave.pcm "plughw:CARD=Loopback,DEV=0,SUBDEV=0"
}
pcm.looprx {
type plug
slave.pcm "plughw:CARD=Loopback,DEV=1,SUBDEV=0"
}
pcm.loopcapture {
type plug
slave.pcm "plughw:CARD=Loopback,DEV=1,SUBDEV=0"
}
ctl.pageout {
type hw
card Headphones
}
役割は以下。
pageout = Raspberry Piのイヤホン/スピーカー出力
pagein = 無音入力
looptx = baresipがAsterisk音声を出力する先
looprx = Pythonが読み取るLoopback入力
3-3. 音声出力確認
使用するスピーカー、又はイヤホンをRaspberryPiのイヤホンジャックに接続しておく
イヤホン端子に音が出るか確認。
speaker-test -D pageout -c 1 -r 8000 -t sine -f 1000
1000Hzの音が聞こえればOK。
音量調整。
amixer -c 0 scontrols
amixer -c 0 set PCM 90% unmute
4. baresip設定
4-1. baresip accounts設定
mkdir -p ~/.baresip
nano ~/.baresip/accounts
内容。
<sip:rpi-page@192.168.1.1>;auth_user=rpi-page;auth_pass=<<充分つよつよなパスワード>>;answermode=auto
auth_pass はAsteriskの pjsip.conf と合わせる。
権限を絞る。
chmod 600 ~/.baresip/accounts
4-2. baresip config設定
nano ~/.baresip/config
該当箇所を以下のようにする。
audio_source alsa,pagein
audio_player alsa,looptx
audio_alert alsa,pageout
ausrc_srate 8000
auplay_srate 8000
ausrc_channels 1
auplay_channels 1
ausrc_format s16
auplay_format s16
audio_buffer 100-500
重要なのは以下。
audio_player alsa,looptx
これにより、Asteriskから来た音声はRaspberry Piのスピーカーへ直接出ず、Loopbackへ送られる。
確認。
grep -nE "audio_source|audio_player|audio_alert|ausrc_srate|auplay_srate|ausrc_channels|auplay_channels|audio_buffer" ~/.baresip/config
有効な audio_player は1行だけであることを確認する。
4-3. baresip起動テスト
baresip
Asterisk側で確認。
sudo asterisk -rx "pjsip show contacts" | grep rpi-page
Avail になればO
5.暫定完成版スクリプト
6.利用の注意点
・README及びLICENSEをお読みください
・このコードの作成には生成AIを用いています
・このコードは無保証です。バグフィックスや改修などの要望はお受けできません
・人命救助や防災等の目的、および安定した運用が必要とされる環境で使用しないでください