Lua 脚本

最后: 2018/5

FlashAir支持运行以Lua编写的程序,可以实现多种高级功能,例如:

  • 直接从FlashAir将文件上传到服务器。

  • 在FlashAir上生成数据文件。

  • 动态生成HTML。

Lua脚本可用于固件版本3.00.00以上。

关于Lua

Lua是一种强大、快捷、轻量、可嵌入的脚本语言。

Lua将简单的程序语法与基于关联数组和可扩展语义的强大数据描述结构结合在一起。Lua为动态类型,通过向基于寄存器的虚拟机解释字节码来运行,并提供带有渐进式碎片回收的自动内存管理功能,因此非常适合于配置、脚本及快速成型。

 —  Lua:关于Lua

更多关于Lua语言的信息请参照:

可用函数库

以下库函数可用于FlashAir的Lua脚本开发:

限制

由于内存限制,标准库中的以下功能不可用:

更新 数学功能现在可用于FlashAir W-04。
  • 协同程序控制

  • 操作系统设备

  • Debug库

Lua函数参考

内容如有更改,恕不另行通知。
函数名称 说明 固件版本

Updated request

发起HTTP请求

3.00.00+

HTTPGetFile

通过HTTP下载文件

3.00.00+

pio

以PIO形式控制SD接口

3.00.00+

ftp

通过FTP下载或上传文件

3.00.00+

deleted md5

计算MD5

3.00.00

hash

生成散列

3.00.00+

Scan

扫描SSID

3.00.00+

GetScanInfo

获取SSID扫描结果

3.00.00+

Connect

在STA模式下开启无线局域网

3.00.00+

Establish

在AP模式下开启无线局域网

3.00.00+

Bridge

在互联网直通模式下开启无线局域网

3.00.00+

Disconnect

关闭无线局域网

3.00.00+

sleep

在指定的时间带停止执行脚本

3.00.00+

sharedmemory

从共享内存获取数据或将数据写入共享内存

3.00.00+

SetCert

通过文件设置根证书

3.00.00+

strconvert

转换字符串

3.00.00+

SetChannel

设置无线频道

3.00.01+

MailSend

由FlashAir发送电子邮件

3.00.01+

spi

由FlashAir设置SPI

3.00.01+

New spi("init")

初始化接口并更改时钟周期

4.00.03+

New spi("mode")

SPI模式规范

4.00.03+

New spi("bit")

指定传输位数

4.00.03+

New spi("write")

写和读

4.00.03+

New spi("read")

写和读

4.00.03+

New spi("cs")

芯片选择信号的控制

4.00.03+

ReadStatusReg

获取FlashAir的状态寄存器内容

3.00.00+

ip

获取或设置IP地址

3.00.00+

WlanLink

确认连接

3.00.00+

remove

删除文件

3.00.00+

rename

重命名文件

3.00.00+

Update i2c

I 2C操作

4.00.00+

search

文件搜索功能

4.00.00+

control("time")

保存日期和时间备忘录

4.00.00+

control("fioget")

获取无线局域网开/关状态

4.00.00+

control("fioset")

无线局域网开/关

4.00.00+

ConnectedSTA

AP连接的连接站数

4.00.00+

websocket

WebSocket功能

4.00.00+

New watchdog("start")

WatchDog定时器启动

4.00.03+

New watchdog("stop")

WatchDog定时器停止

4.00.03+

New watchdog("event")

WatchDog定时器重置

4.00.03+

New watchdog("status")

获取WatchDog的状态

4.00.03+

New control("hid_set_pass")

设置密码以保存到隐藏区域

4.00.03+

New control("hid_change_pass")

更改设置为保存到隐藏区域的密码

4.00.03+

New control("hid_store")

将脚本保存到隐藏区域

4.00.03+

New control("hid_get")

检索保密区域中保存的脚本

4.00.03+

New control("hid_clear")

删除通过密码,API保存的所有脚本文件

