この記事は、 大阪工業大学 Advent Calendar 2022(https://adventar.org/calendars/7957)の17日目の記事です。
目次
背景
オフトゥンの魔力が強力な時期の真っ只中となりました。私は朝起きることができなくなりつつあります。スマホのアラームをセットしてはいますが、オフトゥンからでることなく止めることができ音もそれほど大きくないため二度寝しがちです。そして家を出発する10分前に目覚めるのです。この状況をなんとか打開しなければならないと私は思いました。そこで目覚まし時計として最適な物が自宅に転がっていることに気が付きます。そう、どの家にでも必ず1台ある黒電話です。レオパ〇スなら着信するだけで全入居者が目を覚ますほど大きな音が鳴ります。これを使わない手はありません。しかし、黒電話は電話です。着信しなければ鳴ることはありません。とはいえ有料のモーニングコールサービスを使うのもアホらしいです。仕方がないので簡易的な内線電話網を構築して自動で架電できる仕組みを作ることにしました。
使用機器
- 黒電話
- NVR500 (VoIPルーター)
- サーバー (ラズパイなどでよい)
ディレクトリ構成
最終的なディレクトリ構成は以下の通りです。
/home/maintainer/
├── docker
│ ├── asterisk
│ │ ├── Dockerfile
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── config
│ │ │ ├── extensions.conf
│ │ │ └── pjsip.conf
│ │ ├── docker-compose.yml
│ │ ├── morning_call
│ │ ├── morning_call.sh
│ │ └── outgoing
作業内容
SIPサーバーを構築し、黒電話がSIPクライアントとなる設定を行います。SIPサーバーからSIPクライアントに自動で朝の指定した時間で架電することによって目覚まし機能を実現するため、ほとんどの作業はSIPサーバーに対してものです。
Asteriskのセットアップ
SIPサーバーにはAsteriskを用いります。
まずは適当にディレクトリを整えましょう。
cd ~/
mkdir docker
cd docker
mkdir asterisk
cd asterisk
mkdir config
mkdir outgoing
次に今作成したasteriskディレクトリ直下に以下のようなdocker-compose.ymlを用意します。
version: '3'
services:
asterisk:
image: andrius/asterisk:latest
volumes:
- ./config/pjsip.conf:/etc/asterisk/pjsip.conf
- ./config/extensions.conf:/etc/asterisk/extensions.conf
- ./outgoing:/var/spool/asterisk/outgoing
ports:
- "5060:5060/udp"
restart: always
コンフィグがないと動きませんのでコンフィグを準備します。
config/pjsip.conf
[transport-udp]
type=transport
protocol=udp
bind=0.0.0.0
[777]
type=endpoint
transport=transport-udp
context=from-internal
disallow=all
allow=ulaw
auth=777
aors=777
[777]
type=auth
auth_type=userpass
password=hoge
username=777
[777]
type=aor
max_contacts=10
config/extensions.conf
[from-internal]
exten = 100,1,Answer()
same = n,Playback(hello-world)
same = n,Hangup()
exten = 777,1,Dial(PJSIP/777,30,r)
same = n.Hangup()
最後にAsteriskを起動します。
sudo docker-compose up -d
自動発信用ファイルの作成
Asteriskでは /var/spool/asterisk/outgoing 直下に指定のフォーマットで記述したファイルを置くことによって自動発信できるようです。したがって、以下のファイルを作成します。
morningcall
Channel: PJSIP/777
MaxRetries: 0
Context: from-internal
Extension: 100
次にファイルをoutgoingに配置するスクリプトを準備します。
morningcall.sh
#!/bin/bash
# ファイルを複製
cp /home/maintainer/docker/asterisk/morning_call /home/maintainer/docker/asterisk/tmp
# 複製したファイルの所有者・グループをAsteriskに設定
chown 100:101 /home/maintainer/docker/asterisk/tmp
# 最後にoutgoingへ配置
mv /home/maintainer/docker/asterisk/tmp /home/maintainer/docker/asterisk/outgoing/tmpA
こちらのサイトの補足説明を参考にスクリプトを作成しています。
cronの設定
はじめにタイムゾーンを設定しておきます。
普通は設定済みですが、私はずれていたので合わせました。
sudo timedatectl set-timezone Asia/Tokyo
次にcrontabで定期実行の設定をします。
sudo crontab -e
# この一文を追記
30 6 * * * bash /home/maintainer/docker/asterisk/morning_call.sh
最後に設定を確実に反映させるためcronを再起動させます。
sudo systemctl restart cron
NVR500の設定
私は既にIP電話サービスを設定済みだったので以下の3行のみコンフィグに追加しました。
sip server display name 2 777
sip server 2 172.16.20.20 register udp sip:777@172.16.20.20 777 hoge name=asterisk
analog sip arrive myaddress 1 2 sip:777@172.16.20.20
追加したらsaveします。
save
まとめ
面倒な作業ばかりでしたが毎朝6時30分に黒電話が鳴るようになりました。dockerを使っているせいかそこまで難しくはないので朝起きれない人にはチャレンジしてほしいです。今はcronの設定をいじらないと時間とかを変えられないので後々は黒電話だけでセットできるようにしたいなと思います。最後までお読みいただきありがとうございました。
※追記 黒電話が鳴った瞬間だけ起き上がって黒電話を鎮めた後に布団へ戻る技が磨かれてきており、毎日布団へ戻るまでの時間が短縮されています。