Raspberry Pi Zero 2 W+GPS+Zenfone Max Pro[m2] を繋いでテスト。
DE-C41-30000BKを満充電の後、26時間連続稼働で残りゲージ2つ(50%以下)くらいなので、48時間くらいイケそうだな。
最近、RX-7のバッテリがよく低電圧に陥り、カーポートソーラーに2日ほど接続していたが、夕方エンジン掛けようとするも掛からず、ジャンプスタータで始動した。
RX-7のバッテリがもうそろそろダメなのかもしれん。

I know who Iam.
Raspberry Pi Zero 2 W+GPS+Zenfone Max Pro[m2] を繋いでテスト。
DE-C41-30000BKを満充電の後、26時間連続稼働で残りゲージ2つ(50%以下)くらいなので、48時間くらいイケそうだな。
最近、RX-7のバッテリがよく低電圧に陥り、カーポートソーラーに2日ほど接続していたが、夕方エンジン掛けようとするも掛からず、ジャンプスタータで始動した。
RX-7のバッテリがもうそろそろダメなのかもしれん。
|
|
車載Raspberry Pi Zero 2 W(以下rx7pi)を稼働させるのに、バッテリが低電圧になるのを解決すべく、ポータブルバッテリをこうにう。
エレコムは 自社、Amazon、楽天市場のショップで同一価格なので、ポイント4倍の楽天で買うのが一番お得。
リチウムイオン電池じゃなく、ハイブリットカーのバッテリにも使用されているリン酸鉄リチウムイオン電池なので、高温になりがちな車載でも安心。
以前、ガラケーをFOMA 補助充電アダプタ03に繋ぎ、それに4.5Wソーラーパネルに接続して電力を賄っていたが、スマートフォン+GPS+rx7pi を車のバッテリに繋ぐと電圧低下で、エンジン始動できなくなる。
そこで、以前みたいに、今回買ったDE-C41-30000BKへ rx7pi 一式を接続して、入力に18Wソーラーパネルを接続して、車の電力系から独立させてみようと思った。
ソーラーパワーのみで賄えるようになったらうれしいな 🙂
まあ、できなくても、週末のみモバイルバッテリー充電すればOKの体制にはしたいなあ。
10月9日夜、車のセキュリティのリモコンが鳴って、何だろう?と思って車を確認。
セキュリティOFFにしようにもOFFにならない。
どうも、バッテリ低電圧の警告でリモコンが鳴ってた模様。
何度かやってる内になんとかセキュリティOFFにはなった。
18Wソーラーパネルを接続してはいたが、天気が悪く小雨が降ってて、全然陽に当たってなかった。
カーポートソーラーの常夜灯も、22時頃に消灯してしまったので、やっぱり日照が全然足りてなかったのだろう。
車載のRaspberry Pi Zero 2 W(以下rx7pi)の電源は落としていたが、USBポートに繋いでいた携帯電話とGPSは通電したまんま。
それらの電源を遮断して、とりあえず、ジャンプスターターでエンジンを掛けて、30分ほど放置。
翌朝、エンジンは掛かり、会社へ行って、家に帰ったらrx7pi系統を電源遮断していたが、今日、会社帰りにエンジンオートスターターでエンジン始動させようとするもエンジン始動せず。
一応、電気の食う携帯電話は、車のエンジンが掛かってる間だけ電力供給するようにしていたのだが、GPSモジュールをデータ取得間隔1000ms→100msで動かしてたから、やっぱり電気食うんだろうなあ。
セキュリティOFFとドア解錠はできたので、そのままキーでエンジン始動させると、セルの回りが悪いながらもエンジンは始動。
携帯電話は、エンジン掛かってる間だけ充電しても100%にならんので、とりあえず家で充電。
GPSのデータ取得間隔を1000msに戻したけど、現状は、日々、バッテリが消耗していくばかりなので、バッテリ回復するまで、rx7pi は稼働させない方が良さそうだ。
|
1 2 3 4 5 6 7 8 9 |
noizumi@greyhound:~$ ping -w 5 192.168.11.19 PING 192.168.11.19 (192.168.11.19) 56(84) バイトのデータ 64 バイト応答 送信元 192.168.11.19: icmp_seq=2 ttl=64 時間=204 ミリ秒 64 バイト応答 送信元 192.168.11.19: icmp_seq=3 ttl=64 時間=1.62ミリ秒 64 バイト応答 送信元 192.168.11.19: icmp_seq=4 ttl=64 時間=333 ミリ秒 --- 192.168.11.19 ping 統計 --- 送信パケット数 5, 受信パケット数 3, パケット損失 40%, 時間 4027ミリ秒 rtt 最小/平均/最大/mdev = 1.615/179.474/332.910/136.348ミリ秒 |
RX-7車載の Raspberry Pi Zero 2 W(以降rx7pi) だが、家の Wi-Fi に繋ぐと、謎のパケットロスが発生する。
rx7pi はプログラムで次の機能を持たせている。
これらの機能のプログラムを走らせると、Wi-Fiのパケットロスが発生する。
GPIOの信号線半田付けする時に、チップ抵抗まで盛ってしまい、ショートさせたので、まだショート箇所が残ってるのかと半田吸い取り線をヨドバシから買って、信号線の付け直しをしてみたが症状変わらず。
GPIO監視だけのテストプログラムを動かしたら発生しないので、GPIOでは無いようだ。
端末から監視プログラムを動かすと、
|
1 2 3 4 |
noizumi@rx7pi:~/bin $ alarm_monitor.sh & [1] 5150 noizumi@rx7pi:~/bin $ エラー: 接続のアクティベーションに失敗しました: (44) Bluetooth 接続が失敗またはタイムアウトしました. エラー: 接続のアクティベーションに失敗しました: (44) Bluetooth 接続が失敗またはタイムアウトしました. |
携帯電話へ bluetooth テザリングで接続してなかったらするようにしてるが、家なので、携帯電話は有効にしていない。
ちょっと気になるので、bluetooth テザリング接続部をコメントアウトすると、パケットロスが無くなった。
|
1 |
sudo nmcli dev connect ${BTPAN} |
この部分でパケットロスが発生しとるようで、bluetooth と Wi-Fiは同一チップで制御しとるから、大方、bluetooth の制御コマンドを送ると、Wi-Fi の回路の処理が停止して影響が出とるのかな?
安物の Wi-Fiチップだと、回路共通部分での競合ってありそうで、嫌だのう。
今まではUSBテザリングを使っていたが、スマートフォンの画面ロックを解除しないと、通信が確立しないので、朝、システムを起動して、画面ロック解除を忘れて、その後、通信不可ってのが嫌で、bluetooth テザリングにしたんだよなあ。
車載機としては、bluetooth テザリングが通信の生命線なので、接続断の場合は、何度もリトライを繰り返す処理にしてるけど、Wi-Fi 接続時はキャンセルする例外を入れんといかんかな?
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
function bt_tethering_check(){ # Wi-Fi繋がってたら何もしない。 WIFI=`ifconfig|grep wlan` if [ "${WIFI}" != "" ]; then return 0 fi # bluetooth 接続状態確認 PATTERN="[\s\S]*?${BTPAN}" if [[ ! $CONNECTED =~ $PATTERN ]]; then sudo nmcli dev connect ${BTPAN} else # 接続中に携帯電話の応答が無い場合、 # bluetooth死亡の可能性大なので再起動 if [ -e $FILE_TE_DEAD ]; then sudo reboot fi fi } |
Wi-Fi繋がってたら、bluetooth テザリング接続をしないようにした。
これで謎のパケットロスは解消した。 🙂
前は、tenki.jp を元にさせていただいていたが、地震が発生しても ircbot で表示されない事があり、ircbot の workファイルを見ると、1バイトのファイルが作成されている事があり、この原因がよく分からない。
そこで、Yahoo! の地震情報から RSSを生成する事にする 🙂
|
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 |
<?php header('Content-Type: text/xml;charset=UTF-8'); $url = 'https://typhoon.yahoo.co.jp/weather/jp/earthquake/list/'; $count = 10; do { $html = file_get_contents($url); $count--; } while (empty($html) && $count>0); $http_header = get_headers($url, 1); $base_url = 'https://typhoon.yahoo.co.jp'; // ヘッダから時間を取得 $now = new DateTime($http_header['Date']); $now->setTimezone(new DateTimeZone('Asia/Tokyo')); $now_rfc2822 = $now->format(DateTimeInterface::RFC2822); $now_PermaLink = $now->format('A') . ' Asia/Tokyo+9 ' . $now->format('D M y'); // RSS ヘッダ $RSS = <<< EOD <rss xmlns:content="http://purl.org/rss/1.0/modules/content/" version="2.0"> <channel> <title>地震情報 - Yahoo!天気・災害</title> <link>${url}</link> <language>ja</language> <lastBuildDate>${now_rfc2822}</lastBuildDate> <pubDate>${now_rfc2822}</pubDate> <guid isPermaLink="false">${now_PermaLink}</guid> EOD; # テーブルの抜き出し if (preg_match('/<table .*class="yjw_table yjSt boderset">[\s\S]*?<\/table>/m', $html, $matches)) { $earth_quake_table = $matches[0]; } else { $earth_quake_table = ''; } // row の抜き出し if (preg_match_all('/<tr.*>([\s\S]*?)<\/tr>/m', $earth_quake_table, $matches)) { $trs = $matches[1]; $trmax = count($trs); for ($tr = 1; $tr < $trmax; $tr++) { // カラムの抜き出し if (preg_match_all('/<td.*?>([\s\S]*?)<\/td>/m', $trs[$tr], $matches)) { $tds = $matches[1]; if(preg_match('/<a href="([^"]*)">(.*)<\/a>/', $tds[0],$matches)){ $link = $base_url . $matches[1]; $datetime = $matches[2]; } $center = $tds[1]; $magnitude = $tds[2]; $max_level = $tds[3]; // 震度3以上 if($max_level<3){ continue; } sscanf($datetime, '%d年%d月%d日%d時%d分ごろ', $y, $m, $d, $h, $i); $ocdate = new DateTime("$y-$m-$d $h:$i"); $ocdate->setTimezone(new DateTimeZone('Asia/Tokyo')); $occurrence_date = $ocdate->format(DateTimeInterface::RFC2822); $RSS .= <<< EOD <item> <title>[震源地] ${center} [最大震度] 震度${max_level} M${magnitude}(${datetime}発生) - Yahoo</title> <link>${link}</link> <description/> <pubDate>${occurrence_date}</pubDate> </item> EOD; } } $RSS .= <<< EOD </channel> </rss> EOD; $sl = strlen($RSS); header('Content-Length: '.$sl); print $RSS; } ?> |
震度1〜2は出てもウザいので、震度3以上を表示するようにしている。
「goo天気」をご利用くださいまして、ありがとうございます。
誠に勝手ながら「goo天気」のサービスは2023年9月27日をもちまして、終了させて頂くことになりました。
長年にわたり「goo天気」をご愛顧いただきましたお客様に、心より感謝申し上げるとともに、ご迷惑をおかけして誠に申し訳ございません。
今後とも引き続きgooのサービスをご利用いただけますと幸いです。
情報源: goo天気の終了について – goo天気
とうとう地震のRSS配信してる所が無くなってしまう。
うーん…。
|
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 |
<?php header('Content-Type: text/xml;charset=UTF-8'); $html = file_get_contents('https://earthquake.tenki.jp/bousai/earthquake/entries/level-3/'); $base_url = 'https://earthquake.tenki.jp'; $now = new DateTime(); $now_rfc2822 = $now->format(DateTimeInterface::RFC822); $now_PermaLink = $now->format('A').' Asia/Tokyo+9 '.$now->format('D M y'); // RSS ヘッダ $RSS =<<< EOD <rss xmlns:content="http://purl.org/rss/1.0/modules/content/" version="2.0"> <channel> <title>過去の地震情報 震度3以上(日付の新しい順) - 日本気象協会 tenki.jp</title> <link>https://earthquake.tenki.jp/bousai/earthquake/entries/level-3/</link> <language>ja</language> <lastBuildDate>${now_rfc2822}</lastBuildDate> <pubDate>${now_rfc2822}</pubDate> <guid isPermaLink="false">${now_PermaLink}</guid> EOD; # テーブルの抜き出し if(preg_match('/<table class="earthquake\-entries\-table">[\s\S]*?<\/table>/m',$html, $matches)){ $earth_quake_table = $matches[0]; }else{ $earth_quake_table = ''; } if(preg_match_all('/<tr>([\s\S]*?)<\/tr>/m',$earth_quake_table, $matches)){ $trs = $matches[1]; for($tr=1; $tr<count($trs); $tr++){ if(preg_match('/datetime"><a href="([^"]*)" class="text-link">/', $trs[$tr], $matches)){ $link = $base_url.$matches[1]; } if(preg_match('/datetime">.*class="text-link">(.*)<\/a>/', $trs[$tr], $matches)){ $datetime = $matches[1]; // 欠則時は恐らく<span class="grey">が入る if(preg_match('/<span class="grey">(.*)<\/span>/', $datetime, $matches)){ $datetime = $matches[1]; } } if(preg_match('/center">(.*)<\/td>/',$trs[$tr],$matches)){ $center = $matches[1]; // 欠則時は恐らく<span class="grey">が入る if(preg_match('/<span class="grey">(.*)<\/span>/', $center, $matches)){ $center = $matches[1]; } } if(preg_match('/magnitude">(.*)<\/td>/',$trs[$tr],$matches)){ $magnitude = $matches[1]; // 欠則時は恐らく<span class="grey">が入る if(preg_match('/<span class="grey">(.*)<\/span>/', $magnitude, $matches)){ $magnitude = $matches[1]; } } if(preg_match('/max\-level">.*alt="(.*?)"/',$trs[$tr],$matches)){ $max_level = $matches[1]; // 欠則時は恐らく<span class="grey">が入る if(preg_match('/<span class="grey">(.*)<\/span>/', $max_level, $matches)){ $max_level = $matches[1]; } } sscanf($datetime,'%d年%0d月%0d日%0d時%0d分',$y,$m,$d,$h,$i); $ocdate = new DateTime("$y-$m-$d $h:$i"); $occurrence_date = $ocdate->format(DateTimeInterface::RFC822); $RSS .=<<< EOD <item> <title>[震源地] ${center} [最大震度] 震度${max_level} ${magnitude}(${datetime}発生) - tenki.jp</title> <link>${link}</link> <description/> <pubDate>${occurrence_date}</pubDate> </item> EOD; } $RSS .=<<< EOD </channel> </rss> EOD; print $RSS; } ?> |
という事で作った 🙂
IRCのbotで、RSSを出力するものがあるのでそいつに食わせる。
Raspberry Pi Zero 2 Wは 4コアなので、並列処理した方が速くなる為、本体プログラムと bluetooth のチェックを分けた。
【メイン処理】
|
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 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 |
#!/bin/bash export PATH=/home/noizumi/bin:$PATH GPIO=26 GPIO_DIR=/sys/class/gpio MOTION_MOVIE_DIR=/ramdisk/motion/detected MOTION_PID=/ramdisk/motion/motion.pid MOTION_STOP=/ramdisk/motion.stop GPS_BASE=/ramdisk/gps_base GPS_LATLON=/home/noizumi/bin/gpslatlon.sh GPS_LIMIT=100 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 if [ "${BT_CHECK_PID}" != "" ]; then kill -TERM ${BT_CHECK_PID} fi 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_ } # 車載警報装置が発報したら、twilio で携帯電話にSMSを送る sms_send(){ # 通常のSMS送信は、電話番号を購入して月額約164円払わねばならないが、 # Verify だと電話番号買わなくていいので、固定費が発生しない。 # # 通知内容は「あなたの車載警報装置 認証コード:123456」みたいな内容だが # 警報が発報した事が分かればよい。 curl -X POST \ https://verify.twilio.com/v2/Services/[twilio Service SID]/Verifications \ --data-urlencode "To=[わしの電話番号]" \ --data-urlencode "Channel=sms" \ -u [twilio Account SID]:[twilio Auth Token] } # 車載警報装置は、発報するとイヤホンマイクスイッチをONにする # イヤホンマイク信号を GPIO 26で検知して、発報時の処理 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"` PATTERN=".*Detection status PAUSE" if [[ $MOTION_STATUS =~ $PATTERN ]]; 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} GPS_SAVE=${GPS_NOW} fi fi } # 動体検知ストップ motion_stop(){ MOTION_STATUS=`curl -s http://localhost:8080/0/detection/status |grep "Detection status"` PATTERN=".*Detection status ACTIVE" if [[ $MOTION_STATUS =~ $PATTERN ]]; 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 チェックは別処理にし、ファイルの有無で状態を判断する bluetooth_check(){ # bluetooth 接続状態確認 if [ -e ${MOTION_STOP} ]; then # 接続してたら、動体検知止める motion_stop else # 接続してなかったら、動体検知スタート motion_start fi } # GPSで移動距離チェック # 警戒モードONの時、GPSの位置を gps_base ファイルに記録し、 # 以後、100m以上移動毎に現在位置をメール送信 gps_check(){ if [ "`ls /dev/gps* 2>/dev/null`" != "" ]; then if [ -e ${GPS_BASE} ]; then GPS_NOW=`${GPS_LATLON}` if [ "${GPS_NOW}" != "" ] && [ "${GPS_SAVE}" != "" ]; then DISTANCE=`distance.sh ${GPS_SAVE} ${GPS_NOW}` if [ "`echo \"${DISTANCE}>${GPS_LIMIT}\"|bc`" = "1" ]; then GPS_BASE_VALUE=`cat ${GPS_BASE}` TOTAL_DISTANCE=`distance.sh ${GPS_BASE_VALUE} ${GPS_NOW}` mail_send "GPS Warning! ${TOTAL_DISTANCE}m moved." "https://maps.google.com/maps?q=${GPS_NOW}" fi fi GPS_SAVE=${GPS_NOW} else GPS_LIMIT=100 fi fi } # メイン処理スタート initialize trap shutdown_handler 1 2 3 15 bt_check.sh & BT_CHECK_PID=$! # motion を daemon モードで起動 if [ ! -e ${MOTION_PID} ]; then mkdir -p ${MOTION_MOVIE_DIR} motion -b fi # pulseaudo 起動確認 if [ "`ps ux|grep -e \"${USER}.*pulseaudio\"|grep -v grep`" = "" ]; then pulseaudio --start sudo systemctl restart bluetooth.service fi while :; do bluetooth_check # 車載警報装置が発報した時 if [ "`cat ${GPIO_DIR}/gpio${GPIO}/value`" = "0" ]; then button_pushed fi gps_check sleep 1 done |
【bluetoothチェック処理】
|
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 |
#!/bin/bash # bluetooth 接続による動体検知OFF用 BTMAC=XX:XX:XX:XX:XX:XX # OpenRun Pro by Shokz BTKEY=XX:XX:XX:XX:XX:XX # AB Shutter3 FILE_MOTION_STOP=/ramdisk/motion.stop BTKEY_ACTIVATE=0 # bluetoothテザリング用 BTPAN=XX:XX:XX:XX:XX:XX # ASUS_X01BDA # bluetooth テザリングしてなかったらnmcliで接続する function bt_tethering_check(){ # bluetooth 接続状態確認 PATTERN="[\s\S]*?${BTPAN}" if [[ ! $CONNECTED =~ $PATTERN ]]; then sudo nmcli dev connect ${BTPAN} fi } # bluetooth ヘッドフォンが接続してたら、警戒モードOFF function bt_headphone_check(){ # bluetooth 接続状態確認 PATTERN="[\s\S]*?${BTMAC}" if [[ $CONNECTED =~ $PATTERN ]]; then if [ ! -e ${FILE_MOTION_STOP} ]; then # 接続してたら、動体検知止める touch ${FILE_MOTION_STOP} fi else # 接続してなかったら、動体検知スタート rm -f ${FILE_MOTION_STOP} fi } # AB Shutter3 接続状態確認 # triggerhappy に本体再起動、本体電源OFFを定義してある function bt_abshutter_check(){ # 接続してたら triggerhappy再起動 PATTERN="[\s\S]*?${BTKEY}" if [[ $CONNECTED =~ $PATTERN ]]; then if [ "${BTKEY_ACTIVATE}" != "1" ]; then BTKEY_ACTIVATE=1 sudo systemctl restart triggerhappy.service fi else BTKEY_ACTIVATE=0 fi } # bluetoothの接続は並列でチェック # 同じ処理を複数実行しても意味が無いので、各処理終了を待つ。 function bluetooth_connect(){ declare -a pids=() bt_tethering_check & pids+=($!) bt_headphone_check & pids+=($!) bt_abshutter_check & pids+=($!) for pid in ${pids[@]}; do wait $pid done } while :; do # bluetooth 接続状態を取得 CONNECTED=`hcitool con` bluetooth_connect sleep 1 done |
【GPS関連処理】
|
1 2 3 |
#!/bin/sh # gpspipe で位置情報行を抜き出して、「[緯度],[経度]」で出力する timeout 2 /usr/bin/gpspipe -w -n 10 | /bin/grep -E "\"TPV\",.*\"lat\":.*\"lon\":" | /bin/sed -r 's/.*"lat":([^"]*),"lon":([^"]*),.*/\1,\2/' | /usr/bin/head -1 |
|
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 # 2つの緯度経度情報からメートル単位の距離を算出する。 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_ |
今までは USBテザリングで通信していたが、セキュリティの為か、携帯電話の画面ロックを解除した状態にしないと接続できなかった。
しかし、bluetooth テザリングは、一度ペアリングすれば、接続要求によって簡単に繋がるので、画面ロック解除しなくても良くなった。
以前試行した時は、bluetooth テザリングに、 bt-pan というプログラム使ってたけど、接続できなくて sleep 1 で回してても負荷が無茶苦茶高かった記憶がある。
問題は最大3Mbps程度の通信スピードになるが、povo 2.0 の非課金速度が128kbps なので、ボトルネックになる事は無い。
今は、NetworkManagerを導入したおかげで、sudo nmcli dev connect [MACアドレス] で接続できるので、負荷が非常に低く、load avarage も
|
1 2 |
root@rx7pi:~# uptime 11:02:49 up 15:13, 2 users, load average: 0.10, 0.14, 0.16 |
こんな感じで非常に低負荷で済んでいる。
Raspberry Pi Zero 2 W(以下rx7pi)のカメラソケットが破損して、暫くカメラ運用をしていなかったが、新しい物が買えたので、交換し、カメラ運用するようになった。
motionも最新版にし、「助けて」「すべてのカメ」と、日本語が非常に残念であるが、rx7piからリアルタイム映像を閲覧できるようになった。
Wiregurd VPNで、rx7pi から Kagoya VPSの irc.noizumi.org までVPNを張って、192.168.40.2:8080 で motion のwebインターフェースにアクセスできるようになっている。
家ーKagoya VPSー車 とVPN網を構築し、この網に接続すれば、さも家のLANに繋いでるが如く、稼働している機器にアクセスできるってのは便利だね。 🙂
オープンソース版: SoftEther VPN 4.42 Build 9798 RTM (2023/06/30)
製品版: PacketiX VPN 4.42 Build 9798 RTM
米国 Cisco Systems, Inc. による高度なコードレビューと技術協力の結果、CVE-2023-27395 等の 6 件の脆弱性を修正しました。今回修正したいずれの脆弱性も、通常の使用方法と使用環境においては、不正侵入等のセキュリティ侵害に悪用されるリスクは比較的低く、実際の攻撃は容易ではありませんが、将来発見される可能性がある複数の脆弱性が組み合わさると攻撃に悪用される可能性もあるため、できるだけ、アップデートをお勧めします。
情報源: バージョン更新履歴 (ChangeLog) – SoftEther VPN プロジェクト
「アップデートをお勧めします」なんて書かれてるとやらざるを得ない。
SoftEther VPN Server は定期的にバージョンアップを実施する必要があります。放置しているとセキュリティホールを突かれて不正アクセスに繋がります。バージョンアップは容易に実施できるので手順を押さえましょう。
情報源: SoftEther VPN Server バージョンアップ手順 | りんか ネット
こちらを参考にまず、家のサーバーのRaspberry Pi 4のアップデート作業から始める。
要は、vpn_server.config のファイルをコピーすればいいだけだな。
# wget https://jp.softether-download.com/files/softether/v4.42-9798-rtm-2023.06.30-tree/Linux/SoftEther_VPN_Server/64bit_-_ARM_64bit/softether-vpnserver-v4.42-9798-rtm-2023.06.30-linux-arm64-64bit.tar.gz # tar xvzf softether-vpnserver-v4.42-9798-rtm-2023.06.30-linux-arm64-64bit.tar.gz # cd vpnserver # make # cd .. # mv vpnserver /usr/local/vpnserver-v4.42 # cd /usr/local # cp vpnserver/vpn_server.config vpnserver-v4.42/ # chmod -R og-rwx vpnserver-v4.42 # chmod +x vpnserver-v4.42/vpncmd vpnserver-v4.42/vpnserver # systemctl stop softether-vpnserver.service # mv vpnserver vpnserver-v4.38 # ln -sf vpnserver-v4.42 vpnserver # systemctl start softether-vpnserver.service
ごちゃっとしてるけど、手順メモ(笑)
SoftEther VPN ダウンロードのページから、最新版のARM 64bit のファイルをダウンロードして、/user/local に設置。
旧バージョンに戻せるようにそれぞれフォルダ名にバージョン名を含め、systemd のスクリプトで矛盾が無いように vpnserver のシンボリックリンクを最新バージョンに張る。
具体的には、
/usr/local/vpnserver → /usr/local/vpnserver-v4.38
/usr/local/vpnserver のシンボリックリンクを /usr/local/vpnserver-v4.42 に張る。
そういや、SoftEther vpnserver 設置に試行錯誤で苦労した覚えがあるが、作業記録を全然残して無かったな(汗
systemd のスクリプトが次の通り。
[/etc/systemd/system/multi-user.target.wants/softether-vpnserver.service]
[Unit] Description=SoftEther VPN Server After=network.target network-online.target [Service] ExecStart=/usr/local/vpnserver/vpnserver start ExecStop=/usr/local/vpnserver/vpnserver stop WorkingDirectory=/usr/local/vpnserver/ ExecStartPre=/sbin/ip link set dev eth0 arp off promisc on ExecStartPost=sh /root/bin/addif_tap.sh Type=forking RestartSec=3s [Install] WantedBy=multi-user.target
#!/bin/sh /bin/sleep 10 ; brctl addif br0 tap_softether &
linux は vpnサーバーに接続すると、クライアントから vpn サーバーに ssh ログインできないという問題がある。
Unnumbered eth0 に br0 のブリッジで、IPアドレス振って、SoftEther VPN側から tap デバイスで br0 にローカルブリッジ設定してやると vpn接続後に、ssh 192.168.11.254 とか、サーバーのIPアドレス指定でログインできるようになる。
この辺、無茶苦茶苦労したのに全然記録に残してない(滝汗
なんせ、家のサーバーで br0 のブリッジデバイス作成に失敗して、完全通信途絶したので、USB キーボード&マウスとHDMIでディスプレイ繋いで、ローカル端末で修正しなくてはいけなかった。
ちなみにRaspberry Pi 4には、マウスとキーボードが一つのレシーバーで使えるELECOM TK-FDM063BKとかが便利。
わしはこれをNTT西日本のポイントで貰い、使い途に困ってたがRaspberry Piに使った時に、「コレだ!」っておもっちゃいました。 🙂
Kagoya VPS の irc.noizumi.org なんかは、通信途絶したらどうしようと冷や汗もので設定した。多分、通信途絶しても、VPS管理画面のコンソールだけは使えるだろうから大丈夫だとは思うけど。
後は、irc.noizumi.org のSoftEther vpnserverをアップデートすればいいけど、Intel x64版をダウンロードして、vpn_server.configコピーするだけだからすぐ済むな 🙂
朝停電があったが、クーラー停止、電話器が「電話回線に接続してください」連呼、SoftEther VPNの接続不良と散々だった。
姉が押し付けて来た SANYOのコードレス電話だが、電話回線休止状態なので、接続する事ができず、デモモードになって延々と保留音のレパートリーを披露してくれる状態。
取説探したけど無いので、別の機種の取説見ると、電話回線のトーン、パルスの手動設定方法は無いようなので、電源ブチ切り。内線だけ使ってたけど、別の手段にしなくてはならない。
SoftEther VPN はServer Manager で見てみると、Kagoya VPSへ接続されているが、ローカルネットで設定した 192.168.30.254 やL3スイッチに設定している、192.168.11.253、192.168.30.253 へ ping が通らない。
家のサーバーリブートしても直らない。
|
1 |
# systemctl restart softether-vpnserver.service |
とやったら直った。うーん……、何だったんだろう。