4.00.03+

New control("hid_hash")

从设置的密码和指定的字符串中创建一个哈希字符串

4.00.03+

request

发起HTTP(超文本传输协议Hyper Text Transfer Protocol)请求。

格式(Syntax)

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

参数

url

string。 网址的字符串。( 4.00.00 端口可以被指定:8080)

method

string。 HTTP请求方法。如果未指定方法,则使用 "GET"

headers

table。 HTTP请求头数据的字段表格。如果未指定,则不添加任何字段。

file

string。 HTTP请求中发送的文件路径。

body

string。 将在HTTP请求中发送的消息字符串。 如果file和body参数都已指定,该指令将在文件内容中替换 <!--WLANSDFILE--> 后发送信息。

bufsize

number。 发送HTTP请求中的缓冲区大小。参照备注一节。

redirect

boolean。 如果设为 true ,则启用HTTP跳转(HTTP redirection)。默认值为 true

rcvbuff 4.00.03

string。 在Lua的堆栈上保存内存并将接收到的数据保存在安全的内存中。

rcvfile 4.00.03

string。 它将收到的HTTP响应数据保存到指定的文件中。

返回值

b

string。 HTTP响应主体的字符串。

c

number。 HTTP状态代码。

h

string。 HTTP响应头数据的字符串。

示例

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",
 method = "POST",
 headers = {["Content-Length"] = tostring(blen),
 ["Content-Type"] = contenttype},
 file = filepath,
 body = mes
}

备注

  • 一个HTTP请求的最大有效数据量为3KB。

  • TCP重置可能会取消请求,尤其是在向Flickr上传文件时。将bufsize设为1460*10,减少发送缓冲大小,即可避免这一问题。

4.00.00 注意事项

  • 使用此功能执行HTTPS通信时,建议在执行前使用 fa.SetCert函数设置根证书。 在未设置根证书的情况下执行HTTPS通信时,将不使用根证书验证服务器证书,而是执行通信。

  • 如果验证因使用根证书验证服务器证书而失败,则此功能的执行将失败。

HTTPGetFile

通过HTTP下载文件。

格式(Syntax)

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

参数

uri

string。 网址的字符串。

filepath

string。 储存响应的文件路径。

user

string。 基本认证中的用户字符串。

pass

string。 基础验证的用户参数。

返回值

result

number

1

成功。

nil

错误。

pio

以PIO (程控输入/输出:Programmed Input/Output) 形式控制SD接口。

格式(Syntax)

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

参数

ctrl

number。 输入或输出。 将要读取的位设为 0 ,要写入的位设为 1

data

number。 设定输出。 低位输出时设为 0 ,高位输出时设为 1

返回值

s

number。 控制接口状态。

1

成功。

0

错误。

indata

number。 输入。

备注

位赋值

  • CMD : 0x01

  • D0 : 0x02

  • D1 : 0x04

  • D2 : 0x08

  • D3 : 0x10

ftp

通过FTP(文件传输协议:File Transfer Protocol)下载或上传文件。

格式(Syntax)

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

参数

cmd

string。 FTP指令。

"get"

文件下载。

"put"

文件上传。

url

string。 FTP服务器的URI。

filename

string。 FlashAir上文件的路径。

返回值

result

number

1

成功。

nil

错误。

示例

fa.ftp("get", "ftp://user:pass@ftp.test.com:21/test", "test");

md5

This is obsolete. Use hash.

hash

生成一个哈希值。

格式(Syntax)

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

参数

name

string。 选择散列的类型(md5,sha1,sha256,hmac-sha256)。

data

string。 数据。

key

string。 密钥(用于名称为hmac-sha256)。

返回值

hash value

string。 散列值,作为十六进制数字。

Scan

扫描SSID。调用GetScanInfo()取得扫描结果。

格式(Syntax)

count = fa.Scan([ssid])

参数

ssid

