Lua 先进先出/队列文件
Lua FIFO / QUEUE file
我对 Lua 和嵌入式编程还很陌生。我正在做一个项目:
IoT 节点可以抽象为两部分:传感器和运行 Open WRT with Lua 5.1 的电路板。我正在编写每分钟都会从 crontab 调用的脚本。
- 在我的脚本中,我通过用 C 编写的程序包从传感器访问数据。从传感器读取数据的结果是“字符串中返回的十六进制数:
4169999a4180cccd41c9851f424847ae4508e0003ddb22d141700000418e666641c87ae14248147b450800003dc8b439
- 然后将其(字符串)转换为我需要的值,然后 POST 将其转换为 API。
问题:
有时 API 由于网络连接不佳而无法访问。
所以我需要实现一个系统,我将从传感器读取数据,然后如果 API 没有响应,我会将它保存到 FIFO 队列(缓冲区)。然后下次调用脚本读取时,它将首先发送 'old' 记录,然后是最新的记录和结尾。
local queue_filespec = [[/path/to/your/queue/file]]
-- Initially your "queue file" (regular file!) must contain single line:
-- return {}
local function operation_with_queue(func)
local queue = dofile(queue_filespec)
local result = func(queue)
for k, v in ipairs(queue) do
queue[k] = ("%q,\n"):format(v)
end
table.insert(queue, "}\n")
queue[0] = "return {\n"
queue = table.concat(queue, "", 0)
local f = assert(io.open(queue_filespec, "w"))
f:write(queue)
f:close()
return result
end
function add_to_queue(some_data)
operation_with_queue(
function(queue)
table.insert(queue, some_data)
end
)
end
function extract_from_queue()
-- returns nil if queue is empty
return operation_with_queue(
function(queue)
return table.remove(queue, 1)
end
)
end
用法示例:
add_to_queue(42)
add_to_queue("Hello")
print(extract_from_queue()) --> 42
print(extract_from_queue()) --> Hello
print(extract_from_queue()) --> nil
我对 Lua 和嵌入式编程还很陌生。我正在做一个项目:
IoT 节点可以抽象为两部分:传感器和运行 Open WRT with Lua 5.1 的电路板。我正在编写每分钟都会从 crontab 调用的脚本。
- 在我的脚本中,我通过用 C 编写的程序包从传感器访问数据。从传感器读取数据的结果是“字符串中返回的十六进制数:
4169999a4180cccd41c9851f424847ae4508e0003ddb22d141700000418e666641c87ae14248147b450800003dc8b439
- 然后将其(字符串)转换为我需要的值,然后 POST 将其转换为 API。
问题:
有时 API 由于网络连接不佳而无法访问。 所以我需要实现一个系统,我将从传感器读取数据,然后如果 API 没有响应,我会将它保存到 FIFO 队列(缓冲区)。然后下次调用脚本读取时,它将首先发送 'old' 记录,然后是最新的记录和结尾。
local queue_filespec = [[/path/to/your/queue/file]]
-- Initially your "queue file" (regular file!) must contain single line:
-- return {}
local function operation_with_queue(func)
local queue = dofile(queue_filespec)
local result = func(queue)
for k, v in ipairs(queue) do
queue[k] = ("%q,\n"):format(v)
end
table.insert(queue, "}\n")
queue[0] = "return {\n"
queue = table.concat(queue, "", 0)
local f = assert(io.open(queue_filespec, "w"))
f:write(queue)
f:close()
return result
end
function add_to_queue(some_data)
operation_with_queue(
function(queue)
table.insert(queue, some_data)
end
)
end
function extract_from_queue()
-- returns nil if queue is empty
return operation_with_queue(
function(queue)
return table.remove(queue, 1)
end
)
end
用法示例:
add_to_queue(42)
add_to_queue("Hello")
print(extract_from_queue()) --> 42
print(extract_from_queue()) --> Hello
print(extract_from_queue()) --> nil