東芝のFlashAirエミュレータ

FlashAirエミュレータ flashair-lua-dev で少し困った。


FlashAirのエミュレータを探していて
https://flashair-developers.com/ja/documents/resources/
の下の方に表示される、flashair-lua-dev を試した。

fa オブジェクトがエミュレートできるので大変便利で助かったのですが、
ファイルを multipart/form-data でアップロードが出来なかった。

【手順】
https://flashair-developers.com/ja/documents/api/lua/reference/#request
のファイルアップロードのサンプルコードを使い、flashair.luaを呼び出すが、通信が完了しない。
(CentOS 6.7 x86)

【問題点】
「引数bodyに、<!--WLANSDFILE-->が記述された場合、置き換えで、file内容を埋め込む」
というFlashAir独自仕様が満たされていないように見えます。

【対策案】
少し冗長ですが、flashair.luaのtrequest関数を、次の様に修正する。
	local trequest = function(...)
		local param = ...
		local url      = param["url"]
		local method   = param["method"]
		local headers  = param["headers"]
		local file     = param["file"]
		local reqbody  = param["body"]
		local bufsize  = param["bufsize"]
		local redirect = param["redirect"]

		-- Hundredsoft add start
		if (file ~= nil) then
			local fp = io.open(file, "rb")
			if (fp ~= nil) then
				local r1, r2 = string.match(reqbody, "(.-)%<%!%-%-WLANSDFILE%-%-%>(.+)")
				if (r1 ~= nil and r2 ~= nil) then
					reqbody = r1 .. fp:read("*a") .. r2
				end
				fp:close()
			end
		end
		-- Hundredsoft add end

		local http = require("socket.http")
		local ltn12 = require("ltn12")

		local body = {}
		local b, c, h = http.request {
			url = url,
			sink = ltn12.sink.table(body),
			method = method,
			headers = headers,
			source = ltn12.source.string(reqbody), 
			step = nil,
			proxy = nil, 
			redirect = redirect,
			create = nil,
		}
		return table.concat(body), c, h
	end

で、動いた。

CentOS上では、メモリが豊富なので bodyに、<!--WLANSDFILE--> などと打ち込まず、
ファイル内容を、そのまま入れ込む方法でも動きますが、
実機(FlashAir)では、大きな写真を送ろうとすると、メモリ不足でコケてしまいます。
大きな画像を送るときには、<!--WLANSDFILE--> は、必須のようです。

個人的には、あとは、FTP エミュレータができると、とても嬉しい。




Tags: プログラムメモ
author : HUNDREDSOFT | - | -