string。 扫描指定的SSID。 如果没有指定,则搜索附近的SSID。

返回值

count

number。 扫描中找到的AP数量。

备注

如果无线局域网开启(由Connect, Establish或Bridge开启),该指令不可用。

GetScanInfo

获取SSID扫描结果。

格式(Syntax)

ssid, other = fa.GetScanInfo(num)

参数

num

number。 扫描结果中的项目序号。

返回值

ssid

string。 SSID。

other

table。 AP信息。

备注

如果无线局域网开启(由Connect, Establish或Bridge开启),该指令不可用。

Connect

在STA模式下开启无线局域网。

格式(Syntax)

fa.Connect(ssid, networkkey)

参数

ssid

string。 FlashAir连接的AP对应的SSID名。

networkkey

string。 FlashAir连接的AP对应的网络密钥。

返回值

无。

Establish

在AP模式下开启无线局域网。

格式(Syntax)

fa.Establish(ssid, networkkey, encmode)

参数

ssid

string。 FlashAir建立的AP对应的SSID。

networkkey

string。 FlashAir建立的AP对应的网络密钥。

encmode

number。 FlashAir建立的AP使用的编码模式。参照备注一节。

返回值

无。

备注

encmode必须取以下值之一:

说明

0

开放系统,无加密

1

开放系统,WEP加密

3

WPA-PSK、TKIP

4

WPA-PSK、AES

5

WPA2-PSK、TKIP

6

WPA2-PSK、AES

Bridge

在互联网直通模式下开启无线局域网。

格式(Syntax)

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

参数

ssid

string。 FlashAir建立的AP对应的SSID。

networkkey

string。 FlashAir建立的AP对应的网络密钥。

encmode

string。 FlashAir建立的AP使用的编码模式。 Establish指令参照备注一节。

brgssid

string。 FlashAir连接的AP对应的SSID。

brgnetworkkey

string。 FlashAir连接的AP对应的网络密钥。

返回值

无。

Disconnect

关闭无线局域网。

格式(Syntax)

fa.Disconnect()

参数

无。

返回值

无。

sleep

在指定的时间带停止执行脚本。

格式(Syntax)

sleep(msec)

参数

msec

number。 0~(2 32 - 1)的休眠时间,单位为毫秒。

返回值

无。

sharedmemory

从共享内存获取数据或将数据写入共享内存。

格式(Syntax)

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

参数

command

string。 执行命令(write, read)。

addr

number。地址(0〜511)。

len

number。 数据长度(0〜512)。

wdata

string。 写入数据字符串(通过写入命令启用)。

返回值

write ⇒  失败: nil 成功: 1
read  ⇒  失败: nil 成功: 读取数据的字符串

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

SetCert

通过文件设置或清除根认证(使用DER进行X.509二进制编码)。

格式(Syntax)

fa.SetCert(filename)

参数

filename

string。 设置DER文件的路径和文件名,如果省略,则清除根认证。

返回值

result

number

1

成功的。

nil

失败。

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

strconvert

将SJIS字符转换为UTF-8,将utf8字符转换为SJIS。

格式(Syntax)

fa.strconvert(format, orgstr)

参数

format

string。 如果指定「sjis2utf8」,则将SJIS字符转换为UTF-8,如果指定「utf82sjis」,则将UTF-8字符转换为SJIS。

orgstr

string。 转换前的原始数据。

返回值

成功: 转换字符串。
失败: nil

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

SetChannel

设置无线频道。

格式(Syntax)

fa.SetChannel(channelNo)

参数

channelNo

number。 通道(0〜11或0x0〜0xb,指定0为AUTO)。

返回值

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

MailSend

通过FlashAir发送电子邮件(启用附加文件)。

格式(Syntax)

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。 选择文件附件(OPTION)。

ContentType

string。 选择一种内容(仅当附件有效时才需要)。

返回值

成功: MailSend是成功的。
失败: nil(发送失败)。

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"
}

