Lynx-EyEDの電音鍵盤 新館

制御とか数学とか駄文とか

FlashAir単独でデータの符号化処理をする

FlashAirならではの使い方

仕事でFlashAirを冶具として使っているのですが、なかなか便利だったのでメモ。
5ピン分のGPIOが自由に使えるWi-Fi SDカード、というイメージが先行してしまいがちなのですが、速度がそこそこなので、このSDの旨みはそこじゃないんじゃないかなと。

  • 保存データの簡易的な暗号化

データをFlashAir内部に保存 → 保存時のトリガ*1Luaスクリプトを起動、データを算術・エントロピーの法則に基づいて符号化 → 元データ削除

データをFlashAir内部に保存 → 保存時のトリガでLuaスクリプトを起動、データを算術法則に基づいて符号化 → 圧縮

符号化処理

データの暗号化、圧縮ともに符号化が必要です。今回は符号化でよく使うであろう、ガンマ符号とデルタ符号用のスクリプトを書きました。

このブログを書いている2015年5月現在、FlashAirのLua機能には数学関数がないので、あまり複雑なことはできないかもしれませんが、少しの工夫で何とかなる場合も多いです。

今回用意した関数は

  • 引数の2進数表記での桁数を返す関数(function numOfDigits(num) )
  • ガンマ符号化を行い、値と桁数(2進数表記時)を返す関数(function gammaCoder(num))
  • デルタ符号化を行い、値と桁数(2進数表記時)を返す関数(function deltaCoder(num))

デルタ符号化はガンマ符号化関数を使い、符号化しています。
それぞれの符号の詳細は…
ガンマ符号 - Wikipedia
デルタ符号 - Wikipedia

コード

print("HTTP/1.1 200 OK\r\nContent-Type:text/html;charset=utf-8\r\n")

local s_find   = string.find
local s_len    = string.len
local s_format = string.format
local fa_req   = fa.request
local i_close  = io.close
local i_open   = io.open
local L_shift  = bit32.lshift
local R_shift  = bit32.rshift
local b_and    = bit32.band
local b_or     = bit32.bor
local cjson    = require "cjson"

-----------------------------------------------
--	function: numOfDigits(num) 
--	digits(upto 32bits)
--	returns: Number of digits(Numbers when binary) 
-----------------------------------------------
function numOfDigits(num)
	local nod
	for kk = 1,32 do
		nod = kk
	 	num = R_shift(num,1)
	 	if num == 0 then 
	 		break
	 	end
	end
	return nod
end
-----------------------------------------------
--	function: gammaCoder(num) 
--	num: digits
--	returns: gamma code, number of gamma-coded-digits
-----------------------------------------------
function gammaCoder(num)
	local nndigits 
	nndigits = numOfDigits(num) * 2
	nndigits = nndigits - 1 		-- total number
	return num, nndigits
end
-----------------------------------------------
--	function: deltaCoder(num) 
--	num: digits
--	returns: gamma code, number of gamma-coded-digits
-----------------------------------------------
function deltaCoder(num)
	local nndigits,nndigitsX
	local numX
	nndigits = numOfDigits(num)
	numX, nndigitsX = gammaCoder(nndigits)
	nndigits = nndigits - 1
	
	numX = L_shift(numX, nndigits)
	
	num  = b_and(num, (2 ^ nndigits - 1)) 
	
	numX = b_or(num, numX)
	
	nndigits = nndigitsX + nndigits 		-- total number
	return numX, nndigits
end	

-- main program 


local c = 21 -- ここに符号化したい値を記述

local x,n = deltaCoder(c)
print(c.."のデルタ符号は"..x.."で、桁数は"..n.."<br><br>")
x,n = gammaCoder(c)
print(c.."のガンマ符号は"..x.."で、桁数は"..n.."<br><br>")

print("program end.")


-- main end

上記コードをUTF-8 BOM無しエンコードでFlashAirに保存してください。
ブラウザから動作確認すると、以下のようになると思います。

f:id:Lynx-EyED:20150513214132p:plain

おしまい。

*1:CONFIGにLUA_SD_EVENTを記述する。詳しくはhttps://flashair-developers.com/ja/documents/api/config/#LUA_SD_EVENT