若松ガイガー 20151231版 公開

 本年の残り僅かになりました。
 前回2014年12月にファーム更新して以来、ずっと無更新が続いていたので、「もう終わったのかい?」って方も大勢おられたかと思います。
 2015年の日付を冠したファームをリリースしないまま2015年が終わるのも不本意なので、密かにコチョコチョ弄ってた部分をまとめて今回リリースすることに致します。


20151231版 ファームウェア一式
まっさらな mbed に導入する前提で全てのファイルを同梱していますが、旧バージョンからアップグレードされる方は geiger.bin のみの上書きで大丈夫です。


20141230版との機能比較 (20141230版の仕様はこちらを参照ください)

  • MQTT Broker へ測定値を Publish する機能を追加
  • 起動時に MACアドレスmac.txt に出力
  • メンテナンスモードで MACアドレス を液晶表示

注意


 以前に本家のオリジナルファーム Ver1.0 を利用されていた方の mbed 内に GEIGER-2.bin というタイムスタンプ 2008/01/01 のファイルが出来ている場合があります。


 2012/1/7頃に実施された自動アップデートによってダウンロードされたプログラムのようですが、mbed の中に拡張子 BIN のファイルが複数あると意図せぬ誤作動が起きやすくなりますので、私のファームを導入する前に GEIGER-2.BIN は予め削除しておいて下さい。


 特にタイムスタンプが変な(新しいのに古い日付の) BIN ファイルが混じると理解困難な不可解な現象(意図したファームが動いてくれない)が起きやすくなりますので、そんなときには、全てのファーム(拡張子が BIN)を削除して再起動させ、その後に目的の BIN を1つ入れて再起動し直して下さい。


 タイムスタンプが変なファームによって mbed の内部で行われているバージョン管理が狂ってしまったとき、BINファイルがひとつもない状態にして起動させることで狂った管理テーブルがクリアされるようです。

MQTT Broker へ測定値を Publish する機能を追加



 ESP8266 向けに MQTT クライアントを実装する作業は概ね完了してますが、しばらく前までは mbed にドップリ嵌っていたわけで、順序としては mbed のほうを先にしないといけないはず・・・ということで、若松ネットガイガーのほうを先に MQTT クライアント対応しました。


 MQTT とはなんぞや?という点については各自ググって頂くとして、ザックリ言えば測定値を定期的に送信するために便利なプロトコル、ってくらいの理解でいいかと思います。
 ESP8266 で実装した MQTT では Publish のほか Subscribe もやって、双方向通信やってみましたが、若松ネットガイガーでは Publish の単方向のみです。


 mbed のフォーラムで公開されている MQTT クライアントライブラリを使って手軽にできるかと思いきや、動作が限りなくボロボロな状態(関数のリザルトの使い方を間違えているので、これじゃ動作するわけがないだろ、的なレベル)でして、デバッグしているうちに、MQTT のプロトコル仕様を概ね理解してしまう羽目に。。。
 そもそも根本的な元バグがあるうえに、それを修正しても最大メッセージ長127バイトに制限されていた公開ライブラリを16383バイトまで拡張したりして、ようやくまともに使える代物に致しました。


■env.ini

項目名 目的 指定方法 省略時
MQTT1(MQTTと同義) MQTT 設定ファイル ファイル名 未使用
MQTT2 MQTT 設定ファイル ファイル名 未使用
MQTT3 MQTT 設定ファイル ファイル名 未使用


 これまで同様に MQTT設定ファイル を先に作っておいて、それを env.ini の中で指定することで有効になります。


■MQTT 設定ファイル

項目名 目的 省略時
host MQTT Broker のホスト名 必須
username 接続時に認証するユーザー名(クリアテキスト) 匿名接続
password 接続時に認証するパスワード(クリアテキスト) 匿名接続
clientID 接続時に名乗るクライアント名 MACアドレス
port Brokerのポート番号 1883
topic Publish先のTopic 必須
payload Publishする内容 必須
retain 1:Broker に対して最終送信値の記録を要求
0:要求しない
0:要求しない
header payloadの内容(書式)を最初にPublishするときのTopic名 Publishしない
interval Publish間隔(分数) 必須
delayStart 初回のPublish遅延(分数) 必須


 テンプレート(書き方のひな型)を MQTT.CFG に同梱しておきましたので併せて参照ください。


 QoS は 0 で固定です。(再送処理はしない)
 header に何か記述して payload の内容を送信するときは、その Publish については RETAIN=1 で送信しますので、途中からサブスクライブする端末でも書式を受け取ります。


 使用する Broker(サーバー) に依るかもしれませんが、Mosquitto を使った場合だと、同一クライアント名で複数接続すると古い接続が自動切断されるため、クライアント名はユニークであることが望ましいです。


 ところで何の断りもなく Mosquitto とか書きましたが、フリーの MQTT Broker です。
 自前の Broker を準備できない方は、とり急ぎ 時雨堂さんの Sango サービス あたり試用なさってはいかがでしょうか。


起動時に MACアドレスmac.txt に出力
メンテナンスモードで MACアドレス を液晶表示



 MQTT Broker へ Publish するにあたり、ユニークなクライアント名が必要なことから、MACアドレスを名乗るのが最も世話ないわけですが、私の環境では ヤマハルーター RT58i が DHCPサーバー やっているので、そこで show status dhcp すれば一目瞭然なものの、やっぱ面倒だということに今さら気が付きました。


 そこで起動時に自身の MACアドレス をローカルフラッシュ内に mac.txt というファイル名で落とすようにしました。
 PC で繋いで、その mac.txt をメモ帳で開ければ、その mbed の MACアドレス が一目瞭然という寸法です。


 メンテナンスモード(スイッチ押しながら起動)においても、液晶に MACアドレス を表示するようにしました。