拿到这个模块(nodemcu)后,第一个想要实现的功能就是,能够在电脑上或者是手机上来控制这个模块上的一个LED灯的亮灭。也就是通过在电脑(或者手机)和模块之间建立网络连接,然后通过电脑(或者手机)发送一个数据让网络模块上的一个IO口拉高(或拉低)。一般最常用的网络连接方式有TCP和UDP两种吧,这里只是用了TCP这一种。通过在nodemcu上建立TCP服务器端,在电脑(或手机)上建立TCP客户端,两者建立连接后既可以通信啦。最开始我还以为要把TCP协议的每一个部分都看懂才能实现这个高大上的功能呢(最开始真的觉得很高大上,但其实也就是那么回事),所以我在网上找TCP协议的各种解释,看TCP协议发送的每一个数据包的每个字节和每个比特的意义,结果看到最后还是一头雾水。其实根本没有那么麻烦,只要调用API,固定的那几句程序就可以创建一个TCP服务器端。然后在电脑上通过网络调试助手创建一个客户端端,只要客户端和服务器端的IP地址和端口号对上了,就可以实现这个功能那。当然,我这么说是为了告诉大家实现这个功能并不难。要是真正的研究网络协议的话,还有好长的路要走。(现在我连编一个Widows下的应用程序都不会)好,下面我来一步一步的说一下我是怎么实现这个入门级的功能的。
1、nodemcu模块
2、网络调试助手软件(PC端或手机端)
3、ESPlorer
我的这个模块就是网上花30块钱买的,挺便宜的。需要注意的是nodemcu模块最开始出厂的时候应该默认是用AT指令库(通过写AT指令来操作),我们一般是导入nodemcu专门的固件库(通过在ESPlorer上写lua程序来操作)。烧固件这部分我就不说了,网上有很多这部分的教程的。也就是说下面的程序都是要在nodemcu的固件库成功烧写后,才能正确执行的。那么怎么才能说明成功烧写呢?烧完固件库后,打开ESPlorer。检测到com口后点击open,如下图
这样肯定是有问题的。就是那个波特率必须要调,我用的是9600,这个波特率一般的nodemcu上是有说明的吧。反正最常用的就是9600和115200。调完9600后就出现下面的一段话,就是说检测到了固件库。
这里需要注意的是,有时候必须按一下复位键,才可以检测到固件库。另外我记得有一次我是点了两下那个DTR才好用的,注意是两次。那个DTR正常情况下肯定是绿色的。
必须要知道的是,nodemcu上电复位后会自动执行 init.lua 这个程序。然而最开始你没有往模块里面导这个程序,所以你按下复位键后回显示can't open init.lua
所以你就写一个程序,把它命名为 init.lua 导进去呗。下面的是点亮LED灯的程序,我的这个模块LED的正接的VCC,负接的pin4 ,所以就是把 pin4 拉低。点击Save to ESP导入程序就行。再强调一次,文件名字必须是 init.lua
把程序中的 gpio.write(pin,gpio.LOW) 改成 gpio.write(pin,gpio.HIGH) 再导入就可以熄灭LED。这一部分先说到这。
再来说一说怎么用网络调试助手来创建客户端和服务器,网络调试助手没有的话,自己在网上随便找一个下载就行。
我们可以在一个电脑上开两个调试助手来稍微测试一下。当然电脑必须先联网。
一般打开软件后,选择TCP Server和TCP Client后它会自动检测本机IP地址的。客户端的IP地址和端口号必须和服务器端所在的IP地址和端口号保持一致。然后首先点击服务器端的“连接“(也就是建立服务器),再点击客户端的“连接”(也就是建立客户端并和服务器建立连接)。就完成了客户端和服务器之间的网络连接了,可以传送数据了。在客户端输入字母 q 点击发送,可以在服务器端接收到。当然也可以在服务器端发送数据,客户端接收数据。下面我们要做的就是在nodemcu模块上创建服务器来接收数据。
1、nodemcu创建服务器端
首先要保证电脑和nodemcu连接在同一局域网下,我的就是把他们都连到了我手机的热点上。还要知道的是,nodemcu可以导入多个程序,只是他会首先执行 init.lua ,可以在 init.lua 里调用其他的程序。这里我就直接给程序啦,因为lua语言了解的也不多,所以有些语法也没搞懂什么意思,但是其实主要就是调一些固件库里的API。这里的 init.lua 函数要稍微改一下。
最后一句就是执行 wifi.lua 。所以我们要写一个 wifi.lua 的程序导入到nodemcu里。如下
wifi.setmode(wifi.STATIONAP)
wifi.sta.config("lalalala","12341234") --手机热点的名称和密码
wifi.sta.connect() --接入手机热点
tmr.alarm(2,1000,1,function()
if wifi.sta.getip() == nil then
print("connecting...")
else tmr.stop(2)
print("connected,Ip is "..wifi.sta.getip()) --得到的是nodemcu的IP,后面客户端要连接的就是这个地址
end
end)
pin=4
gpio.mode(pin,gpio.OUTPUT)
srv=net.createServer(net.TCP,28800) --创建tcp服务器
srv:listen(8888,function(conn) --8888为端口号,可以改,但必须与客户端的端口号保持一致
conn:on("receive",function(conn,payload) --接受客户端传来的数据,并存入payload
if (payload >= "31") then --如果接受到的数据大于“31”,注意这里的比较大小是字符串的比较
gpio.write(pin,gpio.LOW) --点亮LED
print(1)
elseif (payload <="31") then --如果接受到的数据小于“31”,注意这里的比较大小是字符串的比较
gpio.write(pin,gpio.HIGH) --熄灭LED
print(0)
else
print(3) --这里的print(3)和前面的print都是为了从左边观察,没什么用
end
print(payload) --打印输出接受到的数据
end)
end)
成功导入后,只要连接上了手机的热点就可以得到nodemcu的IP地址的,可以通过print函数在右边显示出来。
这里的 wifi.lua 实现的功能就是,首先连接上自己手机的热点,然后创建TCP服务器。等待与客户端建立连接并接受其数据,如果数据大于 “31”就点亮LED,如果数据小于 “31” 就熄灭LED。这里大小的比较是字符串的比较。到这nodemcu的服务器端就创建好了。
上面有一句 wifi.lua:16 :only one tcp server allowed,可能是因为我以前导入过一次wifi.lua 吧,没什么问题的。
2、网络调试助手创建客户端
打开网络调试助手
这里服务器的ip地址和端口号必须要和前面nodemcu的对应。
然后就可以在电脑上的网络调试助手里向服务器发送一个 “41”来点亮LED(只要比“31”大就行),也可以在向服务器端发送一个“21”来熄灭LED(只要比“31”小就行)。