[ファイアウォール]


<Interop2010(その20)-つぶやくルーターX10( @X10_1gou )のLuaスクリプト #yamaha_X10>

[ファイアウォール] Interop2010(その20)-つぶやくルーターX10( @X10_1gou )のLuaスクリプト #yamaha_X10

ヤマハの平野です。

今回は、Interop Tokyo 2010で参考出展したつぶやくルーター「@X10_1gou」のLuaスクリプト大公開です。

【注意事項】

  • Luaスクリプト機能における「HTTPクライアント機能拡張」が利用できるファームウェアは、2010年6月時点で一般公開されておりません。
    ※今後のリリース時期は、未定です。
  • 今回公開したLuaスクリプトのTwitterアクセスでは、Basic認証を利用しているため、2010年 6月30日 8月16日以降はご利用いただけません。
    ※OAuth認証もしくはxAuth認証への対応は、未定です。
  • 楽しめたとか、つまらなかったとか、わからなかったとか、ビジネスに生かせる可能性を感じられたとか、セキュリティはどうすんだとか、ご意見がありましたら、rt100i-users当blogへのコメントなどお願いします。

@X10_1gouのLuaスクリプト構成】

@X10_1gouでは、microSDメモリの挿抜、USBメモリの挿抜、携帯データ通信端末の挿抜、LANポートのlink up/down、および、DOWNLOADボタンの長押しを識別し、それぞれの操作に応じたつぶやきを実現していました。これらの機能を実現するために5つのLuaスクリプトを並列に走らせておりました。

Luaスクリプトで並列プログラミングを行うことで、ログに対する処理が単純化され、スクリプトもコンパクトに実現できています。これにより、ログの取りこぼしなども減らすことができております。

補足:
ルーター上で実行されるLuaスクリプトはルーティング処理と比較して優先順位が下げられておりますので、複雑な処理を行わせると取りこぼしなどの状況も発生する可能性があります。優先順位は、ルーターが行うべき本来の仕事がルーティングであるという考え方で決められております。

イメージ図は、こちらをご覧ください。

X10_1gou_script

基本的な4つのLuaスクリプト(attach_1gou.lua ,detach_1gou.lua ,lan1_1gou.lua ,dl_watch_1gou.lua )は、並列に走っており、それぞれの特定のログを待ち、ログが発生したら、該当するつぶやきを実現しています。

残る1つのLuaスクリプト(dl_btn.lua )は、DOWNLOADボタンを長押ししたときに実行されるLuaスクリプトで、長押しされたとき、特定のキーワードをログに記録し、DOWNLOADボタンに対応するつぶやきを実現するLuaスクリプト(dl_watch_1gou.lua)への「DOWNLOADボタンが押された」というメッセージにしています。

@X10_1gouのログ待ちLuaスクリプトの基本構造】

rt.syslogwatch()関数で特定パターンのログを待ち、帰ってきたら、rt.httprequest()関数で該当するつぶやきをTwitterに送信します。それを永遠と繰り返します。

Syslogwatch

@X10_1gouのLuaスクリプトのポイント】

  • 漢字コード:
    ヤマハルーターで採用している漢字コードは、シフトJISなのですが、Twitterで利用できる文字コードは、UTF-8です。しかも、HTTP APIであるためURLエンコーディングも必要なので、UTF-8 + URLエンコーディングされた漢字(文字列)を埋め込んでいます。
  • Twitterの認証方式:
    Luaスクリプト機能で搭載予定のHTTPクライアント機能では、Basic認証しか対応しておりません。ヤマハルーターで実際にTwitterにつぶやく場合には、OAuth認証もしくはxAuth認証に対応する必要がありますが、現在の対応予定は未定です。
  • Twitterのアクセス間隔制限について:
    プログラム上で、60秒に1回のアクセス制限をケアしておりませんから、実行する場合には、「操作」をしたら、必ず「つぶやきの確認」を実施する必要があります。

@X10_2gouのLuaスクリプトのポイント】

  • @X10_1gou@X10_2gouは、つぶやきの内容を博多弁に変更しています。
  • DOWNLOADボタンに対応するつぶやきの数は、増減可能ですから、博多弁らしい独自のつぶやきも追加しました。

