Gm-10

提供: fukudat.net
2020年10月21日 (水) 20:33時点におけるFukudat (トーク | 投稿記録)による版 (→‎ドライバのデーモン化)
ナビゲーションに移動検索に移動

オーダーから入手まで

  • 2011年5月4日: 製品ページの"Buy Now"ボタンを押してオーダーを試みると,在庫切れの表示.入荷待ちしたい人はメールしろというので,メールしてみる.すぐに backorder list に入れたという返事が来る.
  • 2011年5月18日: メールで若干の在庫があるからオーダーできるという連絡が届く.メールに添付されていたURLからUSBモデルのGM-10をオーダー.PayPal決済で本体価格 $249.00,送料が $39.13.
  • 2011年5月20日: 出荷したとのメールが届く.
  • 2011年5月25日: 航空郵便で物が届く.関税 500円と通関手数料200円を郵便配達員に支払って受け取る.

Install

ハードウェアの設定は本体にシリアル-USB変換ケーブルを取り付け,USBをPCにつなぐだけ.今回はLinux (Ubuntu Server 10.04.4) に接続. 2個目のシリアルデバイスなので,/dev/ttyUSB1 として認識される.

稼働確認のためkermitでつないでみる.

$ kermit
C-Kermit> set line /dev/ttyUSB1
C-Kermit> set speed 57600
C-Kermit> set stop-bits 1
C-Kermit> connect

すると画面に読めない文字が表示される.動作しているようだ.

もしつながらなかったら /dev/ttyUSB1のパーミッションを調べる.

準備

GM-10を読むデーモンを動かすUnixユーザを作成する.

$ sudo adduser --system gm10

デバイス

デバイスがttyUSB0になるかttyUSB1になるかはタイミング依存で,ブートするたびに変わってしまう可能性がある. それでは不便なので,udevを使って固有の名前がアサインされるようにすべき.

/etc/udev/rules.d に 80-ttyUSB.rules というファイルを作り,そこにルールを記述する.ルールの書き方はここを参照し,ルールに使える条件は以下のコマンドで調べる.

$ udevadm info -a -p $(udevadm info -q path -n /dev/ttyUSB1) | less

ここで /dev/ttyUSB1 は調べたいデバイスの名前.

あくまで例だが,USB物理ポート番号で識別する場合は以下のようになる.

SUBSYSTEM=="tty",KERNELS=="4-2",SUBSYSTEMS=="usb",SYMLINK+="nas04-console"
SUBSYSTEM=="tty",KERNELS=="7-2",SUBSYSTEMS=="usb",SYMLINK+="gm10-1",OWNER="gm10",MODE="0660"

ここで

  • 1行目は(GM-10とは関係ない)シリアルデバイス.ポート4-2につながっているデバイスを選択して,
    • /dev/nas04-consoleというシンボリックリンクを作っている.
  • 2行目がGM-10のシリアルデバイス.ポート7-2につながっているデバイスを選択して,
    • /dev/gm10-1というシンボリックリンクを作り,
    • オーナーを"gm10"というユーザに変更し,
    • パーミッションを 0660 (-rw-rw----) に設定している.

物理アドレスだとUSBの配線に依存するので,ATTRS{modalias}とかを使って選択すべきかもしれない.

実は "/dev/gm10-1" というようなお尻が数字で終わるネーミングは重要.下で設定するドライバがそういう名前でないとだめなようにできているから.

Linux Driver

Linuxサーバーにつないで使うので,Linux用ドライバを準備.

必要そうな前提ソフトをゲット

$ sudo apt-get install mysql-client libmysql++-dev
  • http://mathias.bavay.free.fr/software/gm4lin/ から最新版のtarballをゲット
  • 適当なディレクトリで展開
  • バイナリが同梱されていてそのまま動くが,MySQLサポートがdisableされているので,Makefileに以下のパッチを当てる
*** Makefile.orig       2011-04-14 18:07:12.000000000 +0900
--- Makefile    2011-05-26 02:30:51.000000000 +0900
***************
*** 23,33 ****
  #LIB_GETTEXT=-lintl
  
  #comment the following 5 lines to disable my_sql support
! #MYSQL_LIBS= -lmysqlclient -lz
! #MYSQL_CFG=/usr/bin/mysql_config
! #MYSQL_LIBS=-L'/usr/lib/mysql' -lmysqlclient -lz -lcrypt -lnsl -lm
! #MYSQL_INCLUDES=-I'/usr/include/mysql'
! #SQL_DECLARE=-D SQL_LIBS
  
  #for "buggy" implementations of sigaction
  #BUGGY_SIGACTION=-DBUGGY_SIGACTION
--- 23,33 ----
  #LIB_GETTEXT=-lintl
  
  #comment the following 5 lines to disable my_sql support
! MYSQL_LIBS= -lmysqlclient -lz
! MYSQL_CFG=/usr/bin/mysql_config
! MYSQL_LIBS=-L'/usr/lib/mysql' -lmysqlclient -lz -lcrypt -lnsl -lm
! MYSQL_INCLUDES=-I'/usr/include/mysql'
! SQL_DECLARE=-D SQL_LIBS
  
  #for "buggy" implementations of sigaction
  #BUGGY_SIGACTION=-DBUGGY_SIGACTION
***************
*** 44,50 ****
  OPT_OK=-ffast-math -fomit-frame-pointer -finline-functions -fexpensive-optimizations
  OPTIMISATIONS=$(OPT_OK) $(OPT_TEST)
  #available architectures
