Lua機能

最終更新: 2018/5

Lua言語で書かれたスクリプトファイルをFlashAirに保存することで、 下記のような簡易なバッチ処理が行えます。

  • FlashAirに保存されたファイルを、任意のサーバー等にアップロード。(ダイレクトアップロード)
  • FlashAirにファイルを生成する。
  • 動的にHTMLファイルを生成する。

本機能は、FlashAir W-03以上で利用できます。

Lua言語について

Luaは、パワフルで、高速で、軽量で、埋め込み可能な、スクリプト言語です。

Luaは、シンプルな手続き型構文をと強力なデータ記述構造を、連想配列と拡張可能なセマンティクスを用いて組み合わせています。 Luaは動的型付けであり、レジスタベースの仮想マシン向けのバイトコードを解釈することによって実行されます。 また、インクリメンタルガベッジコレクションによる自動メモリ管理を備えており、 設定、スクリプティング、ラピッドプロトタイピングに最適です。

Lua言語の詳細は、関連情報をご覧ください。

利用できる機能

FlashAirのLua機能では、下記のライブラリ関数が利用できます。

制約事項

メモリ制約のため、標準ライブラリの以下の機能は使用できません。

  • コルーチン操作
  • OS機能
  • デバッグライブラリ

Lua関数リファレンス

関数名 機能 ファームウェアバージョン
Bridge インターネット同時接続モードで無線LANの有効化 3.00.00+
Connect STAモードで無線LANの有効化 3.00.00+
ConnectedSTA AP接続時の接続ステーション数 4.00.00+
control("fioget") 無線LAN On/Off状態の取得 4.00.00+
control("fioset") 無線LAN On/Off 4.00.00+
New control("hid_change_pass") 秘匿領域に設定したパスワードの変更 4.00.03+
New control("hid_clear") パスワード、APIで保存したスクリプトファイルを全て削除 4.00.03+
New control("hid_get") 秘匿領域に保存したスクリプトを取得 4.00.03+
New control("hid_hash") 設定したパスワードと指定する文字列からハッシュ文字列を作成 4.00.03+
New control("hid_set_pass") 秘匿領域への保存のためのパスワードを設定 4.00.03+
New control("hid_store") スクリプトを秘匿領域へ保存 4.00.03+
control("time") 日時メモ保存 4.00.00+
Disconnect 無線LANの停止 3.00.00+
Establish APモードで無線LANの有効化 3.00.00+
ftp FTPを使用したファイルのアップロード、ダウンロード 3.00.00+
GetScanInfo SSIDスキャン結果の取得 3.00.00+
hash ハッシュの計算 3.00.00+
HTTPGetFile HTTPを使用したファイルのダウンロード 3.00.00+
Update i2c I 2C操作 4.00.00+
ip IPアドレスを取得または設定 3.00.00+
MailSend メールの送信 3.00.01+
deleted md5 MD5ハッシュの計算 3.00.00
ping 指定IPへPINGを発行 3.00.00+
pio SDインターフェースのGPIO制御 3.00.00+
ReadStatusReg FlashAir自身のステータスレジスタを取得 3.00.00+
remove ファイルの削除 3.00.00+
rename ファイル名の変更 3.00.00+
Updated request HTTPリクエストの発行 3.00.00+
Scan SSIDスキャンの実行 3.00.00+
search ファイルサーチ機能 4.00.00+
SetCert ルート証明登録 3.00.00+
SetChannel 無線チャネルを設定する 3.00.01+
sharedmemory 共有メモリのデータを読み込み或いは書き込み 3.00.00+
sleep 指定時間だけスクリプトの実行を停止 3.00.00+
spi SPI操作を行う 3.00.01+
New spi("bit") 転送ビット数の指定 4.00.03+
New spi("cs") チップセレクト信号の制御 4.00.03+
New spi("init") インターフェースを初期化し、クロック周期の変更を行う 4.00.03+
New spi("mode") SPIモードの指定 4.00.03+
New spi("read") ライトおよびリード 4.00.03+
New spi("write") ライトおよびリード 4.00.03+
strconvert 文字列変換 3.00.00+
New watchdog("event") WatchDogのタイマーリセット 4.00.03+
New watchdog("start") WatchDogのタイマースタート 4.00.03+
New watchdog("status") WatchDogの状態取得 4.00.03+
New watchdog("stop") WatchDogのタイマー停止 4.00.03+
websocket WebSocket機能 4.00.00+
WlanLink 接続確認 3.00.00+

Bridge

インターネット同時接続モードで無線LANを有効化します。

書式

fa.Bridge(ssid, networkkey, encmode, brgssid, brgnetworkkey)

引数

ssid
string。 FlashAirのSSID。
networkkey
string。 FlashAirのセキュリティキー。
encmode
string。 FlashAirのセキュリティモード。 指定可能な値については Establishを参照して下さい。
brgssid
string。 接続先無線LAN APのSSID。
brgnetworkkey
string。 接続先無線LAN APのセキュリティキー。

戻り値

なし

Connect

STAモードで無線LANを有効化します。

書式

fa.Connect(ssid, networkkey)

引数

ssid

string。 接続先無線LAN APのSSID名。

networkkey

