Luat系列教程:0、luat是什么?

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内部的基本架构

这个部分在官网有着详细的解释,引用wiki页的一张图片:

  • 首先,模块的底层固件(lod文件格式)是由c语言来进行编写的,实现了一套完整的lua虚拟机、文件系统和各种底层接口,以支持lua脚本的运行和功能的实现。

  • 接着又一个虚拟ATC接口,这个接口实际上是在lua脚本需要调用到GPRS等功能时,代替你去执行AT命令的,可以让你远离那些复杂的AT命令,专心实现功能。

  • 最后就是lua脚本与lua脚本的烧写调试了。我们编写的lua脚本都是去除了注释后直接烧录到模块中的,没有经过编译这道步骤,所以在代码出错时可以很快定位到是哪一行出的错误。同时下载口也是调试口,在脚本运行时回输出各类信息以供调试。

上面的第三点提到了lua脚本是直接烧录到模块中的,这一点也给了大家一个要注意的地方:编写luat使用的代码时不需要ide,只需要准备一个代码编辑器即可,我这里使用的时VisualStudio Code(点击下载),建议按自己的喜好进行选择。

0x03 最后

由于只是简单解释,本文篇幅也不宜太长,所以只挑了一些比较主要的来写,毕竟大部分读者的耐心都是有限的(无奈脸

最后建议在看完后,学习一下lua语法,这将会对后面的文章有很大的帮助

发表评论

您的电子邮箱地址不会被公开。