はじめに

前回の「Pocket Geiger Type6をFreeBSDで使う(動作確認編)」に続いて、もう少し深堀をしていきたいと思います。
最終的には、24時間365日稼働のFreeBSDサーバーにPocket Geiger Type6を接続し、定期的に測定した結果をWebサーバで表示するところまで持っていければと思います。

シェルスクリプトで測定プログラムを作成する

前回の動作確認で記載した通り、Pocket Geiger Type6自体はシリアルデバイスとして利用可能なので、新たにドライバ等を書いてやる必要はありません。
とりあえず、一番手軽なシェルスクリプトで実装してみます。

測定プログラム「measure_radiation.sh」
#!/bin/sh

device_file='/dev/cuaU0'
result='./result.csv'
trial_limit=6000
lock_file='/var/run/measure_radiation'

if [ `whoami` != 'root' ]
then
	echo 'This shellscript must be run by user "root".'
	exit
fi

if [ -f ${lock_file} ]
then
	echo 'This shellscript is being executed, operation aborted.'
	exit
fi

touch ${lock_file}

if [ ! -e ${device_file} ]
then
	echo 'DeviceFile is not found, operation aborted.'
	exit
fi

trial_count=0
success_count=0
radiation_count=0

start_date=`date "+%Y%m%d%H%M%S"`

echo 'S' > ${device_file}

while read line < ${device_file}
do
	radiation_count_incremental=`echo ${line} | tr -d ">" | cut -d ',' -f 1`
	error_count=`echo ${line} | tr -d ">" | cut -d ',' -f 2`

	if [ 0 == ${error_count} ]
	then
		radiation_count=$(( radiation_count + radiation_count_incremental ))
		success_count=$(( success_count + 1 ))
	fi

	trial_count=$(( trial_count + 1 ))

	if [ ${trial_limit} == ${trial_count} ]
	then
		break
	fi
done

echo 'E' > ${device_file}

microsv_per_hour=`echo "scale=3; ${radiation_count} *${trial_limit} / ${success_count} * 600 / ${trial_limit} / 53.032" | bc | sed -e 's/^\./0./g'`

echo "${start_date},${trial_limit},${success_count},${radiation_count},${microsv_per_hour}" >> ${result}

rm ${lock_file}

実装にあたって、不明な点があったので、販売元に確認してみました。

まず1点目、返却されてくる

> (Signal),(Noise)

のそれぞれの値(Signal、Noise)については、ともに100msの間に観測されたカウントで、CPMではないのではないかと聞いてみましたが、そのとおりでした。
ですので、Signalの値を600スロット分(10msec×600=60sec=1min分)足し合わせればCPMになります。

続いて2点目、Noiseが観測された場合には、その値をどうするべきか(その値を捨てるのか、Noise分を除いたSignalをカウントするのか)を聞いてみましたが、Androidアプリでは、Noiseが観測された場合、その前後1秒間(合計2秒間,21スロット分?)のSignalを捨てているそうです。
つまり、Noiseが検出されたらそのスロット分の測定結果は捨てるべきで、Androidアプリでは更にその前後のスロットの観測結果についても捨てているわけです。

私が試した範囲では、Pocket Geiger Type6に衝撃を与えない限りは、Noiseが観測されることはほぼないので、上のシェルスクリプトではNoiseが観測されたスロット分のみ捨てるようにしています。(実装が簡単なので…)

最後に3点目、CPMからuSV/hへの換算式を聞いてしましたが、Pocket Geiger Type6ではCPMを53.032で割った値をuSV/hとすればよいとのことです。(実際に公開されているAndroidアプリのコードを追っていくと、この変換を行なっています。)

測定結果の出力

やや脇道にそれてしまいましたが、このシェルスクリプトを実際に実行すると、10分間の計測の後、変数resultで指定したファイルにCSV形式で測定結果を追記していきます。

20170518233414,6000,6000,28,0.052

測定毎に上記のような行が追加されていきます。

各値の意味は、左から順番に

測定開始日時
測定スロット数
有効スロット数(Noiseが観測されなかったスロット数)
カウント数
uSV/h換算値

となっています。

あとは、このスクリプトを定期的に動かし、測定した結果をcsvに蓄積していけばよいです。

HTTP/HTTPSでの測定結果のアップロード

ローカルに蓄積するのではなく、値そのものをどこかのサーバに定期的に通知したい場合は、wgetやfetchなどを使って、

wget "http://foo.bar/upload_radiation.cgi?start_date=${start_date}&trial_limit=${trial_limit}&success_count=${success_count}&radiation_count=${radiation_count}µsv_per_hour=${microsv_per_hour}"

とかやればよいと思います。

実際にサーバ間のI/Fを構築する際は、悪意のあるユーザがサーバ側に偽の測定値を送りつける可能性があるため、
・IPアドレスによる通知先の制限
・SSLによる暗号化+BASIC/DIGEST認証
・クライアント認証
などを検討しないといけないですね。


あなたの探し物は見つかりましたか?
まさにこれだ
参考になった
ちょっと違う
これじゃない

何かメッセージがあればお願いします

このメッセージを非公開にする

ご注意

・頂いたメッセージは管理者のチェックの後、公開されます。
・メッセージの公開を希望されない場合には、「このメッセージを非公開にする」にチェックを入れてください。
・管理者が不適切と判断したメッセージは公開しませんので、予めご了承ください。


まだ評価がありません

表示できるメッセージはありません。