GEOGIA LATTE NISTAで一服
これ買ってるより、隣のモスでコーヒー買ってる方が良い気がしてきた。
I know who Iam.
結局、 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円になっとるから、円安は海外通販には痛いのう。
今日、ライブでやってたんだな。
この映像を見て、面白いと思うのは、1080pの乱れの無い映像で、凄く高速の軍用回線を使ってるという事で、これは有事の際にも、有効に活用されるという事だな。
今の車載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付きにしたので、クリックすれば、車の位置がすぐ分かるようになっている。座標の方は、すり替えておいたのさ 🙂
ワークマン公式オンラインストアでの通販は全国のワークマン店舗で受け取れば送料無料!!お買上1万円以上も送料無料!話題のアウトドアウェアや人気の防寒ウェア、かっこいい作業着の店舗取り置きが可能です。Heya(ヘヤ)ルームブーツ(レディースフリー アイボリー)
情報源: FC162/FC172 Heya(ヘヤ)ルームブーツ | ワークマン公式オンラインストア
友人に薦められて買ったけど、暖かくて結構いいな。お値段980円
情報源: 走れば走るほど加算される自動車「走行距離課税」に地方民が激怒! 物流への影響で「日本経済にトドメ」の指摘も | Smart FLASH/スマフラ[光文社週刊誌]
これ、デカい釣り針だな。
どんなバカでも分かる「とんでもない話」を出して騒ぎを起こし、裏でこっそりもっととんでもない話を通そうとしてる場合に、こういう見え透いた茶番をやる場合があるな。
まあ、税の二重取りしてるガソリン税や、自動車税が減税ターゲットになる可能性が高いので、減税の話が挙がる前に増税の話をぶつけて、減税を言わさないようにしようとしてるのかもしれんけど。