NodeMCU入门(4):搭建Web服务器,配置网络连接

准备工作

1.NodeMCU模块

2.ESPlorer v0.2.0-rc6

3.NodeMCU-HTTP-Server

搭建web服务器

下载https://github.com/wangzexi/NodeMCU-HTTP-Server文件,并上传到NodeMCU中

修改init.lua文件,可参看NodeMCU-HTTP-Server Example

-- init.lua

---------------------
-- wifi
---------------------

print(‘Setting up WIFI...‘)
wifi.setmode(wifi.STATION)
wifi.sta.config(‘WX401901‘, ‘smyh1234‘)
wifi.sta.autoconnect(1)

tmr.alarm(1, 1000, tmr.ALARM_AUTO, function()
    if wifi.sta.getip() == nil then
        print(‘Waiting for IP ...‘)
    else
        print(‘IP is ‘ .. wifi.sta.getip())
    tmr.stop(1)
    end
end)

-- Serving static files
dofile(‘httpServer.lua‘)
httpServer:listen(80)

-- Custom API
-- Get text/html
httpServer:use(‘/welcome‘, function(req, res)
    res:send(‘Hello ‘ .. req.query.name) -- /welcome?name=doge
end)

-- Get file
httpServer:use(‘/doge‘, function(req, res)
    res:sendFile(‘doge.jpg‘)
end)

-- Get json
httpServer:use(‘/json‘, function(req, res)
    res:type(‘application/json‘)
    res:send(‘{"doge": "smile"}‘)
end)

-- Redirect
httpServer:use(‘/redirect‘, function(req, res)
    res:redirect(‘doge.jpg‘)
end)

现在是工作在STATION模式下,保存后可以看到获取的IP地址,在浏览器中输入http://192.168.100.100就可以看到一个简单的页面了。

修改成 wifi.setmode(wifi.STATIONAP) 模式,出现了内存不足的错误,无视它。

E:M 248
not enough memory
stack traceback:
[C]: in function ‘dofile‘
init.lua:22: in main chunk
[C]: in function ‘dofile‘
stdin:1: in main chunk

现在NodeMCU有两个IP,一个是作为STATION的192.168.100.100,另外一个是作为AP的192.168.4.1,这时在无线列表中会多出一个AI-THINKER_AC72F4,用手机或电脑连上后浏览器中输入http://192.168.4.1 也可以看到页面。

实现Web配置无线连接账号和密码

这里借用NodeMCU之旅(四):实现Web配置页面配置页面

首先,删除上一步中上传的测试文件 404.html和doge.jpg

然后,上传新的配置页面

最后,修改init.lua文件去掉演示web相关的路由配置添加两个新的路由:

httpServer:use(‘/config‘, function(req, res)
    if req.query.ssid ~= nil and req.query.pwd ~= nil then
        wifi.sta.config(req.query.ssid, req.query.pwd)

        status = ‘STA_CONNECTING‘
        status_sleep=0
        tmr.alarm(TMR_WIFI, 1000, tmr.ALARM_AUTO, function()
            status_sleep=status_sleep+1
       --当设置的账号密码错误时,定时器不会停止,所以这里添加了超时检查
            if(status_sleep==10) then
                   res:type(‘application/json‘)
                res:send(‘{"status":"timeout"}‘)
                tmr.stop(TMR_WIFI)
             end

            if status ~= ‘STA_CONNECTING‘  then
                res:type(‘application/json‘)
                res:send(‘{"status":"‘ .. status .. ‘"}‘)
                tmr.stop(TMR_WIFI)
            end

        end)
    end
end)

-- Get json
httpServer:use(‘/scanap‘, function(req, res)

  wifi.sta.getap(function(table)
        local aptable = {}
        for ssid,v in pairs(table) do
            local authmode, rssi, bssid, channel = string.match(v, "([^,]+),([^,]+),([^,]+),([^,]+)")
            aptable[ssid] = {
                authmode = authmode,
                rssi = rssi,
                bssid = bssid,
                channel = channel
            }
        end
        res:type(‘application/json‘)--原来是cjson.encode(aptable),因为构建固件时没有找到cjson用了sjson,所以这里改成sjson
        res:send(sjson.encode(aptable)) end)
end)

当请求的方法里出现异常时前端看到的是404错误,这个坑让我一直怀疑是httpServer.lua的问题

保存后,访问http://192.168.100.100,修改成一个错误的密码,点击连接网络,Led灯开始闪烁然后模块重启常亮,表示修改失败。

* Sending index.html
* Finished index.html
PANIC: unprotected error in call to Lua API (httpServer.lua:77: not connected)