【技術情報】

【Luaスクリプト一覧】

attach_1gou.lua】  (354行)

--[[

 ● 携帯端末/USBメモリ/microSDの接続を監視するスクリプト(attach_1gou.lua)

 ・携帯端末/USBメモリ/microSDの接続時に出力されるSYSLOGを監視して、
  特定のログが検出されたら接続されたデバイスを判定し、デバイスが
  接続された旨をtwitterに投稿します。

 ・このファイルをRTFSに保存し、schedule atコマンドで実行してください。
  schedule at 1 startup * lua /attach_1gou.lua
 ・必ず detach_1gou.lua とペアで実行してください。
 ・複数実行しないでください。
 ・スクリプトを停止するときは terminate lua コマンドを実行してください。
  再実行するには lua コマンドで実行します。

 <ノート>
 ・つぶやきたいことは、UTF-8に変換後、URLエンコーディングする必要があります。
  このサイトなどで変換してください。(http://hogehoge.tk/tool/)
 ・本スクリプトファイルを編集する場合、文字コードは必ず Shift-JIS を使用してください。

]]

--------------------------------------------------
-- グローバル変数の設定                         --
--------------------------------------------------

--------------------------##  設定値  ##--------------------------------

-- つぶやく文字列テーブル
twt_tbl = {
	-- 携帯データ通信端末が装着されました。
	comm_ok = "%E6%90%BA%E5%B8%AF%E3%83%87%E3%83%BC%E3%82%BF%E9%80%9A%E4%BF%A1%E7%AB%AF%E6%9C%AB%E3%81%8C%E8%A3%85%E7%9D%80%E3%81%95%E3%82%8C%E3%81%BE%E3%81%97%E3%81%9F%E3%80%82",
	-- 携帯データ通信端末は、1台しか接続できません。
	comm_ng = "%E6%90%BA%E5%B8%AF%E3%83%87%E3%83%BC%E3%82%BF%E9%80%9A%E4%BF%A1%E7%AB%AF%E6%9C%AB%E3%81%AF%E3%80%811%E5%8F%B0%E3%81%97%E3%81%8B%E6%8E%A5%E7%B6%9A%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82",
	-- 大容量USBメモリが装着されました。
	usb_hc = "%E5%A4%A7%E5%AE%B9%E9%87%8FUSB%E3%83%A1%E3%83%A2%E3%83%AA%E3%81%8C%E8%A3%85%E7%9D%80%E3%81%95%E3%82%8C%E3%81%BE%E3%81%97%E3%81%9F%E3%80%82",
	-- USBメモリが装着されました。
	usb_nm = "USB%E3%83%A1%E3%83%A2%E3%83%AA%E3%81%8C%E8%A3%85%E7%9D%80%E3%81%95%E3%82%8C%E3%81%BE%E3%81%97%E3%81%9F%E3%80%82",
	-- microSDHCメモリが装着されました。
	sd_hc = "microSDHC%E3%83%A1%E3%83%A2%E3%83%AA%E3%81%8C%E8%A3%85%E7%9D%80%E3%81%95%E3%82%8C%E3%81%BE%E3%81%97%E3%81%9F%E3%80%82%0D%0A",
	-- microSDメモリが装着されました。
	sd_nm = "microSD%E3%83%A1%E3%83%A2%E3%83%AA%E3%81%8C%E8%A3%85%E7%9D%80%E3%81%95%E3%82%8C%E3%81%BE%E3%81%97%E3%81%9F%E3%80%82%0D%0A"
}

-- twitterの設定
user = "(TwitterのユーザーID)"
pass = "(Twitterのパスワード)"

----------------------##  設定値ここまで  ##----------------------------

-- httpリクエストテーブル
http_t = {
	url = "http://twitter.com/statuses/update.xml",
	method = "POST",
	auth_type = "basic",
	auth_name = user,
	auth_pass = pass,
	content_type = "application/x-www-form-urlencoded"
}

--------------------------------------------------
-- つぶやく関数                                 --
--------------------------------------------------
function tweet(str)
	local r

	http_t.post_text = "status=" .. str .. time_stamp()
	r = rt.httprequest(http_t)

	if (r.code ~= 200) then
		print("[twitter] Failed to update status.")
	end
end

--------------------------------------------------
-- twitterへの接続テストをする関数                
--------------------------------------------------
function test_tweet()
	local t = {
		url = "http://twitter.com/help/test.xml",
		method = "GET"
	}

	r = rt.httprequest(t)
	return r.code
end

--------------------------------------------------
-- 起動時にデバイスの状況を取得する関数         --
--------------------------------------------------
function init_status()
	local rtn, str
	local status = {0, 0, 0}

	-- syslog debug on を設定
	assert(rt.command("syslog debug on"), "スクリプトの初期化に失敗しました。")

	-- usb1を取得
	status[1] = usb_memory(1, true)
	if (status[1] == 0) then
		status[1] = mobile(1, true)
		if (status[1] == 2) then
			print("携帯データ通信端末が接続されています。")
		end
	end

	-- usb2を取得
	status[2] = usb_memory(2, true)
	if (status[2] == 0) then
		status[2] = mobile(2, true)
		if (status[2] == 2) then
			if (status[1] == 2) then
				print("携帯データ通信端末は1台しか接続できません。")
			else
				print("携帯データ通信端末が接続されています。")
			end
		end
	end

	-- sdを取得
	status[3] = sd_memory(true)

	-- configに接続状態を保存
	save_status(status)

	-- twitterへの接続チェック
	if (test_tweet() ~= 200) then
		print ("ネットワーク接続を確認してください。")
	end

	-- 初期化終了
	print("USBデバイスとmicroSDの監視を開始します。")
end

--------------------------------------------------
-- デバイスの状況をconfigに保存する関数         --
--------------------------------------------------
function save_status(status)
	local rtn, str
	local num = status[1] * 100 + status[2] * 10 + status[3]

	rtn, str = rt.command("set lua_dev_status=" .. tostring(num))
	assert(rtn)
end

--------------------------------------------------
-- デバイスの状況をconfigから取得する関数       --
--------------------------------------------------
function load_status()
	local rtn, str, num
	local cmd = "show config"
	local ptn = "set lua_dev_status=(%d+)"
	local status = {0, 0, 0}

	rtn, str = rt.command(cmd)
	if (rtn) and (str) then
		num = str:match(ptn)
		if (num) then
			status[1] = num / 100
			num = num % 100
			status[2] = num / 10
			status[3] = num % 10
		end
	end

	return status
end

--------------------------------------------------
-- 携帯端末の接続を確認する関数                 --
--------------------------------------------------
function mobile(port, init)
	local rtn, str
	local cmd = "show status usbhost " .. tostring(port)
	local ptn = "電話番号%:%s+%d+"

	for i = 1, 30 do
		rtn, str = rt.command(cmd)
		if (rtn) and (str) then
			if (str:match(ptn)) then
				return 2
			end
		end

		if (not init) then
			rt.sleep(1)
		end
	end
	
	return 0
end

--------------------------------------------------
-- USBメモリの接続時の処理                      --
--------------------------------------------------
function usb_memory(port, init)
	local rtn, str, size
	local cmd = "show status usbhost " .. tostring(port)
	local ptn = "記憶容量%:%s+(%d+) KB"

	if (not init) then
		rt.sleep(1)
	end

	rtn, str = rt.command(cmd)
	if (rtn) and (str) then
		size = str:match(ptn)
		if (size) then
			size = tonumber(size)

			if (size > 2100000) then
				if (init) then
					print("USBポートに大容量メモリが装着されています。")
				else
					tweet(twt_tbl.usb_hc)
					print("USBポートに大容量メモリが装着されました。")
				end
			else
				if (init) then
					print("USBポートにメモリが装着されています。")
				else
					tweet(twt_tbl.usb_nm)
					print("USBポートにメモリが装着されました。")
				end
			end

			return 1
		end
	end
	
	return 0
end

--------------------------------------------------
-- microSD/microSDHCの接続時の処理              --
--------------------------------------------------
function sd_memory(init)
	local rtn, str, size
	local cmd = "show status sd"
	local ptn = "記憶容量%:%s+(%d+) KB"

	if (not init) then
		rt.sleep(2)
	end

	rtn, str = rt.command(cmd)
	if (rtn) and (str) then
		size = str:match(ptn)
		if (size) then
			size = tonumber(size)

			if (size > 3000000) then
				if (init) then
					print("microSDHCメモリが装着されています。")
				else
					tweet(twt_tbl.sd_hc)
					print("microSDHCメモリが装着されました。")
				end
			else
				if (init) then
					print("microSDメモリが装着されています。")
				else
					tweet(twt_tbl.sd_nm)
					print("microSDメモリが装着されました。")
				end
			end

			return 1
		end
	end

	return 0
end

--------------------------------------------------
-- 接続を検出し、デバイス毎に処理する関数       --
--------------------------------------------------
ptn_t = {
	"USB (%w+) device is attached to Port(%d)",
	"micro(%w+) card is attached"
}

function update_status(log)
	local rtn, str
	local device, port, val
	local status = load_status()

	for i, v in ipairs(ptn_t) do
		device, port = log:match(v)

		-- 携帯データ通信端末
		if (device == "communication") then
			port = tonumber(port)
			val = mobile(port, false)
			if (status[port] ~= val) then
				status[port] = val
				if ((status[1] + status[2]) < 4) then
					tweet(twt_tbl.comm_ok)
					print("携帯データ通信端末が接続されました。")
				else
					tweet(twt_tbl.comm_ng)
					print("携帯データ通信端末は、1台しか接続できません。usb" .. tostring(port) .. "の端末を切断してください。")
				end
				save_status(status)
				return
			end

		-- USBメモリ
		elseif (device == "storage") then
			port = tonumber(port)
			val = usb_memory(port, false)
			if (status[port] ~= val) then
				status[port] = val
				save_status(status)
				return
			end

		-- microSDカード
		elseif (device == "SD") then
			val = sd_memory(false)
			if (status[3] ~= val) then
				status[3] = val
				save_status(status)
				return
			end
		end
	end
end

--------------------------------------------------
-- 日付と時刻、ハッシュタグ関数を返す関数       --
--------------------------------------------------
function time_stamp()
	local t = os.date("*t")
	return string.format("%%28%02d%%2F%02d+%02d%%3A%02d%%3A%02d%%29+%%23yamaha_X10", 
		t.month, t.day, t.hour, t.min, t.sec)
end

--------------------------------------------------
-- メイン                                       --
--------------------------------------------------
local ptn = "is attached"
local rtn, str, num

init_status()

while (true) do
	rtn, str = rt.syslogwatch(ptn)
	if (rtn) and (str) then
		update_status(str[1])
	end
end

print("end")

detach_1gou.lua】 (263行)

--[[

 ● 携帯端末/USBメモリ/microSDの切断を監視するスクリプト(detach_1gou.lua)

 ・携帯端末/USBメモリ/microSDの切断時に出力されるSYSLOGを監視して、
  特定のログが検出されたら切断されたデバイスを判定し、
  USBポート/microSDスロットが空いた旨をtwitterに投稿します。

 ・このファイルをRTFSに保存し、schedule atコマンドで実行してください。
  schedule at 2 startup * lua /detach_1gou.lua
 ・必ず attach_1gou.lua とペアで実行してください。
 ・複数実行しないでください。
 ・スクリプトを停止するときは terminate lua コマンドを実行してください。
  再実行するには lua コマンドで実行します。

 <ノート>
 ・つぶやきたいことは、UTF-8に変換後、URLエンコーディングする必要があります。
  このサイトなどで変換してください。(http://hogehoge.tk/tool/)
 ・本スクリプトファイルを編集する場合、文字コードは必ず Shift-JIS を使用してください。

]]

--------------------------------------------------
-- グローバル変数の設定                         --
--------------------------------------------------

--------------------------##  設定値  ##--------------------------------

-- つぶやく文字列テーブル
twt_tbl = {
	-- USBスロットが空きました。
	usb_dis = "USB%E3%82%B9%E3%83%AD%E3%83%83%E3%83%88%E3%81%8C%E7%A9%BA%E3%81%8D%E3%81%BE%E3%81%97%E3%81%9F%E3%80%82",
	-- microSDスロットが空きました。
	sd_dis ="microSD%E3%82%B9%E3%83%AD%E3%83%83%E3%83%88%E3%81%8C%E7%A9%BA%E3%81%8D%E3%81%BE%E3%81%97%E3%81%9F%E3%80%82"
}

-- twitterの設定
user = "(TwitterのユーザーID)"
pass = "(Twitterのパスワード)"

----------------------##  設定値ここまで  ##----------------------------

-- httpリクエストテーブル
http_t = {
	url = "http://twitter.com/statuses/update.xml",
	method = "POST",
	auth_type = "basic",
	auth_name = user,
	auth_pass = pass,
	content_type = "application/x-www-form-urlencoded"
}

-- USBコマンドテーブル
usbcmd_tbl = {
	"no pp bind usb",
	"no mobile use usb"
}

--------------------------------------------------
-- つぶやく関数                                 --
--------------------------------------------------
function tweet(str)
	local r

	http_t.post_text = "status=" .. str .. time_stamp()
	r = rt.httprequest(http_t)

	if (r.code ~= 200) then
		print("[twitter] Failed to update status.")
	end
end

--------------------------------------------------
-- twitterへの接続テストをする関数                
--------------------------------------------------
function test_tweet()
	local t = {
		url = "http://twitter.com/help/test.xml",
		method = "GET"
	}

	r = rt.httprequest(t)
	return r.code
end

--------------------------------------------------
-- 現在のデバイスの状況を取得する関数           --
--------------------------------------------------
function get_status()
	local rtn, str
	local status = {0, 0, 0}
	
	-- usb1を取得
	status[1] = usb_memory(1)
	if (status[1] == 0) then
		status[1] = mobile(1)
	end

	-- usb2を取得
	status[2] = usb_memory(2)
	if (status[2] == 0) then
		status[2] = mobile(2)
	end

	--sdを取得
	status[3] = sd_memory()

	return status
end

--------------------------------------------------
-- デバイスの状況をconfigに保存する関数         --
--------------------------------------------------
function save_status(status)
	local rtn, str
	local num = status[1] * 100 + status[2] * 10 + status[3]

	rtn, str = rt.command("set lua_dev_status=" .. tostring(num))
	assert(rtn)
end

--------------------------------------------------
-- デバイスの状況をconfigから取得する関数       --
--------------------------------------------------
function load_status()
	local rtn, str, num
	local cmd = "show config"
	local ptn = "set lua_dev_status=(%d+)"
	local status = {0, 0, 0}

	rtn, str = rt.command(cmd)
	if (rtn) and (str) then
		num = str:match(ptn)
		if (num) then
			status[1] = num / 100
			num = num % 100
			status[2] = num / 10
			status[3] = num % 10
		end
	end

	return status
end

--------------------------------------------------
-- 携帯端末の接続を確認する関数                 --
--------------------------------------------------
function mobile(port)
	local rtn, str
	local cmd = "show status usbhost " .. tostring(port)
	local ptn = "電話番号%:%s+%d+"

	rtn, str = rt.command(cmd)
	if (rtn) and (str) then
		if (str:match(ptn)) then
			return 2
		end
	end
	
	return 0
end

--------------------------------------------------
-- 携帯端末設定のあるUSBポートを取得する        --
--------------------------------------------------
function get_mobile_usbport()
	local rtn, str, port
	local ptn = "pp bind usb(%d+)"
	local cmd = "show config"

	rtn, str = rt.command(cmd)
	if (rtn) and (str) then
		port = str:match(ptn)
		if (port) then
			return tonumber(port)
		end
	end

	return 0
end

--------------------------------------------------
-- USBメモリの接続を確認する関数                --
--------------------------------------------------
function usb_memory(port)
	local rtn, str, size
	local cmd = "show status usbhost " .. tostring(port)
	local ptn = "記憶容量%:%s+(%d+) KB"

	rtn, str = rt.command(cmd)
	if (rtn) and (str) then
		size = str:match(ptn)
		if (size) then
			return 1
		end
	end
	
	return 0
end

--------------------------------------------------
-- SDメモリの接続を確認する関数                 --
--------------------------------------------------
function sd_memory()
	local rtn, str, size
	local cmd = "show status sd"
	local ptn = "記憶容量%:%s+(%d+) KB"

	rtn, str = rt.command(cmd)
	if (rtn) and (str) then
		size = str:match(ptn)
		if (size) then
			return 1
		end
	end

	return 0
end

--------------------------------------------------
-- 日付と時刻、ハッシュタグ関数を返す関数       --
--------------------------------------------------
function time_stamp()
	local t = os.date("*t")
	return string.format("%%28%02d%%2F%02d+%02d%%3A%02d%%3A%02d%%29+%%23yamaha_X10", 
		t.month, t.day, t.hour, t.min, t.sec)
end

--------------------------------------------------
-- メイン                                       --
--------------------------------------------------
local ptn = "device detached"
local rtn, str, port
local st_old, st_new

-- twitterへの接続テスト
if (test_tweet() ~= 200) then
	print ("ネットワーク接続を確認してください。")
end

while (true) do
	rtn, str = rt.syslogwatch(ptn)
	if (rtn) and (str) then
		st_old = load_status()
		st_new = get_status()

		for i = 1, 2 do
			if (st_new[i] == 0) and (st_old[i] ~= 0) then
				tweet(twt_tbl.usb_dis)
				print("USBポートが空きました。")
				save_status(st_new)
			end
		end

		if (st_new[3] == 0) and (st_old[3] == 1) then
			tweet(twt_tbl.sd_dis)
			save_status(st_new)
			print("microSDスロットが空きました。")
		end
	end
end

print("end")

lan1_1gou.lua】 (137行)

--[[

 ● LAN1のlink up/downを監視するスクリプト(lan1_1gou.lua)

 ・LAN1の各ポートのlink up/downを監視し、twitterに状況を投稿する
  スクリプトです。

 ・このファイルをRTFSに保存し、schedule atコマンドで実行してください。
  schedule at 3 startup * lua /lan1_1gou.lua
 ・複数実行しないでください。
 ・スクリプトを停止するときは terminate lua コマンドを実行してください。
  再実行するには lua コマンドで実行します。

 <ノート>
 ・つぶやきたいことは、UTF-8に変換後、URLエンコーディングする必要があります。
  このサイトなどで変換してください。(http://hogehoge.tk/tool/)
 ・本スクリプトファイルを編集する場合、文字コードは必ず Shift-JIS を使用してください。

]]

--------------------------------------------------
-- グローバル変数の設定                         --
--------------------------------------------------

--------------------------##  設定値  ##--------------------------------
-- twitterの設定
user = "(TwitterのユーザーID)"
pass = "(Twitterのパスワード)"

----------------------##  設定値ここまで  ##----------------------------

-- httpリクエストテーブル
http_t = {
	url = "http://twitter.com/statuses/update.xml",
	method = "POST",
	auth_type = "basic",
	auth_name = user,
	auth_pass = pass,
	content_type = "application/x-www-form-urlencoded"
}

--------------------------------------------------
-- つぶやく関数                                 --
--------------------------------------------------
function tweet(str)
	local r

	http_t.post_text = "status=" .. str .. time_stamp()
	r = rt.httprequest(http_t)

	if (r.code ~= 200) then
		print("[twitter] Failed to update status.")
	end
end

--------------------------------------------------
-- twitterへの接続テストをする関数                
--------------------------------------------------
function test_tweet()
	local t = {
		url = "http://twitter.com/help/test.xml",
		method = "GET"
	}

	r = rt.httprequest(t)
	return r.code
end

--------------------------------------------------
-- LAN1のLink up/down を判定する関数            --
--------------------------------------------------
msg_t = {
	-- にGbEで接続されました。
	giga = "%E3%81%ABGbE%E3%81%A7%E6%8E%A5%E7%B6%9A%E3%81%95%E3%82%8C%E3%81%BE%E3%81%97%E3%81%9F%E3%80%82",
	-- にLAN端末が接続されました。
	fast = "%E3%81%ABLAN%E7%AB%AF%E6%9C%AB%E3%81%8C%E6%8E%A5%E7%B6%9A%E3%81%95%E3%82%8C%E3%81%BE%E3%81%97%E3%81%9F%E3%80%82",
	-- は、未接続になりました。
	down = "%E3%81%AF%E3%80%81%E6%9C%AA%E6%8E%A5%E7%B6%9A%E3%81%AB%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%97%E3%81%9F%E3%80%82"
}

function lan1_proc(str)
	local ptn_ud  = "LAN1: PORT(%d+) link (%w+)"
	local ptn_gbe = "1000BASE%-T"
	local port, ud, text

	port, ud = str:match(ptn_ud)
	if (port) and (ud) then
		if (ud == "up") then
			if (str:match(ptn_gbe)) then
				text = "LAN1." .. tostring(port) .. msg_t.giga
			else
				text = "LAN1." .. tostring(port) .. msg_t.fast
			end
		elseif (ud == "down") then
			text = "LAN1." .. tostring(port) .. msg_t.down
		end
	end

	return text
end

--------------------------------------------------
-- 日付と時刻、ハッシュタグ関数を返す関数       --
--------------------------------------------------
function time_stamp()
	local t = os.date("*t")
	return string.format("%%28%02d%%2F%02d+%02d%%3A%02d%%3A%02d%%29+%%23yamaha_X10", 
		t.month, t.day, t.hour, t.min, t.sec)
end

--------------------------------------------------
-- メイン                                       --
--------------------------------------------------
local ptn = "LAN1: PORT%d link %w+"
local rtn, str

-- syslog debug on を設定
assert(rt.command("syslog debug on"), "スクリプトの初期化に失敗しました。")
if (test_tweet() ~= 200) then
	print ("ネットワーク接続を確認してください。")
end

-- LAN1監視し始めたなう。
--tweet("LAN1%E7%9B%A3%E8%A6%96%E3%81%97%E5%A7%8B%E3%82%81%E3%81%9F%E3%81%AA%E3%81%86%E3%80%82")

while (true) do
	rtn, str = rt.syslogwatch(ptn)
	if (rtn) and (str) then
		str = lan1_proc(str[1])

		if (str) then
			tweet(str)
		end
	end
end

print("end")

dl_watch_1gou.lua】 (125行)

--[[

 ● DOWNLOADボタン長押しでつぶやくスクリプト(dl_watch_1gou.lua)

 ・dl_btn.luaが吐くSYSLOGを監視して、つぶやくスクリプトです。

 ・このファイルをRTFSに保存し、schedule atコマンドで実行してください。
  schedule at 4 startup * lua /dl_watch_1gou.lua
 ・複数実行しないでください。
 ・スクリプトを停止するときは terminate lua コマンドを実行してください。
  再実行するには lua コマンドで実行します。
 ・以下を設定してください。
   - syslog debug on
   - operation button function download execute lua /dl_btn.lua

 <ノート>
 ・つぶやきたいことは、UTF-8に変換後、URLエンコーディングする必要があります。
  このサイトなどで変換してください。(http://hogehoge.tk/tool/)
 ・本スクリプトファイルを編集する場合、文字コードは必ず Shift-JIS を使用してください。

]]

--------------------------------------------------
-- グローバル変数の設定                         --
--------------------------------------------------

--------------------------##  設定値  ##--------------------------------

-- つぶやく文字列テーブル
msg_t = {
	--幕張なう。
	"%E5%B9%95%E5%BC%B5%E3%81%AA%E3%81%86%E3%80%82", 
	--幕張メッセなう。
	"%E5%B9%95%E5%BC%B5%E3%83%A1%E3%83%83%E3%82%BB%E3%81%AA%E3%81%86%E3%80%82", 
	--Interopなう。
	"Interop%E3%81%AA%E3%81%86%E3%80%82", 
	--Interop Tokyoなう。
	"Interop+Tokyo%E3%81%AA%E3%81%86%E3%80%82", 
	--Interop住商情報システムブースなう。
	"Interop%E4%BD%8F%E5%95%86%E6%83%85%E5%A0%B1%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%83%96%E3%83%BC%E3%82%B9%E3%81%AA%E3%81%86%E3%80%82", 
	--Interopヤマハブースなう。
	"Interop%E3%83%A4%E3%83%9E%E3%83%8F%E3%83%96%E3%83%BC%E3%82%B9%E3%81%AA%E3%81%86%E3%80%82", 
	--Interopで参考出品のX10がつぶやいています。
	"Interop%E3%81%A7%E5%8F%82%E8%80%83%E5%87%BA%E5%93%81%E3%81%AEX10%E3%81%8C%E3%81%A4%E3%81%B6%E3%82%84%E3%81%84%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82" 
}

-- twitterの設定
user = "(TwitterのユーザーID)"
pass = "(Twitterのパスワード)"

----------------------##  設定値ここまで  ##----------------------------

-- httpリクエストテーブル
http_t = {
	url = "http://twitter.com/statuses/update.xml",
	method = "POST",
	auth_type = "basic",
	auth_name = user,
	auth_pass = pass,
	content_type = "application/x-www-form-urlencoded"
}


--------------------------------------------------
-- つぶやく関数                                 --
--------------------------------------------------
function tweet(str)
	local r

	http_t.post_text = "status=" .. str .. time_stamp()
	r = rt.httprequest(http_t)

	if (r.code == 200) then
		print("[twitter] OK.")
	else
		print("[twitter] NG.")
	end
end

--------------------------------------------------
-- twitterへの接続テストをする関数                
--------------------------------------------------
function test_tweet()
	local t = {
		url = "http://twitter.com/help/test.xml",
		method = "GET"
	}

	r = rt.httprequest(t)
	return r.code
end

--------------------------------------------------
-- 日付と時刻、ハッシュタグ関数を返す関数       --
--------------------------------------------------
function time_stamp()
	local t = os.date("*t")
	return string.format("%%28%02d%%2F%02d+%02d%%3A%02d%%3A%02d%%29+%%23yamaha_X10", 
		t.month, t.day, t.hour, t.min, t.sec)
end

--------------------------------------------------
-- メイン                                       --
--------------------------------------------------
local ptn = "%[INTEROP%] Please tweet."
local rtn, str
local count = 1

-- syslog debug on を設定
assert(rt.command("syslog debug on"), "スクリプトの初期化に失敗しました。")
if (test_tweet() ~= 200) then
	print ("ネットワーク接続を確認してください。")
end

while (true) do
	rtn, str = rt.syslogwatch(ptn)
	if (rtn) and (str) then
		tweet(msg_t[count])
	end

	count = count + 1
	if (count > #msg_t) then
		count = 1
	end
end

dl_btn.lua】 (13行)

--[[

 ● DOWNLOADボタンでSYSLOGを出力するスクリプト(dl_btn.lua)

 ・DOWNLOADボタンでつぶやくスクリプト用にログをはきます。
 ・以下を設定してください。
   - syslog debug on
   - operation button function download execute lua /dl_btn.lua

]]

rt.syslog("debug", "[INTEROP] Please tweet.")

【Interop Tokyo 2010記事】


トラックバック

このページのトラックバックURL:
http://www.typepad.jp/t/trackback/240314/6969950

このページへのトラックバック一覧


コメント

コメントを投稿



ヤマハのネットワーク製品

プロジェクトフォン

会議システムとは、手軽に遠隔地と連絡や議論を行うためのもの。実際は、ハウリングしたり、声が途切れたり、返事が聞こえなかったり。プロジェクトフォンは、会議の音を改善する新しい会議システムです。

ルータ&ファイアウォール



 1995年よりISDN応用製品のひとつとして始めたヤマハルーター。常にSOHO、中堅・中小企業の皆様に最先端のネットワークソリューションを提供し、多くの実績をお客様と共に作って参りました。SRT100は、より信頼性の高いネットワークセキュリティを実現します。