! INTEL_PENTIUM=-march=i586 -maccumulate-outgoing-args -DCPU=586 -malign-double #this is for pentium
  ULTRA_SPARC=-mcpu=v8 -fdelayed-branch -m32 #-m64 #this is for Ultra Sparc
  POWERPC_G4=-mcpu=powerpc -mtune=7400 -maltivec -mabi=altivec
  ARM_XSCALE=-mcpu=xscale 
--- 44,50 ----
  OPT_OK=-ffast-math -fomit-frame-pointer -finline-functions -fexpensive-optimizations
  OPTIMISATIONS=$(OPT_OK) $(OPT_TEST)
  #available architectures
! INTEL_PENTIUM=-maccumulate-outgoing-args #this is for pentium
  ULTRA_SPARC=-mcpu=v8 -fdelayed-branch -m32 #-m64 #this is for Ultra Sparc
  POWERPC_G4=-mcpu=powerpc -mtune=7400 -maltivec -mabi=altivec
  ARM_XSCALE=-mcpu=xscale
  • コマンドラインで mysql のパスワードを渡すことになるのだが,それが ps コマンドや /proc から丸見えになる.それを避けるために initializations.c にパッチを当てる.
*** initializations.c.orig	2011-04-14 18:08:06.000000000 +0900
--- initializations.c	2017-01-29 12:26:00.768340144 +0900
***************
*** 278,283 ****
--- 278,286 ----
  				return EXIT_FAILURE;
  			}
  			sscanf(argv[i],"%s",settings->sql_password);
+ 			/* destroy password in argv[i] */
+ 			for (char *p = argv[i]; *p; p++)
+ 				*p = 'x';
  			continue;
  		}
  		#endif
  • ビルドする
$ make clean
$ make
  • /usr/local/bin にコピーする
$ sudo cp -p gm4lin /usr/local/bin

MySQLの設定

  • mysqlにexperimentデータベースを作成する
$ mysqladmin -u root -p create experiment
  • mysqlのexperimentデータベースにradiationテーブルを作成する
$ mysql -u root -p experiment
mysql> create table radiation (device tinyint, dose double, data double, dataunits varchar(3), stamp timestamp);
  • mysqlにアクセスするユーザを作る
$ mysql -u root -p experiment
mysql> create user 'USER'@'localhost' identified by 'PASSWORD';
mysql> grant all privileges on *.* to 'USER'@'localhost';

USER と PASSWORD は適当に指定.後で使う.

ドライバのデーモン化

  • ディレクトリ /etc/gm4lin を作る.
  • /etc/gm4lin/gm4lindを以下の内容で作る.必要に応じて変数定義や起動オプションを変更する.
#!/bin/bash
. /lib/lsb/init-functions

RETVAL=0
DRIVER=/usr/local/bin/gm4lin
DAEMON_UID=$(getent passwd gm10 | cut -d : -f 3)

MYSQL_HOST=localhost
MYSQL_USER=`cat /etc/gm4lin/mysql.user`
MYSQL_PASS=`cat /etc/gm4lin/mysql.password`
MYSQL_DATA=$MYSQL_USER@localhost:experiment:radiation

case "$1" in
    start)
        log_daemon_msg "Starting $DRIVER radiation detectors driver"
        $DRIVER --device /dev/gm10- \
                --number 1 --start 1 --no-file-log \
                --mysql $MYSQL_DATA --passwd $MYSQL_PASS \
                --uid $DAEMON_UID \
                --daemon --syslog
        RETVAL=$?
        ;;

    stop)
        log_daemon_msg "Stopping $DRIVER radiation detectors driver"
        kill -TERM `pidofproc $DRIVER`
        RETVAL=$?
        ;;

    restart)
        $0 stop
        $0 start
        RETVAL=$?
        ;;

    status)
        pidofproc $DRIVER >/dev/null
        RETVAL=$?
        if [ $RETVAL -eq 0 ]; then
            log_success_msg "$DRIVER is runnning"
        else
            log_failure_msg "$DRIVER is not running"
        fi
        ;;

*)
        printf "Usage: $DRIVER {start|stop|restart|status}\n"
        exit 1
esac

exit $RETVAL
  • /etc/gm4lin/mysql.user と /etc/gm4lin/mysql.password に上で決めたMySQLのユーザ名とそのパスワードを書いてセーブする.他人に読めないようにする.
$ sudo chown root.root mysql.user mysql.password
$ sudo chmod 600 mysql.user mysql.password
  • /etc/gm4lin/gm4lind へ /etc/init.d からシンボリックリンクを張る
$ cd /etc/init.d
$ sudo ln -s /etc/gm4lin/gm4lind .
  • 最後に gm4lind をアクティブにする.
$ sudo sysv-rc-conf gm4lind on

ちゃんと動いたかどうか /var/log/daemon.log で確認.

アプリケーション

グラフ化

数値はCPM (count per minute) なので,Sv/hに変換したい.Cs137でキャリブレーションされた値が http://www.blackcatsystems.com/GM/converting_CPM_mRhr.html にある.要するに CPM を 120 で割れば μSv/h になる.

時系列データなので、Cacti で Round Robin Database にしてグラフ化して 公開

Twitter bot化

PerlによるTwitter botの作り方に従って放射線量を呟く twitter bot @machida_radを作成. その後,管理人の引越しに伴い,@mita_radに移動.

呟き方は@nihonbashi_radを真似っこ。

ビルド・デプロイ

ビルドは github から直接 HTML_ROOT/gm10 に clone するだけ。Web Server (Apache2), PHP, Cacti/rrdtool に依存している。

cron に tweet/tweet-radiation スクリプトを1時間おきに実行させる。このスクリプトに -d フラグをつけて実行すると、ツイートする内容をプリントアウトする(実際にはツイートしない)。

参考文献