string。 接続先無線LAN APのセキュリティキー。

戻り値

なし

ConnectedSTA 4.00.00

AP接続時の接続されているステーション数、ip、macを返します。

書式

cnt,tbl = fa.ConnectedSTA()

戻り値

cnt
接続しているステーションの個数を返却する。
Tbl
取得したクライアントのテーブルを返却する。cntが0に場合nilを返却する。

AP起動時に何台接続しているか確認する。
local cnt, tbl = fa.ConnectedSTA()
print(cnt,tbl)
for i,t in ipairs(tbl) do 
  for k,v in pairs(t) do
  print(k,v)
   end
end
結果
   1       table: 856B1C
   mac     40:48:0f:7b:37:92
   ip      192.168.0.11

control("fioget") 4.00.00

無線LANのOn/Off状態を取得します。

書式

result = fa.control("fioget")

引数

第1引数は"fioget"固定。

戻り値

result
number。現在の無線LANの状態。
  • 1:無線LANはOn。
  • 0:無線LANはOff。

control("fioset") 4.00.00

無線LANのOn/Offを行います。

書式

result = fa.control("fioset", enable)

引数

第1引数は"fioset"固定。
enable
number。1 または 0を指定。
  • 1:無線LANをOnにする。モードやSSIDなどの設定はCONFIGファイルの内容が適用される。
  • 0:無線LANをOffにする。

戻り値

result
number。現在の無線LANの状態。
  • 1:無線LANはOn。
  • 0:無線LANはOff。

control("hid_change_pass") 4.00.03

秘匿領域に設定したパスワードを変更します。

書式

ret = fa.control("hid_change_pass", old_password, new_password)

引数

第1引数は"hid_change_pass"固定。
old_password
string。設定済みパスワード。
new_password
string。新規パスワード。

戻り値

ret
number
0

成功。

1

設定エラー。

-1

パスワード長エラー。

control("hid_clear") 4.00.03

パスワード、APIで保存したスクリプトファイルを全て削除します。

書式

fa.control("hid_clear")

引数

第1引数は"hid_clear"固定。

戻り値

なし

control("hid_get") 4.00.03

秘匿領域に保存したスクリプトを取得します。

書式

fa.control("hid_get", filename , dstfilename, password)

引数

第1引数は"hid_get"固定。
filename
string。保存しているスクリプト。
dstfilename
string。コピー先ファイル名。
password
string。パスワード。

戻り値

なし

fa.control("hid_get", "h:sys.lua", "tmp/option.lua", "mysecret")

注意事項

  • ホストからアクセス可能な領域で実行されたLuaスクリプトから、秘匿領域へ保存されたファイルへアクセスは出来ません。

control("hid_hash") 4.00.03

秘匿領域に設定したパスワードと指定する文字列からハッシュ文字列を作成します。

書式

ret = fa.control("hid_hash", string)

引数

第1引数は"hid_change_pass"固定。
string
string。設定文字列。

戻り値

ret
string。ハッシュ値。

control("hid_set_pass") 4.00.03

秘匿領域への保存のためのパスワードを設定します。

書式

fa.control("hid_set_pass", password)

引数

第1引数は"hid_set_pass"固定。
password
string。パスワード。

戻り値

なし

control("hid_store") 4.00.03

スクリプトを秘匿領域へ保存します。

書式

fa.control("hid_store", filename, password)

引数

第1引数は"hid_store"固定。
filename
string。保存するスクリプト。
password
string。パスワード。

戻り値

なし

fa.control("hid_store", "test.lua", "12345678")

保存したファイルをCONFIGで指定する

LUA_RUN_SCRIPT=H:filename
LUA_SD_EVNET=H:filename

control("time") 4.00.00

日時メモの保存または取得を行います。

書式

result = fa.control("time"[, savetime])

引数

第1引数は"time"固定。
savetime
number。保存する日時。FAT形式で指定する。
  • savetime引数ありの場合、指定された日時を保存する。
  • savetime引数なしの場合、保存された日時を取得する。
  • FAT形式の日時について
    • 32ビットの整数値で、上位16ビットが日付、下位16ビットが時刻。
    • 日付と時刻は、 command.cgiのop=100を実行した際に取得できる値と同じフォーマット。

戻り値

result
number。取得した日時。
  • savetime引数ありの場合、指定された日時そのものを返す。
  • savetime引数なしの場合、保存された日時を返す。
    • 日時が保存されていない場合は、-1を返す。
  • エラーの場合は nil を返す。

"2017/06/01 12:34:56" を保存する。
result = fa.control("time", 0x4ac1645c)
保存された日時を取得する。
result = fa.control("time")
if result ~= nil then
  print(string.format("time: 0x%08x", result))
end

Disconnect

無線LANを停止します。

書式

fa.Disconnect()

引数

なし

戻り値

なし

Establish

APモードで無線LANを有効化します。

書式

fa.Establish(ssid, networkkey, encmode)

引数

ssid
string。 FlashAirのSSID。
networkkey
string。 FlashAirのセキュリティキー。
encmode
number。 FlashAirのセキュリティモード。

戻り値

なし

備考

FlashAirセキュリティモードには、下記のうち一つを指定します。

