FlashAir単独でデータの符号化処理をする
FlashAirならではの使い方
仕事でFlashAirを冶具として使っているのですが、なかなか便利だったのでメモ。
5ピン分のGPIOが自由に使えるWi-Fi SDカード、というイメージが先行してしまいがちなのですが、速度がそこそこなので、このSDの旨みはそこじゃないんじゃないかなと。
- 保存データの簡易的な暗号化
データをFlashAir内部に保存 → 保存時のトリガ*1でLuaスクリプトを起動、データを算術・エントロピーの法則に基づいて符号化 → 元データ削除
- 保存データの可逆圧縮
データを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に保存してください。
ブラウザから動作確認すると、以下のようになると思います。
おしまい。
*1:CONFIGにLUA_SD_EVENTを記述する。詳しくはhttps://flashair-developers.com/ja/documents/api/config/#LUA_SD_EVENT