跳转至

数据打包解包(pack)

一、LuatOS string 库 pack 和 unpack 接口

LuatOS string 库的 pack 和 unpack 是一个用于在 Lua 程序中进行二进制数据打包和解包操作的接口,支持多种数据类型和字节序格式,方便处理二进制协议和文件。

由于 Lua 中字符串几乎可以用于存储所有形式的数据,所以下面先系统介绍下 Lua 字符串的特点,方便习惯使用 C 语言编程的初学者系统的了解两种语言在数据存储方面的一些差异。

1.1 字节序的概念

字节序是指在计算机存储或传输多字节数据时,字节的排列顺序,通常分为大端序(big-endian,最高有效字节在前)和小端序(little-endian,最低有效字节在前)。

大端也常被称作叫“网络序”因为 TCP、UDP 网络数据传输和存储都使用这种格式,而一些像 STM32 等 ARM 单片机,则使用小端存储格式;

1.2 Lua 中字符串存储

Lua 中字符串可以存储所有字节数据,包括“字符串中的可见和不可见字符”,这一点与 C 语言有很大区别;

1.3 Lua 中字符串的序号

注:Lua 中字符串首字节从序号 1 开始,而不像 C 语言是从序号 0 开始;并且 Lua 字符串有正数序号也有负数序号,这一点也与 C 语言不同;

二、演示功能概述

本文使用 Air201 模组,运用 LuatOS string 库 pack 和 unpack 接口对二进制数据进行打包和解包操作。

三、准备硬件环境

3.1 Air201模组

点击链接购买:合宙Air201模组淘宝购买链接

此模组的详细使用说明参考:Air201 产品手册

3.2 TYPE-C 数据线

购买链接(注意:必须是具备USB通信的数据线!)

四、准备软件环境

4.1 Luatools

Luatools 日志打印与程序烧录软件下载

4.2 core 固件和源码脚本

注:core 固件,是基础环境,该固件由合宙官方提供,用户不可修改;源码脚本,为应用程序,可由客户自行修改; 右键点我,另存为,下载完整压缩文件包

五、软硬件资料

1、此模组的详细使用说明参考:Air201 产品手册

2、API 使用介绍说明

5.1 开发板按钮与指示灯图示与说明

5.2 硬件安装与连接

5.2.1 SIM 卡安装

5.2.2 实物连接图

注:开发板与电脑通过 TYPE-C 线连接,用于通信与供电,所以必须使用具有 USB 通信功能的 TYPE-C 线才可以;

六、代码示例介绍

6.1 完整程序清单

注:完整复制后保存为 main.lua,可直接使用

-- LuaTools需要PROJECT和VERSION这两个信息
PROJECT = "pack_demo"
VERSION = "2.0.0"

--[[
本demo演示 string字符串的基本操作
1\. lua的字符串是带长度, 这意味着, 它不依赖0x00作为结束字符串, 可以包含任意数据
2\. lua的字符串是不可变的, 就不能直接修改字符串的一个字符, 修改字符会返回一个新的字符串
]]

-- sys库是标配
_G.sys = require("sys")
sysplus = require("sysplus")

sys.taskInit(function ()
    sys.wait(1000) -- 免得看不到日志
    local tmp

    --实验1:以小端方式编码
    local data = string.pack("<I", 0xAABBCCDD)      --‘<’表示以小端方式编码,'I'表示,unsigned int , 4字节
    log.info("pack:",         string.format("%02X", data:byte(1)),         --输出小端编码后的数据
                                            string.format("%02X", data:byte(2)), 
                                            string.format("%02X", data:byte(3)), 
                                            string.format("%02X", data:byte(4)))

    --实验2:以大端方式编码
    local data = string.pack(">I", 0xAABBCCDD)
    log.info("pack:",         string.format("%02X", data:byte(1)),   --输出大端编码后的数据
                                            string.format("%02X", data:byte(2)), 
                                            string.format("%02X", data:byte(3)), 
                                            string.format("%02X", data:byte(4)))

    --实验3:对上面已经完成的大端编码,再次进行解包为每个字节                                        
    local byte1,byte2,byte3,byte4 = string.unpack(">BBBB", data)  --将32位数据拆成4个8位字节数据
--log.info("Unpack", byte1,byte2,byte3,byte4)                
    log.info("Unpack:", string.format("%02X", byte1),   --以十六进制形式输出拆解后的4个字节数据,分别对应byte1~4
                                            string.format("%02X", byte2), 
                                            string.format("%02X", byte3), 
                                            string.format("%02X", byte4))
end)
-- 这里演示4G模块上网后,会自动点亮网络灯,方便用户判断模块是否正常开机
sys.taskInit(function()
    while true do
        sys.wait(6000)
        if mobile.status() == 1 then
            gpio.setup(1, 1, gpio.PULLUP) 
        else
            gpio.setup(1, 0, gpio.PULLUP)
            mobile.reset()
        end
    end
end)
-- 用户代码已结束---------------------------------------------
-- 结尾总是这一句
sys.run()
-- sys.run()之后后面不要加任何语句!!!!!

七、功能验证

7.1 开机

按图 1 所示通过 TYPE-C 线将开发板与电脑连接无误后,此时按下开机键,约 2 秒后释放,等待几秒蓝色指示灯常亮,即开机并联网成功,如下图:

此时电脑设备管理器中会发现下图所示几个设备,即代表开机成功!

7.2 打开 Luatool 软件工具并进入项目管理测试页面

7.3 按序号步骤创建项目

7.4 按如下步骤进行程序烧录

Air201进入boot下载模式,烧录固件和程序,需要将预留的测试点(Air201板子 B面图) 的BOOT 上拉到vdd_ext(A面USB旁边),之后上电开机,即可进入下载模式,下载完程序后将boot脚悬空。

Air201板子 A面图

Air201板子 B面图

判断是否进入 BOOT 模式:模块上电,此时在电脑的设备管理器中,查看串口设备, 会出现一个端口表示进入了 BOOT 下载模式,如下图所示:

7.5 观察下载过程后确认烧录结果

下载中

下载成功

7.6 关闭项目管理界面,回到调试页面,观察输出

注:详细日志输出内容,在程序中有增强注释说明,请详细查看。

八、总结

至此,我们已使用 Air201模组验证了 LuatOS string 库 pack 和 unpack 接口对二进制数据进行打包和解包的功能。

九、拓展说明

lua 5.3 之前,string 不支持这两个接口,当时我们移植了 pack 库,使用方法和 string 库的两个接口原理一样,函数入口参数顺序有少许差别,具体可以参考 api(https://docs.openluat.com/air201/luatos/api/core/pack/),当前最新固件 string 已完全支持 pack 和 unpack 两个接口,所以开发者可直接使用 string 这两个方法即可。