意味
0 オープンシステム、暗号化なし
1 オープンシステム、WEP
3 WPA-PSK、TKIP
4 WPA-PSK、AES
5 WPA2-PSK、TKIP
6 WPA2-PSK、AES

ftp

FTP (File Transfer Protocol) によるファイルのダウンロードまたはアップロードを実行します。

書式

result = fa.ftp(cmd, uri, filename)

引数

cmd
string。 FTPコマンド。
"get"
ファイルのダウンロード。
"put"
ファイルのアップロード。
url
string。 FTPサーバーのURI。
filename
string。 FlashAirカード内のファイルパス。

戻り値

result
number
1
正常動作。
nil
エラー。

備考

  • FlashAirの対応しているデータ転送モードはパッシブ(PASV)モードのみとなります。
  • FTPS接続を使用する場合はURLをftps://とすると実行可能です。implicit, explicitモード両方とも利用可能です。
  • ポート指定はホスト名の後ろにポート番号を付けてください。

動作例

result = fa.ftp("get", "ftp://user:pass@ftp.test.com:21/test.txt", "test.txt");
result = fa.ftp("put", "ftps://user:pass@ftp.test.com:990/test.txt;implicit", "test.txt");
result = fa.ftp("put", "ftps://user:pass@ftp.test.com:990/test.txt;explicit", "test.txt");

GetScanInfo

Scan関数で得られた情報を取得します。

書式

ssid, other = fa.GetScanInfo(num)

引数

num

number。 Scanリストの番号を指定。

戻り値

ssid

string。 SSID。

other

table。 Scan結果情報。

備考

Connect, Establish, または Bridge コマンドにより無線LANが有効になっていると利用できません。

count = fa.Scan()
for i=1,count do
  ssid,other = fa.GetScanInfo(i)
  for key, val in pairs(other) do
    print(key, val)
 end
 end

hash

ハッシュ値を計算します。

書式

hash = fa.hash(name, data, key)

引数

name
string。 hashの種類選択(md5,sha1,sha256,hmac-sha256)。
data
string。 データ。
key
string。 秘密鍵(nameがhmac-sha256時利用)。

戻り値

hash
string。 16進数で表したハッシュ値。

HTTPGetFile

HTTPを使用してファイルをダウンロードします。

書式

result = fa.HTTPGetFile(uri, filepath [, user, pass])

引数

uri

string。 取得元のURI。

filepath

string。 保存先ファイル名。

user

string。 Basic認証におけるUser文字列。

pass

string。 Basic認証におけるPass文字列。

戻り値

result
number
1
正常動作。
nil
エラー。

4.00.00 注意事項

  • この関数でHTTPS通信を実行する場合、実行前に fa.SetCert関数でルート証明書を設定することが推奨されています。ルート証明書を設定せずにHTTPS通信を実行した場合、ルート証明書を用いたサーバ証明書の検証が行われないまま、通信が行われます。
  • ルート証明書を用いてサーバ証明書を検証した結果、検証が失敗した場合、この関数の実行は失敗となります。

i2c 4.00.00

FlashAirよりI 2C操作を行います。i2cはMasterとして動作します。

書式

res, data1, data2, data3, ... = fa.i2c(table)
res, string = fa.i2c(table)
res, data, ctrl = fa.i2c{mode = "getpio"}

引数

table
以下のフィールドがあります。
mode
string。I 2C操作の属性。
freq
string。I 2Cクロック周波数(単位:kHz)。設定可能な値は、 "45""100""189""400"の4つ。省略時は "100"が設定されます。
timeout
number。スレーブ応答のタイムアウト時間(単位:msec)。省略時は 10が設定されます。
address
number。接続デバイスのスレーブアドレスを指定します。
direction
string。データの方向を指定します。設定可能な値は "read""write"です。 "read"を指定した場合、接続デバイスからデータを読み出します。 "write"を指定した場合、接続デバイスへデータを送ります。
data
string or number。送信データを設定します。string形式で指定した場合は、設定したデータを全て送ります。number形式で指定した場合は 0255までの値を設定できます。 "setpio" の場合、0または1でPIOの出力を指定します。
4.00.03 Null文字のサポートしました。
bytes
number。受信データサイズを指定します。省略時には 1が設定されます。
type
string。受信データ形式を指定します。設定可能な値は "binary""string"です。省略時には、 "binary"が設定されます。
ctrl 4.00.03
number。PIOの方向を指定します。0のとき入力、1のとき出力となります。
デバイス初期化 スタートコンディションの送信 リスタートコンディションの送信 接続デバイスからデータ読み出し 接続デバイスへデータ書き込み ストップコンディションを送信し、コネクションを閉じる 4.00.03
PIO設定
4.00.03
PIO取得
mode "init" "start" "restart" "read" "write" "stop" "setpio" "getpio"
freq 省略可 不要 不要 不要 不要 不要 不要 不要
timeout 省略可 不要 不要 不要 不要 不要 不要 不要
address 不要 必須 必須 不要 不要 不要 不要 不要
direction 不要 必須 必須 不要 不要 不要 不要 不要
data 不要 不要 不要 不要 必須 不要 必須 不要
bytes 不要 不要 不要 省略可 省略可 不要 不要 不要
type 不要 不要 不要 省略可 不要 不要 不要 不要
ctrl 不要 不要 不要 不要 不要 不要 必須 不要

