gpsdのサイトからソース取ってきて、野良ビルドして動かしてみた。
QZSSのみちびきPRN194〜196まで使ってて、昨日は見られなかったPRN300番台のGAってのが現れているが、これは欧州のGALILEOだな。
Raspberry Pi 4 の gpsd は 3.18 なので、早く新しくならんかのう。
I know who Iam.
gpsdのサイトからソース取ってきて、野良ビルドして動かしてみた。
QZSSのみちびきPRN194〜196まで使ってて、昨日は見られなかったPRN300番台のGAってのが現れているが、これは欧州のGALILEOだな。
Raspberry Pi 4 の gpsd は 3.18 なので、早く新しくならんかのう。
USBのGPSレシーバーが aliexpress から届いた。
大体、1週間ちょっとで、最近、aliexpress はやけに到着が早くなってるな。
早速動作確認してみたが、ちゃんと動いている。
Ubuntu 20.04の gpsd-3.20-8ubuntu0.4 だと、衛星の種類まで出るんだな。
GPがGPSで、SBがSBAS(衛星航法補強システム)、QZがQZSS(準天頂衛星)、GLがGLONASSでロシアの衛星。
ウクライナに侵攻してるロシアだが、結構GPSでは世話になっとったんだなあ。
車に Raspberry Pi zero 2Wを設置して、GPSにより、車の移動を検知して、メールで警告をするようにしている。
前のGPSドングルのVK-172は、平和堂で、車を駐車場に停めてる時に、100m以上の誤差が出て、警告メールが飛んできた。
1 2 3 4 5 6 7 8 9 |
From: yuji@noizumi.org To: yuji@noizumi.org Subject: Car Security alert GPS Warning! 100.55m moved. Message-Id: <E1owZqP-0004Rc-A8@rx7pi> Date: Sun, 20 Nov 2022 11:14:05 +0900 XSRV-Filter: yuji@noizumi.org Car Security alarm was GPS Warning! 100.55m moved. at 2022/11/20 11:14:05 https://maps.google.com/maps?q=XX.065626526,XXX.026907982 |
北へ100.55m移動したと誤警報。
こういう誤差による誤検知でメールが飛ばないように、100m越えにしてるのだが、TOPGNSS803G は現状では大体誤差20m位に収まってるから、誤検知が出ないのに期待したい。
結局、 motion が多重起動するのは防げないっぽいので、daemon モードで常駐させて、web_connect で start と pause の指令を motion に送って対応する事にした。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 |
#!/bin/bash export PATH=/home/noizumi/bin:$PATH GPIO=26 GPIO_DIR=/sys/class/gpio MOTION_PID=/dev/shm/motion.pid MOTION_STOP=/dev/shm/motion.stop GPS_BASE=/dev/shm/gps_base GPS_LATLON=/home/noizumi/bin/gpslatlon.sh # bluetooth 接続による動体検知OFF用 #BTMAC=XX:XX:XX:XX:XX:XX # OPPO Reno3 A BTMAC=XX:XX:XX:XX:XX:XX # OpenRun Pro by Shokz initialize(){ # GPIO26を有効化。プルアップ抵抗ON echo $GPIO >${GPIO_DIR}/export sleep 0.1 echo in >${GPIO_DIR}/gpio${GPIO}/direction sleep 0.1 echo high >${GPIO_DIR}/gpio${GPIO}/direction } shutdown_handler(){ # GPIOクリーンアップ echo $GPIO >$GPIO_DIR/unexport motion_stop exit 0 } mail_send(){ cat << _EOD_|/usr/sbin/sendmail -t -f yuji@noizumi.org From: yuji@noizumi.org To: yuji@noizumi.org Subject: Car Security alert $1 Car Security alarm was $1 at `date +"%Y/%m/%d %H:%M:%S"` $2 _EOD_ } sms_send(){ DATEMES=`date +"%Y/%m/%d %H:%M:%S"` curl -X POST https://api.twilio.com/2010-04-01/Accounts/[twilioアカウント]/Messages.json \ --data-urlencode "Body=Car Security alarm was $1 at $DATEMES" \ --data-urlencode "From=[twilio電話番号]" \ --data-urlencode "To=[わしの携帯電話番号]" \ -u [twilioアカウント]:[twilioパスワード] -o /home/noizumi/logs/twilio.log } button_pushed(){ motion_start mail_send activated sms_send activated # ボタンが押されている間、ループ while [ "`cat ${GPIO_DIR}/gpio${GPIO}/value`" = "0" ]; do sleep 1 done mail_send stopped sms_send stopped } motion_start(){ MOTION_STATUS=`curl -s http://localhost:8080/0/detection/status |grep "Detection status" | /bin/sed -r 's/.*Detection status (.*).*/\1/'` if [ "${MOTION_STATUS}" != "ACTIVE" ]; then curl -s http://localhost:8080/0/detection/start >/dev/null 2>&1 fi if [ ! -e ${GPS_BASE} ]; then GPS_NOW=`${GPS_LATLON}` if [ "${GPS_NOW}" != "" ]; then echo "${GPS_NOW}" > ${GPS_BASE} fi fi } motion_stop(){ MOTION_STATUS=`curl -s http://localhost:8080/0/detection/status |grep "Detection status" | /bin/sed -r 's/.*Detection status (.*).*/\1/'` if [ "${MOTION_STATUS}" = "ACTIVE" ]; then curl -s http://localhost:8080/0/detection/pause >/dev/null 2>&1 fi if [ -e ${GPS_BASE} ]; then rm -f ${GPS_BASE} || true fi } bluetooth_connect(){ # 接続状態確認 CONNECTED=`cat << _EOD_|bluetoothctl|grep "Connected: yes" power on info ${BTMAC} quit _EOD_ ` # bluetooth 接続状態確認 if [ "${CONNECTED}" != "" ] || [ -e ${MOTION_STOP} ]; then # 接続してたら、動体検知止める motion_stop else # 接続してなかったら、動体検知スタート motion_start fi } initialize trap shutdown_handler 1 2 3 15 # motion を daemon モードで起動 if [ ! -e ${MOTION_PID} ]; then motion -b fi while :; do # pulseaudo 起動確認 if [ "`ps ux|grep -e \"${USER}.*pulseaudio\"|grep -v grep`" = "" ]; then pulseaudio --start sudo systemctl restart bluetooth.service fi # イヤホンマイクボタンが押された時 if [ "`cat ${GPIO_DIR}/gpio${GPIO}/value`" = "0" ]; then button_pushed fi bluetooth_connect if [ -e ${GPS_BASE} ]; then GPS_SAVE=`cat ${GPS_BASE}` GPS_NOW=`${GPS_LATLON}` if [ "${GPS_NOW}" != "" ] && [ "${GPS_BASE}" != "" ]; then DISTANCE=`distance.sh ${GPS_SAVE} ${GPS_NOW}` if [ "`echo \"${DISTANCE}>100\"|bc`" = "1" ]; then mail_send "GPS Warning! ${DISTANCE}m moved." "https://maps.google.com/maps?q=${GPS_NOW}" echo "${GPS_NOW}" > ${GPS_BASE} fi fi fi sleep 1 done |
今までは、 motion の起動と終了で動体検知を管理してたけど、常駐した motion に start と pause の指令を送る事で、動体検知ON/OFFを管理するようにした。
MOTION_STATUS=`curl -s http://localhost:8080/0/detection/status |grep “Detection status” | /bin/sed -r ‘s/.*Detection status (.*).*/\1/’`
MOTION_STATUS に ACTIVE か PAUSE が入るので、その状態によって、start か pause かの指令を送る方式。
これで bluetooth ヘッドフォン接続したら、動体検知OFFになればいいけど、暫く様子見。
あと、昼頃に会社から車の rx7pi へ ssh 接続してると通信途絶する事があって、携帯電話のUSBテザリングが終了してる事がある問題がある。
これの対策は bluetooth テザリングとか試してみたけど、リブートしたら自動で再接続しない等問題がある。
あとはWiFiテザリング位しか残された道が無いけど、電力食うのは嫌なんだよなあ。
結局の所、ロックファイルがあれば起動しない処理だったけど、なぜか起動するという事はファイルが無くなっているという事。
プロセスを終了させて、ファイルを消している処理があるので、そこでプロセスが完全に終了するまで待つ事にした。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
motion_start(){ if [ ! -e ${MOTION_PID} ]; then motion -n & echo $! >${MOTION_PID} # ファイルが作成されるまで待つ while [ ! -e ${MOTION_PID} ]; do sleep 0.1 done fi if [ ! -e ${GPS_BASE} ]; then GPS_NOW=`${GPS_LATLON}` if [ "${GPS_NOW}" != "" ]; then echo "${GPS_NOW}" > ${GPS_BASE} fi fi } motion_stop(){ if [ -e ${MOTION_PID} ]; then PID=`cat ${MOTION_PID}` kill -TERM ${PID} # プロセスが完全に終了するまで待つ while [ "`ps h p ${PID}`" != "" ]; do sleep 0.1 done rm -f ${MOTION_PID} || true rm -f ${GPS_BASE} || true fi } |
元は、kill -TERM `cat ${MOTION_PID}`て処理だったけど、それよりも先にファイル削除になって、PIDがkill に渡らないから生存しつづけて、多重起動になっとったんかなあ。
linux ってファイルを処理に渡したら、削除しても内容は消えずに渡ると思ってたが、あれは通常のファイルシステムの話で、RAM DISK上のファイルは違うのかねえ。
とりあえず、プロセス終了を待ってからファイル削除で多重起動しなくなったから、ま、いっか。
【皇紀2682年11月17日 追記】
今日、会社の帰りに車に乗ったら二重起動が発生。
もう、どこが悪いのか分かんね。
【/皇紀2682年11月17日 追記】
車載のRaspberry Pi zero 2 W(以下rx7pi) で、bluetoothヘッドフォン接続時に、motion の動体検知録画を止め、切断時に動体検知録画ONになるようにしている。
だが、確認してみると、朝、車に乗る前に、bluetoothヘッドフォン接続したのに、通勤時の動画が一杯記録されてた。
VPN経由でrx7piへログインしてみたところ、
1 2 3 4 |
noizumi@rx7pi:~ $ ps auxw|grep motion|grep -v grep noizumi 5374 1.4 9.1 206036 34324 ? SLl 11月14 11:56 motion -n noizumi 20643 0.8 7.5 171496 28364 ? SLl 09:29 0:16 motion -n noizumi 23656 0.8 7.5 171496 28112 ? SLl 09:34 0:14 motion -n |
三重起動しとる……。
1 2 |
noizumi@rx7pi:~ $ cat /dev/shm/motion.pid 23656 |
記録されとるのは、一番最後のプロセスIDなので、多重起動防止を突破しとるようだ。
あと、motion が二重起動してる事があって、何でだろうと考えたが、motion -n &でバックグラウンド起動してるので、process IDを出力する前に、ループで二週目の呼び出しで二重起動になってるんだろう。
1234567891011121314 motion_start(){if [ ! -e ${MOTION_PID} ]; thentouch ${MOTION_PID}motion -n &echo $! >${MOTION_PID}fiif [ ! -e ${GPS_BASE} ]; thenGPS_NOW=`gpslatlon.sh`if [ "${GPS_NOW}" != "" ]; thenecho "${GPS_NOW}" > ${GPS_BASE}fifi}という事で、process IDが出力する前に、touch でファイルを作成しておき、二重呼び出しにならないようにした。
情報源: raspberry pi – Yuji Noizumi’s blog
と、対策はしたのだが、なぜに多重起動する!?
9:29 と 9:34 に起動してるが、ドアの開閉でルームランプのLEDライトが点灯した時にLEDのノイズで接続が切れてるのかもしれんな。
しかし、それでも論理的に多重起動するのはあり得んのだが、状況を整理しよう。
これはやっぱりLEDライト点灯による bluetooth 接続断がくさいが、もしかすると、motion の起動完了にすごく時間が掛かってて、sleep 1 のwaitでは足らないのかもしれない。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
motion_start(){ if [ ! -e ${MOTION_PID} ]; then motion -n & echo $! >${MOTION_PID} while [ ! -e ${MOTION_PID} ]; do sleep 0.1 done fi if [ ! -e ${GPS_BASE} ]; then GPS_NOW=`gpslatlon.sh` if [ "${GPS_NOW}" != "" ]; then echo "${GPS_NOW}" > ${GPS_BASE} fi fi } |
という事で、 恐らく、touch したファイルは、リダイレクト指定したら削除されて、ファイルが存在しないから多重呼び出し可能になってしまうのだろう。
そこで、リダイレクトのファイルが作成されるまで待つ処理を入れてみて、様子を見るとしよう。
会社からVPN使ってRX-7搭載Raspberry Pi zero 2 W(以下ラズパイ)へログインして、状態を確認していた所、GPSからデータが一切流れて来ていない。
alarm_monito.sh をKILLして、スクリプト弄ってたら、通信途絶した。
帰宅してWiFi経由でログインしても、別に異常は無いし、何が原因かよく分からん。
とりあえず、GPSがハングアップした時の為に、timeout を入れるのと、応答を良くする為に、gpspipe のパラメータを弄った。
1 2 3 |
#!/bin/sh timeout 1 /usr/bin/gpspipe -w -n 4| /bin/grep TPV | /bin/sed -r 's/.*"lat":([^"]*),"lon":([^"]*),.*/\1,\2/' | /usr/bin/head -1 |
gpspipe は -n 4 指定で、TPVの行が出て、終了するので、多分、これが一番速い。
GPSがハングアップしてても、1秒でタイムアウトなので、警戒監視スクリプトでデッドロックする事もあるまい。
あと、motion が二重起動してる事があって、何でだろうと考えたが、motion -n &でバックグラウンド起動してるので、process IDを出力する前に、ループで二週目の呼び出しで二重起動になってるんだろう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
motion_start(){ if [ ! -e ${MOTION_PID} ]; then touch ${MOTION_PID} motion -n & echo $! >${MOTION_PID} fi if [ ! -e ${GPS_BASE} ]; then GPS_NOW=`gpslatlon.sh` if [ "${GPS_NOW}" != "" ]; then echo "${GPS_NOW}" > ${GPS_BASE} fi fi } |
という事で、process IDが出力する前に、touch でファイルを作成しておき、二重呼び出しにならないようにした。
それと、GPSハングアップに備えて、GPSのデータ参照してる所は、空白データの時に処理しないFail safeを入れた。
まあ、GPSドングルが壊れてる可能性もあるので、TOPGNSSの11.11セールで売ってたものをポチっておいた。
情報源: Topgnss usb gps glonass受信機アンテナモジュールusb出力プロトコル、互換交換BU353S4|GPS レシーバー & アンテナ| – AliExpress
前に買った奴が結構いいので、再び購入したが、前が1,500円位だったのに、今はセールで2,200円になっとるから、円安は海外通販には痛いのう。
今の車載Raspberry Pi zero 2 W は、車載警報装置のイヤホンマイクをGPIOに接続して、発報すると、イヤホンマイクスイッチがONになるので、それをトリガにメール&SMS送信するようになっている。
加えて、カメラを追加して、bluetooth ヘッドホンの Open Run Proが接続していないと、motion をスタートさせて、動体検知記録する。
つまり、車に乗って、bluetooth ヘッドホンを接続していれば、動体検知はOFFで、車から離れて、bluetooth接続が切れたら、動体検知ONになるようにしている。
今回やろうとしてるのは、動体検知ONの時に、GPSで現在位置を保存して、定期的に車の移動距離を測定し、車が100m移動してたらメールを飛ばそうというもの。
【rx7pi新スペック】
※写真貼るのが面倒なので、アフィリエイト利用
とりあえず、USBのGPSドングルが余っていたので、Raspberry Pi zero 2 Wへ接続。
VK172って、2019年に1,090円で買ったけど、円安のせいで値上がりしとるなあ。
1 |
sudo apt install gpsd gpsd-clients |
gpsd をインストール。
既定の動作の設定
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# Default settings for the gpsd init script and the hotplug wrapper. # Start the gpsd daemon automatically at boot time START_DAEMON="true" # Use USB hotplugging to add new USB devices automatically to the daemon USBAUTO="true" # Devices gpsd should collect to at boot time. # They need to be read/writeable, either by user gpsd or the group dialout. DEVICES="/dev/ttyACM0" # Other options you want to pass to gpsd GPSD_OPTIONS="-n -G" |
VPN経由で、FoxtrotGPSや、xgps、gpsmonが自端末で見れるようにListenStream=0.0.0.0:2947 にする。
1 2 3 4 5 6 7 8 9 10 11 12 |
[Unit] Description=GPS (Global Positioning System) Daemon Sockets [Socket] ListenStream=/var/run/gpsd.sock ListenStream=[::1]:2947 #ListenStream=127.0.0.1:2947 ListenStream=0.0.0.0:2947 SocketMode=0600 [Install] WantedBy=sockets.target |
設定ファイルの再読込と、サービスの再起動
1 2 |
$ sudo systemctl deamon-reload $ sudo systemctl restart gpsd.service |
ガレージを中心にそこそこの精度。
今回、新規作成した gpsd の出力から、緯度、経度を抜き出すプログラム。巷で出回ってるGPS出力から時間を抜くスクリプトの改造版(笑)
1 2 3 |
#!/bin/sh /usr/bin/gpspipe -w | /usr/bin/head -10 | /bin/grep TPV | /bin/sed -r 's/.*"lat":([^"]*),"lon":([^"]*),.*/\1,\2/' | /usr/bin/head -1 |
そして、2点の緯度経度から、距離を計算するプログラムだが、これは、次のページのpythonプログラムをシェルスクリプト用に書き直した。
情報源: Python で2点の緯度経度から距離を計測する方法 – GIS奮闘記
ありがとうございます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
#!/bin/bash START=(${1//,/ }) END=(${2//,/ }) cat << _EOD_|bc -l scale=20 pole_radius=6356752.314245 /* 極半径 */ equator_radius=6378137.0 /* 赤道半径 */ pi=4*a(1)/180 start_lat=${START[0]}*pi start_lon=${START[1]}*pi end_lat=${END[0]}*pi end_lon=${END[1]}*pi diff_lat=start_lat-end_lat diff_lon=start_lon-end_lon avg_lat=(start_lat+end_lat)/2 /* 平均緯度 */ e2=(equator_radius^2-pole_radius^2)/equator_radius^2 /* 第一離心率^2 */ w=sqrt(1-e2*(s(avg_lat)^2)) m=equator_radius*(1-e2)/(w^3) n=equator_radius/w distance=sqrt((m*diff_lat)^2+(n*diff_lon*c(avg_lat))^2) scale=2 distance/1 _EOD_ |
distance.sh 緯度1,経度1 緯度2,経度2 で距離(m)を出力する。
元のページは km 単位で、最後に1,000で割ってたけど、わしが欲しいのはメートル単位なので、1,000では割ってない。
ただ、 bc で、平方根使うと、小数点以下20位まで有効になるので、最後に scale=2を指定して、1で割り算して、小数点以下2桁までにしている。
どうせ、GPSの測定誤差が数十メートル単位で出るので、メートルの小数点以下はほぼ無意味だけどね。 🙂
上の2つを新たに組み込んだ車載警報装置モニタプログラムがこちら。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 |
#!/bin/bash GPIO=26 GPIO_DIR=/sys/class/gpio MOTION_PID=/dev/shm/motion.pid MOTION_STOP=/dev/shm/motion.stop GPS_BASE=/dev/shm/gps_base #BTMAC=XX:XX:XX:XX:XX:XX # OPPO Reno3 A BTMAC=XX:XX:XX:XX:XX:XX # OpenRun Pro by Shokz initialize(){ # GPIO26を有効化。プルアップ抵抗ON echo $GPIO >${GPIO_DIR}/export sleep 0.1 echo in >${GPIO_DIR}/gpio${GPIO}/direction sleep 0.1 echo high >${GPIO_DIR}/gpio${GPIO}/direction } shutdown_handler(){ # GPIOクリーンアップ echo $GPIO >$GPIO_DIR/unexport motion_stop exit 0 } mail_send(){ cat << _EOD_|/usr/sbin/sendmail -t -f yuji@noizumi.org From: yuji@noizumi.org To: yuji@noizumi.org Subject: Car Security alert $1 Car Security alarm was $1 at `date +"%Y/%m/%d %H:%M:%S"` $2 _EOD_ } sms_send(){ DATEMES=`date +"%Y/%m/%d %H:%M:%S"` curl -X POST https://api.twilio.com/2010-04-01/Accounts/[アカウント]/Messages.json \ --data-urlencode "Body=Car Security alarm was $1 at $DATEMES" \ --data-urlencode "From=[twilio電話番号]" \ --data-urlencode "To=[わしの携帯電話番号]" \ -u [twilioアカウント]:[twilioパスワード] -o /home/noizumi/logs/twilio.log } button_pushed(){ motion_start mail_send activated sms_send activated # ボタンが押されている間、ループ while [ "`cat ${GPIO_DIR}/gpio${GPIO}/value`" = "0" ]; do sleep 1 done mail_send stopped sms_send stopped } motion_start(){ if [ ! -e ${MOTION_PID} ]; then # 動体検知開始時の現在位置の保存 gpslatlon.sh >${GPS_BASE} motion -n & echo $! >${MOTION_PID} fi } motion_stop(){ if [ -e ${MOTION_PID} ]; then kill -TERM `cat ${MOTION_PID}` rm -f ${MOTION_PID} || true rm -f ${GPS_BASE} || true fi } bluetooth_connect(){ # 接続状態確認 CONNECTED=`cat << _EOD_|bluetoothctl|grep "Connected: yes" power on info ${BTMAC} quit _EOD_ ` # bluetooth 接続状態確認 if [ "${CONNECTED}" != "" ]; then # 接続してたら、動体検知止める motion_stop else # 接続してなかったら、動体検知スタート motion_start fi } initialize trap shutdown_handler 1 2 3 15 # pulseaudo 起動確認 if [ "`ps ux|grep -e \"${USER}.*pulseaudio\"|grep -v grep`" = "" ]; then pulseaudio --start sudo systemctl restart bluetooth.service fi while :; do # イヤホンマイクボタンが押された時 if [ "`cat ${GPIO_DIR}/gpio${GPIO}/value`" = "0" ]; then button_pushed fi bluetooth_connect if [ -e ${GPS_BASE} ]; then # 動体検知開始時の現在位置の取得 GPS_SAVE=`cat ${GPS_BASE}` # 現在位置の取得 GPS_NOW=`gpslatlon.sh` # 移動距離計算 DISTANCE=`distance.sh $GPS_SAVE $GPS_NOW` # 100m以上移動していたらメール送信 if [ "`echo \"${DISTANCE}>100\"|bc`" = "1" ]; then mail_send "GPS Warning! ${DISTANCE}m moved." "https://maps.google.com/maps?q=${GPS_NOW}" fi else sleep 1 fi done |
そして、1m以上移動で異常にして、強引にメール送信させてみた。
1 2 3 4 5 6 7 8 |
From: yuji@noizumi.org To: yuji@noizumi.org Subject: Car Security alert GPS Warning! 4.66m moved. Message-Id: <E1orXIB-0004oY-9k@rx7pi> Date: Sun, 06 Nov 2022 13:29:55 +0900 Car Security alarm was GPS Warning! 4.66m moved. at 2022/11/06 13:29:55 https://maps.google.com/maps?q=35.68519148229406,139.75279343187816 |
google maps のURL付きにしたので、クリックすれば、車の位置がすぐ分かるようになっている。座標の方は、すり替えておいたのさ 🙂
ブラウザで http://192.168.40.1:8081/ でアクセスすると、駐車中の車のリアルタイム映像が見れるのがいいな。
ただ、スマホのUSBテザリングの省電力機能のせいで、アクセス開始するまで、最大10分待たされるけど 🙁
結局、bluetooth 連携は、bluetoothctl に connect コマンドを発行すると、sshの入力がプチフリーズするからやめた。
スマートフォンから、Raspberry Pi zero 2 Wへ bluetooth接続する事で当面はやってみようと思う。
※商品画像貼るの面倒なので、アフィリエイト使用
結局、Amazonで調達したチルト機能付きカメラはこんな感じに設置した。
証拠というよりは、車に乗り込まれたかどうかを判定する程度。
結局の所、カメラケーブル50cmでは、自由な位置に取り付けができなかったのだ。
で、RX-7搭載のRaspberry Pi zero 2 Wは、わしの携帯電話のbluetoothに接続を試み、接続できた場合は、カメラの動体検知OFFで、運転中のノイズをカット。
駐車場に停めて、車から離れて、bluetooth接続が切れたら、動態検知ONというようにした。
車から離れたら動体検知ONになって欲しいのだが、わしの部屋から車庫までの距離だと、ギリギリbluetooth接続できてしまうので、動体検知がOFFになってしまう。
まあ、家では他に監視カメラがあるので、特に問題は無いけど、ゆくゆくは信号強度見て判断できるようになったらいいなとは思っている。
【機能】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 |
#!/bin/bash GPIO=26 GPIO_DIR=/sys/class/gpio MOTION_PID=/dev/shm/motion.pid BTMAC=[わしの携帯電話のbluetoothのMACアドレス] initialize(){ # GPIO26を有効化。プルアップ抵抗ON echo $GPIO >${GPIO_DIR}/export sleep 0.1 echo in >${GPIO_DIR}/gpio${GPIO}/direction sleep 0.1 echo high >${GPIO_DIR}/gpio${GPIO}/direction } shutdown_handler(){ # GPIOクリーンアップ echo $GPIO >$GPIO_DIR/unexport motion_stop exit 0 } mail_send(){ cat << _EOD_|/usr/sbin/sendmail -t -f yuji@noizumi.org From: yuji@noizumi.org To: yuji@noizumi.org Subject: Car Security alert $1 Car Security alarm was $1 at `date +"%Y/%m/%d %H:%M:%S"` _EOD_ } sms_send(){ DATEMES=`date +"%Y/%m/%d %H:%M:%S"` curl -X POST https://api.twilio.com/2010-04-01/Accounts/[アカウント]/Messages.json \ --data-urlencode "Body=Car Security alarm was $1 at $DATEMES" \ --data-urlencode "From=[twilioの携帯電話番号]" \ --data-urlencode "To=[わしの携帯電話番号]" \ -u [アカウント]:[パスワード] -o /home/noizumi/logs/twilio.log } button_pushed(){ motion_start mail_send activated sms_send activated # 車載警報装置発報中はループ while [ "`cat ${GPIO_DIR}/gpio${GPIO}/value`" = "0" ]; do sleep 1 done mail_send stopped sms_send stopped } motion_start(){ if [ ! -e ${MOTION_PID} ]; then motion -n & echo $! >${MOTION_PID} fi } motion_stop(){ if [ -e ${MOTION_PID} ]; then kill -TERM `cat ${MOTION_PID}` rm -f ${MOTION_PID} || true fi } bluetooth_connect(){ # bluetooth 接続状態確認 if [ "`hcitool con|grep -v Connection|grep ${BTMAC}`" != "" ]; then # 接続してたら、動体検知止める motion_stop if [ "`ip a|grep bnep`" = "" ]; then # bluetoothテザリング bt-pan client ${BTMAC} fi else # 接続してなかったら、動体検知スタート motion_start cat << _EOD_|bluetoothctl >/dev/null 2>&1 power on connect ${BTMAC} quit _EOD_ fi } initialize trap shutdown_handler 1 2 3 15 # pulseaudo 起動確認(bluetooth 接続用) if [ "`ps ux|grep -e \"${USER}.*pulseaudio\"|grep -v grep`" = "" ]; then pulseaudio --start sudo systemctl restart bluetooth.service fi while :; do # 車載警報装置発報時 if [ "`cat ${GPIO_DIR}/gpio${GPIO}/value`" = "0" ]; then button_pushed fi bluetooth_connect sleep 1 done |
車載Raspberry Pi zero 2 W の監視スクリプトも結構な長さになったなあ。
家に帰って、車のラズパイがWiFiに繋がった時に、WireGuard のネットワークとカチ合ってぐだぐだになる問題があって、dhcpcd の hook で何とかするとかやってたが、もっと簡単な方法があった。
WireGuard の接続設定で、AllowedIPs = 0.0.0.0/0 とやれば良かったのだ。
1 2 3 4 5 6 7 8 9 10 |
noizumi@rx7pi:~ $ netstat -nr カーネルIP経路テーブル 受信先サイト ゲートウェイ ネットマスク フラグ MSS Window irtt インタフェース 0.0.0.0 192.168.42.129 0.0.0.0 UG 0 0 0 usb0 0.0.0.0 192.168.44.1 0.0.0.0 UG 0 0 0 bnep0 0.0.0.0 192.168.11.1 0.0.0.0 UG 0 0 0 wlan0 192.168.11.0 0.0.0.0 255.255.255.0 U 0 0 0 wlan0 192.168.40.0 0.0.0.0 255.255.255.0 U 0 0 0 wg0 192.168.42.0 0.0.0.0 255.255.255.0 U 0 0 0 usb0 192.168.44.0 0.0.0.0 255.255.255.0 U 0 0 0 bnep0 |
wg-quick up wg0 を手動でやってみたら、tcp forward ONにしたりしていたが、そうだよ! ルーターモードにしたら、192.168.30.254 から、WireGuard クライアントの 192.168.40.1に接続しても応答できるじゃん。何で気付かなかったんだろう。
ま、困った時には、「てきとーに握ってくれ」やね 🙂