开发者学堂课程【嵌入式之 RFID 开发与应用2020版:Wifi-nodeMCU-esp8266 建立热点同时作为服务器完成设备连接控制】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/665/detail/11209
Wifi-nodeMCU-esp8266 建立热点同时作为服务器完成设备连接控制
内容介绍
一、代码展示
二、演示
一、代码展示
该服务器是一个 80 端口的 web 服务器。可以接收客户端的请求,把发送的数据打印出来。实际接收到的数据比所看到的要更加复杂。演示收到的实际数据。
发送如下请求:192.168.1.17/xxx,最后结果是匹配失败,匹配失败之后,会把收到的所有请求打印。数据较多,是 HTTP 的请求,没有匹配上的效果如下:
将所有数据打印,最终结果不是 Close 或 open 中的内容,匹配失败。打开关闭是从以上信息当中寻找是否有 Close 或者 open。但该方法并不是长久之计,假如头部包括关键字信息就会出现错误。所以,能否通过 Close 或 open 准确的找到信息,还存在疑问,但基本模型存在。 Web AP 将设备当做热点,是软路由的方式。之前的方式是存在路由器和 8266,8266 作为服务器,手机和电脑作为客户端,同时连接上路由器,但手机和电脑是连接到8266服务器中的,此时所做的工作,就是将路由器省略,将 8266 作为服务器和路由器,也能实现点对点通信。连接上之后直接发送信息 Hello World,表示连接成功,同时连接了热点。较为复杂的例子
Web_AP_ server_light:
wifi.setmode (wifi.SOFTAP)
print(wifi.getmode ())
softap_cfg={ ssid="qfedu" ,pwd="123456789"}
wifi.ap.config (softap_cfg)
print ( "AP_Ip is "..wifi.ap.getipi))
首先,io 口的初始化与之前相同,但不同的是,先建立了 AP。之前,首先建立的是 STA,属于普通客户,此时建立的是热点,只需要将热点的 SSID 取名为 QFEdu,密码设置为 123456789。此时不是连接热点,而是创建热点。创建完热点之后,以下代码是获取自己的IP地址:
print ( "AP_Ip is "..wifi.ap.getip())
也就是创建成功之后,会生成服务器的IP,相当于一个网关。设置完毕之后,使用net 接口创建 Server,与之前操作相同。代码如下:
srv=net. createServer (net. TCP)
建立好之后,直接连接80端口监听。监听的事件包括接收数据,接收数据的逻辑较为麻烦。代码如下:
Srv: li sten (80 , function (conn)
conn:on("rergeive",function (cl ient , payload)
-- print ("receive:". .payload)
local buf = "",
local_,_,method, path, vars = string. find (payload,
" ([A-Z]+) (.+)?(.+) HTTP") ;
if (method == nil) then
_,_
method, path = string. find (payload, " ([A-Z]+) (.+)
HTTP") ;
end
local GET = {}
if (vars ~= nil) then
for k,V in string. gmatch (vars," (号w+)=(号w+) &*") do
GET[k] = V
end
一开始并没有接收到数据,正常情况下,建立了一个热点之后,就需要连接热点,连接完毕之后,由于既是热点也是服务器,所以就会获取服务器的网页信息,所以一开始将网页信息放到 BUF 中。B UF..后就是连接内容,第二次 BUF..就将后面所有内容连接。代码如下:
buf = buf. ."<h1>开关</h1>" ;
buf = buf. ."<p><a href=\"?pin=ON\"><button
style=\"font-size: 50px;height: 100px;width: 180px; \">ON</button>
/a> <a href=\"?pin=OFF\"><button
style=\" font-size: 50px;height: 100px;width: 180px; \ ">OFF</button>
</a></p>";
此时的判断条件都不满足。 以下代码就是将网页发送:
client : send(buf) ;
对网页进行加工如下:
{ ssid="ChinaNet- fTVU" , pwd="hgd4de5a"}
<h1>
开关</h1>
<p>
<a href=\ "?pin=ON\">
<button style=\" font-size: 50px; height: 100px;width: 180px; \">
ON
</button>
</a>
<a href=\"?pin=OFF\">
<button style=\" font-size: 50px;height: 100px;width: 180px; \">
OFE
</button>
</a>
</p>
P 标签中有一个 A 标签。 A 标签当中存在 2 个 button。通过手机或浏览器访问服务器时。首先得到的是一个网页,网页存在标题是开关。内容有 2 个 A 标签,A 标签当中内嵌了 button。 Button 的名字叫做 on。以下为内嵌风格:
<button style=\" font-size: 50px; height: 100px;width: 180px; \">
如果点击 on 就会产生超链接。正常情况下,超链接连接到另外一个网站。但此时连接到的内容如下:
?pin=ON\
其中双引号指内容。
另一个按钮按下,得到的内容如下:
?pin=OFF\
当在手机中点击 on 或 off 时,就会将内容发送给服务器。发送给服务器,服务器接收到之后,就会产生几个变量:
Local _,_,method, path, vars = string. find (payload,
([A-Z]+) (.+)?(.+) HTTP") ;
_表示变量。其中 payload 收到的就是发送的内容如下:
?pin=ON\
?pin=OFF\
但收到的内容不止于如上代码。收到的内容是包含所有 HTTP 请求的信息如下:
recv:GET /xxxx HTTP/1.1
包括方法和路径:
payload = GET / ?pin=ON
以上为 payload 的真正收到的内容。之后的匹配方法类似于正则表达式,但并不是标准正则表达式。所以最终得到的方法就是 get,路径就是/,值就是 PIN=2。解析出的是以下 3 个变量:
method=GET
path=/
vars=pin
如果不存在就不需要理会。如果存在,就需要进行解析。 Get 相当于定义了一个表,从 VARS 中提取 pin 和值,类似于键值对。 提取出之后判断 键是否等于指定的值, 从而决定是否要开灯、关灯,之后再将网页进行发送,重复操作,最后释放资源。客户端的浏览器请求都是单次,每次请求完毕,都会发送关闭客户端的请求,以上就是服务器的结构。
二、演示
首先需要关闭之前的代码,重新打开。建议将之前的代码删除,重新进行下载。加载完毕之后,效果如下
接下来进行运行。以下代码表示热点已经创建好:
> dofile("05_ _web_ ap_ server_ light.lua")
2
AP_ Ip is 192.168.4.1
>
下载完成之后,手机上直接登录创建好的热点。首先热点必须连接 QFEdu,在浏览器中输入 192.168.4.1,点击 on,就打开了热点,点击 off,就关闭了热点:
以上就是设备作为热点的同时又是服务器的演示。如果电脑上的浏览器也可以连接热点,也可以通过电脑浏览器控制,前提是电脑 WiFi 需要连接到热点上。连接热点之后,电脑可能无法上网。打开电脑的浏览器。效果如下:
以上是 8266 作为热点,同时作为服务器的代码演示。
Node做业务开发较为简单,一方面提供了较为简单方便的接口,另一方面提供了许多案例。开关的例子也能从案例中找到,官方部件当中除了模块之外,还有Example。Example 当中就是许多案例,例如本课程所叙述的 web AP 也在其中,只需要将其简单修改即可。以上就是使用 node MCU 进行开发的优势所在。