UDP をブロードキャストするサービスを作る
UDP の受信方法
動作確認で必要なので覚えておこう。
一度だけ受信したい人は
$ nc -ul 39391
で十分、socat 不要。 nc -ulk 39391
だとずっと Listen できる。
shsudo apt install socat
sudo socat -T 1 -u UDP-LISTEN:39390,fork STDOUT
UDP をブロードキャストするプログラム
python を使うと簡単に作れる。socket モジュールそのまま使うだけ便利
python -m venv .venv
で仮想環境を作ってね( .venv/bin/activate
でアクティベートを忘れずに )。
main.pyimport socket
HOST_NAME = ''
PORT = 39391
host = socket.gethostname()
#udp通信を使いたいので、SOCK_DGRAM
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
#ブロードキャスト
sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
#データ送信
message = message.encode("utf-8")
sock.sendto(message, (HOST_NAME, PORT))
sock.close()
定期実行の仕組み
systemd.timer を使う。Unit で service を指定する。 [Timer]
で 30s ごとに値を入れる
/etc/systemd/system/udp3939x.timer# /etc/systemd/system/udp3939x.timer
[Unit]
Description=udp3939x
[Timer]
OnBootSec=30s
OnUnitActiveSec=30s
Unit=udp3939x.service
[Install]
WantedBy=timers.target
Unit の設定
/etc/systemd/system/udp3939x.service# /etc/systemd/system/udp3939x.service
[Unit]
Description=udp3939x
[Service]
Type=oneshot
User=pi
Group=pi
WorkingDirectory=/home/pi/workspace/mikumiku
ExecStart=/home/pi/workspace/mikumiku/.venv/bin/python ./main.py
[Install]
WantedBy=multi-user.target
実行してみよう
shsudo systemctl start udp3939x.service
エラーがでなければOK。
エラーが出たら次のコマンドでエラーを見よう!
shsudo journalctl -u udp3939x.service
udp3939x.service のファイルに間違いがあるようなら、次のコマンドでエラーを確認しよう。
shsudo systemctl status udp3939x.service
定期実行させる
shsudo systemctl enable udp3939x.service
sudo systemctl enable udp3939x.timer
UDP の受信方法 の方法をみて受信できるか見てみよう!