关于LUA
和智能云平台相似,nodemcu就是esp12的核心板加一个USB转串口模块,芯片貌似比普通的USB转TTL模块上的靠谱,电路板上用了比较贵的钽电容,稳定性估计不错。
虽然号称是LUA专用平台,但是你刷好固件,用其它的SDK开发一点问题都没有。但是
,LUA确实有它的优势。下面就简单介绍一下。
什么是LUA
- LUA是一群巴西人在93年设计出来的。lua在葡萄牙语中是月亮的意思,发音就很像LUNA,我理解应该是
替月行道
的意思。 - Lua是很轻量的脚本语言,只有1M。
- 用C语言编写,和C++,C可以相互调用。
- 没有自己的库函数,因为都用别人现成的。
- 稳定性,速度,功能都不错。很多大型程序用来做嵌入式脚本,比如魔兽世界,伯德之门,和。。。三国杀
- 当然最重要的是
免费
。
如果想了解lua的更多,可以
本人并不打算介绍具体语法,因为我也不懂,我们先编程再说。
Step1
-
首先,我们从停止运行的中文官网上搞一段代码,就是左上角的那段,先把路由器给连上。
print(wifi.sta.getip())
--nil
wifi.setmode(wifi.STATION)
wifi.sta.config("SSID","password")
wifi.sta.connect()
tmr.alarm(1, 1000, 1, function()
if wifi.sta.getip() == nil then
print("Connecting...")
else
tmr.stop(1)
print("Connected, IP is "..wifi.sta.getip())
end
end) SSID
和password
要填自己路由器的名称和密码。下面逐段解释:-
wifi.sta.getip()
是在station模式下获取IP地址。 -
--
是注释符号,nil
是零的意思,在没有连接路由时,返回的IP地址是空的。 -
wifi.setmode(wifi.STATION)
很好理解,一共有三种模式,这里设置成station
模式,可以连接路由器,其他两种是AP
和AP+station
-
wifi.sta.config("SSID","password")
,就是设置路由器的密码和账号。 - 然后连接
wifi.sta.connect()
-
tmr.alarm()
是一个定时器函数,一共有四个变量,分别是:-
ID
,选择片上定时器的ID,一共有7个0~6,这里选择了1
-
interval
定时时间(ms),这里选择了1000
,就是1s -
repeat
重复闹钟次数,这里选择1
,在一次循环中只执行一次。 -
function do
到事件后执行的函数,就是后面的if...else...
语句
-
-
if...then
如果获得的IP还是空的,说明还在连接中 -
else
如果返回值不为空,说明连上了 -
tmr.stop(1)
,停止定时器1, - 然后
print()
打印IP地址wifi.sta.getip()
,..
是字符串的连接符,把两个字符串连成一体。 - 结束
if
语句 - 结束
function
Step2
- 打开ESPlor,在右侧窗口,点刷新(在open和速率选择之间),选9600,open
- 右侧串口窗口会显示一堆无法接受正确信息之类,不用搭理。
Can’t autodetect firmware, because proper answer not received (may be unknown firmware).
Please, reset module or continue. - 把
step1
中的代码,复制到右侧窗口,然后save,保存一个文件名connect.lua
-
代码编译自动上传,右侧串口窗口显示如下信息,表示连接上了。
dofile(“connect.lua”);
nil
Connecting…
Connecting…
Connecting…
Connecting…
Connected, IP is 192.168.1.3 注意不要忘记把ssid和passward改成自己路由器的。
wifi连上了,我们可以在电脑和nodemcu之间互发消息,
- 可以参考ESP8266新手入门调试指导(补全)(然而并没有链接,大家网上搜一下),
- 需要使用USR-TCP232-Test(依然没有链接)
- 收发方式有
TCP server
和TCP client
两种,这里只介绍一种,另一种请参考ESP8266新手入门调试指导(补全)
Step3
-
首先整理一下思路,用过
AT
指令的朋友们知道,在station
模式下,建立TCP
连接的步骤是:Server
模式,AT+CIPMUX=1
开启多链接模式;AT+CIPSERVER=1,8080
创建服务器;打开USR-TCP232-Test.exe
设置为客户端并连接;AT+CIPSTO=2880
设置服务器超时时间;AT+CIPSTATUS
查看当前连接确保连接上。AT+CIPSEND=0,10
向客户端发送数据,长度为10 -
Lua和
AT指令
都是在esp8266的原生API的基础上进行封装,所以步骤大同小异,打开官方lua固件里的nodemcu-firmware-master\lua_examples\tcp2uart.lua
,把超时和端口改成2880和8080uart.setup(0,9600,8,0,1,0)
sv=net.createServer(net.TCP, 2880)
global_c = nil
sv:listen(8080, function(c)
if global_c~=nil then
global_c:close()
end
global_c=c
c:on("receive",function(sck,pl) uart.write(0,pl) end)
end)
uart.on("data",4, function(data)
if global_c~=nil then
global_c:send(data)
end
end, 0) -
tcp2uart.lua
也是一个server
服务器,通过uart
输入数据发送客户端,和AT指令
是很相似的,逐段解释程序:uart.setup()
设置串口端口,变量的含义分别是:只支持一个串口(0),波特率(9600),奇偶校验(无),停止位(1),回显(0,关闭)net.createServer()
建立服务器,类型可以选择net.TCP
或net.UDP
,超时设置为60
msglobal_c = nil
是一个net.socket
类型变量,赋值为空nil
,用来监听
客户端sv:listen()
的listen
是net.server
子模块下的监听函数,(AT指令
自动执行监听,不用设置),9999
是端口号,function()
是连接成功后的回调函数,c
是回调参数,代表客户端口if...end
如果全局变量gloabal_c
不为空,则关闭close
端口gloabal_c
global_c=c
把回调参数c
赋值给全局变量gloabal_c
on(event,function())
是net.socket
子模块下的函数,返回值是nil
(也是c
的),如果envet
事件发生,执行回调函数function()
。这里
event
是recieve
,接收信息,function
的第一个变量sck
是socket的意思,就是服务器连接的客户端,p1
是从客户端接收到字符串。-
uart.write()
是function()
的内容,0
只支持一个串口,把接收到的p1
字符串写入串口 end
结束function(sck,p1)
end
结束listen()
中的function(c)
uart.on()
设置UART事件的回调函数,第一个变量method
只支持data
,表示收到数据,4
设置传输字符的长度,当收到第4个字符串,就回调函数。-
function()
就是回调函数,if...then...
是函数内容 - 如果
gloabal_c
不为空,就向客户端发送send
数据data
,也就是uart
接收到的长度为4
的字符串。 - 两个
end
分别结束if
和function(data)
几点说明
代码的功能分四块,
- 第一块
net.createServer()
设置服务器 - 第二块
listen()
实现监听,如果已连接上,监听成功,用if...then
把gloabal_c
清零,然后把USR-TCP232-Test
客户端nec.socket
类型的c
赋给gloabal_c
- 第三块
on()
实现从USR-TCP232-Test
客户端接收数据,建立在监听成功的基础上 - 第四块
uart.on()
实现向USR-TCP232-Test
客户端发送数据,只有监听成功,gloabal_c
被赋值后,才能向USR-TCP232-Test
客户端发送数据
关于
net.socket
子模块-
gloabal_c
和c
都是nec.socket
类性子模块,代表USR-TCP232-Test
客户端的连接, -
nec.sockt(
step2中保存的
connect.lua文件)块包含
on,
clos,保存并运行e,
send等方法,
gloabal_c和
c`都有调用 -
sv
是由net.createServer()
创建的net.server
服务器连接模块,包含listen
,close
,send
等方法,使用上与nec.socket
模块类似。 -
nec.socket
类型可以通过net.createConnection()
创建,如果用nodemcu作为客户端,使用该命令。
step4
- 在
ESPlore
左侧窗口中,将step3
中的代码复制到step1
中的代码之下(step2
中保存的connect.lua
文件),保存并上传运行 - 右侧串口窗口显示连接成功,给出nodemcu的
IP地址
- 打开
USR-TCP232-Test.exe
,右侧窗口选择client,服务器地址输入nodemcu的IP地址
,端口输入8080
,点击连接 - 通过
ESPlore
的串口界面可以和USR-TCP232-Test
互发信息,USR-TCP232-Test
接收到的貌似是ASCII码
写到这里,这一部分快结束了,如果你想尝试用nodemcu作为TCP client
,可以参考:
ESP8266新手入门调试指导(补全)
- nodemcu 的API说明,中文API说明 和 英文API说明 以及官方lua固件文件夹下的
\nodemcu-firmware-master\docs\en
,打开这些.md
文件你可能需要github出品的atom,非常好用的编辑器。中文说明有些错误,以.md
文件为准 -
官方lua固件文件夹里还有nodemcu的各个模块的示例
nodemcu-firmware-master\lua_modules
和nodemcu-firmware-master\lua_examples
关于LUA语言
- 从lua的文风看,已经比较接近自然语言的感觉,这一点和python有点像,但是后者有成堆的库文件。语法结构比较简洁。
- LUA是异步事件驱动,语言风格和现在很火的Node.js非常接近。比如本文代码中的PI
listen()
,on()
等API,回调函数嵌入到API中,一旦’event’事件发生就给予执行。对于有大量并发型事件的网络应用,执行效率应会提高不少。
下一篇准备写写各种网络协议:http
,udp
,telnet
等。