还得切换Wifi到AI-THINKER_AC72F4,通过http://192.168.4.1修改账号密码。

-- init.lua

----------------------
--define
---------------------
IO_BLINK = 4

TMR_WIFI = 4
TMR_BLINK = 5
TMR_BTN = 6

gpio.mode(IO_BLINK, gpio.OUTPUT)

---------------------
-- blink
---------------------
blink = nil
tmr.register(TMR_BLINK, 100, tmr.ALARM_AUTO, function()
    gpio.write(IO_BLINK, blink.i % 2)
    tmr.interval(TMR_BLINK, blink[blink.i + 1])
    blink.i = (blink.i + 1) % #blink
end)

function blinking(param)
    if type(param) == ‘table‘ then
        blink = param
        blink.i = 0
        tmr.interval(TMR_BLINK, 1)
        running, _ = tmr.state(TMR_BLINK)
        if running ~= true then
            tmr.start(TMR_BLINK)
        end
    else
        tmr.stop(TMR_BLINK)
        gpio.write(IO_BLINK, param or gpio.LOW)
    end
end

---------------------
-- wifi
---------------------

print(‘Setting up WIFI...‘)
wifi.setmode(wifi.STATIONAP )
wifi.sta.config(‘WX401901‘, ‘smyh1234‘)
wifi.sta.autoconnect(1)

tmr.alarm(1, 1000, tmr.ALARM_AUTO, function()
    if wifi.sta.getip() == nil then
        print(‘Waiting for IP ...‘)
    else
        print(‘IP is ‘ .. wifi.sta.getip())
    tmr.stop(1)
    end
end)

status=nil

wifi.sta.eventMonReg(wifi.STA_WRONGPWD, function()
    blinking({100, 100 , 100, 500})
    status = ‘STA_WRONGPWD‘
    print(status)
end)

wifi.sta.eventMonReg(wifi.STA_APNOTFOUND, function()
    blinking({2000, 2000})
    status = ‘STA_APNOTFOUND‘
    print(status)
end)

wifi.sta.eventMonReg(wifi.STA_CONNECTING, function(previous_State)
    blinking({300, 300})
    status = ‘STA_CONNECTING‘
    print(status)
end)

wifi.sta.eventMonReg(wifi.STA_GOTIP, function()
    blinking()
    status = ‘STA_GOTIP‘
    print(status, wifi.sta.getip())
end)

wifi.sta.eventMonStart(1000)

---------------------
-- http
---------------------
dofile(‘httpServer.lua‘)
httpServer:listen(80)

httpServer:use(‘/config‘, function(req, res)
    if req.query.ssid ~= nil and req.query.pwd ~= nil then
        wifi.sta.config(req.query.ssid, req.query.pwd)

        status = ‘STA_CONNECTING‘
        status_sleep=0
        tmr.alarm(TMR_WIFI, 1000, tmr.ALARM_AUTO, function()
            status_sleep=status_sleep+1

            if(status_sleep==10) then
                   res:type(‘application/json‘)
                res:send(‘{"status":"timeout"}‘)
                tmr.stop(TMR_WIFI)
             end

            if status ~= ‘STA_CONNECTING‘  then
                res:type(‘application/json‘)
                res:send(‘{"status":"‘ .. status .. ‘"}‘)
                tmr.stop(TMR_WIFI)
            end

        end)
    end
end)

-- Get json
httpServer:use(‘/scanap‘, function(req, res)

  wifi.sta.getap(function(table)
        local aptable = {}
        for ssid,v in pairs(table) do
            local authmode, rssi, bssid, channel = string.match(v, "([^,]+),([^,]+),([^,]+),([^,]+)")
            aptable[ssid] = {
                authmode = authmode,
                rssi = rssi,
                bssid = bssid,
                channel = channel
            }
        end
        res:type(‘application/json‘)
        res:send(sjson.encode(aptable))
    end)
end)

init.lua

相关资源

NodeMCU文档

NodeMCU custom builds

nodemcu-flasher

ESPlorer.zip

Zepto中文API

本文是在NodeMCU之旅(三):响应配置按钮NodeMCU之旅(四):实现Web配置页面 基础之上的学习过程,感谢原作者。

时间: 2024-10-13 16:03:45

NodeMCU入门(4):搭建Web服务器,配置网络连接的相关文章

基于Nginx搭建Web服务器及虚拟主机相关配置详解

随着计算机与Internet技术的高速发展,各种各样的Web站点也就成为面向用户的中坚力量.在各种网站服务器软件中.除了Apache外,还有一款轻量级的HTTP服务器软件--Nginx. 基于Apache搭建Web服务器可以参考博文:基于Apache搭建Web服务器详解 一.Nginx服务简介 Nginx由俄罗斯的lgor Sysoev开发,专为性能优化而开发,其最知名的优点就是它的稳定性和低系统资源消耗.以及对HTTP并发连接的高处立能力(单台物理服务器可支持30000~50000个并发请求)

