开发者学堂课程【嵌入式之 RFID 开发与应用2020版:Wifi-nodeMCU-esp8266tcp 服务器创建并通过 tcp 调试助手远程控制 LED】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/665/detail/11207
Wifi-nodeMCU-esp8266tcp 服务器创建并通过 tcp 调试助手远程控制 LED
接下来进入 8266 的核心功能,8266 主要是 wifi 模块那么基于 wifi 的网络编程是比较重要的部分。接下来不按 ppt 讲解,主要讲解一下内容:第一个是模块作为服务器,第二个是是模块作为客户端,第三个是模块作为热点,最后是模块作为普通家用节点或者热点和普通的终端兼容的功能。
一、模块作为服务器
首先做模块作为服务器的内容,这部分内容比较简单。打开代码,首先配置了 IO 接口,配置成输出并且配置为高电平根硬件电路有关,GPIO16 连接 IO,VDD3V3连接高电平它是共阳的,共阳意味着低电平灯亮高电平灯灭。使用代码中开始是设置高电平使灯灭,wifi.setmode (wifi.STATIONAP) 设置 wifi 的工作模式STATIONAP(混合模式)既可以做热点又可以做客户端。
设置 Wifi 工作模式:wifi.STATIONAP,I 混合模式,软路由即热点和客户端共存模式,既要连接服务器又要给客户提供连接服务器。最简单的模:wifi.STATION,客户端模式,只能搜索别的 wifi 信号进行接入。wifi.SOFTAP,软路由或支持热点,自己当做路由建立热点,等待其它设备连接。
代码中使用 wifi.STATIONAP,I混合模式;而下面语句 connect 意思是连接别人,连接别人可以使用客户端模式。station_cfg {ssid="huiyi",pwd="huiyi..."}
服务器的 ssid 和服务器密码,ssid 更改为 ChinaNet-fTVU,密码改为 hgd4de5a,然后继续配置,其中不明白的可以参考手册中的 wifi 模块。设置模式后需要获取模式,有关联网不属于 wifi 需要查找子模块中的内容. wifi.sta.config(station cfg)
wifi.sta.connect () 配网后进行连接,怎么知道是否连接成功需要创建一个定时器t tmr.create()。然后给定时器注册一个回调函数,定时器以毫秒为单位,t:register (1000,tmr.ALARM AUTO,function ()一秒钟的定时器以闹钟的形式自动触发,到时间会调用函数 function()。
函数定义: function 关键字,然后是函数名 create_srv,这个函数是无参的可以在括号中添加参数。之前讲过不管是函数题还是循环体或者是条件语句后都需要加上 end。
代码中的第一个 end 是回调函数的,第二个 endt 类中是 register方法。如果代码看着不习惯,可以进行拆分:
function conn_back()
if wifi.sta.getip()==nil then
print ("connecting...")
else
print("connected,Ip is "..wifi.sta.getip())
t:stop()
create_srv()
end
end
I
t tmr.create()
t:register (1000,tmr.ALARM_AUTO,conn_back)
t:start()
t:register (1000,tmr.ALARM AUTO,function
一秒钟的定时器以闹钟的形式自动触发,到时间会调用函数 function()。函数中 if wifi.sta.getip()==nil then通过 WiFi 的子模块获取 ip 如果获取 ip 为空表示还在连接即未连接,然后继续获取 IP。如果得到 IP 执行 else 后的语句把 IP 打印出来,打印后执行 t:stop()关闭闹钟,关闭闹钟表示已经连上 WiFi,连上 WiFi 后创建服务器 create_srv 。第一个函数中 print 指打印数据到终端,print("connected,Ip is "..wifi.sta.getip())
中的..表示字符串连接即前后字符串连接,wifi.sta.getip()为 IP 地址,把两个字符串连接成一个字符串(在 python 中使用加号进行字符串的连接)然后调用函数 create_srv。
函数 create_srv 创建服务器,使用 net 模块创建服务器。srv=net.create
Server (net.TCP,30) 创建 TCP 服务器,30 是指延迟的时间。srv:listen (8888,function(conn) 调用 listen 监听 8888;监听时假设发生一些事件例如收到数据还有其他事件,这里只处理一个接受到数据。conn:on ("receive",function(client,pyload) 然后有是一个回调,监听到后把参数传递过来,然后连接客户端,客户端发送数据,pyload 即发来的数据。
if (string.find(payload,"open")~=nil)then 如果从发来的数据中可以找到 open,~=nil 表示能够找到 open,string.find 字符串查找,如果找到 open 执行apio.write(led,qpio.LOW) 把灯点亮。
elseif (string.find(payload,"close")~=nil)then
如果找到 close,把灯关闭 gpio.write(led,gpio.HIGH)。如果即找不到 open 又找不到 close 把传递的内容输出,print("recv:"..payload)。client:send (payload.."...oK\n");
给客户端回复 OK,如关灯 OK,开灯 OK。最后 collectgarbage();表示垃圾回收,一般加上collectgarbage();回收网络资源。
在工具 ESPlorer 中点击 open 打开文档, reload 刷新代码,然后点击 CTRL+S保存代码后点击 Save 加载代码,下载完成后模块开始连接,连接到 IP 为192.168.1.17 已经连接到热点并获取到 IP。接下来访问服务器,需要使用一个网络调试助手,可以在网上下载。首先,注意是 TCP 的客户端,服务器 IP 为192.168.1.17, 服务器端口号为 8888,然后点击 【连接】
连接后开发板灯亮,因为默认的是亮灯。在网络调试助手中发送 close,服务器回了 OK 但是灯并没有灭,服务器发送 OK 表示已经收到指令。重新在网络调试助手中发送 open,开发板上面的灯亮,那么刚才没有出错,是操作开发板上面的灯。
那么关于网络 server 讲解到这,下节课讲解如何同继电器连接起来或者是如何通过网页,手机如何控制。