spi

由FlashAir设置SPI。

格式(Syntax)

fa.spi(command,data)

command

init

更改时钟周期(默认值:1000)。

mode

选择SPI的模式(数值:0〜3。默认:3)。

bit

发送的分配位数(默认值:8)。

write

写命令。

read

读命令。

cs

控制芯片选择信号(CS = ON,如果为1,则CS = OFF,如果为0)。

响应

write : 发出 write命令时收到的数据。
read :发出 read命令时读取数据。
除此以外: 任何状态。

fa.spi("init", 1001)

spi("init") 4.00.03

初始化接口并更改时钟周期(默认值:1000)。 CS变高。

格式(Syntax)

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

参数

period

number。 可选的。 时钟周期。

返回值

res

number

1

成功的。

0

失败。

spi("mode") 4.00.03

设置SPI模式。 (默认值:3)

格式(Syntax)

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

参数

mode

number。 范围 03。 SPI模式。

返回值

res

number

1

成功的。

0

失败。

注意

在执行 spi("init") 之前执行spi("mode")。

spi("bit") 4.00.03

设置传输位数。 (默认值:8)

格式(Syntax)

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

参数

bit

number。 范围 132。 传输位数。

返回值

res

number

1

成功的。

0

失败。

注意

spi("write")指定字符串时,不能使用位指定。

spi("write") 4.00.03

写和读。 虽然可以多次传输,但读取结果只能最后一次获取。

格式(Syntax)

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

参数

data_num

number。 传输数据。

data_str

string。 将传输数据指定为字符串。 它以每个字节多个字节传输。

xfer_num

number。 传输的字节数。 当data_str的字符串长度超过时,传输数据为0x00。

返回值

res

number。 带头价值。 (如果通过一次函数调用多次传输数据,则最后一次读取值)

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

注意

当使用data_str时,它不能用于位指定。

spi("read") 4.00.03

写和读。 它可以传输多次,并可以获取所有读取结果。 传输数据是重复传输的虚拟数据。

格式(Syntax)

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("cs") 4.00.03

控制芯片选择信号。

格式(Syntax)

fa.spi("cs", cs_level)

参数

cs_level

number。1: 高, 0: 低。

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)

ReadStatusReg

获取FlashAir的状态寄存器内容。

格式(Syntax)

reg = fa.ReadStatusReg()

参数

返回值

以字符串形式返回状态寄存器内容。 有关状态寄存器内容,请参阅 状态寄存器

获取该卡的IP地址。

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

ip

获取或设置FlashAir的IP地址。

格式(Syntax)

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")

确认FlashAir无线连接到网络。

格式(Syntax)

result = fa.WlanLink()

参数

返回值

结果

number

1

连接的。

0

断开。

remove

删除文件。

格式(Syntax)

fa.remove(filepath)

参数

filepath

string。 要删除的文件。

返回值

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

rename

移动或重命名文件或目录。

格式(Syntax)

fa.rename(oldfile, newfile)

参数

oldfile

string。 旧文件路径。

newfile

string。 新的文件路径。

返回值

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

i2c 4.00.00

I 2C操作由FlashAir完成。 i2c作为主人工作。

格式(Syntax)

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"。 省略时设置 "100"
timeout
number。 从机响应超时时间(单位:毫秒)。 省略时,设定为 10
address
number。 指定连接设备的从站地址。
direction
string。指定数据方向。 可能的值是 "read""write"。 当指定 "read"时,将从连接的设备读取数据。 如果指定了 "write",数据将发送到连接的设备。
data
string or number。 设置传输数据。 如果以字符串格式指定,则发送所有设置数据。 当以数字格式指定时,可以设置 0255之间的值。对于 "setpio",指定0或1以输出PIO。
4.00.03 支持空字符。
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 D1可以与 "setpio" / "getpio"一起使用。