備考

ビット割当
  • CMD: SCL
  • D0: SDA

SCL/SDAはプルアップしてください。
CLKはプルダウンしてください。
4.00.03 "setpio" / "getpio" ではD1が使用できます。

複数バイト送信
バイナリデータを複数バイト送信したい場合は、データ書き込みを続けて実行することで、複数バイト送信することができます。

戻り値

res
string。成功時は "OK"を返します。失敗時はそれ以外の文字列を返します。
data1, data2, data3, ...
number0255までの値が格納されます。接続デバイスからデータ読み出し、 type = "binary"指定時のみ使用します。
string
string。受信データが格納されます。接続デバイスからデータ読み出し、 type = "string"指定時のみ使用します。
data 4.00.03
number。PIOの取得値が格納されます。 type = "getpio"指定時のみ使用します。
control 4.00.03
number。PIOの方向設定値が格納されます。 0 のとき入力、 1 のとき出力となります。 type = "getpio"指定時のみ使用します。

res = fa.i2c{mode = "init", freq = "100"}
res = fa.i2c{mode = "start", address = 50, direction = "write"}
res = fa.i2c{mode = "restart", address = 50, direction = "read"}
res, data1, data2, data3, ... = fa.i2c{mode = "read", type = "binary"}
res, string = fa.i2c{mode = "read", type = "string"}
res = fa.i2c{mode = "write", data = 0}
res = fa.i2c{mode = "stop"}
アドレス50のスレーブから5バイト読み出す
res = fa.i2c{mode = "init", freq = "100"}
res = fa.i2c{mode = "start", address = 50, direction = "read"}
res, r0, r1, r2, r3, r4, r5 = fa.i2c{mode = "read", bytes = 5, type = "binary"}
res = fa.i2c{mode = "stop"}
アドレス50のスレーブに0を書き込んでから1バイト読み出す
res = fa.i2c{mode = "init", freq = "100"}
res = fa.i2c{mode = "start", address = 50, direction = "write"}
res = fa.i2c{mode = "write", data = 0}
res = fa.i2c{mode = "restart", address = 50, direction = "read"}
res, data = fa.i2c{mode = "read", bytes = 1, type = "binary"}
fa.i2c{mode = "stop"}
PIOの操作 4.00.03
res = fa.i2c {mode ="init", freq="100"}
res = fa.i2c {mode ="setpio", data=1, ctrl=1} -- 出力High
res = fa.i2c {mode ="setpio", data=0, ctrl=1} -- 出力Low
                         
res = fa.i2c {mode ="setpio", data=0, ctrl=0} -- 入力
res, data, ctrl = fa.i2c {mode="getpio"}

ip

FlashAir自身のIPアドレスを取得または設定します。

書式

ip, mask, gw = fa.ip(ipaddress, subnetmask, gateway)

引数

ipaddress
string。 FlashAirに設定するIPアドレス。
subnetmask
string。 サブネットマスク値。
gateway
string。 ゲートウェイのIPアドレス。

戻り値

ip
string。 IPアドレス。
mask
string。 サブネットマスク。
gw
string。 ゲートウェイ。

-- 値取得時
ip, mask, gw = fa.ip()
-- 値設定時
fa.ip("192.168.11.2", "255.255.255.0", "192.168.11.1")

MailSend

Flashairよりメール送信を行う(ファイルの添付も可能)。

書式

fa.MailSend(from,headers,body,server,user,password, attachment, ContentType)

引数

from
string。 送信元メールアドレス。
headers
string。 メールヘッダ。
body
string。 メール本文。
server
string。 メールサーバ(smtp)。
user
string。 ユーザーID。
password
string。 パスワード。
attachment
string。 添付ファイル指定(任意)。
ContentType
string。 コンテンツタイプ指定(attachment指定時に有効で必須)。

レスポンス

成功: MailSend is success.
失敗: Error: It failed to send.

動作例

from = "fromaddr@yahoo.co.jp"
rcpt = "toaddr@gmail.com"
a = fa.MailSend {
  from = from,
  headers = "To: "..rcpt.."\r\nFrom: "..from.."\r\nSubject: test",
  body = "HELLO HELLO",
  server = "smtp.mail.yahoo.co.jp",
  user = "flashair",
  password ="1234567890",
  attachment = "FBYF.jpg",
  ContentType = "image/jpg"
}

md5

hash(ハッシュの計算)へ統合されました。

ping

指定IPへPINGを発行します。

書式

result = fa.ping(ip)

引数

ip
string。 ipアドレス。

戻り値

result
number
1
正常動作。
nil
エラー。

動作例

result = fa.ping("192.168.130.1")

pio

SDインターフェースのPIO (Programmed Input/Output) 制御を行います。

書式

s, indata = fa.pio(ctrl, data)

引数

ctrl
number。 ピンの入出力指定。 読み込みたい端子に対応するビットに 0 を、 書き込みたい端子に対応するビットに 1 を指定します。
data
number。 出力ピン状態の指定。 書き込みたい端子に対応する各ビットに、 0 を設定するとLow、 1 を設定するとHighを出力します。

