Lua FIFO / QUEUE文件

时间:2016-12-19 09:48:33

标签: lua embedded iot openwrt

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

物联网节点可以抽象为两部分:传感器和运行Open WRT和Lua 5.1的电路板。我正在编写将每分钟从crontab调用的脚本。

  1. 在我的脚本中,我通过用C编写的包从传感器访问数据。从传感器读取数据的结果是'以字符串形式返回的十六进制数字:
  2. 4169999a4180cccd41c9851f424847ae4508e0003ddb22d141700000418e666641c87ae14248147b450800003dc8b439 
    
    1. 然后将它(字符串)转换为我需要的值并将其POST到API。
    2. 问题:

      由于网络连接不良,有时无法访问API。 所以我需要实现系统,我将从传感器读取数据,然后如果API没有响应,我会将其保存到FIFO队列(缓冲区)。然后,当下一次调用脚本时,它将首先发送“旧”记录,然后发送最新的记录。

1 个答案:

答案 0 :(得分:0)

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