多字节传输
如果要传输多个字节的二进制数据,通过执行数据写入操作,可以传输多个字节。

返回值

res
string。 成功时返回 "OK"。 失败时返回其他字符串。
data1, data2, data3, ...
number。 存储从 0255的值。 它仅在从连接的设备读取数据时使用,并指定 type = "binary"
string
string。 接收到的数据被存储。 它仅在从连接的设备读出数据并指定 and 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"}
将0写入地址为50的从站并读取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} -- 出力高
res = fa.i2c {mode ="setpio", data=0, ctrl=1} -- 出力低
                                 
res = fa.i2c {mode ="setpio", data=0, ctrl=0} -- 入力
res, data, ctrl = fa.i2c {mode="getpio"}

它根据指定目录中更新的日期和时间搜索文件。 可以搜索具有最新日期和时间的文件,或者搜索具有由参数指定的更新日期的文件。

格式(Syntax)

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

参数

type
string。 搜索类型。 固定文件。
  • file:搜索文件
path
string。 搜索目标目录。
searchtime
number。 更新目标日期和时间。 -1或FAT格式的日期和时间。
  • 当指定-1时,搜索具有最新日期和时间的文件。
  • 如果指定了-1以外的值,则搜索以下两项。
    • 与指定的更新日期和时间匹配的文件
    • 指定更新日期和时间比新文件(具有指定日期和时间的新文件中的下一个更早的文件)
  • 关于FAT格式的日期和时间
    • 它是一个32位整数值,高16位是日期,低16位是时间
    • 日期和时间格式与 op = 100 of command.cgi时可以获得的值相同。

返回值

result
number。 状态。
1 成功
-1 创建文件列表时溢出
  • 如果将搜索时间指定为-1,则"更新日期和时间是最新文件"列表中的字符串缓冲区溢出
  • 如果指定的搜索时间不是-1,则字符串缓冲区会在创建"指定的更新日期和时间之外的最早的文件"的列表中溢出
-2 创建文件列表时溢出(只有在为搜索时间指定-1时才有可能返回)
  • 字符串缓冲区在"与指定的更新日期和时间匹配的文件"列表中溢出
-3 目录打开错误
-4 目录读取错误
filelist
string。 逗号分隔的文件列表。
  • 以逗号分隔的字符串形式返回符合条件的文件列表。
  • 如果搜索时间不是-1,则会返回一个字符串,它将"与指定的更新日期和时间相匹配的文件"以及"指定的更新日期和时间之外的最早的文件列表"连接起来。
  • 如果没有相应的文件,则返回 "" (空字符串)。
  • 在溢出之外的错误情况下返回nil。
time
number。搜索结果日期和时间。
  • 如果为搜索时间指定了-1,则返回"具有最新更新时间的文件"的更新日期和时间。
  • 如果搜索时间不是-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

control("time") 4.00.00

保存或获取日期和时间备忘录。

格式(Syntax)

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

参数

第一个参数是"time"固定的。
savetime
number。 保存日期和时间。 它以FAT格式指定。
  • 保存时间如果有参数,请保存指定的日期和时间。
  • 保存时间如果没有参数,则获取保存的日期和时间。
  • 关于FAT格式的日期和时间
    • 它是一个32位整数值,高16位是日期,低16位是时间。
    • 日期和时间格式与 op = 100 of command.cgi时可以获得的值相同。

返回值

result
number。 获得日期和时间。
  • 如果给出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

control("fioget") 4.00.00

获取无线局域网的开/关状态。

格式(Syntax)

result = fa.control("fioget")

参数

第一个参数"fioget"是固定的。

返回值

result
number。 当前无线局域网的状态。
  • 1:无线局域网上。
  • 0:无线局域网关闭。

control("fioset") 4.00.00

打开/关闭无线局域网。

格式(Syntax)

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

参数

第一个参数"fioget"是固定的。
enable
number。 指定1或0。
  • 1:打开无线局域网。 诸如模式和SSID之类的设置是应用CONFIG文件的内容。
  • 0:关闭无线局域网。