戻り値

s
number。 インターフェース制御の状態。
1
成功。
0
失敗。
indata
number。 入力ピン情報。

備考

ビット割当

  • CMD : 0x01
  • D0 : 0x02
  • D1 : 0x04
  • D2 : 0x08
  • D3 : 0x10

ReadStatusReg

FlashAir自身のステータスレジスタを取得する。

書式

reg = fa.ReadStatusReg()

引数

なし

戻り値

無線LAN機能ステータスレジスタの内容を、文字列として返します。内容は 無線LAN機能ステータスレジスタ(Application Status for Wireless LAN)を参照してください。

動作例

IPアドレスを取得する場合

local ipaddress = string.sub(fa.ReadStatusReg(),160,168)

remove

指定されたファイルを削除します。

書式

fa.remove(filepath)

引数

filepath
string。 削除対象のファイル名。

戻り値

なし

動作例

fa.remove("/DCIM/100__TSB/DSC_100.JPG")>

rename

指定されたファイルのパスを変更します。

書式

fa.rename(oldfile, newfile)

引数

oldfile
string。 元ファイル名。
newfile
string。 新ファイル名。

戻り値

なし

動作例

fa.rename("/DCIM/100__TSB/DSC_100.JPG","/DCIM/100__TSB/DSC_101.JPG")

request

HTTP (Hyper Text Transfer Protocol) リクエストを発行します。

書式

b, c, h = fa.request(url [, method [, headers [, file [, body [, bufsize [, redirect [, rcvbuff [, rcvfile]]]]]]]])

引数

url
string。 URLの文字列。( 4.00.00 ポート指定可能:8080)
method
string。 HTTPリクエストメソッド。省略すると "GET" とみなします。
headers
table。 HTTPリクエストのヘッダーフィールド情報を追加できます。
file
string。 HTTPリクエストのボディに指定されたファイルを追加して送信します。
body
string。 HTTPリクエストのボディに指定された文字列を追加して送信します。 fileオプションと併用するとbody内部の文字列 <!--WLANSDFILE--> をファイルに置換して送信します。bodyが指定されていない場合は、単にfileが送信されます。
bufsize
number。 HTTPリクエストの送信バッファ・サイズ。flickrサーバーへ送信する場合はこの値を1460*10とします。
redirect
boolean。 HTTPのリダイレクト動作の有効無効を制御する。省略すると true を指定したものとみなします。
rcvbuff 4.00.03

string。Luaのスタック上にメモリを確保し、受信データを確保したメモリに保存します。

rcvfile 4.00.03
string。受信したHTTPレスポンスのデータを指定したファイルへの保存を行います。

戻り値

b
string。 HTTP response bodyの文字列。
c
number。 HTTPステータスコード。
h
string。 HTTP response headerの文字列。

boundary = "--61141483716826"
contenttype = "multipart/form-data; boundary=" .. boundary
filepath = "sample.txt"
mes = "--".. boundary .. "¥r¥n"
 .."Content-Disposition: form-data; name=¥"file¥"; filename=¥""..file .."¥"¥r¥n"
 .."Content-Type: text/plain¥r¥n"
 .."¥r¥n"
 .."<!--WLANSDFILE-->¥r¥n"
 .."--" .. boundary .. "--¥r¥n"

blen = lfs.attributes(file,"size") + string.len(mes) - 17
b,c,h = fa.request{url = "http://192.168.0.1/upload.cgi:8080",
 method = "POST",
 headers = {["Content-Length"] = tostring(blen),
 ["Content-Type"] = contenttype},
 file = filepath,
 body = mes
}

備考

  • HTTP Responseの転送サイズは、3KBまで対応。
  • Flickrへの送信においてTCPリセットが行われることがあります。bufsizeオプションで送信バッファサイズを1460*10程度に小さくすると回避できる場合があります。

4.00.00 注意事項

  • この関数でHTTPS通信を実行する場合、実行前に fa.SetCert関数でルート証明書を設定することが推奨されています。ルート証明書を設定せずにHTTPS通信を実行した場合、ルート証明書を用いたサーバ証明書の検証が行われないまま、通信が行われます。
  • ルート証明書を用いてサーバ証明書を検証した結果、検証が失敗した場合、この関数の実行は失敗となります。

Scan

Scan開始コマンド。結果はGetScanInfo()で取得します。

書式

count = fa.Scan([ssid])

引数

ssid
string。 指定したSSIDについてスキャンを行います。 省略した場合は近傍のSSIDをスキャンします。

戻り値

count

number。 スキャンで見つかったAP数。

備考

Connect, Establish, または Bridge コマンドにより無線LANが有効になっていると利用できません。

指定したディレクトリ内で、更新日時によるファイル検索を行います。更新日時が最新であるファイルの検索、または引数で指定した更新日時によるファイルの検索が可能です。

書式

result, filelist, time = fa.search(type, path, searchtime)

引数

type
string。検索タイプ。file固定。
  • file:ファイルの検索
