0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

IP無線アプリzelloとAsteriskを接続する

0
Posted at

諸注意

・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を用いています
・このコードは無保証です。バグフィックスや改修などの要望はお受けできません
・人命救助や防災等の目的、および安定した運用が必要とされる環境で使用しないでください

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?