返回值

result
number。 当前无线局域网的状态。
  • 1:无线局域网上。
  • 0:无线局域网关闭。

ConnectedSTA 4.00.00

返回AP连接时的连接站点数ip,mac。

格式(Syntax)

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

websocket 4.00.00

WebSocket通信。

格式(Syntax)

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

参数

table
有以下字段。
mode
string。 WebSocket连接的属性。
address
string。 连接目标的服务器地址。
payload
string or table。 消息内容(字符串,数组)。
type
number。 消息类型 (文本 = 1, 二进制 = 2, PING = 9, 默认 = 自动确定)。
length
number。 消息长度(默认=有效载荷对象长度)。
tout
number。 超时时间(单位:毫秒)。
打开 发信息 接收消息
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"}

watchdog("start") 4.00.03

启动WatchDog的定时器。

格式(Syntax)

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

参数

第一个参数是固定的"start"。
cycle

number。在几秒钟内指定看门狗问题。

返回值

result
number
1

定时器开始。

0

计时器等待时间尚未设置。

watchdog("stop") 4.00.03

停止WatchDog定时器。

格式(Syntax)

result = fa.watchdog("stop")

参数

第一个参数是固定的"stop"。

返回值

result
number
0

计时器停止。

watchdog("event") 4.00.03

重置WatchDog的定时器。

格式(Syntax)

result = fa.watchdog("event")

参数

第一个参数是固定的"event"。

返回值

result
number
1

定时器重启。

0

您尚未启动看门狗(未设置定时器等待时间)。

watchdog("status") 4.00.03

获取WatchDog的状态。

格式(Syntax)

result = fa.watchdog("status")

参数

第一个参数是固定的"status"。

返回值

result
number
0或更多

看门狗定时器启动之前的剩余时间。

0

激活之前的剩余时间少于1秒。

-1

看门狗定时器在等待。

control("hid_set_pass") 4.00.03

设置保密区域的密码。

格式(Syntax)

fa.control("hid_set_pass", password)

参数

第一个参数是固定的"hid_set_pass"。
password
string。 密码。

返回值

无。

control("hid_change_pass") 4.00.03

更改为隐藏区域设置的密码。

格式(Syntax)

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

参数

第一个参数是固定的"hid_change_pass"。
old_password
string。 配置的密码。
new_password
string。 新密码。

返回值

ret
number
0

成功的。

1

配置错误。

-1

密码长度错误。

control("hid_store") 4.00.03

将脚本保存到隐藏区域。

格式(Syntax)

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

参数

第一个参数是固定的"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("hid_get") 4.00.03

获取保存在隐藏区域的脚本。

格式(Syntax)

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

参数

第一个参数是固定的"hid_get"。
filename
string。 保存的脚本。
dstfilename
string。 目标文件的名称。
password
string。 密码。

返回值

无。

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

Notes

  • 您无法从主机可访问的区域中执行从Lua脚本中访问保密区域中保存的文件。

control("hid_clear") 4.00.03

删除通过密码,API保存的所有脚本文件。

格式(Syntax)

fa.control("hid_clear")

参数

第一个参数是固定的"hid_clear"。

返回值

无。

control("hid_hash") 4.00.03

从隐藏区域中设置的密码和指定的字符串中创建一个哈希字符串。

格式(Syntax)

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

参数

第一个参数是固定的"hid_change_pass"。
string
string。 设置字符串。

返回值

ret
string。 哈希值。

分区操作 4.00.03

您可以访问第二个分区。 第二个分区是保存Lua内部日志的区域,不受主机设备文件访问的影响。
可以通过驱动器号来指定分区。

格式(Syntax)

"p" --第一分区(略)
"s" --第二分区
"h" --秘密区域

其他

使用主机设备(如Linux,Win10)可以划分分区。

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