path
string。検索対象のディレクトリ。
searchtime
number。検索対象更新日時。-1またはFAT形式の日時を指定する。
  • -1を指定した場合、更新日時が最新のファイルを検索する。
  • -1以外を指定した場合、以下の両方を検索する。
    • 指定された更新日時と一致するファイル
    • 指定された更新日時より新しいファイルのうち最も古いファイル(指定された日時の次に新しいファイル)
  • FAT形式の日時について
    • 32ビットの整数値で、上位16ビットが日付、下位16ビットが時刻。
    • 日付と時刻は、 command.cgiのop=100を実行した際に取得できる値と同じフォーマット。

戻り値

result
number。ステータス。
1 正常終了
-1 ファイルリストの作成時にオーバーフロー
  • searchtimeに-1を指定した場合、「更新日時が最新のファイル」のリスト作成で文字列バッファのオーバーフロー
  • searchtimeに-1以外を指定した場合、「指定された更新日時より新しいファイルのうち最も古いファイル」のリスト作成で文字列バッファのオーバーフロー
-2 ファイルリストの作成時にオーバーフロー(searchtimeに-1以外を指定した場合のみ返す可能性がある)
  • 「指定された更新日時と一致するファイル」のリスト作成で文字列バッファのオーバーフロー
-3 ディレクトリオープンエラー
-4 ディレクトリリードエラー
filelist
string。カンマ区切りのファイルリスト。
  • 条件に一致するファイルのリストをカンマ区切りの文字列で返す。
  • searchtimeに-1以外を指定した場合、 「指定された更新日時と一致するファイル」のリストと「指定された更新日時より新しいファイルのうち最も古いファイル」のリストを連結した文字列を返す。
  • 該当ファイルがない場合は、""(空文字列)を返す。
  • オーバーフロー以外のエラーの場合はnilを返す。
time
number。検索結果日時。
  • searchtimeに-1を指定した場合、「更新日時が最新のファイル」の更新日時を返す。
  • searchtimeに-1以外を指定した場合、 「指定された更新日時より新しいファイルのうち最も古いファイル」の更新日時を返す。
  • 条件に一致するファイルがない場合は0を返す。
  • オーバーフロー以外のエラーの場合はnilを返す。
備考
  • ファイルリストの作成時に512文字を超えた場合はバッファオーバーフローとなり、リストは途中で打ち切られる。
  • 検索するディレクトリの深さは3階層まで。

"/DCIM" から最新のファイルを検索する。
local result, filelist, time = fa.search("file", "/DCIM", -1)
if result ~= 1 then
  print("error: ", result)
end
if filelist ~= nil then
  for f in string.gmatch(filelist, '(.-),') do
      print(f)
  end
end
if time ~= nil then
  print(string.format("time: 0x%08x", time))
end
“DCIM”から更新日時が 2017/06/01 12:34:56 であるファイルと、その日時より新しいファイルのうち最も古いファイルを検索する。
local result, filelist, time = fa.search("file", "/DCIM", 0x4ac1645c)
if result ~= 1 then
  print("error: ", result)
end
if filelist ~= nil then
  for f in string.gmatch(filelist, '(.-),') do
      print(f)
  end
end
if time ~= nil then
  print(string.format("time: 0x%08x", time))
end

参考

FAT形式の日時変換例
文字列の日時をFAT形式に変換する
local function StringToFatDateTime(datetime_str)
  local pattern = '(%d+)/(%d+)/(%d+)%s+(%d+):(%d+):(%d+)'
  local year,month,day,hour,min,sec = string.match(datetime_str, pattern)
  year = year - 1980
  sec = bit32.rshift(sec, 1)
  local date_fat = bit32.bor(bit32.lshift(year, 9),
                             bit32.lshift(month, 5),
                             day)
  local time_fat = bit32.bor(bit32.lshift(hour, 11),
                             bit32.lshift(min, 5),
                             sec)
  local datetime_fat = bit32.bor(bit32.lshift(date_fat, 16),
                                 time_fat)
  return datetime_fat
end
FAT形式の日時を文字列に変換する
local function FatDateTimeToString(datetime_fat)
  local function getbits(x, from, to)
      local mask = bit32.lshift(1, to - from + 1) - 1
      local shifted = bit32.rshift(x, from)
      return bit32.band(shifted, mask)
  end
  local fatdate = bit32.rshift(datetime_fat, 16)
  local day = getbits(fatdate, 0, 4)
  local month = getbits(fatdate, 5, 8)
  local year = getbits(fatdate, 9, 15) + 1980

  local fattime = getbits(datetime_fat, 0, 15)
  local sec = getbits(fattime, 0, 4) * 2
  local min = getbits(fattime, 5, 10)
  local hour = getbits(fattime, 11, 15)

  return string.format('%02d/%02d/%02d %02d:%02d:%02d', year, month, day, hour, min, sec)
end

SetCert

証明書のクリアor登録(X.509 binary encode with DER)を行います。

書式

fa.SetCert(filename)

引数

filename
string。 DERファイルのパス、ファイル名を指定する。省略時は証明書をクリアする。

戻り値

result
number
1
正常動作。
nil
失敗。

動作例

lres = fa.SetCert("DerSha256.cer")
if (res == nil) then
	print("cert err")
end

SetChannel

無線チャネルを設定する。

書式

fa.SetChannel(channelNo)

引数

