【问题标题】:Lua FIFO / QUEUE fileLua FIFO/QUEUE 文件
【发布时间】:2016-12-20 16:28:23
【问题描述】:

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

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

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

4169999a4180cccd41c9851f424847ae4508e0003ddb22d141700000418e666641c87ae14248147b450800003dc8b439 
  1. 然后将其(字符串)转换为我需要的值并将其发布到 API。

问题:

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

【问题讨论】:

    标签: lua embedded iot openwrt


    【解决方案1】:
    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
    

    【讨论】:

    • 感谢您的回答,但我不认为这对我有用。我需要将这些记录保存在文件中的某个位置,因为我的脚本会定期(每分钟)调用一次,并且就我而言,每次脚本从头开始运行时(它声明并创建所有具有默认值的变量)
    • 感谢更新代码。但是我不确定您所说的“常规文件”是什么意思,我可以使用二进制文件(buffer.bin)吗?我在我的板上以交互模式尝试了你的脚本,第一次调用 add_to_queue(42) 给了我以下错误:queue.lua:23: bad argument #1 to 'insert' (table expected, got nil)
    • 在运行程序之前,您必须创建文件并手动写入return {} 行。 “常规文件”是指“不是特殊文件(如管道、套接字、设备……)”。这个文件将只存储文本数据,但你可以给它任何你喜欢的名字,包括“buffer.bin”:-)
    猜你喜欢
    • 2011-11-17
    • 1970-01-01
    • 2010-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多