Lua FIFO / QUEUE 文件

我对 Lua 和嵌入式编程比较新。我正在做一个项目:

可以抽象成两部分的 IoT 节点:传感器和运行 Open WRT with Lua 5.1的板子。我正在编写一个脚本,每分钟从 crontab 调用一次。

1.在我的脚本中,我通过用 C 编写的包访问传感器数据。从传感器读取数据的结果是以字符串形式返回的 '十六进制数:


4169999a4180cccd41c9851f424847ae4508e0003ddb22d141700000418e666641c87ae14248147b450800003dc8b439

2.然后将其(字符串)转换为所需的值并提交到 API。

问题:

由于网络连接质量差,有时 API 无法到达。因此,我需要实现一个系统,在从传感器读取数据后,如果 API 无响应,我将把它保存到 FIFO 队列(缓冲区)。然后,在下一次调用脚本时,将首先发送 '旧' 记录,最新的记录放在最后。

点赞
用户6834680
用户6834680
local queue_filespec = [[/path/to/your/queue/file]]
-- "queue file" 必须是一个包含单行 "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()
  -- 如果队列为空,则返回 nil
  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
2016-12-19 10:00:16