channelNo
number。 チャネル(0~11 or 0x0~0xb 0指定はAUTO)。

戻り値

なし

動作例

fa.Disconnect()
fa.SetChannel("0xB")
fa.Establish("flashair3", "12345678", "6")

sharedmemory

共有メモリからデータを読み込み或いは書き込みを行います。

書式

fa.sharedmemory(command, addr, len, wdata)

引数

command
string。 動作コマンド(write, read)。
addr
number。 アドレス(0~511)( 4.00.00 0~2047)。
len
number。 データ長(0~512)( 4.00.00 1~2048)。
wdata
string。 書込み文字列(コマンドでwrite指定時有効)。

レスポンス

write時 成功:1 失敗:nil
read時 成功:読み出し文字列 失敗:nil

動作例

res1 = fa.sharedmemory("write", 0, 8, "12345678")
res2 = fa.sharedmemory("read", 1, 4, 0)
print("res=",res2)
  
 結果:res=2345

sleep

指定時間だけスクリプトの実行を停止します。

書式

sleep(msec)

引数

msec
number. 停止時間を0~(2 32 - 1)の範囲のミリ秒単位で指定します。

戻り値

なし

spi

FlashAirよりSPI操作を行う。

書式

result = fa.spi(command, data)
command
init
クロック周期の変更を行う(デフォルト値:1000)。
mode
SPIモードの指定(引数:0~3。デフォルト値:3)。
bit
転送ビット数(デフォルト値:8)。
write
ライト。
read
リード。
cs
チップセレクト信号の制御(引数1でCS=ON、0でCS=OFF)。

レスポンス

write ライトコマンド発行時の受信データ。
read リードコマンド発行時の受信データ。
otherwise ステータス

動作例

fa.spi("init", 1001)

spi("bit") 4.00.03

転送ビット数を指定します。(デフォルト値:8)

書式

res = fa.spi("bit", bit)

引数

bit
number。範囲 132 。転送ビット数。

戻り値

res

number

1
成功。
0
失敗。

注意事項

spi("write") で文字列を指定する場合、bit指定との併用は不可となります。

spi("cs") 4.00.03

チップセレクト信号を制御します。

書式

fa.spi("cs", cs_level)

引数

cs_level
number。1: High, 0: Low。

local CS_ASSERT=0
local CS_NEGATE=1
fa.spi("mode", 2)
fa.spi("init", 1000)
fa.spi("cs", CS_ASSERT)
fa.spi("write", "hello", 5)
fa.spi("cs", CS_NEGATE)

spi("init") 4.00.03

インターフェースを初期化し、クロック周期の変更を行う(デフォルト値:1000)。CSはHighとなる。

書式

res = fa.spi("init"[, period])

引数

period
number。 省略可。クロック周期。

戻り値

res
number
1
成功。
0
失敗。

spi("mode") 4.00.03

SPIモードを指定します。(デフォルト値:3)

書式

res = fa.spi("mode", mode)

引数

mode

number。範囲 03 。SPIモード。

戻り値

res
number
1

成功。

0

失敗。

注意事項

spi("init") の実行前にspi("mode")を実行してください。

spi("read") 4.00.03

ライトおよびリード。複数回転送でき、全てのリード結果を取得できます。送信データはダミーデータを繰り返し送信します。

書式

res_num = fa.spi("read")
res_tbl = fa.spi("read", xfer_num, data_num)

引数

xfer_num
number。転送回数。
data_num
number。送信データ。

戻り値

res_num
number。リードした値。
res_tbl
table。リードした値の配列。

送信データについて

fa.spi("read") の書式では、ダミーデータとして全ビット0が送信されます。

fa.spi("read", xfer_num, data_num) の書式では、ダミーデータとしてdata_numが送信されます。

res_num = fa.spi("read")
print(res_num)
res_tbl = fa.spi("read", 10, 0xff)
for i, v in ipairs(res_tbl) do
  print(i, v)
end

spi("write") 4.00.03

ライトおよびリード。複数回転送できますが、リード結果は最後の1回のみ取得できます。

書式

res = fa.spi("write", data_num)
res = fa.spi("write", data_str, xfer_num)

引数

data_num
number。送信データ。
data_str
string。送信データを文字列で指定。1バイトずつ複数回に分けて転送される。
xfer_num
number。送信バイト数。data_strの文字列長を超えた場合には送信データは0x00となる。

戻り値

res
number。リードした値。(1度の関数呼び出しで複数回転送した場合は、最後にリードした値)

res = fa.spi("write", 0x12)
result = fa.spi("write", "hello", 8)

注意事項

data_strを使用する場合、bit指定との併用は不可となります。

strconvert

SJIS文字をUTF-8文字へ変換とutf8文字をSJIS文字へ変換する。

書式

fa.strconvert(format, orgstr)

引数

format
string。 「sjis2utf8」を指定するとsjis文字をutf8文字へ変換する、「utf82sjis」を指定するとutf8文字をsjis文字へ変換する。
orgstr
string。 変換元文字列。

レスポンス

成功:変換文字列
失敗:nil

動作例

str = "あかさたなはまやらわ"
print("testStr=", str)
a = fa.strconvert("sjis2utf8", str )
print("toUTF8=", a)
b = fa.strconvert("utf82sjis", a)
print("toSJIS=", b)

