LUAT系列全部教程可以点击下面链接查看(建议保存书签):
https://www.chenxublog.com/tag/luat系列教程
本章适合的读者:
对编程语言有基础认识的
熟悉至少一款单片机的
不会照搬文章,对文中错误有自己的认识的
有耐心看完全文的
本人知识水平有限,如果发现文中错误,请在下面留言,谢谢!
0x00 什么是luat?
根据官网的介绍,我们可以看到如下描述:
Luat = Lua + AT, Luat推出的物联网开源架构,依托于通信模块做简易快捷的开发,将传统的AT命令用Lua语言封装成API,并提供各种功能应用的demo,大大减少用户的开发成本。
开发者可以通过调用API轻松,便捷的实现TTS、GPS、SOCKET、MQTT、OTA等功能。例如下面通过几条代码既可以实现GPS,MQTT功能。
官网的这段话可能不太直观,我们可以用同样功能的代码来作一下对比,来体现luat真正的优势所在:
NTP时间同步服务(仅用来示例,无需看懂代码)
使用c语言,利用AT命令与SIM800C通讯来同步时间
struct ABT_LocalTime_TypeDef{
u16 ALT_year;
u8 ALT_month;
u8 ALT_day;
u8 ALT_hour;
u8 ALT_minute;
u8 ALT_second;
};
extern u8 ABT_SyncTime(void)
{
if(sim900a_send_cmd((u8 *)"AT+SAPBR=3,1,\"CONTYPE\",\"GPRS\"",(u8 *)"OK",100))
return 1;
if(sim900a_send_cmd((u8 *)"AT+SAPBR=3,1,\"APN\",\"UNIWAP\"",(u8 *)"OK",500))
return 2;
sim900a_send_cmd((u8 *)"AT+SAPBR=1,1",(u8 *)"OK",200);
if(sim900a_send_cmd((u8 *)"AT+SAPBR=2,1",(u8 *)"OK",600))
return 4;
if(sim900a_send_cmd((u8 *)"AT+CNTP=\"ntp1.aliyun.com\",32",(u8 *)"OK",200))
return 5;
if(sim900a_send_cmd((u8 *)"AT+CNTP",(u8 *)"CNTP: 1",2000))
return 6;
return 0;
}
extern void ABT_GetLocalTime(void)
{
char *timePtr = NULL;
/*
if(sim900a_send_cmd((u8 *)"AT+CCLK?",(u8 *)"CCLK:",2000))
timePtr = strstr(USART2_RX_BUF,(const char *)"CCLK:");
*/
sim900a_send_cmd((u8 *)"AT+CCLK?",(u8 *)"CCLK:",2000);
timePtr = strstr((const char*)USART2_RX_BUF,(const char*)"CCLK:");
G_LocalTime.ALT_year = 2000 + 10*(timePtr[7] - '0') + timePtr[8] - '0';
G_LocalTime.ALT_month = 10*(timePtr[10] - '0') + timePtr[11] - '0';
G_LocalTime.ALT_day = 10*(timePtr[13] - '0') + timePtr[14] - '0';
G_LocalTime.ALT_hour = 10*(timePtr[16] - '0') + timePtr[17] - '0';
G_LocalTime.ALT_minute = 10*(timePtr[19] - '0') + timePtr[20] - '0';
G_LocalTime.ALT_second = 10*(timePtr[22] - '0') + timePtr[23] - '0';
}
使用luat,利用lua接口来同步时间
require"ntp"
require"misc"
local function prinTime()
local tm = misc.getClock()
log.info("testNtp.printTime", string.format("%04d/%02d/%02d,%02d:%02d:%02d", tm.year, tm.month, tm.day, tm.hour, tm.min, tm.sec))
end
sys.timerLoopStart(prinTime,1000)
ntp.timeSync()
上述代码实现了同样的功能:连接NTP服务器来进行时间同步操作。哪种方法更加简洁,相信各位的心理已经有答案了。
0x01 为什么要使用lua?
用c语言写习惯了的各位,可能会和我刚接触lua时产生同样的疑惑:为什么luat要选择用lua语言来进行开发?
不过当我熟悉了之后,很快就不再去想起这个问题了,因为与C语言相比,很多地方的语法十分自由(虽然会带来一些麻烦吧),而且由于lua是一门脚本语言,所以在luat架构中你可以对一个很完善的文件系统来进行各种操作,运行的lua脚本都是真真实实存在的文件;同时由于运行的程序都是脚本的原因,远程升级固件也变得十分简单。
另外一说,请不熟悉lua的各位,在本文结束后,去熟悉一下lua的基本语法,在后面会有很大的帮助。
0x02 luat内部的基本架构
- 首先,模块的底层固件(lod文件格式)是由c语言来进行编写的,实现了一套完整的lua虚拟机、文件系统和各种底层接口,以支持lua脚本的运行和功能的实现。
接着又一个虚拟ATC接口,这个接口实际上是在lua脚本需要调用到GPRS等功能时,代替你去执行AT命令的,可以让你远离那些复杂的AT命令,专心实现功能。
最后就是lua脚本与lua脚本的烧写调试了。我们编写的lua脚本都是去除了注释后直接烧录到模块中的,没有经过编译这道步骤,所以在代码出错时可以很快定位到是哪一行出的错误。同时下载口也是调试口,在脚本运行时回输出各类信息以供调试。
上面的第三点提到了lua脚本是直接烧录到模块中的,这一点也给了大家一个要注意的地方:编写luat使用的代码时不需要ide,只需要准备一个代码编辑器即可,我这里使用的时VisualStudio Code(点击下载),建议按自己的喜好进行选择。
0x03 最后
由于只是简单解释,本文篇幅也不宜太长,所以只挑了一些比较主要的来写,毕竟大部分读者的耐心都是有限的(无奈脸
最后建议在看完后,学习一下lua语法,这将会对后面的文章有很大的帮助
转载保留版权:晨旭的博客 » 《Luat系列教程:0、luat是什么?》如果喜欢可以: 点击右侧上方的邮件订阅,订阅本站