如何搭建web服务器 使用Nginx搭建反向代理服务器

转载   如何搭建web服务器 使用Nginx搭建反向代理服务器 :   http://blog.csdn.net/w13770269691/article/details/6977727 引言:最近公司有台服务器遭受DDOS攻击,流量在70M以上,由于服务器硬件配置较高所以不需要DDOS硬件防火 墙.但我们要知道,IDC机房是肯定不允许这种流量一直处于这么高的,因为没法具体知道后面陆续攻击的流量会有多大,如果流量过大就会导致整个IDC网络 瘫痪.我们都知道北方的数据中心和南方的数据中心从带宽出

轻松使用Nginx搭建web服务器

如果读者以前做过web开发的话,就应该知道如何去搭建一个web服务器来跑你的web站点,在windows下你可能会选择去用IIS,十分的快捷,在linux下,你可能首先会想到apache,"一哥"( W3Techs网站数据的排名)啦 今天小编要介绍后起之秀nginx来实现web服务器.小编在前面的博客中也详细的聊过apache的使用,如今又来说nginx的使用,读者可能以后搭建web服务器的话就不知道选用哪一种,O(∩_∩)O~,别急,小编这就来给读者分析一下Nginx和Apache区

【CentOS】搭建Web服务器

参考资料: http://www.paipat.com/?post=24 http://www.cnblogs.com/xiaoluo501395377/archive/2013/04/07/3003278.html 1.安装apache 2.安装php 3.安装mysql 1.安装apache 安装:直接使用yum安装apache:yum install httpd rpm使用: 格式:rpm  -q[子选项][软件名] 用法:结合不同的子选项,完成不同的查询 -qa   : 查看系统中已安装

IIS中搭建web服务器

IIS中搭建web服务器 前面的博文中和大家聊了如何在Windows Server 2012 R2的环境下搭建IIS服务器,今天我们就继续和大家聊聊如何在我们的IIS服务器中搭建一个WEB服务器,从而实现我们要发布网站的愿望. 在搭建WEB服务器之前我们首先要明确几个只是点: 1. web服务一般情况下使用的是HTTP协议(超文本传输协议),其所占用端口为TCP/80端口. 2. 同一服务器上发布多个网站的情况下,ip地址.端口号和主机名不可完全相同(这就是我们平时所说的虚拟主机) OK.明确了

搭建web服务器环境

搭建web服务器的环境(配置PHP的工作环境): 首先要配置php,在Apache的配置文件夹中httpd.conf中配置 1把php配置成Apache的一个功能模块 LoadModule php5_module "F:\class22\amp\php\php5apache2_2.dll" 2.指定.php 后缀的文件交给PHP的功能模块处理 AddType apalication/x-httpd-php .php 3.确定PHP的配置文件php.ini的路径 PHPIniDir &q

linux搭建web服务器

linux httpd 假设服务器地址为192.168.80.20/24 1.   将准备安装的httpd软件包共享给everyone , (1)在linux上mount.cifs  //真机IP地址/共享文件夹名   /media / ls  /meidia/ 查看 tar    xjvf   httpd-2.4.10.tar.bz2    -C  /usr/src       解压至/usr/src下 下面两个插件是httpd2.4以后的版本所需要的 http://ftp.jaist.ac.

Linux中创建RAID5卷并搭建web服务器详解

北大青鸟的实验项目 实验任务:使用Linux的RHEL6.5版本64位的操作系统搭建web服务器,创建RAID5卷并挂载到web目录下. 实验过程:1.创建RHEL6.5操作系统,并且配置主机名.IP地址192.168.1.100/24等实验要求. 2.添加4块大小为30G的虚拟磁盘,做RAID5卷,可用空间为60GB. 3.关闭iptables防火墙和SElinux. 4.打开win7虚拟机进行IP地址192.168.1.200配置,并测试互联互通. 5.搭建网站服务器,名称为web.bene

ubuntu 12.04下搭建web服务器(MySQL+PHP+Apache) 教程(转+亲测)

ubuntu 12.04下搭建web服务器(MySQL+PHP+Apache) 教程 1.切换管理员身份 在ubuntu中需要用root身份进行操作,所以用下面的命令确保以root身份登录: sudo su 2.开始安装ssh (安装SSH-server:(用Xshell操作更方便,先获得ssh服务支持)sudo apt-get updatesudo apt-get install openssh-server openssh-client启动SSH-Serversudo /etc/init.d