zoukankan      html  css  js  c++  java
  • openwrt 里LUA程序怎么获取POST数据?

    https://www.zhihu.com/question/31579325

    作者:齐葛
    链接:https://www.zhihu.com/question/31579325/answer/283425839
    来源:知乎
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    uhttpd + Fast-CGI的开发要求:

    1. 安装uhttpd包(https需要加装“uhttpd-mod-tls”和“px5g”);
    2. 修改uhttpd配置文件“/etc/config/uhttpd”,将Lua作为“interpreter”;
    3. Lua脚本写到“/www/cgi-bin/”目录下,但是不带扩展名,且可执行;
    4. Fast-CGI要求Lua脚本必须首先使用“io.write()”输出“Content-type: text/html ”
    5. “/www/cgi-bin/”目录下的脚本可以调用“/usr/lib/lua/”目录下的自定义模块;
    6. Lua环境已经就绪。

    “读取GET和POST数据”为例,全部使用默认值的情况下,如何具体实现:

    第一步:使用“opkg update”更新“.ipk”包的源,然后使用“opkg install uhttpd”安装;

    第二步:使用“vi /etc/config/uhttpd”,在“config uhttpd main”下添加一行

    list interpreter ".lua=/usr/bin/lua”

    第三步:建立目录“/www/cgi-bin”,并增加“+x”属性;

    root@OpenWrt:~# mkdir -p /www/cgi-bin/
    root@OpenWrt:~# chmod +x /www/cgi-bin/

    建立响应文件,并增加“+x”属性;

    root@OpenWrt:~# touch /www/cgi-bin/webservice
    root@OpenWrt:~# chmod +x /www/cgi-bin/webservice

    将文件“/www/cgi-bin/webservice”内容修改为:

    #!/usr/bin/lua
    local WebService = require 'WebService'
    WebService.Run()

    第四步:建立Lua模块文件(不再要求“+x”属性),并读取参数,返回响应:

    root@OpenWrt:~# touch /usr/lib/lua/WebService.lua

    将其内容修改为如下内容:

    local WebService = {}
    
    function WebService.Run()
        local client = os.getenv("REMOTE_ADDR")
        local GET = os.getenv("QUERY_STRING")
        local POST = nil
        local POSTLength = tonumber(os.getenv("CONTENT_LENGTH")) or 0
        if (POSTLength > 0) then
            POST = io.read(POSTLength)
            --POST = io.read("*a")
        end
    
        -- Fast-CGI+HTTP require HEADER
        -- enable cache
        --io.write("Content-type: text/html
    
    ")
        -- disable cache, especially for Internet Explorer
        io.write("Content-type: text/html
    Pragma: no-cache
    
    ")
    
        local reply = string.format("Client %s said: url: [%s], data: [%s]
    ", client or '-', GET or '-', POST or '-')
        io.write(reply)
    end
    
    return WebService

    第五步:重启“uhttpd”服务(为了让更改的/etc/config/uhttpd生效):

    root@OpenWrt:~# /etc/init.d/uhttpd restart

    第六步:使用浏览器测试:

    使用浏览器访问如下地址:

    http://<openwrt_ipaddr>/cgi-bin/webservice?author=qige

    这里假设OpenWrt开发板的IP为192.168.1.24:

    http://192.168.1.24/cgi-bin/webservice?author=qige

    最终效果如下图:

    通过cUrl模拟POST提交通过form表单POST提交的浏览器结果

    注意:

    1. POST数据可以由curl、Python requests等进行模拟提交,也可以自制如:<form action="/cgi-bin/webservice" method="POST">提交;
    2. 根据Fast-CGI要求,必须要先使用“io.write()”输出http协议头部;再根据http协议的要求,头部和内容之间必须使用“ ”来隔开。因此Lua脚本必须先输出头部“Content-type: text/html ”,再输出其它内容;
    3. 如果“不需要缓存”,输出立即过期,则修改头部内容为“Content-type: text/html Pragma: no-cache ”;
    4. 让uhttpd开机自动启动,需要执行“/etc/init.d/uhttpd enable”;
    5. 需要将接收到的数据输出到串口,可以再安装一个“coreutils-stty”包用于控制串口波特率
    root@OpenWrt:~# opkg install coreutils
    root@OpenWrt:~# opkg install coreutils-stty

    再将以下内容添加到Lua模块的适当位置,并调用此函数即可:

    function WebService.uartWrite(msg)
        local uartConfig = 'stty -F /dev/ttyS0 raw speed 9600
    '
        os.execute(uartConfig)
    
        local cmd = string.format("echo '%s' > /dev/ttyS0
    ", msg or '')
        os.execute(cmd)
    end
  • 相关阅读:
    [cf621E]Wet Shark and Blocks
    [学习笔记]数论
    [CZYZ2016]day8
    Python 对 Excel 操作用法详解
    HTML学记笔记
    Django 2.2_错误:UnicodeDecodeError: 'gbk' codec can't decode byte 0xa6 in position 9737: illegal multibyte sequence
    Python在终端通过pip安装好包以后,在Pycharm中依然无法使用的解决办法
    div的移动特效
    jQuery各种动画效果
    jqZoom插件
  • 原文地址:https://www.cnblogs.com/kekeoutlook/p/10787233.html
Copyright © 2011-2022 走看看