XBee イベントデータを FAX で自動送信

DeviceServer にFAX で送信する機能を追加しました。これを利用して、リモートXBee デバイスから送信されたセンサーデータを FAX で自動送信する例を紹介したいと思います。

XBee 自身には I/O や A/D 変換機能がありますので、これを使用すると簡単にセンサーネットワークができます。例えば、XBee に スイッチのみ接続したリモートデバイスで I/O イベントを送信してみます。

この状態でサーバー側 で XBee I/O イベントデータを受信します。イベントハンドラは下記の様に設定しておきます。DeviceServer でイベント受信時に実行されるイベントハンドラ(XBEE_IO_DATA)では、FAX 送信を行うスクリプトを別スレッドで起動するだけの処理にしています。

file_id = "XBEE_IO_DATA"

--[[
******************************************************************************
*イベントハンドラスクリプト実行時間について*

一つのスクリプトの実行は長くても数秒以内で必ず終了するようにしてください。
処理に時間がかかると、イベント処理の終了を待つアラームデバイスで、
タイムアウトが発生します。

また、同時実行可能なスクリプトの数に制限があるため、他のスクリプトの実行開始が
待たされる原因にもなります。

******************************************************************************

XBEE_IO_DATA スクリプト起動時に渡される追加パラメータ

---------------------------------------------------------------------------------
キー値			値		            									値の例
---------------------------------------------------------------------------------

APIType			フレームデータ中のAPI Type(16進数2桁)					83

SourceAddress	フレームデータ中のSourceAddress
				16bit アドレスの場合(16進数4桁)							0A01
				64bit アドレスの場合(16進数16桁)						0013A200404AC397

NodeIdentifier	XBee デバイスの NodeIdentifier。
				DeviceServer に保持されたマスターファイルを使用して、
				SourceAddress から変換した値が設定される。				Device1
				マスターにNodeIdentifier未登録の場合は"" が設定される

RSSI			フレームデータ中のRSSI(16進数2桁)						45

Options			フレームデータ中Options(16進数2桁)						00

SAMPLE_COUNT	I/O データのサンプル数									1

SAMPLE_DIO		I/O データ中のサンプル対象となったDIOビット番号リスト
				(10進数、カンマ区切り)									0,1,4

SAMPLE_ADC		I/O データ中のサンプル対象となったADCビット番号リスト
				(10進数、カンマ区切り)									2,3

SAMPLE_<Sample#>_<"DIO"|"ADC">_<Bit#>

				I/O サンプルデータ値。
				DIO の場合は、High で "1"、Low で "0"。					1
				ADC の場合は 10進数。									1023

				<Sample#> には 最大、SAMPLE_COUNT まで 1から順番に
				インクリメントされた値が入る。

				<"DIO"|"ADC">は、I/O サンプルデータが ADC
				もしくは、DIO のどちらであるかを示す。

				<Bit#>は、サンプルデータのビット番号。10進数。

		例:"SAMPLE_1_ADC_0" は、第一サンプルデータ中の #0番ポートのADC変換値を示す。

]]

if not script_fork_exec("XBEE_IO_EVENT_FAX",g_params) then error() end

FAX 送信を行うスクリプト (XBEE_IO_EVENT_FAX) は下記の様に作成しておきます。このスクリプトでは、同じ リモートXBee デバイスから連続して受信したイベントデータに対して FAX を送信しないようにする機能も付けています。(同一デバイスのイベントデータを10 分以内に受信した場合には FAX 送信しない)

file_id = "XBEE_IO_EVENT_FAX"

--[[
*********************************************************************
パラメータで渡された XBEE_IO_DATA イベントデータを FAX で送信する
*********************************************************************
]]
log_msg("start..",file_id)

-------------------------------------
-- FAX送信先設定
-------------------------------------
local header = { 	RecipientFax = "0123456789",
					RecipientName = "送信先名前",
           			Subject = "監視システムアラームFAX",
					DocumentName = "ドキュメント名",
					SenderTel = "999-000-222",
					SenderFax = "123-456-789",
					SenderName = "送信者氏名"
				}

-------------------------------------
-- クリティカルセクション開始
-------------------------------------
local cstat,handle = critical_section_enter("FaxSendLapseTimeCheck",10000);
if not cstat then error() end

--------------------------------------------------------
-- 前回 FAX送信したときからの経過時間を計測する
-- XBee デバイス毎に経過時間測定用のフラグを使用するする
--------------------------------------------------------
local t = os.time()
local time_check_key = "PREV_FAX_TIME_" .. g_params["SerialNumber"]
local stat,prev_t = get_shared_data(time_check_key)
if not stat then error() end
if (prev_t ~= "") then
	-----------------------------------------------------------
	-- 前回の FAX送信から 10 分以内の場合には送信しない
	-- ログにのみメッセージを残す
	-----------------------------------------------------------
	local diff_t = os.difftime(t,tonumber(prev_t));
	if diff_t < 600 then
		log_msg("** 連続 FAX送信をキャンセルしました **",file_id)
		critical_section_leave(handle)
		return
	end
end

--------------------------------------------------------
-- 次回 FAX送信時の経過時間計測用に現在時刻を保存する
--------------------------------------------------------
if not set_shared_data(time_check_key,tostring(t)) then error() end

-------------------------------------
-- クリティカルセクション終了
-------------------------------------
if not critical_section_leave(handle) then error() end

-------------------------------------
-- FAX送信
-- キー名でソートしてから送信する
-------------------------------------
local body = {}
table.insert(body,"** XBee I/O event data **")
table.insert(body,"")
for key,val in orderedPairs(g_params) do
	table.insert(body,string.format("xbee_io[%s] = %s",key,val))
end
if not fax_submit(header,body) then error() end

XBee に接続したスイッチを操作するとサーバーからFAX が自動的に送信されます。FAX の内容は XBee I/O イベントデータをフォーマットして見易くした配列形式のテキストです。実際に送信された FAX は下記になります。

FAX 送信は サーバーPC にセットアップされている Microsoft FAX サービスを使用しています。DeviceServer や FAX サービスはサービスプログラムとして動作しますので、サーバーPC でログインしていなくても問題ありません。今回紹介したスクリプトでは、複数の リモートXBeeからのイベントデータをFAX送信する場合にも対応しています。

それではまた。

 

 

 

 

 

 

 

 

 

 

コメントは受け付けていません。