watchdog("event") 4.00.03

WatchDogのタイマーをリセットします。

書式

result = fa.watchdog("event")

引数

第1引数は"event"固定。

戻り値

result
number
1

タイマー再始動。

0

watchdogをスタートしていない(タイマー待ち時間未設定)。

watchdog("start") 4.00.03

WatchDogのタイマーをスタートさせます。

書式

result = fa.watchdog("start", cycle)

引数

第1引数は"start"固定。
cycle

number。 watchdogを発行を秒単位で指定します。

戻り値

result
number
1

タイマー開始。

0

タイマー待ち時間未設定。

備考

WatchDogとは、システムが機能し続けていることを確認するためのタイマーのことです。WatchDogのタイマーをスタートした後システムに異常事態が起こり、WatchDogのタイマーをリセットできなかった場合FlashAirを再起動させます。

使用例

  1. CONFIGに LUA_RUN_SCRIPT=/HelloWorld.luaを追加します。 こちらのチュートリアルで使用した HelloWorld.luaをFlashAirルート上に保存します。すでにHello.txtがルート上にある場合はリネームまたは削除してください。
  2. FlashAirルート上に以下のコードを保存します。
    /WatchDog.lua
    fa.watchdog("start", 10)
    print("watchdog start")
    for i = 1, 30 do
      result = fa.watchdog("status")
      print("watchdog status:"..result)
    end
    result, filelist, time = fa.search("file", "/DCIM", -1)
    if filelist ~= nill then
      result = fa.watchdog("event")
      print("watchdog restart")
    else
      fa.watchdog("stop")    
      print("watchdog stop")                    
    end
    while 0 ~= fa.watchdog("status") do
      result = fa.watchdog("status")
      print("watchdog status:"..result)
    end
    このスクリプトはWatchdogタイマーを10秒間隔でスタートさせ、Watchdogステータスを数回確認、 /DCIM上にファイルが存在したらWatchdogタイマーを再起動させ、Watchdogステータスが0になるまでprintし続けます。
  3. FlashAirを抜き差します。
  4. HelloWorld.luaにより作成されたHello.txtを確認します。(Hello There!が1行表示されている状態です)
  5. ブラウザから WatchDog.luaを実行します。
  6. ブラウザ上にprint文で出力した内容が表示されたら 抜き差しせずにHello.txtを確認します。(Hello There!が2行表示されている状態です)
    FlashAirが再起動され、 LUA_RUN_SCRIPTが実行されていることが確認できます。

watchdog("status") 4.00.03

WatchDogの状態を取得します。

書式

result = fa.watchdog("status")

引数

第1引数は"status"固定。

戻り値

result
number
0以上

watchdogタイマー発動までの残り時間。

0

発動までの残り時間が1秒未満。

-1

watchdogタイマー待機中。

watchdog("stop") 4.00.03

WatchDogのタイマーを停止します。

書式

result = fa.watchdog("stop")

引数

第1引数は"stop"固定。

戻り値

result
number
0

タイマー停止。

websocket 4.00.00

WebSocket通信をします。

書式

res, type, payload = fa.websocket(table)

引数

table
以下のフィールドがあります。
mode
string。WebSocket接続の属性。
address
string。接続先のサーバアドレス。
payload
string or table。メッセージ内容(文字列、配列)。
type
number。メッセージタイプ(テキスト= 1、バイナリ= 2、PING= 9、 省略時=自動判別)。
length
number。メッセージの長さ(省略時=payloadのオブジェクト長)。
tout
number。タイムアウト時間(単位:msec)。
オープン メッセージ送信 メッセージ受信 クローズ
mode "open" "send" "recv" "close"
address 必須 不要 不要 不要
payload 不要 必須 不要 不要
type 不要 省略可 不要 不要
length 不要 省略可 不要 不要
tout 不要 不要 省略可 不要

戻り値

res
number。受信成功時は 0もしくは正数を返します。受信失敗時は負数を返します。
type
number。メッセージタイプ(テキスト= 1、バイナリ= 2)。受信失敗時は nilを返します。メッセージ受信のときのみ使用します。
payload
string or table。受信メッセージ。受信失敗時は nilを返します。メッセージ受信のときのみ使用します。

res = fa.websocket{mode = "open", address = "ws://localhost/socket"}
res = fa.websocket{mode = "send", payload = "hello!", type = 1}
res, type, payload = fa.websocket{mode = "recv", tout = 5000}
fa.websocket{mode = "close"}

ネットワークに無線接続されているかを確認します。

書式

result = fa.WlanLink()

引数

なし

戻り値

result
number
1
接続状態。
0
未接続。

パーティション操作 4.00.03

第2パーティションへアクセスを行うことが出来ます。第2パーティションはLuaの内部ログなどを保存し、ホスト機器からのファイルアクセスによる影響がない領域のことです。
ドライブレターにより、パーティションを指定することが可能です。

書式

"p" --1stパーティション(省略化)
"s" --2ndパーティション
"h" --秘匿領域

その他

パーティションの作成は、Linux、Win10などのホスト機器を使用して分割することが可能です。

local file = io.open("s:\flashair.log", "a")