Forráskód Böngészése

update: 更新miniz/fastlz/hmeta添加gmssl demo

shenyuanyuan 3 hónapja
szülő
commit
eae89a7bd7
65 módosított fájl, 3126 hozzáadás és 351 törlés
  1. 31 14
      module/Air780EHM_Air780EHV_Air780EGH/demo/fastlz/fastlz_app.lua
  2. 24 18
      module/Air780EHM_Air780EHV_Air780EGH/demo/fastlz/main.lua
  3. 46 20
      module/Air780EHM_Air780EHV_Air780EGH/demo/fastlz/readme.md
  4. 0 0
      module/Air780EHM_Air780EHV_Air780EGH/demo/fastlz/test.txt
  5. 71 0
      module/Air780EHM_Air780EHV_Air780EGH/demo/gmssl/gmssl_sm2.lua
  6. 43 0
      module/Air780EHM_Air780EHV_Air780EGH/demo/gmssl/gmssl_sm2sign.lua
  7. 26 0
      module/Air780EHM_Air780EHV_Air780EGH/demo/gmssl/gmssl_sm3.lua
  8. 53 0
      module/Air780EHM_Air780EHV_Air780EGH/demo/gmssl/gmssl_sm4.lua
  9. 78 0
      module/Air780EHM_Air780EHV_Air780EGH/demo/gmssl/main.lua
  10. 92 0
      module/Air780EHM_Air780EHV_Air780EGH/demo/gmssl/readme.md
  11. 24 0
      module/Air780EHM_Air780EHV_Air780EGH/demo/hmeta/hmeta_app.lua
  12. 60 19
      module/Air780EHM_Air780EHV_Air780EGH/demo/hmeta/main.lua
  13. 54 0
      module/Air780EHM_Air780EHV_Air780EGH/demo/hmeta/readme.md
  14. 60 30
      module/Air780EHM_Air780EHV_Air780EGH/demo/miniz/main.lua
  15. 47 0
      module/Air780EHM_Air780EHV_Air780EGH/demo/miniz/miniz_app.lua
  16. 55 0
      module/Air780EHM_Air780EHV_Air780EGH/demo/miniz/readme.md
  17. 0 0
      module/Air780EHM_Air780EHV_Air780EGH/demo/miniz/test.txt
  18. 71 0
      module/Air780EPM/demo/gmssl/gmssl_sm2.lua
  19. 43 0
      module/Air780EPM/demo/gmssl/gmssl_sm2sign.lua
  20. 26 0
      module/Air780EPM/demo/gmssl/gmssl_sm3.lua
  21. 53 0
      module/Air780EPM/demo/gmssl/gmssl_sm4.lua
  22. 78 0
      module/Air780EPM/demo/gmssl/main.lua
  23. 88 0
      module/Air780EPM/demo/gmssl/readme.md
  24. 24 0
      module/Air780EPM/demo/hmeta/hmeta_app.lua
  25. 60 19
      module/Air780EPM/demo/hmeta/main.lua
  26. 50 0
      module/Air780EPM/demo/hmeta/readme.md
  27. 60 30
      module/Air780EPM/demo/miniz/main.lua
  28. 47 0
      module/Air780EPM/demo/miniz/miniz_app.lua
  29. 51 0
      module/Air780EPM/demo/miniz/readme.md
  30. 0 0
      module/Air780EPM/demo/miniz/test.txt
  31. 68 0
      module/Air8000/demo/fastlz/fastlz_app.lua
  32. 71 0
      module/Air8000/demo/fastlz/main.lua
  33. 63 0
      module/Air8000/demo/fastlz/readme.md
  34. 0 0
      module/Air8000/demo/fastlz/test.txt
  35. 71 0
      module/Air8000/demo/gmssl/gmssl_sm2.lua
  36. 43 0
      module/Air8000/demo/gmssl/gmssl_sm2sign.lua
  37. 26 0
      module/Air8000/demo/gmssl/gmssl_sm3.lua
  38. 53 0
      module/Air8000/demo/gmssl/gmssl_sm4.lua
  39. 78 0
      module/Air8000/demo/gmssl/main.lua
  40. 89 0
      module/Air8000/demo/gmssl/readme.md
  41. 24 0
      module/Air8000/demo/hmeta/hmeta_app.lua
  42. 61 16
      module/Air8000/demo/hmeta/main.lua
  43. 52 0
      module/Air8000/demo/hmeta/readme.md
  44. 60 30
      module/Air8000/demo/miniz/main.lua
  45. 47 0
      module/Air8000/demo/miniz/miniz_app.lua
  46. 52 0
      module/Air8000/demo/miniz/readme.md
  47. 0 0
      module/Air8000/demo/miniz/test.txt
  48. 0 97
      module/Air8101/demo/fastlz/fastlz.h
  49. 68 0
      module/Air8101/demo/fastlz/fastlz_app.lua
  50. 55 40
      module/Air8101/demo/fastlz/main.lua
  51. 62 0
      module/Air8101/demo/fastlz/readme.md
  52. 0 0
      module/Air8101/demo/fastlz/test.txt
  53. 71 0
      module/Air8101/demo/gmssl/gmssl_sm2.lua
  54. 43 0
      module/Air8101/demo/gmssl/gmssl_sm2sign.lua
  55. 26 0
      module/Air8101/demo/gmssl/gmssl_sm3.lua
  56. 53 0
      module/Air8101/demo/gmssl/gmssl_sm4.lua
  57. 78 0
      module/Air8101/demo/gmssl/main.lua
  58. 88 0
      module/Air8101/demo/gmssl/readme.md
  59. 24 0
      module/Air8101/demo/hmeta/hmeta_app.lua
  60. 67 18
      module/Air8101/demo/hmeta/main.lua
  61. 49 0
      module/Air8101/demo/hmeta/readme.md
  62. 71 0
      module/Air8101/demo/miniz/main.lua
  63. 47 0
      module/Air8101/demo/miniz/miniz_app.lua
  64. 51 0
      module/Air8101/demo/miniz/readme.md
  65. 0 0
      module/Air8101/demo/miniz/test.txt

+ 31 - 14
module/Air780EHM_Air780EHV_Air780EGH/demo/fastlz/fastlz_test.lua → module/Air780EHM_Air780EHV_Air780EGH/demo/fastlz/fastlz_app.lua

@@ -1,17 +1,28 @@
 --[[
-@module  fastlz_test
-@summary fastlz压缩与解压缩测试功能模块
+@module  fastlz_app
+@summary fastlz_app 
 @version 1.0
-@date    2025.07.01
-@author  孟伟
+@date    2025.10.28
+@author  沈园园
 @usage
-使用Air780EHM演示压缩与解压缩的流程。
+本文件为fastlz应用功能模块,核心业务逻辑为:
+1、演示压缩与解压缩的流程;
+
+本文件没有对外接口,直接在main.lua中require "fastlz_app"就可以加载运行;
 ]]
 
-function test_fastlz_func()
-    sys.wait(1000)
+
+function fastlz_compress_uncompress_func(mode)
     -- 原始数据
-    local originStr = io.readFile("/luadb/test.txt") or "q309pura;dsnf;asdouyf89q03fonaewofhaeop;fhiqp02398ryhai;ofinap983fyua0weo;ifhj3p908fhaes;iofaw789prhfaeiwop;fhaesp98fadsjklfhasklfsjask;flhadsfk"
+    local originStr
+    if mode == 1 then
+        log.info("原始数据文件读取2K数据")
+        originStr = io.readFile("/luadb/test.txt")          
+    else
+        log.info("原始数据108长度字符串")
+        originStr = "abcd1234567890efghijklmnopqrstuvwxyzabcd1234567890efghijklmnopqrstuvwxyzabcd1234567890efghijklmnopqrstuvwxyz"            
+    end
+    
     local maxOut = #originStr
     log.info("原始数据长度", #originStr)
 
@@ -29,8 +40,6 @@ function test_fastlz_func()
         log.info("压缩等级1:解压后的数据与原始数据不同")
     end
 
-    sys.wait(1000)
-
     -- 以压缩等级2 进行压缩
     local L2 = fastlz.compress(originStr, 2)
     log.info("压缩等级2:压缩后的数据长度", #L2)
@@ -44,8 +53,16 @@ function test_fastlz_func()
         log.info("压缩等级2:解压后的数据与原始数据相同")
     else
         log.info("压缩等级2:解压后的数据与原始数据不同")
-    end
+    end     
+end
+
+function fastlz_task_func()
+    -- 原始数据108长度字符串
+    fastlz_compress_uncompress_func()
+    -- 原始数据文件读取2K数据
+    fastlz_compress_uncompress_func(1)   
 end
---创建并且启动一个task
---运行这个task的主函数test_fastlz_func
-sys.taskInit(test_fastlz_func)
+
+
+--创建一个task,并且运行task的主函数fastlz_task_func
+sys.taskInit(fastlz_task_func)

+ 24 - 18
module/Air780EHM_Air780EHV_Air780EGH/demo/fastlz/main.lua

@@ -1,13 +1,16 @@
 --[[
 @module  main
-@summary LuatOS用户应用脚本文件入口,总体调度应用逻辑
+@summary LuatOS用户应用脚本文件入口,总体调度应用逻辑 
 @version 1.0
-@date    2025.07.01
-@author  孟伟
+@date    2025.10.28
+@author  沈园园
 @usage
-本demo演示的功能为:
-实现使用Air780EHM来对文本/段落序列、原始像素数据序列或具有大量重复的任何其他数据块的快速压缩与解压缩。
+本demo演示的核心功能为:
+演示如何对数据压缩解压
+更多说明参考本目录下的readme.md文件
 ]]
+
+
 --[[
 必须定义PROJECT和VERSION变量,Luatools工具会用到这两个变量,远程升级功能也会用到这两个变量
 PROJECT:项目名,ascii string类型
@@ -17,19 +20,25 @@ VERSION:项目版本号,ascii string类型
             X、Y、Z各表示1位数字,三个X表示的数字可以相同,也可以不同,同理三个Y和三个Z表示的数字也是可以相同,可以不同
             因为历史原因,YYY这三位数字必须存在,但是没有任何用处,可以一直写为000
         如果不使用合宙iot.openluat.com进行远程升级,根据自己项目的需求,自定义格式即可
-
-
 ]]
--- LuaTools需要PROJECT和VERSION这两个信息
-PROJECT = "FastLZ"
+PROJECT = "luatos_fastlz_app"
 VERSION = "001.000.000"
 
---添加硬狗防止程序卡死
+
+-- 在日志中打印项目名和项目版本号
+log.info("main", PROJECT, VERSION)
+
+
+-- 如果内核固件支持wdt看门狗功能,此处对看门狗进行初始化和定时喂狗处理
+-- 如果脚本程序死循环卡死,就会无法及时喂狗,最终会自动重启
 if wdt then
-    wdt.init(9000)--初始化watchdog设置为9s
-    sys.timerLoopStart(wdt.feed, 3000)--3s喂一次狗
+    --配置喂狗超时时间为9秒钟
+    wdt.init(9000)
+    --启动一个循环定时器,每隔3秒钟喂一次狗
+    sys.timerLoopStart(wdt.feed, 3000)
 end
 
+
 -- 如果内核固件支持errDump功能,此处进行配置,【强烈建议打开此处的注释】
 -- 因为此功能模块可以记录并且上传脚本在运行过程中出现的语法错误或者其他自定义的错误信息,可以初步分析一些设备运行异常的问题
 -- 以下代码是最基本的用法,更复杂的用法可以详细阅读API说明文档
@@ -53,13 +62,10 @@ end
 --     log.info("mem.sys", rtos.meminfo("sys"))
 -- end, 3000)
 
-
---加载fastlz测试应用模块
-require "fastlz_test"
-
-
+-- 加载fastlz_app应用功能模块
+require "fastlz_app"
 
 -- 用户代码已结束---------------------------------------------
 -- 结尾总是这一句
 sys.run()
--- sys.run()之后后面不要加任何语句!!!!!
+-- sys.run()之后不要加任何语句!!!!!因为添加的任何语句都不会被执行

+ 46 - 20
module/Air780EHM_Air780EHV_Air780EGH/demo/fastlz/readme.md

@@ -1,40 +1,66 @@
+## 功能模块介绍
+
+1、main.lua:主程序入口;
+
+2、fastlz_app.lua:如何对数据压缩解压;
 
 ## 演示功能概述
 
-将使用Air780EHM核心板,演示FastLZ的压缩与解压缩的使用方法,实现读取文件系统中的文件,并演示压缩与解压缩的代码实现。
+1、创建一个task;
+
+2、演示如何对数据压缩解压;
+
 
 ## 演示硬件环境
 
-1、Air780EHM核心板一块
+![](https://docs.openluat.com/air780ehv/luatos/common/hwenv/image/Air780EHV2.png)
+
+1、Air780EHM/Air780EHV/Air780EGH核心板一块
 
 2、TYPE-C USB数据线一根
 
-3、Air780EHM核心板和数据线的硬件接线方式为
+3、Air780EHM/Air780EHV/Air780EGH核心板和数据线的硬件接线方式为
+
+- Air780EHM/Air780EHV/Air780EGH核心板通过TYPE-C USB口连接TYPE-C USB 数据线,数据线的另外一端连接电脑的USB口;
+- 核心板正面的 ON/OFF 拨动开关 拨到ON一端;
 
-- Air780EHM核心板通过TYPE-C USB口供电;(核心板USB旁边的开关拨到on一端)
 
-- TYPE-C USB数据线直接插到核心板的TYPE-C USB座子,另外一端连接电脑USB口;
 ## 演示软件环境
 
-1、Luatools下载调试工具
+1、[Luatools下载调试工具](https://docs.openluat.com/air780ehv/luatos/common/download/)
 
-2、[Air780EHM V2007版本固件](https://gitee.com/openLuat/LuatOS/tree/master/module/Air780EHM/core)(理论上最新版本固件也可以,如果使用最新版本的固件不可以,可以烧录V2007固件对比验证)
+2、[Air780EHM 最新版本的内核固件](https://docs.openluat.com/air780epm/luatos/firmware/version/)
 
-## 演示核心步骤
+3、[Air780EHV 最新版本的内核固件](https://docs.openluat.com/air780ehv/luatos/firmware/version/)
 
-1、搭建好硬件环境
+4、[Air780EGH 最新版本的内核固件](https://docs.openluat.com/air780egh/luatos/firmware/version/)
 
-2、通过Luatools将demo与固件烧录到核心板中
 
-3、烧录好后,板子开机将会在Luatools上看到如下打印:
+## 演示核心步骤
 
-```lua
-[2025-06-30 14:10:53.447][000000001.239] I/user.原始数据长度	14525
-[2025-06-30 14:10:53.469][000000001.241] I/user.压缩等级1:压缩后的数据长度	212
-[2025-06-30 14:10:53.484][000000001.242] I/user.压缩等级1:解压后的的数据长度	14525
-[2025-06-30 14:10:53.509][000000001.243] I/user.压缩等级1:解压后的数据与原始数据相同
-[2025-06-30 14:10:54.166][000000002.244] I/user.压缩等级2:压缩后的数据长度	114
-[2025-06-30 14:10:54.178][000000002.246] I/user.压缩等级2:解压后的数据长度	14525
-[2025-06-30 14:10:54.191][000000002.247] I/user.压缩等级2:解压后的数据与原始数据相同
+1、搭建好硬件环境
 
-```
+2、Luatools烧录内核固件和demo脚本代码
+
+3、烧录成功后,自动开机运行
+
+4、出现类似于下面的日志,就表示运行成功:
+
+``` lua
+[2025-10-28 17:11:11.613][000000000.368] I/user.原始数据108长度字符串
+[2025-10-28 17:11:11.613][000000000.369] I/user.原始数据长度 108
+[2025-10-28 17:11:11.623][000000000.370] I/user.压缩等级1:压缩后的数据长度 47
+[2025-10-28 17:11:11.623][000000000.371] I/user.压缩等级1:解压后的的数据长度 108
+[2025-10-28 17:11:11.623][000000000.371] I/user.压缩等级1:解压后的数据与原始数据相同
+[2025-10-28 17:11:11.623][000000000.373] I/user.压缩等级2:压缩后的数据长度 47
+[2025-10-28 17:11:11.633][000000000.374] I/user.压缩等级2:解压后的数据长度 108
+[2025-10-28 17:11:11.637][000000000.374] I/user.压缩等级2:解压后的数据与原始数据相同
+[2025-10-28 17:11:11.637][000000000.374] I/user.原始数据文件读取2K数据
+[2025-10-28 17:11:11.643][000000000.375] I/user.原始数据长度 2048
+[2025-10-28 17:11:11.643][000000000.377] I/user.压缩等级1:压缩后的数据长度 128
+[2025-10-28 17:11:11.643][000000000.378] I/user.压缩等级1:解压后的的数据长度 2048
+[2025-10-28 17:11:11.653][000000000.378] I/user.压缩等级1:解压后的数据与原始数据相同
+[2025-10-28 17:11:11.653][000000000.379] I/user.压缩等级2:压缩后的数据长度 116
+[2025-10-28 17:11:11.693][000000000.380] I/user.压缩等级2:解压后的数据长度 2048
+[2025-10-28 17:11:11.713][000000000.380] I/user.压缩等级2:解压后的数据与原始数据相同
+```

A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 0 - 0
module/Air780EHM_Air780EHV_Air780EGH/demo/fastlz/test.txt


+ 71 - 0
module/Air780EHM_Air780EHV_Air780EGH/demo/gmssl/gmssl_sm2.lua

@@ -0,0 +1,71 @@
+--[[
+@module  gmssl_sm2
+@summary gmssl_sm2 
+@version 1.0
+@date    2025.10.29
+@author  沈园园
+@usage
+本文件为gmssl sm2应用功能模块,核心业务逻辑为:
+1、演示国密sm2加密和解码的应用;
+
+本文件没有对外接口,直接在main.lua中require "gmssl_sm2"就可以加载运行;
+]]
+
+
+function gmssl_sm2_encrypt_decrypt(originStr, pkx, pky, private)
+    -- GMSSL默认格式
+    log.info("==== SM2 默认GMSSL模式")
+    local encodeStr = gmssl.sm2encrypt(pkx,pky,originStr)
+    log.info("sm2默认模式", "加密后", encodeStr and  string.toHex(encodeStr))
+    if encodeStr then
+        log.info("sm2默认模式", "解密后", gmssl.sm2decrypt(private,encodeStr))
+    end
+    
+
+    -- 网站兼容模式 https://i.goto327.top/CryptTools/SM2.aspx
+    -- 密文格式 C1C3C2, 新国标, 一般是这种
+    log.info("==== SM2 网站兼容模式")
+    local encodeStr = gmssl.sm2encrypt(pkx,pky,originStr, true)
+    log.info("sm2网站兼容模式 C1C3C2", "加密后", encodeStr and  string.toHex(encodeStr))
+    if encodeStr then
+        log.info("sm2网站兼容模式 C1C3C2", "解密后", gmssl.sm2decrypt(private,encodeStr, true))
+    else
+        log.info("解密失败")
+    end
+    -- 密文格式 C1C2C3, 老国标, 老的Java库通常支持这种
+    log.info("==== SM2 网站兼容模式, 但C1C2C3")
+    local encodeStr = gmssl.sm2encrypt(pkx,pky,originStr, true, true)
+    log.info("sm2网站兼容模式 C1C2C3", "加密后", encodeStr and  string.toHex(encodeStr))
+    if encodeStr then
+        log.info("sm2网站兼容模式 C1C2C3", "解密后", gmssl.sm2decrypt(private,encodeStr, true, true))
+    else
+        log.info("解密失败")
+    end
+end
+
+
+local function gmssl_sm2_task_func()
+    -- 未加密字符串
+    local originStr = "!!from LuatOS!!"
+
+    -- SM2 , 非对称加密, 类似于RSA,但属于椭圆算法
+    -- 就当前实现还是比较慢的
+    if gmssl.sm2encrypt then -- 部分BSP不支持
+        local pkx = "ABE87C924B7ECFDEA1748A06E89003C9F7F4DC5C3563873CE2CAE46F66DE8141"
+        local pky = "9514733D38CC026F2452A6A3A3A4DA0C28F864AFA5FE2C45E0EB6B761FBB5286"
+        local private = "129EDC282CD2E9C1144C2E7315F926D772BC96600D2771E8BE02060313FE00D5"
+        gmssl_sm2_encrypt_decrypt(originStr, pkx, pky, private)
+    end
+
+    -- SM密钥生成
+    if gmssl.sm2keygen then
+        log.info("SM2密钥生成测试")
+        originStr = "32wrniosadnfvnadsio;fasiow"
+        local pkx, pky, private = gmssl.sm2keygen()
+        gmssl_sm2_encrypt_decrypt(originStr, pkx, pky, private)
+    end
+
+end
+
+sys.taskInit(gmssl_sm2_task_func)
+

+ 43 - 0
module/Air780EHM_Air780EHV_Air780EGH/demo/gmssl/gmssl_sm2sign.lua

@@ -0,0 +1,43 @@
+--[[
+@module  gmssl_sm2sign
+@summary gmssl_sm2sign 
+@version 1.0
+@date    2025.10.29
+@author  沈园园
+@usage
+本文件为gmssl sm2sign应用功能模块,核心业务逻辑为:
+1、演示国密SM2签名和验签的应用;
+
+本文件没有对外接口,直接在main.lua中require "gmssl_sm2sign"就可以加载运行;
+]]
+
+
+local function gmssl_sm2sign_task_func()
+
+    -- SM2签名和验签
+    if gmssl.sm2sign then
+        local originStr = string.fromHex("434477813974bf58f94bcf760833c2b40f77a5fc360485b0b9ed1bd9682edb45")
+        local pkx = "ABE87C924B7ECFDEA1748A06E89003C9F7F4DC5C3563873CE2CAE46F66DE8141"
+        local pky = "9514733D38CC026F2452A6A3A3A4DA0C28F864AFA5FE2C45E0EB6B761FBB5286"
+        local private = "129EDC282CD2E9C1144C2E7315F926D772BC96600D2771E8BE02060313FE00D5"
+
+        -- 不带id的情况,即默认id="1234567812345678"
+        local sig = gmssl.sm2sign(private, originStr, nil)
+        log.info("sm2sign", sig and sig:toHex())
+        if sig then
+            local ret = gmssl.sm2verify(pkx, pky, originStr, nil, sig)
+            log.info("sm2verify", ret or "false")
+        end
+
+        -- 带id的情况
+        local id = "1234"
+        local sig = gmssl.sm2sign(private, originStr, id)
+        log.info("sm2sign", sig and sig:toHex())
+        if sig then
+            local ret = gmssl.sm2verify(pkx, pky, originStr, id, sig)
+            log.info("sm2verify", ret or "false")
+        end
+    end
+end
+
+sys.taskInit(gmssl_sm2sign_task_func)

+ 26 - 0
module/Air780EHM_Air780EHV_Air780EGH/demo/gmssl/gmssl_sm3.lua

@@ -0,0 +1,26 @@
+--[[
+@module  gmssl_sm3
+@summary gmssl_sm3
+@version 1.0
+@date    2025.10.29
+@author  沈园园
+@usage
+本文件为gmssl sm3应用功能模块,核心业务逻辑为:
+1、演示国密sm3算法;
+
+本文件没有对外接口,直接在main.lua中require "gmssl_sm3"就可以加载运行;
+]]
+
+
+local function gmssl_sm3_task_func()
+    -- sm3算法,算HASH值
+    local encodeStr = gmssl.sm3("lqlq666lqlq946")
+    log.info("gmssl.sm3",string.toHex(encodeStr))
+    
+    -- sm3算法,算HASH值,但带HMAC
+    local encodeStr = gmssl.sm3hmac("lqlq666lqlq946", "123")
+    log.info("gmssl.sm3hmac",string.toHex(encodeStr))    
+
+end
+
+sys.taskInit(gmssl_sm3_task_func)

+ 53 - 0
module/Air780EHM_Air780EHV_Air780EGH/demo/gmssl/gmssl_sm4.lua

@@ -0,0 +1,53 @@
+--[[
+@module  gmssl_sm4
+@summary gmssl_sm4 
+@version 1.0
+@date    2025.10.29
+@author  沈园园
+@usage
+本文件为gmssl sm4应用功能模块,核心业务逻辑为:
+1、演示国密sm4加密和解码的应用;
+
+本文件没有对外接口,直接在main.lua中require "gmssl_sm4"就可以加载运行;
+]]
+
+
+local function gmssl_sm4_task_func()
+
+    if gmssl.sm4encrypt then
+        log.info("=== SM4测试")
+        local passwd = "1234567890123456"
+        local iv = "1234567890666666"
+        -- SM4 算法, 对称加密
+        originStr = ">>SM4 ECB ZeroPadding test<<"
+        --加密模式:ECB;填充方式:ZeroPadding;密钥:1234567890123456;
+        encodeStr = gmssl.sm4encrypt("ECB", "ZERO", originStr, passwd)
+        log.info("sm4.ecb.zero", "加密后", string.toHex(encodeStr))
+        log.info("sm4.ecb.zero", "解密后", gmssl.sm4decrypt("ECB","ZERO",encodeStr,passwd))
+
+        originStr = ">>SM4 ECB Pkcs5Padding test<<"
+        --加密模式:ECB;填充方式:Pkcs5Padding;密钥:1234567890123456;
+        encodeStr = gmssl.sm4encrypt("ECB", "PKCS5", originStr, passwd)
+        log.info("sm4.ecb.pks5", "加密后", string.toHex(encodeStr))
+        log.info("sm4.ecb.pks5", "解密后", gmssl.sm4decrypt("ECB","PKCS5",encodeStr,passwd))
+
+        originStr = ">>SM4 CBC Pkcs5Padding test<<"
+        --加密模式:CBC;填充方式:Pkcs5Padding;密钥:1234567890123456;偏移量:1234567890666666
+        encodeStr = gmssl.sm4encrypt("CBC","PKCS5", originStr, passwd, iv)
+        log.info("sm4.cbc.pks5", "加密后", string.toHex(encodeStr))
+        log.info("sm4.cbc.pks5", "解密后", gmssl.sm4decrypt("CBC","PKCS5",encodeStr,passwd, iv))
+
+        -- 完全对齐16字节的对比测试
+        originStr = "1234567890123456"
+        encodeStr = gmssl.sm4encrypt("ECB","PKCS7",originStr,passwd)
+        log.info("sm4.ecb.pkcs7", encodeStr:toHex())
+        encodeStr = gmssl.sm4encrypt("ECB","PKCS5",originStr,passwd)
+        log.info("sm4.ecb.pkcs5", encodeStr:toHex())
+        encodeStr = gmssl.sm4encrypt("ECB","ZERO",originStr,passwd)
+        log.info("sm4.ecb.zero", encodeStr:toHex())
+        encodeStr = gmssl.sm4encrypt("ECB","NONE",originStr,passwd)
+        log.info("sm4.ecb.none", encodeStr:toHex())
+    end
+end
+
+sys.taskInit(gmssl_sm4_task_func)

+ 78 - 0
module/Air780EHM_Air780EHV_Air780EGH/demo/gmssl/main.lua

@@ -0,0 +1,78 @@
+--[[
+@module  main
+@summary LuatOS用户应用脚本文件入口,总体调度应用逻辑 
+@version 1.0
+@date    2025.10.29
+@author  沈园园
+@usage
+本demo演示的核心功能为:
+演示有关gmssl国密算法的功能包含SM2,SM3,SM4
+更多说明参考本目录下的readme.md文件
+]]
+
+
+--[[
+必须定义PROJECT和VERSION变量,Luatools工具会用到这两个变量,远程升级功能也会用到这两个变量
+PROJECT:项目名,ascii string类型
+        可以随便定义,只要不使用,就行
+VERSION:项目版本号,ascii string类型
+        如果使用合宙iot.openluat.com进行远程升级,必须按照"XXX.YYY.ZZZ"三段格式定义:
+            X、Y、Z各表示1位数字,三个X表示的数字可以相同,也可以不同,同理三个Y和三个Z表示的数字也是可以相同,可以不同
+            因为历史原因,YYY这三位数字必须存在,但是没有任何用处,可以一直写为000
+        如果不使用合宙iot.openluat.com进行远程升级,根据自己项目的需求,自定义格式即可
+]]
+PROJECT = "luatos_gmssl_app"
+VERSION = "001.000.000"
+
+
+-- 在日志中打印项目名和项目版本号
+log.info("main", PROJECT, VERSION)
+
+
+-- 如果内核固件支持wdt看门狗功能,此处对看门狗进行初始化和定时喂狗处理
+-- 如果脚本程序死循环卡死,就会无法及时喂狗,最终会自动重启
+if wdt then
+    --配置喂狗超时时间为9秒钟
+    wdt.init(9000)
+    --启动一个循环定时器,每隔3秒钟喂一次狗
+    sys.timerLoopStart(wdt.feed, 3000)
+end
+
+
+-- 如果内核固件支持errDump功能,此处进行配置,【强烈建议打开此处的注释】
+-- 因为此功能模块可以记录并且上传脚本在运行过程中出现的语法错误或者其他自定义的错误信息,可以初步分析一些设备运行异常的问题
+-- 以下代码是最基本的用法,更复杂的用法可以详细阅读API说明文档
+-- 启动errDump日志存储并且上传功能,600秒上传一次
+-- if errDump then
+--     errDump.config(true, 600)
+-- end
+
+
+-- 使用LuatOS开发的任何一个项目,都强烈建议使用远程升级FOTA功能
+-- 可以使用合宙的iot.openluat.com平台进行远程升级
+-- 也可以使用客户自己搭建的平台进行远程升级
+-- 远程升级的详细用法,可以参考fota的demo进行使用
+
+
+-- 启动一个循环定时器
+-- 每隔3秒钟打印一次总内存,实时的已使用内存,历史最高的已使用内存情况
+-- 方便分析内存使用是否有异常
+-- sys.timerLoopStart(function()
+--     log.info("mem.lua", rtos.meminfo())
+--     log.info("mem.sys", rtos.meminfo("sys"))
+-- end, 3000)
+
+
+-- 加载sm2算法, 含密钥生成应用功能模块
+require "gmssl_sm2"
+-- 加载sm3算法应用功能模块
+require "gmssl_sm3"
+-- 加载sm4算法应用功能模块
+require "gmssl_sm4"
+-- 加载sm2签名和验签应用功能模块
+require "gmssl_sm2sign"
+
+-- 用户代码已结束---------------------------------------------
+-- 结尾总是这一句
+sys.run()
+-- sys.run()之后不要加任何语句!!!!!因为添加的任何语句都不会被执行

+ 92 - 0
module/Air780EHM_Air780EHV_Air780EGH/demo/gmssl/readme.md

@@ -0,0 +1,92 @@
+## 功能模块介绍
+
+1、main.lua:主程序入口;
+
+2、gmssl_sm2.lua:sm2算法, 含密钥生成;
+
+3、gmssl_sm3:sm3算法;
+
+5、gmssl_sm4:sm4算法;
+
+6、gmssl_sm2sign:sm2签名和验签;
+
+## 演示功能概述
+
+1、创建一个task;
+
+2、演示gmssl国密算法包含SM2算法, 含密钥生成,SM3算法,SM4算法以及sm2签名和验签;
+
+
+## 演示硬件环境
+
+![](https://docs.openluat.com/air780ehv/luatos/common/hwenv/image/Air780EHV2.png)
+
+1、Air780EHM/Air780EHV/Air780EGH核心板一块
+
+2、TYPE-C USB数据线一根
+
+3、Air780EHM/Air780EHV/Air780EGH核心板和数据线的硬件接线方式为
+
+- Air780EHM/Air780EHV/Air780EGH核心板通过TYPE-C USB口连接TYPE-C USB 数据线,数据线的另外一端连接电脑的USB口;
+- 核心板正面的 ON/OFF 拨动开关 拨到ON一端;
+
+
+## 演示软件环境
+
+1、[Luatools下载调试工具](https://docs.openluat.com/air780ehv/luatos/common/download/)
+
+2、[Air780EHM 最新版本的内核固件](https://docs.openluat.com/air780epm/luatos/firmware/version/)
+
+3、[Air780EHV 最新版本的内核固件](https://docs.openluat.com/air780ehv/luatos/firmware/version/)
+
+4、[Air780EGH 最新版本的内核固件](https://docs.openluat.com/air780egh/luatos/firmware/version/)
+
+
+## 演示核心步骤
+
+1、搭建好硬件环境
+
+2、Luatools烧录内核固件和demo脚本代码
+
+3、烧录成功后,自动开机运行
+
+4、出现类似于下面的日志,就表示运行成功:
+
+``` lua
+[2025-10-29 16:51:55.069][000000000.365] I/user.==== SM2 默认GMSSL模式
+[2025-10-29 16:51:55.296][000000000.912] I/user.sm2默认模式 加密后 3078022022F0E9C08C45EC2D456C184541900B2D069790DF554BD37183453306E49A474E022100A7220907D53AF4A580B6AEC7B8EA53FF5E51F5E56A8ACC440C86F58C4E3EB9110420A4FCAE7ECF86059FB63B0F82A502223E8B4C7CAECBE29E72C05A87DF8BA3C08F040F63EE6697093A495733939D4D68070F
+[2025-10-29 16:51:55.526][000000001.150] I/user.sm2默认模式 解密后 !!from LuatOS!!
+[2025-10-29 16:51:55.530][000000001.151] I/user.==== SM2 网站兼容模式
+[2025-10-29 16:51:55.977][000000001.601] I/user.sm2网站兼容模式 C1C3C2 加密后 7CD71EFCD699E81C5A320DD78357788BA4A4E87C02691EB73225B6E8CC3F1A95730359208D2E6A375E49D84321C9BB28F0D7B65BC348DD07A9ADE9C1F38D053CA5B4128EE908F4494DB1867F0C48D00FCFE3F6A9C38CDA696CABAF36E9D120244AAEC7B42200A0A9C8321EDEDC9010
+[2025-10-29 16:51:56.177][000000001.800] I/user.sm2网站兼容模式 C1C3C2 解密后 !!from LuatOS!!
+[2025-10-29 16:51:56.182][000000001.800] I/user.==== SM2 网站兼容模式, 但C1C2C3
+[2025-10-29 16:51:56.589][000000002.228] I/user.sm2网站兼容模式 C1C2C3 加密后 0429D777A89C474D468CBB4BDE604C5D0111EF6FEB9AD180A9A5167657C4CFD09A0CAAF6D3467CE2564C73A666EC4DE2CA2E28F5B2BBFA9FE5B30CCA39D0B453DB60AF6B2B6DC1E7D76F3E9FF048FEACC850B37144EC64840A84A1A81B4ACF4BDB851391ECC9F13974A76464C9F9624C
+[2025-10-29 16:51:56.788][000000002.425] I/user.sm2网站兼容模式 C1C2C3 解密后 !!from LuatOS!!
+[2025-10-29 16:51:56.794][000000002.425] I/user.SM2密钥生成测试
+[2025-10-29 16:51:57.048][000000002.660] I/user.==== SM2 默认GMSSL模式
+[2025-10-29 16:51:57.462][000000003.092] I/user.sm2默认模式 加密后 3081820220227403C3A196042379534047850F01BA8EC3603226AF18E0CE65729EBBBDC68C02201D1FBBD3998FDB2757AE55262F1CDD288C6C403766F77F6D7CB9017457E7EE660420B742677896DEDBBEAF55857603EB4C39FA9DFFDAD6E17AFA27FA0D7C7D2F7EF5041A79A2DF1D84C0B449459A4FE6BCC3A494F9F4CC2D00F9A4A7C4FE
+[2025-10-29 16:51:57.674][000000003.301] I/user.sm2默认模式 解密后 32wrniosadnfvnadsio;fasiow
+[2025-10-29 16:51:57.681][000000003.301] I/user.==== SM2 网站兼容模式
+[2025-10-29 16:51:58.092][000000003.717] I/user.sm2网站兼容模式 C1C3C2 加密后 A615127F2C18731AB83CA50CDC386C0F70506EA3BE6B1B1E74E1F417BCFB992AC9B4F91A4233181CD5C419CA21B5AD46BBA7F2E635D4AC317842E8762A19260218921AB2D4C02C8211E2AC28976B61D33E0AB826B2DE223E6E51729B31B02E02E0C73D5822F12FC4618E6E1F7110278CBD273C152B650C75A423
+[2025-10-29 16:51:58.306][000000003.927] I/user.sm2网站兼容模式 C1C3C2 解密后 32wrniosadnfvnadsio;fasiow
+[2025-10-29 16:51:58.313][000000003.927] I/user.==== SM2 网站兼容模式, 但C1C2C3
+[2025-10-29 16:51:58.748][000000004.372] I/user.sm2网站兼容模式 C1C2C3 加密后 045807522541AF430F7D0F3EE27D0718AA33D17E98F04121CC3039A6C7EA5B219751DA6CDC64B805C5BA08E97CFC7546D72BCBF1CD2329F26190A6CF33D76E37B1BFFEDBA05C31D8673F33CFA5925A5EC0DB37A58F74B30020DE25104E47001D02A23C45814230650A1D9961B5BDC69218DF8AEEB9A66266EF175C
+[2025-10-29 16:51:58.947][000000004.581] I/user.sm2网站兼容模式 C1C2C3 解密后 32wrniosadnfvnadsio;fasiow
+[2025-10-29 16:51:58.962][000000004.588] I/user.gmssl.sm3 E64FD76F4078E51DCA428323D3FADBD5D52723BBF1379184650DA5CE6002B2BF 64
+[2025-10-29 16:51:58.964][000000004.588] I/user.gmssl.sm3hmac FBB67FC936777011AA70336F0F0B6305D529A97A87D8ECA8880472CD2C30A721 64
+[2025-10-29 16:51:58.966][000000004.595] I/user.=== SM4测试
+[2025-10-29 16:51:58.971][000000004.596] I/user.sm4.ecb.zero 加密后 E8DF19897C0BF1FFA50910C5C548F5A4E9E34BED9F5CEE519CFA24C37A290B25 64
+[2025-10-29 16:51:58.973][000000004.596] I/user.sm4.ecb.zero 解密后 >>SM4 ECB ZeroPadding test<<
+[2025-10-29 16:51:58.975][000000004.597] I/user.sm4.ecb.pks5 加密后 25B3D6AB8C855115C3A8883FE3ADCC6B9004C83B86CE7A45517CA6736DBA4EFE 64
+[2025-10-29 16:51:58.976][000000004.598] I/user.sm4.ecb.pks5 解密后 >>SM4 ECB Pkcs5Padding test<<
+[2025-10-29 16:51:58.978][000000004.598] I/user.sm4.cbc.pks5 加密后 A11C24BB018C8124FADAFC9B6BF7932C05BA2F24E9DFB9D79D982A676F9C010C 64
+[2025-10-29 16:51:58.979][000000004.599] I/user.sm4.cbc.pks5 解密后 >>SM4 CBC Pkcs5Padding test<<
+[2025-10-29 16:51:58.981][000000004.600] I/user.sm4.ecb.pkcs7 B083DCC0A9F64BD9FAE2FA8C936E3D776C88F739AF2A29A735381F5677BADEF7 64
+[2025-10-29 16:51:58.983][000000004.600] I/user.sm4.ecb.pkcs5 B083DCC0A9F64BD9FAE2FA8C936E3D776C88F739AF2A29A735381F5677BADEF7 64
+[2025-10-29 16:51:58.987][000000004.601] I/user.sm4.ecb.zero B083DCC0A9F64BD9FAE2FA8C936E3D77D2D68ED9FE06CB40C9A150AA5917F15F 64
+[2025-10-29 16:51:58.988][000000004.601] I/user.sm4.ecb.none B083DCC0A9F64BD9FAE2FA8C936E3D77 32
+[2025-10-29 16:51:59.450][000000005.084] I/user.sm2sign 9C2303667887E45ABA016BBACFF1AF2F3ED764CE220A0B0D67CF9206BF48F26AA2797E5478919FB0C6140B89D7DDA33055428A7B3D40F49E0BAD410624D83199
+[2025-10-29 16:51:59.864][000000005.496] I/user.sm2verify true
+[2025-10-29 16:52:00.357][000000005.982] I/user.sm2sign 756D9F37525A543A6647370C22DD71ADEEFBF86D83CE87A28889EAC9F63F0C5CFF334A2D99B067EA676437EE1DEC86B8A8F109568A7CF3AFE70A8DD09562F7E2
+[2025-10-29 16:52:00.782][000000006.411] I/user.sm2verify true
+```

+ 24 - 0
module/Air780EHM_Air780EHV_Air780EGH/demo/hmeta/hmeta_app.lua

@@ -0,0 +1,24 @@
+--[[
+@module  hmeta_app
+@summary hmeta_app应用功能模块 
+@version 1.0
+@date    2025.10.20
+@author  沈园园
+@usage
+本文件为hmeta应用功能模块,核心业务逻辑为:
+1、获取模块相关信息包括获取模组名称,硬件版本号,原始芯片型号;
+
+本文件没有对外接口,直接在main.lua中require "hmeta_app"就可以加载运行;
+]]
+
+
+local function hmeta_task_func()
+    while true do
+        -- 打印模组名称,硬件版本号,原始芯片型号
+        log.info("hmeta", hmeta.model(), hmeta.hwver(), hmeta.chip())
+        sys.wait(3000)
+    end
+end
+
+--创建一个task,并且运行task的主函数hmeta_task_func
+sys.taskInit(hmeta_task_func)

+ 60 - 19
module/Air780EHM_Air780EHV_Air780EGH/demo/hmeta/main.lua

@@ -1,30 +1,71 @@
+--[[
+@module  main
+@summary LuatOS用户应用脚本文件入口,总体调度应用逻辑 
+@version 1.0
+@date    2025.10.20
+@author  沈园园
+@usage
+本demo演示的核心功能为:
+获取模块相关信息包括获取模组名称,硬件版本号,原始芯片型号
+更多说明参考本目录下的readme.md文件
+]]
 
--- LuaTools需要PROJECT和VERSION这两个信息
-PROJECT = "hmetademo"
-VERSION = "1.0.0"
 
--- sys库是标配
-_G.sys = require("sys")
+--[[
+必须定义PROJECT和VERSION变量,Luatools工具会用到这两个变量,远程升级功能也会用到这两个变量
+PROJECT:项目名,ascii string类型
+        可以随便定义,只要不使用,就行
+VERSION:项目版本号,ascii string类型
+        如果使用合宙iot.openluat.com进行远程升级,必须按照"XXX.YYY.ZZZ"三段格式定义:
+            X、Y、Z各表示1位数字,三个X表示的数字可以相同,也可以不同,同理三个Y和三个Z表示的数字也是可以相同,可以不同
+            因为历史原因,YYY这三位数字必须存在,但是没有任何用处,可以一直写为000
+        如果不使用合宙iot.openluat.com进行远程升级,根据自己项目的需求,自定义格式即可
+]]
+PROJECT = "luatos_hmeta_app"
+VERSION = "001.000.000"
 
 
--- Air780E的AT固件默认会为开机键防抖, 导致部分用户刷机很麻烦
-if rtos.bsp() == "EC618" and pm and pm.PWK_MODE then
-    pm.power(pm.PWK_MODE, false)
+-- 在日志中打印项目名和项目版本号
+log.info("main", PROJECT, VERSION)
+
+
+-- 如果内核固件支持wdt看门狗功能,此处对看门狗进行初始化和定时喂狗处理
+-- 如果脚本程序死循环卡死,就会无法及时喂狗,最终会自动重启
+if wdt then
+    --配置喂狗超时时间为9秒钟
+    wdt.init(9000)
+    --启动一个循环定时器,每隔3秒钟喂一次狗
+    sys.timerLoopStart(wdt.feed, 3000)
 end
 
 
-sys.taskInit(function()
-    while hmeta do
-        -- hmeta识别底层模组类型的
-        -- 不同的模组可以使用相同的bsp,但根据封装的不同,根据内部数据仍可识别出具体模块
-        log.info("hmeta", hmeta.model(), hmeta.hwver and hmeta.hwver())
-        log.info("bsp",   rtos.bsp())
-        sys.wait(3000)
-    end
-    log.info("这个bsp不支持hmeta库哦")
-end)
+-- 如果内核固件支持errDump功能,此处进行配置,【强烈建议打开此处的注释】
+-- 因为此功能模块可以记录并且上传脚本在运行过程中出现的语法错误或者其他自定义的错误信息,可以初步分析一些设备运行异常的问题
+-- 以下代码是最基本的用法,更复杂的用法可以详细阅读API说明文档
+-- 启动errDump日志存储并且上传功能,600秒上传一次
+-- if errDump then
+--     errDump.config(true, 600)
+-- end
+
+
+-- 使用LuatOS开发的任何一个项目,都强烈建议使用远程升级FOTA功能
+-- 可以使用合宙的iot.openluat.com平台进行远程升级
+-- 也可以使用客户自己搭建的平台进行远程升级
+-- 远程升级的详细用法,可以参考fota的demo进行使用
+
+
+-- 启动一个循环定时器
+-- 每隔3秒钟打印一次总内存,实时的已使用内存,历史最高的已使用内存情况
+-- 方便分析内存使用是否有异常
+-- sys.timerLoopStart(function()
+--     log.info("mem.lua", rtos.meminfo())
+--     log.info("mem.sys", rtos.meminfo("sys"))
+-- end, 3000)
+
+-- 加载hmeta_app应用功能模块
+require "hmeta_app"
 
 -- 用户代码已结束---------------------------------------------
 -- 结尾总是这一句
 sys.run()
--- sys.run()之后后面不要加任何语句!!!!!
+-- sys.run()之后不要加任何语句!!!!!因为添加的任何语句都不会被执行

+ 54 - 0
module/Air780EHM_Air780EHV_Air780EGH/demo/hmeta/readme.md

@@ -0,0 +1,54 @@
+## 功能模块介绍
+
+1、main.lua:主程序入口;
+
+2、hmeta_app.lua:获取模块相关信息包括获取模组名称,硬件版本号,原始芯片型号;
+
+## 演示功能概述
+
+1、创建一个task;
+
+2、在task中的任务处理函数中,每隔三秒钟通过日志输出一次模组名称,硬件版本号,原始芯片型号;
+
+
+## 演示硬件环境
+
+![](https://docs.openluat.com/air780ehv/luatos/common/hwenv/image/Air780EHV2.png)
+
+1、Air780EHM/Air780EHV/Air780EGH核心板一块
+
+2、TYPE-C USB数据线一根
+
+3、Air780EHM/Air780EHV/Air780EGH核心板和数据线的硬件接线方式为
+
+- Air780EHM/Air780EHV/Air780EGH核心板通过TYPE-C USB口连接TYPE-C USB 数据线,数据线的另外一端连接电脑的USB口;
+- 核心板正面的 ON/OFF 拨动开关 拨到ON一端;
+
+
+## 演示软件环境
+
+1、[Luatools下载调试工具](https://docs.openluat.com/air780ehv/luatos/common/download/)
+
+2、[Air780EHM 最新版本的内核固件](https://docs.openluat.com/air780epm/luatos/firmware/version/)
+
+3、[Air780EHV 最新版本的内核固件](https://docs.openluat.com/air780ehv/luatos/firmware/version/)
+
+4、[Air780EGH 最新版本的内核固件](https://docs.openluat.com/air780egh/luatos/firmware/version/)
+
+
+## 演示核心步骤
+
+1、搭建好硬件环境
+
+2、Luatools烧录内核固件和demo脚本代码
+
+3、烧录成功后,自动开机运行
+
+4、出现类似于下面的日志,就表示运行成功:
+
+``` lua
+[2025-10-20 17:53:50.355][000000006.254] I/user.hmeta Air780EHV A11 EC718HM
+[2025-10-20 17:53:53.353][000000009.254] I/user.hmeta Air780EHV A11 EC718HM
+[2025-10-20 17:53:56.356][000000012.254] I/user.hmeta Air780EHV A11 EC718HM
+
+```

+ 60 - 30
module/Air780EHM_Air780EHV_Air780EGH/demo/miniz/main.lua

@@ -1,41 +1,71 @@
+--[[
+@module  main
+@summary LuatOS用户应用脚本文件入口,总体调度应用逻辑 
+@version 1.0
+@date    2025.10.28
+@author  沈园园
+@usage
+本demo演示的核心功能为:
+演示如何对数据压缩解压
+更多说明参考本目录下的readme.md文件
+]]
 
--- LuaTools需要PROJECT和VERSION这两个信息
-PROJECT = "minizdemo"
-VERSION = "1.0.0"
 
-sys = require("sys")
+--[[
+必须定义PROJECT和VERSION变量,Luatools工具会用到这两个变量,远程升级功能也会用到这两个变量
+PROJECT:项目名,ascii string类型
+        可以随便定义,只要不使用,就行
+VERSION:项目版本号,ascii string类型
+        如果使用合宙iot.openluat.com进行远程升级,必须按照"XXX.YYY.ZZZ"三段格式定义:
+            X、Y、Z各表示1位数字,三个X表示的数字可以相同,也可以不同,同理三个Y和三个Z表示的数字也是可以相同,可以不同
+            因为历史原因,YYY这三位数字必须存在,但是没有任何用处,可以一直写为000
+        如果不使用合宙iot.openluat.com进行远程升级,根据自己项目的需求,自定义格式即可
+]]
+PROJECT = "luatos_miniz_app"
+VERSION = "001.000.000"
 
---添加硬狗防止程序卡死
+
+-- 在日志中打印项目名和项目版本号
+log.info("main", PROJECT, VERSION)
+
+
+-- 如果内核固件支持wdt看门狗功能,此处对看门狗进行初始化和定时喂狗处理
+-- 如果脚本程序死循环卡死,就会无法及时喂狗,最终会自动重启
 if wdt then
-    wdt.init(9000)--初始化watchdog设置为9s
-    sys.timerLoopStart(wdt.feed, 3000)--3s喂一次狗
+    --配置喂狗超时时间为9秒钟
+    wdt.init(9000)
+    --启动一个循环定时器,每隔3秒钟喂一次狗
+    sys.timerLoopStart(wdt.feed, 3000)
 end
 
-sys.taskInit(function()
-    sys.wait(1000)
-    -- 压缩过的字符串, 为了方便演示, 这里用了base64编码
-    -- 大部分MCU设备的内存都比较小, miniz.compress 通常在服务器端完成,这里就不演示了
-    -- miniz能解压标准zlib数据流
-    local b64str = "eAEFQIGNwyAMXOUm+E2+OzjhCCiOjYyhyvbVR7K7IR0l+iau8G82eIW5jXVoPzF5pse/B8FaPXLiWTNxEMsKI+WmIR0l+iayEY2i2V4UbqqPh5bwimyEuY11aD8xeaYHxAquvom6VDFUXqQjG1Fek6efCFfCK0b0LUnQMjiCxhUT05GNL75dFUWCSMcjN3EE5c4Wvq42/36R41fa"
-    local str = b64str:fromBase64()
-
-    local dstr = miniz.uncompress(str)
-    -- 压缩过的数据长度 156
-    -- 解压后的数据长度,即原始数据的长度 235
-    log.info("miniz", "compressed", #str, "uncompressed", #dstr)
-
-    -- 演示压缩解压
-    local ostr = "abcd12345"
-    -- 压缩字符串
-    local zstr = miniz.compress(ostr)
-    log.info("压缩后的字符串:",zstr:toHex())
-    -- 解压字符串
-    local lstr = miniz.uncompress(zstr)
-    log.info("miniz","compress zstr",#zstr,"uncompress lstr data",lstr)
-end)
 
+-- 如果内核固件支持errDump功能,此处进行配置,【强烈建议打开此处的注释】
+-- 因为此功能模块可以记录并且上传脚本在运行过程中出现的语法错误或者其他自定义的错误信息,可以初步分析一些设备运行异常的问题
+-- 以下代码是最基本的用法,更复杂的用法可以详细阅读API说明文档
+-- 启动errDump日志存储并且上传功能,600秒上传一次
+-- if errDump then
+--     errDump.config(true, 600)
+-- end
+
+
+-- 使用LuatOS开发的任何一个项目,都强烈建议使用远程升级FOTA功能
+-- 可以使用合宙的iot.openluat.com平台进行远程升级
+-- 也可以使用客户自己搭建的平台进行远程升级
+-- 远程升级的详细用法,可以参考fota的demo进行使用
+
+
+-- 启动一个循环定时器
+-- 每隔3秒钟打印一次总内存,实时的已使用内存,历史最高的已使用内存情况
+-- 方便分析内存使用是否有异常
+-- sys.timerLoopStart(function()
+--     log.info("mem.lua", rtos.meminfo())
+--     log.info("mem.sys", rtos.meminfo("sys"))
+-- end, 3000)
+
+-- 加载miniz_app应用功能模块
+require "miniz_app"
 
 -- 用户代码已结束---------------------------------------------
 -- 结尾总是这一句
 sys.run()
--- sys.run()之后后面不要加任何语句!!!!!
+-- sys.run()之后不要加任何语句!!!!!因为添加的任何语句都不会被执行

+ 47 - 0
module/Air780EHM_Air780EHV_Air780EGH/demo/miniz/miniz_app.lua

@@ -0,0 +1,47 @@
+--[[
+@module  miniz_app
+@summary miniz_app应用功能模块 
+@version 1.0
+@date    2025.10.28
+@author  沈园园
+@usage
+本文件为miniz应用功能模块,核心业务逻辑为:
+1、如何对数据压缩解压;
+
+本文件没有对外接口,直接在main.lua中require "miniz_app"就可以加载运行;
+]]
+
+
+local function miniz_task_func()
+    -- 压缩过的字符串, 为了方便演示, 这里用了base64编码
+    -- miniz能解压标准zlib数据流
+    -- 将字符串进行base64解码
+    local b64str = "eAEFQIGNwyAMXOUm+E2+OzjhCCiOjYyhyvbVR7K7IR0l+iau8G82eIW5jXVoPzF5pse/B8FaPXLiWTNxEMsKI+WmIR0l+iayEY2i2V4UbqqPh5bwimyEuY11aD8xeaYHxAquvom6VDFUXqQjG1Fek6efCFfCK0b0LUnQMjiCxhUT05GNL75dFUWCSMcjN3EE5c4Wvq42/36R41fa"
+    local str = b64str:fromBase64()
+    -- 快速解压
+    local dstr = miniz.uncompress(str) 
+    -- 压缩过的数据长度 156
+    -- 解压后的数据长度,即原始数据的长度 235
+    log.info("miniz", "压缩过的数据长度: ", #str, "解压后的数据长度:", #dstr)    
+    
+    -- 演示压缩解压
+    local ostr = "abcd1234567890efghijklmnopqrstuvwxyzabcd1234567890efghijklmnopqrstuvwxyzabcd1234567890efghijklmnopqrstuvwxyz"
+    log.info("压缩前的字符串:", #ostr, ostr)
+    -- 压缩字符串
+    local zstr = miniz.compress(ostr)
+    log.info("压缩后的字符串:",#zstr, zstr:toHex())
+    -- 解压字符串
+    local lstr = miniz.uncompress(zstr)
+    log.info("解压后的字符串:", #lstr, lstr)
+    
+    -- 演示从文件读取2K数据压缩
+    local ostr = io.readFile("/luadb/test.txt")
+    local zstr = miniz.compress(ostr)
+    if zstr then
+        log.info("miniz", "压缩前的数据长度: ", #ostr, "压缩后的数据长度: ", #zstr) 
+    end  
+end
+
+
+--创建一个task,并且运行task的主函数miniz_task_func
+sys.taskInit(miniz_task_func)

+ 55 - 0
module/Air780EHM_Air780EHV_Air780EGH/demo/miniz/readme.md

@@ -0,0 +1,55 @@
+## 功能模块介绍
+
+1、main.lua:主程序入口;
+
+2、miniz_app.lua:如何对数据压缩解压;
+
+## 演示功能概述
+
+1、创建一个task;
+
+2、演示如何对数据压缩解压;
+
+
+## 演示硬件环境
+
+![](https://docs.openluat.com/air780ehv/luatos/common/hwenv/image/Air780EHV2.png)
+
+1、Air780EHM/Air780EHV/Air780EGH核心板一块
+
+2、TYPE-C USB数据线一根
+
+3、Air780EHM/Air780EHV/Air780EGH核心板和数据线的硬件接线方式为
+
+- Air780EHM/Air780EHV/Air780EGH核心板通过TYPE-C USB口连接TYPE-C USB 数据线,数据线的另外一端连接电脑的USB口;
+- 核心板正面的 ON/OFF 拨动开关 拨到ON一端;
+
+
+## 演示软件环境
+
+1、[Luatools下载调试工具](https://docs.openluat.com/air780ehv/luatos/common/download/)
+
+2、[Air780EHM 最新版本的内核固件](https://docs.openluat.com/air780epm/luatos/firmware/version/)
+
+3、[Air780EHV 最新版本的内核固件](https://docs.openluat.com/air780ehv/luatos/firmware/version/)
+
+4、[Air780EGH 最新版本的内核固件](https://docs.openluat.com/air780egh/luatos/firmware/version/)
+
+
+## 演示核心步骤
+
+1、搭建好硬件环境
+
+2、Luatools烧录内核固件和demo脚本代码
+
+3、烧录成功后,自动开机运行
+
+4、出现类似于下面的日志,就表示运行成功:
+
+``` lua
+[2025-10-28 11:39:11.816][000000000.379] I/user.miniz 压缩过的数据长度:  156 解压后的数据长度: 235
+[2025-10-28 11:39:11.821][000000000.380] I/user.压缩前的字符串: 108 abcd1234567890efghijklmnopqrstuvwxyzabcd1234567890efghijklmnopqrstuvwxyzabcd1234567890efghijklmnopqrstuvwxyz
+[2025-10-28 11:39:11.826][000000000.383] I/user.压缩后的字符串: 92 780105C0040D80B04A383CCEDDDD9F9E4184C97E9CD7FDBC1FD828E3422A6DACF321A65C6AEB632E8830D98FF3BA9FF7031B655C48A58D753EC4944B6D7DCC051126FB715EF7F37E60A38C0BA9B4B1CE879872A9AD8FB97E17A42785 184
+[2025-10-28 11:39:11.832][000000000.383] I/user.解压后的字符串: 108 abcd1234567890efghijklmnopqrstuvwxyzabcd1234567890efghijklmnopqrstuvwxyzabcd1234567890efghijklmnopqrstuvwxyz
+[2025-10-28 11:39:11.836][000000000.389] I/user.miniz 压缩前的数据长度:  2048 压缩后的数据长度:  1350
+```

A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 0 - 0
module/Air780EHM_Air780EHV_Air780EGH/demo/miniz/test.txt


+ 71 - 0
module/Air780EPM/demo/gmssl/gmssl_sm2.lua

@@ -0,0 +1,71 @@
+--[[
+@module  gmssl_sm2
+@summary gmssl_sm2 
+@version 1.0
+@date    2025.10.29
+@author  沈园园
+@usage
+本文件为gmssl sm2应用功能模块,核心业务逻辑为:
+1、演示国密sm2加密和解码的应用;
+
+本文件没有对外接口,直接在main.lua中require "gmssl_sm2"就可以加载运行;
+]]
+
+
+function gmssl_sm2_encrypt_decrypt(originStr, pkx, pky, private)
+    -- GMSSL默认格式
+    log.info("==== SM2 默认GMSSL模式")
+    local encodeStr = gmssl.sm2encrypt(pkx,pky,originStr)
+    log.info("sm2默认模式", "加密后", encodeStr and  string.toHex(encodeStr))
+    if encodeStr then
+        log.info("sm2默认模式", "解密后", gmssl.sm2decrypt(private,encodeStr))
+    end
+    
+
+    -- 网站兼容模式 https://i.goto327.top/CryptTools/SM2.aspx
+    -- 密文格式 C1C3C2, 新国标, 一般是这种
+    log.info("==== SM2 网站兼容模式")
+    local encodeStr = gmssl.sm2encrypt(pkx,pky,originStr, true)
+    log.info("sm2网站兼容模式 C1C3C2", "加密后", encodeStr and  string.toHex(encodeStr))
+    if encodeStr then
+        log.info("sm2网站兼容模式 C1C3C2", "解密后", gmssl.sm2decrypt(private,encodeStr, true))
+    else
+        log.info("解密失败")
+    end
+    -- 密文格式 C1C2C3, 老国标, 老的Java库通常支持这种
+    log.info("==== SM2 网站兼容模式, 但C1C2C3")
+    local encodeStr = gmssl.sm2encrypt(pkx,pky,originStr, true, true)
+    log.info("sm2网站兼容模式 C1C2C3", "加密后", encodeStr and  string.toHex(encodeStr))
+    if encodeStr then
+        log.info("sm2网站兼容模式 C1C2C3", "解密后", gmssl.sm2decrypt(private,encodeStr, true, true))
+    else
+        log.info("解密失败")
+    end
+end
+
+
+local function gmssl_sm2_task_func()
+    -- 未加密字符串
+    local originStr = "!!from LuatOS!!"
+
+    -- SM2 , 非对称加密, 类似于RSA,但属于椭圆算法
+    -- 就当前实现还是比较慢的
+    if gmssl.sm2encrypt then -- 部分BSP不支持
+        local pkx = "ABE87C924B7ECFDEA1748A06E89003C9F7F4DC5C3563873CE2CAE46F66DE8141"
+        local pky = "9514733D38CC026F2452A6A3A3A4DA0C28F864AFA5FE2C45E0EB6B761FBB5286"
+        local private = "129EDC282CD2E9C1144C2E7315F926D772BC96600D2771E8BE02060313FE00D5"
+        gmssl_sm2_encrypt_decrypt(originStr, pkx, pky, private)
+    end
+
+    -- SM密钥生成
+    if gmssl.sm2keygen then
+        log.info("SM2密钥生成测试")
+        originStr = "32wrniosadnfvnadsio;fasiow"
+        local pkx, pky, private = gmssl.sm2keygen()
+        gmssl_sm2_encrypt_decrypt(originStr, pkx, pky, private)
+    end
+
+end
+
+sys.taskInit(gmssl_sm2_task_func)
+

+ 43 - 0
module/Air780EPM/demo/gmssl/gmssl_sm2sign.lua

@@ -0,0 +1,43 @@
+--[[
+@module  gmssl_sm2sign
+@summary gmssl_sm2sign 
+@version 1.0
+@date    2025.10.29
+@author  沈园园
+@usage
+本文件为gmssl sm2sign应用功能模块,核心业务逻辑为:
+1、演示国密SM2签名和验签的应用;
+
+本文件没有对外接口,直接在main.lua中require "gmssl_sm2sign"就可以加载运行;
+]]
+
+
+local function gmssl_sm2sign_task_func()
+
+    -- SM2签名和验签
+    if gmssl.sm2sign then
+        local originStr = string.fromHex("434477813974bf58f94bcf760833c2b40f77a5fc360485b0b9ed1bd9682edb45")
+        local pkx = "ABE87C924B7ECFDEA1748A06E89003C9F7F4DC5C3563873CE2CAE46F66DE8141"
+        local pky = "9514733D38CC026F2452A6A3A3A4DA0C28F864AFA5FE2C45E0EB6B761FBB5286"
+        local private = "129EDC282CD2E9C1144C2E7315F926D772BC96600D2771E8BE02060313FE00D5"
+
+        -- 不带id的情况,即默认id="1234567812345678"
+        local sig = gmssl.sm2sign(private, originStr, nil)
+        log.info("sm2sign", sig and sig:toHex())
+        if sig then
+            local ret = gmssl.sm2verify(pkx, pky, originStr, nil, sig)
+            log.info("sm2verify", ret or "false")
+        end
+
+        -- 带id的情况
+        local id = "1234"
+        local sig = gmssl.sm2sign(private, originStr, id)
+        log.info("sm2sign", sig and sig:toHex())
+        if sig then
+            local ret = gmssl.sm2verify(pkx, pky, originStr, id, sig)
+            log.info("sm2verify", ret or "false")
+        end
+    end
+end
+
+sys.taskInit(gmssl_sm2sign_task_func)

+ 26 - 0
module/Air780EPM/demo/gmssl/gmssl_sm3.lua

@@ -0,0 +1,26 @@
+--[[
+@module  gmssl_sm3
+@summary gmssl_sm3
+@version 1.0
+@date    2025.10.29
+@author  沈园园
+@usage
+本文件为gmssl sm3应用功能模块,核心业务逻辑为:
+1、演示国密sm3算法;
+
+本文件没有对外接口,直接在main.lua中require "gmssl_sm3"就可以加载运行;
+]]
+
+
+local function gmssl_sm3_task_func()
+    -- sm3算法,算HASH值
+    local encodeStr = gmssl.sm3("lqlq666lqlq946")
+    log.info("gmssl.sm3",string.toHex(encodeStr))
+    
+    -- sm3算法,算HASH值,但带HMAC
+    local encodeStr = gmssl.sm3hmac("lqlq666lqlq946", "123")
+    log.info("gmssl.sm3hmac",string.toHex(encodeStr))    
+
+end
+
+sys.taskInit(gmssl_sm3_task_func)

+ 53 - 0
module/Air780EPM/demo/gmssl/gmssl_sm4.lua

@@ -0,0 +1,53 @@
+--[[
+@module  gmssl_sm4
+@summary gmssl_sm4 
+@version 1.0
+@date    2025.10.29
+@author  沈园园
+@usage
+本文件为gmssl sm4应用功能模块,核心业务逻辑为:
+1、演示国密sm4加密和解码的应用;
+
+本文件没有对外接口,直接在main.lua中require "gmssl_sm4"就可以加载运行;
+]]
+
+
+local function gmssl_sm4_task_func()
+
+    if gmssl.sm4encrypt then
+        log.info("=== SM4测试")
+        local passwd = "1234567890123456"
+        local iv = "1234567890666666"
+        -- SM4 算法, 对称加密
+        originStr = ">>SM4 ECB ZeroPadding test<<"
+        --加密模式:ECB;填充方式:ZeroPadding;密钥:1234567890123456;
+        encodeStr = gmssl.sm4encrypt("ECB", "ZERO", originStr, passwd)
+        log.info("sm4.ecb.zero", "加密后", string.toHex(encodeStr))
+        log.info("sm4.ecb.zero", "解密后", gmssl.sm4decrypt("ECB","ZERO",encodeStr,passwd))
+
+        originStr = ">>SM4 ECB Pkcs5Padding test<<"
+        --加密模式:ECB;填充方式:Pkcs5Padding;密钥:1234567890123456;
+        encodeStr = gmssl.sm4encrypt("ECB", "PKCS5", originStr, passwd)
+        log.info("sm4.ecb.pks5", "加密后", string.toHex(encodeStr))
+        log.info("sm4.ecb.pks5", "解密后", gmssl.sm4decrypt("ECB","PKCS5",encodeStr,passwd))
+
+        originStr = ">>SM4 CBC Pkcs5Padding test<<"
+        --加密模式:CBC;填充方式:Pkcs5Padding;密钥:1234567890123456;偏移量:1234567890666666
+        encodeStr = gmssl.sm4encrypt("CBC","PKCS5", originStr, passwd, iv)
+        log.info("sm4.cbc.pks5", "加密后", string.toHex(encodeStr))
+        log.info("sm4.cbc.pks5", "解密后", gmssl.sm4decrypt("CBC","PKCS5",encodeStr,passwd, iv))
+
+        -- 完全对齐16字节的对比测试
+        originStr = "1234567890123456"
+        encodeStr = gmssl.sm4encrypt("ECB","PKCS7",originStr,passwd)
+        log.info("sm4.ecb.pkcs7", encodeStr:toHex())
+        encodeStr = gmssl.sm4encrypt("ECB","PKCS5",originStr,passwd)
+        log.info("sm4.ecb.pkcs5", encodeStr:toHex())
+        encodeStr = gmssl.sm4encrypt("ECB","ZERO",originStr,passwd)
+        log.info("sm4.ecb.zero", encodeStr:toHex())
+        encodeStr = gmssl.sm4encrypt("ECB","NONE",originStr,passwd)
+        log.info("sm4.ecb.none", encodeStr:toHex())
+    end
+end
+
+sys.taskInit(gmssl_sm4_task_func)

+ 78 - 0
module/Air780EPM/demo/gmssl/main.lua

@@ -0,0 +1,78 @@
+--[[
+@module  main
+@summary LuatOS用户应用脚本文件入口,总体调度应用逻辑 
+@version 1.0
+@date    2025.10.29
+@author  沈园园
+@usage
+本demo演示的核心功能为:
+演示有关gmssl国密算法的功能包含SM2,SM3,SM4
+更多说明参考本目录下的readme.md文件
+]]
+
+
+--[[
+必须定义PROJECT和VERSION变量,Luatools工具会用到这两个变量,远程升级功能也会用到这两个变量
+PROJECT:项目名,ascii string类型
+        可以随便定义,只要不使用,就行
+VERSION:项目版本号,ascii string类型
+        如果使用合宙iot.openluat.com进行远程升级,必须按照"XXX.YYY.ZZZ"三段格式定义:
+            X、Y、Z各表示1位数字,三个X表示的数字可以相同,也可以不同,同理三个Y和三个Z表示的数字也是可以相同,可以不同
+            因为历史原因,YYY这三位数字必须存在,但是没有任何用处,可以一直写为000
+        如果不使用合宙iot.openluat.com进行远程升级,根据自己项目的需求,自定义格式即可
+]]
+PROJECT = "luatos_gmssl_app"
+VERSION = "001.000.000"
+
+
+-- 在日志中打印项目名和项目版本号
+log.info("main", PROJECT, VERSION)
+
+
+-- 如果内核固件支持wdt看门狗功能,此处对看门狗进行初始化和定时喂狗处理
+-- 如果脚本程序死循环卡死,就会无法及时喂狗,最终会自动重启
+if wdt then
+    --配置喂狗超时时间为9秒钟
+    wdt.init(9000)
+    --启动一个循环定时器,每隔3秒钟喂一次狗
+    sys.timerLoopStart(wdt.feed, 3000)
+end
+
+
+-- 如果内核固件支持errDump功能,此处进行配置,【强烈建议打开此处的注释】
+-- 因为此功能模块可以记录并且上传脚本在运行过程中出现的语法错误或者其他自定义的错误信息,可以初步分析一些设备运行异常的问题
+-- 以下代码是最基本的用法,更复杂的用法可以详细阅读API说明文档
+-- 启动errDump日志存储并且上传功能,600秒上传一次
+-- if errDump then
+--     errDump.config(true, 600)
+-- end
+
+
+-- 使用LuatOS开发的任何一个项目,都强烈建议使用远程升级FOTA功能
+-- 可以使用合宙的iot.openluat.com平台进行远程升级
+-- 也可以使用客户自己搭建的平台进行远程升级
+-- 远程升级的详细用法,可以参考fota的demo进行使用
+
+
+-- 启动一个循环定时器
+-- 每隔3秒钟打印一次总内存,实时的已使用内存,历史最高的已使用内存情况
+-- 方便分析内存使用是否有异常
+-- sys.timerLoopStart(function()
+--     log.info("mem.lua", rtos.meminfo())
+--     log.info("mem.sys", rtos.meminfo("sys"))
+-- end, 3000)
+
+
+-- 加载sm2算法, 含密钥生成应用功能模块
+require "gmssl_sm2"
+-- 加载sm3算法应用功能模块
+require "gmssl_sm3"
+-- 加载sm4算法应用功能模块
+require "gmssl_sm4"
+-- 加载sm2签名和验签应用功能模块
+require "gmssl_sm2sign"
+
+-- 用户代码已结束---------------------------------------------
+-- 结尾总是这一句
+sys.run()
+-- sys.run()之后不要加任何语句!!!!!因为添加的任何语句都不会被执行

+ 88 - 0
module/Air780EPM/demo/gmssl/readme.md

@@ -0,0 +1,88 @@
+## 功能模块介绍
+
+1、main.lua:主程序入口;
+
+2、gmssl_sm2.lua:sm2算法, 含密钥生成;
+
+3、gmssl_sm3:sm3算法;
+
+5、gmssl_sm4:sm4算法;
+
+6、gmssl_sm2sign:sm2签名和验签;
+
+## 演示功能概述
+
+1、创建一个task;
+
+2、演示gmssl国密算法包含SM2算法, 含密钥生成,SM3算法,SM4算法以及sm2签名和验签;
+
+
+## 演示硬件环境
+
+![](https://docs.openluat.com/air780epm/luatos/common/hwenv/image/Air780EPM2.png)
+
+1、Air780EPM核心板一块
+
+2、TYPE-C USB数据线一根
+
+3、Air780EPM核心板和数据线的硬件接线方式为
+
+- Air780EPM核心板通过TYPE-C USB口连接TYPE-C USB 数据线,数据线的另外一端连接电脑的USB口;
+- 核心板正面的 ON/OFF 拨动开关 拨到ON一端;
+
+
+## 演示软件环境
+
+1、[Luatools下载调试工具](https://docs.openluat.com/air780epm/luatos/common/download/)
+
+2、[Air780EPM 最新版本的内核固件](https://docs.openluat.com/air780epm/luatos/firmware/version/)
+
+
+## 演示核心步骤
+
+1、搭建好硬件环境
+
+2、Luatools烧录内核固件和demo脚本代码
+
+3、烧录成功后,自动开机运行
+
+4、出现类似于下面的日志,就表示运行成功:
+
+``` lua
+[2025-10-29 16:51:55.069][000000000.365] I/user.==== SM2 默认GMSSL模式
+[2025-10-29 16:51:55.296][000000000.912] I/user.sm2默认模式 加密后 3078022022F0E9C08C45EC2D456C184541900B2D069790DF554BD37183453306E49A474E022100A7220907D53AF4A580B6AEC7B8EA53FF5E51F5E56A8ACC440C86F58C4E3EB9110420A4FCAE7ECF86059FB63B0F82A502223E8B4C7CAECBE29E72C05A87DF8BA3C08F040F63EE6697093A495733939D4D68070F
+[2025-10-29 16:51:55.526][000000001.150] I/user.sm2默认模式 解密后 !!from LuatOS!!
+[2025-10-29 16:51:55.530][000000001.151] I/user.==== SM2 网站兼容模式
+[2025-10-29 16:51:55.977][000000001.601] I/user.sm2网站兼容模式 C1C3C2 加密后 7CD71EFCD699E81C5A320DD78357788BA4A4E87C02691EB73225B6E8CC3F1A95730359208D2E6A375E49D84321C9BB28F0D7B65BC348DD07A9ADE9C1F38D053CA5B4128EE908F4494DB1867F0C48D00FCFE3F6A9C38CDA696CABAF36E9D120244AAEC7B42200A0A9C8321EDEDC9010
+[2025-10-29 16:51:56.177][000000001.800] I/user.sm2网站兼容模式 C1C3C2 解密后 !!from LuatOS!!
+[2025-10-29 16:51:56.182][000000001.800] I/user.==== SM2 网站兼容模式, 但C1C2C3
+[2025-10-29 16:51:56.589][000000002.228] I/user.sm2网站兼容模式 C1C2C3 加密后 0429D777A89C474D468CBB4BDE604C5D0111EF6FEB9AD180A9A5167657C4CFD09A0CAAF6D3467CE2564C73A666EC4DE2CA2E28F5B2BBFA9FE5B30CCA39D0B453DB60AF6B2B6DC1E7D76F3E9FF048FEACC850B37144EC64840A84A1A81B4ACF4BDB851391ECC9F13974A76464C9F9624C
+[2025-10-29 16:51:56.788][000000002.425] I/user.sm2网站兼容模式 C1C2C3 解密后 !!from LuatOS!!
+[2025-10-29 16:51:56.794][000000002.425] I/user.SM2密钥生成测试
+[2025-10-29 16:51:57.048][000000002.660] I/user.==== SM2 默认GMSSL模式
+[2025-10-29 16:51:57.462][000000003.092] I/user.sm2默认模式 加密后 3081820220227403C3A196042379534047850F01BA8EC3603226AF18E0CE65729EBBBDC68C02201D1FBBD3998FDB2757AE55262F1CDD288C6C403766F77F6D7CB9017457E7EE660420B742677896DEDBBEAF55857603EB4C39FA9DFFDAD6E17AFA27FA0D7C7D2F7EF5041A79A2DF1D84C0B449459A4FE6BCC3A494F9F4CC2D00F9A4A7C4FE
+[2025-10-29 16:51:57.674][000000003.301] I/user.sm2默认模式 解密后 32wrniosadnfvnadsio;fasiow
+[2025-10-29 16:51:57.681][000000003.301] I/user.==== SM2 网站兼容模式
+[2025-10-29 16:51:58.092][000000003.717] I/user.sm2网站兼容模式 C1C3C2 加密后 A615127F2C18731AB83CA50CDC386C0F70506EA3BE6B1B1E74E1F417BCFB992AC9B4F91A4233181CD5C419CA21B5AD46BBA7F2E635D4AC317842E8762A19260218921AB2D4C02C8211E2AC28976B61D33E0AB826B2DE223E6E51729B31B02E02E0C73D5822F12FC4618E6E1F7110278CBD273C152B650C75A423
+[2025-10-29 16:51:58.306][000000003.927] I/user.sm2网站兼容模式 C1C3C2 解密后 32wrniosadnfvnadsio;fasiow
+[2025-10-29 16:51:58.313][000000003.927] I/user.==== SM2 网站兼容模式, 但C1C2C3
+[2025-10-29 16:51:58.748][000000004.372] I/user.sm2网站兼容模式 C1C2C3 加密后 045807522541AF430F7D0F3EE27D0718AA33D17E98F04121CC3039A6C7EA5B219751DA6CDC64B805C5BA08E97CFC7546D72BCBF1CD2329F26190A6CF33D76E37B1BFFEDBA05C31D8673F33CFA5925A5EC0DB37A58F74B30020DE25104E47001D02A23C45814230650A1D9961B5BDC69218DF8AEEB9A66266EF175C
+[2025-10-29 16:51:58.947][000000004.581] I/user.sm2网站兼容模式 C1C2C3 解密后 32wrniosadnfvnadsio;fasiow
+[2025-10-29 16:51:58.962][000000004.588] I/user.gmssl.sm3 E64FD76F4078E51DCA428323D3FADBD5D52723BBF1379184650DA5CE6002B2BF 64
+[2025-10-29 16:51:58.964][000000004.588] I/user.gmssl.sm3hmac FBB67FC936777011AA70336F0F0B6305D529A97A87D8ECA8880472CD2C30A721 64
+[2025-10-29 16:51:58.966][000000004.595] I/user.=== SM4测试
+[2025-10-29 16:51:58.971][000000004.596] I/user.sm4.ecb.zero 加密后 E8DF19897C0BF1FFA50910C5C548F5A4E9E34BED9F5CEE519CFA24C37A290B25 64
+[2025-10-29 16:51:58.973][000000004.596] I/user.sm4.ecb.zero 解密后 >>SM4 ECB ZeroPadding test<<
+[2025-10-29 16:51:58.975][000000004.597] I/user.sm4.ecb.pks5 加密后 25B3D6AB8C855115C3A8883FE3ADCC6B9004C83B86CE7A45517CA6736DBA4EFE 64
+[2025-10-29 16:51:58.976][000000004.598] I/user.sm4.ecb.pks5 解密后 >>SM4 ECB Pkcs5Padding test<<
+[2025-10-29 16:51:58.978][000000004.598] I/user.sm4.cbc.pks5 加密后 A11C24BB018C8124FADAFC9B6BF7932C05BA2F24E9DFB9D79D982A676F9C010C 64
+[2025-10-29 16:51:58.979][000000004.599] I/user.sm4.cbc.pks5 解密后 >>SM4 CBC Pkcs5Padding test<<
+[2025-10-29 16:51:58.981][000000004.600] I/user.sm4.ecb.pkcs7 B083DCC0A9F64BD9FAE2FA8C936E3D776C88F739AF2A29A735381F5677BADEF7 64
+[2025-10-29 16:51:58.983][000000004.600] I/user.sm4.ecb.pkcs5 B083DCC0A9F64BD9FAE2FA8C936E3D776C88F739AF2A29A735381F5677BADEF7 64
+[2025-10-29 16:51:58.987][000000004.601] I/user.sm4.ecb.zero B083DCC0A9F64BD9FAE2FA8C936E3D77D2D68ED9FE06CB40C9A150AA5917F15F 64
+[2025-10-29 16:51:58.988][000000004.601] I/user.sm4.ecb.none B083DCC0A9F64BD9FAE2FA8C936E3D77 32
+[2025-10-29 16:51:59.450][000000005.084] I/user.sm2sign 9C2303667887E45ABA016BBACFF1AF2F3ED764CE220A0B0D67CF9206BF48F26AA2797E5478919FB0C6140B89D7DDA33055428A7B3D40F49E0BAD410624D83199
+[2025-10-29 16:51:59.864][000000005.496] I/user.sm2verify true
+[2025-10-29 16:52:00.357][000000005.982] I/user.sm2sign 756D9F37525A543A6647370C22DD71ADEEFBF86D83CE87A28889EAC9F63F0C5CFF334A2D99B067EA676437EE1DEC86B8A8F109568A7CF3AFE70A8DD09562F7E2
+[2025-10-29 16:52:00.782][000000006.411] I/user.sm2verify true
+```

+ 24 - 0
module/Air780EPM/demo/hmeta/hmeta_app.lua

@@ -0,0 +1,24 @@
+--[[
+@module  hmeta_app
+@summary hmeta_app应用功能模块 
+@version 1.0
+@date    2025.10.20
+@author  沈园园
+@usage
+本文件为hmeta应用功能模块,核心业务逻辑为:
+1、获取模块相关信息包括获取模组名称,硬件版本号,原始芯片型号;
+
+本文件没有对外接口,直接在main.lua中require "hmeta_app"就可以加载运行;
+]]
+
+
+local function hmeta_task_func()
+    while true do
+        -- 打印模组名称,硬件版本号,原始芯片型号
+        log.info("hmeta", hmeta.model(), hmeta.hwver(), hmeta.chip())
+        sys.wait(3000)
+    end
+end
+
+--创建一个task,并且运行task的主函数hmeta_task_func
+sys.taskInit(hmeta_task_func)

+ 60 - 19
module/Air780EPM/demo/hmeta/main.lua

@@ -1,30 +1,71 @@
+--[[
+@module  main
+@summary LuatOS用户应用脚本文件入口,总体调度应用逻辑 
+@version 1.0
+@date    2025.10.20
+@author  沈园园
+@usage
+本demo演示的核心功能为:
+获取模块相关信息包括获取模组名称,硬件版本号,原始芯片型号
+更多说明参考本目录下的readme.md文件
+]]
 
--- LuaTools需要PROJECT和VERSION这两个信息
-PROJECT = "hmetademo"
-VERSION = "1.0.0"
 
--- sys库是标配
-_G.sys = require("sys")
+--[[
+必须定义PROJECT和VERSION变量,Luatools工具会用到这两个变量,远程升级功能也会用到这两个变量
+PROJECT:项目名,ascii string类型
+        可以随便定义,只要不使用,就行
+VERSION:项目版本号,ascii string类型
+        如果使用合宙iot.openluat.com进行远程升级,必须按照"XXX.YYY.ZZZ"三段格式定义:
+            X、Y、Z各表示1位数字,三个X表示的数字可以相同,也可以不同,同理三个Y和三个Z表示的数字也是可以相同,可以不同
+            因为历史原因,YYY这三位数字必须存在,但是没有任何用处,可以一直写为000
+        如果不使用合宙iot.openluat.com进行远程升级,根据自己项目的需求,自定义格式即可
+]]
+PROJECT = "luatos_hmeta_app"
+VERSION = "001.000.000"
 
 
--- Air780E的AT固件默认会为开机键防抖, 导致部分用户刷机很麻烦
-if rtos.bsp() == "EC618" and pm and pm.PWK_MODE then
-    pm.power(pm.PWK_MODE, false)
+-- 在日志中打印项目名和项目版本号
+log.info("main", PROJECT, VERSION)
+
+
+-- 如果内核固件支持wdt看门狗功能,此处对看门狗进行初始化和定时喂狗处理
+-- 如果脚本程序死循环卡死,就会无法及时喂狗,最终会自动重启
+if wdt then
+    --配置喂狗超时时间为9秒钟
+    wdt.init(9000)
+    --启动一个循环定时器,每隔3秒钟喂一次狗
+    sys.timerLoopStart(wdt.feed, 3000)
 end
 
 
-sys.taskInit(function()
-    while hmeta do
-        -- hmeta识别底层模组类型的
-        -- 不同的模组可以使用相同的bsp,但根据封装的不同,根据内部数据仍可识别出具体模块
-        log.info("hmeta", hmeta.model(), hmeta.hwver and hmeta.hwver())
-        log.info("bsp",   rtos.bsp())
-        sys.wait(3000)
-    end
-    log.info("这个bsp不支持hmeta库哦")
-end)
+-- 如果内核固件支持errDump功能,此处进行配置,【强烈建议打开此处的注释】
+-- 因为此功能模块可以记录并且上传脚本在运行过程中出现的语法错误或者其他自定义的错误信息,可以初步分析一些设备运行异常的问题
+-- 以下代码是最基本的用法,更复杂的用法可以详细阅读API说明文档
+-- 启动errDump日志存储并且上传功能,600秒上传一次
+-- if errDump then
+--     errDump.config(true, 600)
+-- end
+
+
+-- 使用LuatOS开发的任何一个项目,都强烈建议使用远程升级FOTA功能
+-- 可以使用合宙的iot.openluat.com平台进行远程升级
+-- 也可以使用客户自己搭建的平台进行远程升级
+-- 远程升级的详细用法,可以参考fota的demo进行使用
+
+
+-- 启动一个循环定时器
+-- 每隔3秒钟打印一次总内存,实时的已使用内存,历史最高的已使用内存情况
+-- 方便分析内存使用是否有异常
+-- sys.timerLoopStart(function()
+--     log.info("mem.lua", rtos.meminfo())
+--     log.info("mem.sys", rtos.meminfo("sys"))
+-- end, 3000)
+
+-- 加载hmeta_app应用功能模块
+require "hmeta_app"
 
 -- 用户代码已结束---------------------------------------------
 -- 结尾总是这一句
 sys.run()
--- sys.run()之后后面不要加任何语句!!!!!
+-- sys.run()之后不要加任何语句!!!!!因为添加的任何语句都不会被执行

+ 50 - 0
module/Air780EPM/demo/hmeta/readme.md

@@ -0,0 +1,50 @@
+## 功能模块介绍
+
+1、main.lua:主程序入口;
+
+2、hmeta_app.lua:获取模块相关信息包括获取模组名称,硬件版本号,原始芯片型号;
+
+## 演示功能概述
+
+1、创建一个task;
+
+2、在task中的任务处理函数中,每隔三秒钟通过日志输出一次模组名称,硬件版本号,原始芯片型号;
+
+
+## 演示硬件环境
+
+![](https://docs.openluat.com/air780epm/luatos/common/hwenv/image/Air780EPM2.png)
+
+1、Air780EPM核心板一块
+
+2、TYPE-C USB数据线一根
+
+3、Air780EPM核心板和数据线的硬件接线方式为
+
+- Air780EPM核心板通过TYPE-C USB口连接TYPE-C USB 数据线,数据线的另外一端连接电脑的USB口;
+- 核心板正面的 ON/OFF 拨动开关 拨到ON一端;
+
+
+## 演示软件环境
+
+1、[Luatools下载调试工具](https://docs.openluat.com/air780epm/luatos/common/download/)
+
+2、[Air780EPM 最新版本的内核固件](https://docs.openluat.com/air780epm/luatos/firmware/version/)
+
+
+## 演示核心步骤
+
+1、搭建好硬件环境
+
+2、Luatools烧录内核固件和demo脚本代码
+
+3、烧录成功后,自动开机运行
+
+4、出现类似于下面的日志,就表示运行成功:
+
+``` lua
+[2025-10-21 09:53:28.552][000000003.209] I/user.hmeta Air780EPM A11 EC718PM
+[2025-10-21 09:53:31.548][000000006.209] I/user.hmeta Air780EPM A11 EC718PM
+[2025-10-21 09:53:34.555][000000009.209] I/user.hmeta Air780EPM A11 EC718PM
+
+```

+ 60 - 30
module/Air780EPM/demo/miniz/main.lua

@@ -1,41 +1,71 @@
+--[[
+@module  main
+@summary LuatOS用户应用脚本文件入口,总体调度应用逻辑 
+@version 1.0
+@date    2025.10.28
+@author  沈园园
+@usage
+本demo演示的核心功能为:
+演示如何对数据压缩解压
+更多说明参考本目录下的readme.md文件
+]]
 
--- LuaTools需要PROJECT和VERSION这两个信息
-PROJECT = "minizdemo"
-VERSION = "1.0.0"
 
-sys = require("sys")
+--[[
+必须定义PROJECT和VERSION变量,Luatools工具会用到这两个变量,远程升级功能也会用到这两个变量
+PROJECT:项目名,ascii string类型
+        可以随便定义,只要不使用,就行
+VERSION:项目版本号,ascii string类型
+        如果使用合宙iot.openluat.com进行远程升级,必须按照"XXX.YYY.ZZZ"三段格式定义:
+            X、Y、Z各表示1位数字,三个X表示的数字可以相同,也可以不同,同理三个Y和三个Z表示的数字也是可以相同,可以不同
+            因为历史原因,YYY这三位数字必须存在,但是没有任何用处,可以一直写为000
+        如果不使用合宙iot.openluat.com进行远程升级,根据自己项目的需求,自定义格式即可
+]]
+PROJECT = "luatos_miniz_app"
+VERSION = "001.000.000"
 
---添加硬狗防止程序卡死
+
+-- 在日志中打印项目名和项目版本号
+log.info("main", PROJECT, VERSION)
+
+
+-- 如果内核固件支持wdt看门狗功能,此处对看门狗进行初始化和定时喂狗处理
+-- 如果脚本程序死循环卡死,就会无法及时喂狗,最终会自动重启
 if wdt then
-    wdt.init(9000)--初始化watchdog设置为9s
-    sys.timerLoopStart(wdt.feed, 3000)--3s喂一次狗
+    --配置喂狗超时时间为9秒钟
+    wdt.init(9000)
+    --启动一个循环定时器,每隔3秒钟喂一次狗
+    sys.timerLoopStart(wdt.feed, 3000)
 end
 
-sys.taskInit(function()
-    sys.wait(1000)
-    -- 压缩过的字符串, 为了方便演示, 这里用了base64编码
-    -- 大部分MCU设备的内存都比较小, miniz.compress 通常在服务器端完成,这里就不演示了
-    -- miniz能解压标准zlib数据流
-    local b64str = "eAEFQIGNwyAMXOUm+E2+OzjhCCiOjYyhyvbVR7K7IR0l+iau8G82eIW5jXVoPzF5pse/B8FaPXLiWTNxEMsKI+WmIR0l+iayEY2i2V4UbqqPh5bwimyEuY11aD8xeaYHxAquvom6VDFUXqQjG1Fek6efCFfCK0b0LUnQMjiCxhUT05GNL75dFUWCSMcjN3EE5c4Wvq42/36R41fa"
-    local str = b64str:fromBase64()
-
-    local dstr = miniz.uncompress(str)
-    -- 压缩过的数据长度 156
-    -- 解压后的数据长度,即原始数据的长度 235
-    log.info("miniz", "compressed", #str, "uncompressed", #dstr)
-
-    -- 演示压缩解压
-    local ostr = "abcd12345"
-    -- 压缩字符串
-    local zstr = miniz.compress(ostr)
-    log.info("压缩后的字符串:",zstr:toHex())
-    -- 解压字符串
-    local lstr = miniz.uncompress(zstr)
-    log.info("miniz","compress zstr",#zstr,"uncompress lstr data",lstr)
-end)
 
+-- 如果内核固件支持errDump功能,此处进行配置,【强烈建议打开此处的注释】
+-- 因为此功能模块可以记录并且上传脚本在运行过程中出现的语法错误或者其他自定义的错误信息,可以初步分析一些设备运行异常的问题
+-- 以下代码是最基本的用法,更复杂的用法可以详细阅读API说明文档
+-- 启动errDump日志存储并且上传功能,600秒上传一次
+-- if errDump then
+--     errDump.config(true, 600)
+-- end
+
+
+-- 使用LuatOS开发的任何一个项目,都强烈建议使用远程升级FOTA功能
+-- 可以使用合宙的iot.openluat.com平台进行远程升级
+-- 也可以使用客户自己搭建的平台进行远程升级
+-- 远程升级的详细用法,可以参考fota的demo进行使用
+
+
+-- 启动一个循环定时器
+-- 每隔3秒钟打印一次总内存,实时的已使用内存,历史最高的已使用内存情况
+-- 方便分析内存使用是否有异常
+-- sys.timerLoopStart(function()
+--     log.info("mem.lua", rtos.meminfo())
+--     log.info("mem.sys", rtos.meminfo("sys"))
+-- end, 3000)
+
+-- 加载miniz_app应用功能模块
+require "miniz_app"
 
 -- 用户代码已结束---------------------------------------------
 -- 结尾总是这一句
 sys.run()
--- sys.run()之后后面不要加任何语句!!!!!
+-- sys.run()之后不要加任何语句!!!!!因为添加的任何语句都不会被执行

+ 47 - 0
module/Air780EPM/demo/miniz/miniz_app.lua

@@ -0,0 +1,47 @@
+--[[
+@module  miniz_app
+@summary miniz_app应用功能模块 
+@version 1.0
+@date    2025.10.28
+@author  沈园园
+@usage
+本文件为miniz应用功能模块,核心业务逻辑为:
+1、如何对数据压缩解压;
+
+本文件没有对外接口,直接在main.lua中require "miniz_app"就可以加载运行;
+]]
+
+
+local function miniz_task_func()
+    -- 压缩过的字符串, 为了方便演示, 这里用了base64编码
+    -- miniz能解压标准zlib数据流
+    -- 将字符串进行base64解码
+    local b64str = "eAEFQIGNwyAMXOUm+E2+OzjhCCiOjYyhyvbVR7K7IR0l+iau8G82eIW5jXVoPzF5pse/B8FaPXLiWTNxEMsKI+WmIR0l+iayEY2i2V4UbqqPh5bwimyEuY11aD8xeaYHxAquvom6VDFUXqQjG1Fek6efCFfCK0b0LUnQMjiCxhUT05GNL75dFUWCSMcjN3EE5c4Wvq42/36R41fa"
+    local str = b64str:fromBase64()
+    -- 快速解压
+    local dstr = miniz.uncompress(str) 
+    -- 压缩过的数据长度 156
+    -- 解压后的数据长度,即原始数据的长度 235
+    log.info("miniz", "压缩过的数据长度: ", #str, "解压后的数据长度:", #dstr)    
+    
+    -- 演示压缩解压
+    local ostr = "abcd1234567890efghijklmnopqrstuvwxyzabcd1234567890efghijklmnopqrstuvwxyzabcd1234567890efghijklmnopqrstuvwxyz"
+    log.info("压缩前的字符串:", #ostr, ostr)
+    -- 压缩字符串
+    local zstr = miniz.compress(ostr)
+    log.info("压缩后的字符串:",#zstr, zstr:toHex())
+    -- 解压字符串
+    local lstr = miniz.uncompress(zstr)
+    log.info("解压后的字符串:", #lstr, lstr)
+    
+    -- 演示从文件读取2K数据压缩
+    local ostr = io.readFile("/luadb/test.txt")
+    local zstr = miniz.compress(ostr)
+    if zstr then
+        log.info("miniz", "压缩前的数据长度: ", #ostr, "压缩后的数据长度: ", #zstr) 
+    end  
+end
+
+
+--创建一个task,并且运行task的主函数miniz_task_func
+sys.taskInit(miniz_task_func)

+ 51 - 0
module/Air780EPM/demo/miniz/readme.md

@@ -0,0 +1,51 @@
+## 功能模块介绍
+
+1、main.lua:主程序入口;
+
+2、miniz_app.lua:如何对数据压缩解压;
+
+## 演示功能概述
+
+1、创建一个task;
+
+2、演示如何对数据压缩解压;
+
+
+## 演示硬件环境
+
+![](https://docs.openluat.com/air780epm/luatos/common/hwenv/image/Air780EPM2.png)
+
+1、Air780EPM核心板一块
+
+2、TYPE-C USB数据线一根
+
+3、Air780EPM核心板和数据线的硬件接线方式为
+
+- Air780EPM核心板通过TYPE-C USB口连接TYPE-C USB 数据线,数据线的另外一端连接电脑的USB口;
+- 核心板正面的 ON/OFF 拨动开关 拨到ON一端;
+
+
+## 演示软件环境
+
+1、[Luatools下载调试工具](https://docs.openluat.com/air780epm/luatos/common/download/)
+
+2、[Air780EPM 最新版本的内核固件](https://docs.openluat.com/air780epm/luatos/firmware/version/)
+
+
+## 演示核心步骤
+
+1、搭建好硬件环境
+
+2、Luatools烧录内核固件和demo脚本代码
+
+3、烧录成功后,自动开机运行
+
+4、出现类似于下面的日志,就表示运行成功:
+
+``` lua
+[2025-10-28 11:39:11.816][000000000.379] I/user.miniz 压缩过的数据长度:  156 解压后的数据长度: 235
+[2025-10-28 11:39:11.821][000000000.380] I/user.压缩前的字符串: 108 abcd1234567890efghijklmnopqrstuvwxyzabcd1234567890efghijklmnopqrstuvwxyzabcd1234567890efghijklmnopqrstuvwxyz
+[2025-10-28 11:39:11.826][000000000.383] I/user.压缩后的字符串: 92 780105C0040D80B04A383CCEDDDD9F9E4184C97E9CD7FDBC1FD828E3422A6DACF321A65C6AEB632E8830D98FF3BA9FF7031B655C48A58D753EC4944B6D7DCC051126FB715EF7F37E60A38C0BA9B4B1CE879872A9AD8FB97E17A42785 184
+[2025-10-28 11:39:11.832][000000000.383] I/user.解压后的字符串: 108 abcd1234567890efghijklmnopqrstuvwxyzabcd1234567890efghijklmnopqrstuvwxyzabcd1234567890efghijklmnopqrstuvwxyz
+[2025-10-28 11:39:11.836][000000000.389] I/user.miniz 压缩前的数据长度:  2048 压缩后的数据长度:  1350
+```

A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 0 - 0
module/Air780EPM/demo/miniz/test.txt


+ 68 - 0
module/Air8000/demo/fastlz/fastlz_app.lua

@@ -0,0 +1,68 @@
+--[[
+@module  fastlz_app
+@summary fastlz_app 
+@version 1.0
+@date    2025.10.28
+@author  沈园园
+@usage
+本文件为fastlz应用功能模块,核心业务逻辑为:
+1、演示压缩与解压缩的流程;
+
+本文件没有对外接口,直接在main.lua中require "fastlz_app"就可以加载运行;
+]]
+
+
+function fastlz_compress_uncompress_func(mode)
+    -- 原始数据
+    local originStr
+    if mode == 1 then
+        log.info("原始数据文件读取2K数据")
+        originStr = io.readFile("/luadb/test.txt")          
+    else
+        log.info("原始数据108长度字符串")
+        originStr = "abcd1234567890efghijklmnopqrstuvwxyzabcd1234567890efghijklmnopqrstuvwxyzabcd1234567890efghijklmnopqrstuvwxyz"            
+    end
+    
+    local maxOut = #originStr
+    log.info("原始数据长度", #originStr)
+
+    -- 以压缩等级1 进行压缩
+    local L1 = fastlz.compress(originStr,1)
+    log.info("压缩等级1:压缩后的数据长度", #L1)
+
+    -- 解压
+    local dstr1 = fastlz.uncompress(L1,maxOut)
+    log.info("压缩等级1:解压后的的数据长度", #dstr1)
+    -- 判断解压后的数据是否与原始数据相同
+    if originStr == dstr1 then
+        log.info("压缩等级1:解压后的数据与原始数据相同")
+    else
+        log.info("压缩等级1:解压后的数据与原始数据不同")
+    end
+
+    -- 以压缩等级2 进行压缩
+    local L2 = fastlz.compress(originStr, 2)
+    log.info("压缩等级2:压缩后的数据长度", #L2)
+
+    -- 解压
+    local dstr2 = fastlz.uncompress(L2,maxOut)
+    log.info("压缩等级2:解压后的数据长度", #dstr2)
+
+    -- 判断解压后的数据是否与原始数据相同
+    if originStr == dstr2 then
+        log.info("压缩等级2:解压后的数据与原始数据相同")
+    else
+        log.info("压缩等级2:解压后的数据与原始数据不同")
+    end     
+end
+
+function fastlz_task_func()
+    -- 原始数据108长度字符串
+    fastlz_compress_uncompress_func()
+    -- 原始数据文件读取2K数据
+    fastlz_compress_uncompress_func(1)   
+end
+
+
+--创建一个task,并且运行task的主函数fastlz_task_func
+sys.taskInit(fastlz_task_func)

+ 71 - 0
module/Air8000/demo/fastlz/main.lua

@@ -0,0 +1,71 @@
+--[[
+@module  main
+@summary LuatOS用户应用脚本文件入口,总体调度应用逻辑 
+@version 1.0
+@date    2025.10.28
+@author  沈园园
+@usage
+本demo演示的核心功能为:
+演示如何对数据压缩解压
+更多说明参考本目录下的readme.md文件
+]]
+
+
+--[[
+必须定义PROJECT和VERSION变量,Luatools工具会用到这两个变量,远程升级功能也会用到这两个变量
+PROJECT:项目名,ascii string类型
+        可以随便定义,只要不使用,就行
+VERSION:项目版本号,ascii string类型
+        如果使用合宙iot.openluat.com进行远程升级,必须按照"XXX.YYY.ZZZ"三段格式定义:
+            X、Y、Z各表示1位数字,三个X表示的数字可以相同,也可以不同,同理三个Y和三个Z表示的数字也是可以相同,可以不同
+            因为历史原因,YYY这三位数字必须存在,但是没有任何用处,可以一直写为000
+        如果不使用合宙iot.openluat.com进行远程升级,根据自己项目的需求,自定义格式即可
+]]
+PROJECT = "luatos_fastlz_app"
+VERSION = "001.000.000"
+
+
+-- 在日志中打印项目名和项目版本号
+log.info("main", PROJECT, VERSION)
+
+
+-- 如果内核固件支持wdt看门狗功能,此处对看门狗进行初始化和定时喂狗处理
+-- 如果脚本程序死循环卡死,就会无法及时喂狗,最终会自动重启
+if wdt then
+    --配置喂狗超时时间为9秒钟
+    wdt.init(9000)
+    --启动一个循环定时器,每隔3秒钟喂一次狗
+    sys.timerLoopStart(wdt.feed, 3000)
+end
+
+
+-- 如果内核固件支持errDump功能,此处进行配置,【强烈建议打开此处的注释】
+-- 因为此功能模块可以记录并且上传脚本在运行过程中出现的语法错误或者其他自定义的错误信息,可以初步分析一些设备运行异常的问题
+-- 以下代码是最基本的用法,更复杂的用法可以详细阅读API说明文档
+-- 启动errDump日志存储并且上传功能,600秒上传一次
+-- if errDump then
+--     errDump.config(true, 600)
+-- end
+
+
+-- 使用LuatOS开发的任何一个项目,都强烈建议使用远程升级FOTA功能
+-- 可以使用合宙的iot.openluat.com平台进行远程升级
+-- 也可以使用客户自己搭建的平台进行远程升级
+-- 远程升级的详细用法,可以参考fota的demo进行使用
+
+
+-- 启动一个循环定时器
+-- 每隔3秒钟打印一次总内存,实时的已使用内存,历史最高的已使用内存情况
+-- 方便分析内存使用是否有异常
+-- sys.timerLoopStart(function()
+--     log.info("mem.lua", rtos.meminfo())
+--     log.info("mem.sys", rtos.meminfo("sys"))
+-- end, 3000)
+
+-- 加载fastlz_app应用功能模块
+require "fastlz_app"
+
+-- 用户代码已结束---------------------------------------------
+-- 结尾总是这一句
+sys.run()
+-- sys.run()之后不要加任何语句!!!!!因为添加的任何语句都不会被执行

+ 63 - 0
module/Air8000/demo/fastlz/readme.md

@@ -0,0 +1,63 @@
+## 功能模块介绍
+
+1、main.lua:主程序入口;
+
+2、fastlz_app.lua:如何对数据压缩解压;
+
+## 演示功能概述
+
+1、创建一个task;
+
+2、演示如何对数据压缩解压;
+
+
+## 演示硬件环境
+
+![](https://docs.openluat.com/luatos_lesson/image/Evh1bVjatoG1rCxhrdpc9ny7nVf.png)
+
+1、Air8000核心板一块
+
+2、TYPE-C USB数据线一根
+
+3、Air8000核心板和数据线的硬件接线方式为
+
+- Air8000核心板通过TYPE-C USB口连接TYPE-C USB 数据线,数据线的另外一端连接电脑的USB口;
+- 核心板正面的 供电/充电 拨动开关 拨到供电一端;
+- 核心板背面的 USB ON/USB OFF 拨动开关 拨到USB ON一端;
+
+
+## 演示软件环境
+
+1、[Luatools下载调试工具](https://docs.openluat.com/air8000/luatos/common/download/)
+
+2、[Air8000 最新版本的内核固件](https://docs.openluat.com/air8000/luatos/firmware/)
+
+
+## 演示核心步骤
+
+1、搭建好硬件环境
+
+2、Luatools烧录内核固件和demo脚本代码
+
+3、烧录成功后,自动开机运行
+
+4、出现类似于下面的日志,就表示运行成功:
+
+``` lua
+[2025-10-28 17:11:11.613][000000000.368] I/user.原始数据108长度字符串
+[2025-10-28 17:11:11.613][000000000.369] I/user.原始数据长度 108
+[2025-10-28 17:11:11.623][000000000.370] I/user.压缩等级1:压缩后的数据长度 47
+[2025-10-28 17:11:11.623][000000000.371] I/user.压缩等级1:解压后的的数据长度 108
+[2025-10-28 17:11:11.623][000000000.371] I/user.压缩等级1:解压后的数据与原始数据相同
+[2025-10-28 17:11:11.623][000000000.373] I/user.压缩等级2:压缩后的数据长度 47
+[2025-10-28 17:11:11.633][000000000.374] I/user.压缩等级2:解压后的数据长度 108
+[2025-10-28 17:11:11.637][000000000.374] I/user.压缩等级2:解压后的数据与原始数据相同
+[2025-10-28 17:11:11.637][000000000.374] I/user.原始数据文件读取2K数据
+[2025-10-28 17:11:11.643][000000000.375] I/user.原始数据长度 2048
+[2025-10-28 17:11:11.643][000000000.377] I/user.压缩等级1:压缩后的数据长度 128
+[2025-10-28 17:11:11.643][000000000.378] I/user.压缩等级1:解压后的的数据长度 2048
+[2025-10-28 17:11:11.653][000000000.378] I/user.压缩等级1:解压后的数据与原始数据相同
+[2025-10-28 17:11:11.653][000000000.379] I/user.压缩等级2:压缩后的数据长度 116
+[2025-10-28 17:11:11.693][000000000.380] I/user.压缩等级2:解压后的数据长度 2048
+[2025-10-28 17:11:11.713][000000000.380] I/user.压缩等级2:解压后的数据与原始数据相同
+```

A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 0 - 0
module/Air8000/demo/fastlz/test.txt


+ 71 - 0
module/Air8000/demo/gmssl/gmssl_sm2.lua

@@ -0,0 +1,71 @@
+--[[
+@module  gmssl_sm2
+@summary gmssl_sm2 
+@version 1.0
+@date    2025.10.29
+@author  沈园园
+@usage
+本文件为gmssl sm2应用功能模块,核心业务逻辑为:
+1、演示国密sm2加密和解码的应用;
+
+本文件没有对外接口,直接在main.lua中require "gmssl_sm2"就可以加载运行;
+]]
+
+
+function gmssl_sm2_encrypt_decrypt(originStr, pkx, pky, private)
+    -- GMSSL默认格式
+    log.info("==== SM2 默认GMSSL模式")
+    local encodeStr = gmssl.sm2encrypt(pkx,pky,originStr)
+    log.info("sm2默认模式", "加密后", encodeStr and  string.toHex(encodeStr))
+    if encodeStr then
+        log.info("sm2默认模式", "解密后", gmssl.sm2decrypt(private,encodeStr))
+    end
+    
+
+    -- 网站兼容模式 https://i.goto327.top/CryptTools/SM2.aspx
+    -- 密文格式 C1C3C2, 新国标, 一般是这种
+    log.info("==== SM2 网站兼容模式")
+    local encodeStr = gmssl.sm2encrypt(pkx,pky,originStr, true)
+    log.info("sm2网站兼容模式 C1C3C2", "加密后", encodeStr and  string.toHex(encodeStr))
+    if encodeStr then
+        log.info("sm2网站兼容模式 C1C3C2", "解密后", gmssl.sm2decrypt(private,encodeStr, true))
+    else
+        log.info("解密失败")
+    end
+    -- 密文格式 C1C2C3, 老国标, 老的Java库通常支持这种
+    log.info("==== SM2 网站兼容模式, 但C1C2C3")
+    local encodeStr = gmssl.sm2encrypt(pkx,pky,originStr, true, true)
+    log.info("sm2网站兼容模式 C1C2C3", "加密后", encodeStr and  string.toHex(encodeStr))
+    if encodeStr then
+        log.info("sm2网站兼容模式 C1C2C3", "解密后", gmssl.sm2decrypt(private,encodeStr, true, true))
+    else
+        log.info("解密失败")
+    end
+end
+
+
+local function gmssl_sm2_task_func()
+    -- 未加密字符串
+    local originStr = "!!from LuatOS!!"
+
+    -- SM2 , 非对称加密, 类似于RSA,但属于椭圆算法
+    -- 就当前实现还是比较慢的
+    if gmssl.sm2encrypt then -- 部分BSP不支持
+        local pkx = "ABE87C924B7ECFDEA1748A06E89003C9F7F4DC5C3563873CE2CAE46F66DE8141"
+        local pky = "9514733D38CC026F2452A6A3A3A4DA0C28F864AFA5FE2C45E0EB6B761FBB5286"
+        local private = "129EDC282CD2E9C1144C2E7315F926D772BC96600D2771E8BE02060313FE00D5"
+        gmssl_sm2_encrypt_decrypt(originStr, pkx, pky, private)
+    end
+
+    -- SM密钥生成
+    if gmssl.sm2keygen then
+        log.info("SM2密钥生成测试")
+        originStr = "32wrniosadnfvnadsio;fasiow"
+        local pkx, pky, private = gmssl.sm2keygen()
+        gmssl_sm2_encrypt_decrypt(originStr, pkx, pky, private)
+    end
+
+end
+
+sys.taskInit(gmssl_sm2_task_func)
+

+ 43 - 0
module/Air8000/demo/gmssl/gmssl_sm2sign.lua

@@ -0,0 +1,43 @@
+--[[
+@module  gmssl_sm2sign
+@summary gmssl_sm2sign 
+@version 1.0
+@date    2025.10.29
+@author  沈园园
+@usage
+本文件为gmssl sm2sign应用功能模块,核心业务逻辑为:
+1、演示国密SM2签名和验签的应用;
+
+本文件没有对外接口,直接在main.lua中require "gmssl_sm2sign"就可以加载运行;
+]]
+
+
+local function gmssl_sm2sign_task_func()
+
+    -- SM2签名和验签
+    if gmssl.sm2sign then
+        local originStr = string.fromHex("434477813974bf58f94bcf760833c2b40f77a5fc360485b0b9ed1bd9682edb45")
+        local pkx = "ABE87C924B7ECFDEA1748A06E89003C9F7F4DC5C3563873CE2CAE46F66DE8141"
+        local pky = "9514733D38CC026F2452A6A3A3A4DA0C28F864AFA5FE2C45E0EB6B761FBB5286"
+        local private = "129EDC282CD2E9C1144C2E7315F926D772BC96600D2771E8BE02060313FE00D5"
+
+        -- 不带id的情况,即默认id="1234567812345678"
+        local sig = gmssl.sm2sign(private, originStr, nil)
+        log.info("sm2sign", sig and sig:toHex())
+        if sig then
+            local ret = gmssl.sm2verify(pkx, pky, originStr, nil, sig)
+            log.info("sm2verify", ret or "false")
+        end
+
+        -- 带id的情况
+        local id = "1234"
+        local sig = gmssl.sm2sign(private, originStr, id)
+        log.info("sm2sign", sig and sig:toHex())
+        if sig then
+            local ret = gmssl.sm2verify(pkx, pky, originStr, id, sig)
+            log.info("sm2verify", ret or "false")
+        end
+    end
+end
+
+sys.taskInit(gmssl_sm2sign_task_func)

+ 26 - 0
module/Air8000/demo/gmssl/gmssl_sm3.lua

@@ -0,0 +1,26 @@
+--[[
+@module  gmssl_sm3
+@summary gmssl_sm3
+@version 1.0
+@date    2025.10.29
+@author  沈园园
+@usage
+本文件为gmssl sm3应用功能模块,核心业务逻辑为:
+1、演示国密sm3算法;
+
+本文件没有对外接口,直接在main.lua中require "gmssl_sm3"就可以加载运行;
+]]
+
+
+local function gmssl_sm3_task_func()
+    -- sm3算法,算HASH值
+    local encodeStr = gmssl.sm3("lqlq666lqlq946")
+    log.info("gmssl.sm3",string.toHex(encodeStr))
+    
+    -- sm3算法,算HASH值,但带HMAC
+    local encodeStr = gmssl.sm3hmac("lqlq666lqlq946", "123")
+    log.info("gmssl.sm3hmac",string.toHex(encodeStr))    
+
+end
+
+sys.taskInit(gmssl_sm3_task_func)

+ 53 - 0
module/Air8000/demo/gmssl/gmssl_sm4.lua

@@ -0,0 +1,53 @@
+--[[
+@module  gmssl_sm4
+@summary gmssl_sm4 
+@version 1.0
+@date    2025.10.29
+@author  沈园园
+@usage
+本文件为gmssl sm4应用功能模块,核心业务逻辑为:
+1、演示国密sm4加密和解码的应用;
+
+本文件没有对外接口,直接在main.lua中require "gmssl_sm4"就可以加载运行;
+]]
+
+
+local function gmssl_sm4_task_func()
+
+    if gmssl.sm4encrypt then
+        log.info("=== SM4测试")
+        local passwd = "1234567890123456"
+        local iv = "1234567890666666"
+        -- SM4 算法, 对称加密
+        originStr = ">>SM4 ECB ZeroPadding test<<"
+        --加密模式:ECB;填充方式:ZeroPadding;密钥:1234567890123456;
+        encodeStr = gmssl.sm4encrypt("ECB", "ZERO", originStr, passwd)
+        log.info("sm4.ecb.zero", "加密后", string.toHex(encodeStr))
+        log.info("sm4.ecb.zero", "解密后", gmssl.sm4decrypt("ECB","ZERO",encodeStr,passwd))
+
+        originStr = ">>SM4 ECB Pkcs5Padding test<<"
+        --加密模式:ECB;填充方式:Pkcs5Padding;密钥:1234567890123456;
+        encodeStr = gmssl.sm4encrypt("ECB", "PKCS5", originStr, passwd)
+        log.info("sm4.ecb.pks5", "加密后", string.toHex(encodeStr))
+        log.info("sm4.ecb.pks5", "解密后", gmssl.sm4decrypt("ECB","PKCS5",encodeStr,passwd))
+
+        originStr = ">>SM4 CBC Pkcs5Padding test<<"
+        --加密模式:CBC;填充方式:Pkcs5Padding;密钥:1234567890123456;偏移量:1234567890666666
+        encodeStr = gmssl.sm4encrypt("CBC","PKCS5", originStr, passwd, iv)
+        log.info("sm4.cbc.pks5", "加密后", string.toHex(encodeStr))
+        log.info("sm4.cbc.pks5", "解密后", gmssl.sm4decrypt("CBC","PKCS5",encodeStr,passwd, iv))
+
+        -- 完全对齐16字节的对比测试
+        originStr = "1234567890123456"
+        encodeStr = gmssl.sm4encrypt("ECB","PKCS7",originStr,passwd)
+        log.info("sm4.ecb.pkcs7", encodeStr:toHex())
+        encodeStr = gmssl.sm4encrypt("ECB","PKCS5",originStr,passwd)
+        log.info("sm4.ecb.pkcs5", encodeStr:toHex())
+        encodeStr = gmssl.sm4encrypt("ECB","ZERO",originStr,passwd)
+        log.info("sm4.ecb.zero", encodeStr:toHex())
+        encodeStr = gmssl.sm4encrypt("ECB","NONE",originStr,passwd)
+        log.info("sm4.ecb.none", encodeStr:toHex())
+    end
+end
+
+sys.taskInit(gmssl_sm4_task_func)

+ 78 - 0
module/Air8000/demo/gmssl/main.lua

@@ -0,0 +1,78 @@
+--[[
+@module  main
+@summary LuatOS用户应用脚本文件入口,总体调度应用逻辑 
+@version 1.0
+@date    2025.10.29
+@author  沈园园
+@usage
+本demo演示的核心功能为:
+演示有关gmssl国密算法的功能包含SM2,SM3,SM4
+更多说明参考本目录下的readme.md文件
+]]
+
+
+--[[
+必须定义PROJECT和VERSION变量,Luatools工具会用到这两个变量,远程升级功能也会用到这两个变量
+PROJECT:项目名,ascii string类型
+        可以随便定义,只要不使用,就行
+VERSION:项目版本号,ascii string类型
+        如果使用合宙iot.openluat.com进行远程升级,必须按照"XXX.YYY.ZZZ"三段格式定义:
+            X、Y、Z各表示1位数字,三个X表示的数字可以相同,也可以不同,同理三个Y和三个Z表示的数字也是可以相同,可以不同
+            因为历史原因,YYY这三位数字必须存在,但是没有任何用处,可以一直写为000
+        如果不使用合宙iot.openluat.com进行远程升级,根据自己项目的需求,自定义格式即可
+]]
+PROJECT = "luatos_gmssl_app"
+VERSION = "001.000.000"
+
+
+-- 在日志中打印项目名和项目版本号
+log.info("main", PROJECT, VERSION)
+
+
+-- 如果内核固件支持wdt看门狗功能,此处对看门狗进行初始化和定时喂狗处理
+-- 如果脚本程序死循环卡死,就会无法及时喂狗,最终会自动重启
+if wdt then
+    --配置喂狗超时时间为9秒钟
+    wdt.init(9000)
+    --启动一个循环定时器,每隔3秒钟喂一次狗
+    sys.timerLoopStart(wdt.feed, 3000)
+end
+
+
+-- 如果内核固件支持errDump功能,此处进行配置,【强烈建议打开此处的注释】
+-- 因为此功能模块可以记录并且上传脚本在运行过程中出现的语法错误或者其他自定义的错误信息,可以初步分析一些设备运行异常的问题
+-- 以下代码是最基本的用法,更复杂的用法可以详细阅读API说明文档
+-- 启动errDump日志存储并且上传功能,600秒上传一次
+-- if errDump then
+--     errDump.config(true, 600)
+-- end
+
+
+-- 使用LuatOS开发的任何一个项目,都强烈建议使用远程升级FOTA功能
+-- 可以使用合宙的iot.openluat.com平台进行远程升级
+-- 也可以使用客户自己搭建的平台进行远程升级
+-- 远程升级的详细用法,可以参考fota的demo进行使用
+
+
+-- 启动一个循环定时器
+-- 每隔3秒钟打印一次总内存,实时的已使用内存,历史最高的已使用内存情况
+-- 方便分析内存使用是否有异常
+-- sys.timerLoopStart(function()
+--     log.info("mem.lua", rtos.meminfo())
+--     log.info("mem.sys", rtos.meminfo("sys"))
+-- end, 3000)
+
+
+-- 加载sm2算法, 含密钥生成应用功能模块
+require "gmssl_sm2"
+-- 加载sm3算法应用功能模块
+require "gmssl_sm3"
+-- 加载sm4算法应用功能模块
+require "gmssl_sm4"
+-- 加载sm2签名和验签应用功能模块
+require "gmssl_sm2sign"
+
+-- 用户代码已结束---------------------------------------------
+-- 结尾总是这一句
+sys.run()
+-- sys.run()之后不要加任何语句!!!!!因为添加的任何语句都不会被执行

+ 89 - 0
module/Air8000/demo/gmssl/readme.md

@@ -0,0 +1,89 @@
+## 功能模块介绍
+
+1、main.lua:主程序入口;
+
+2、gmssl_sm2.lua:sm2算法, 含密钥生成;
+
+3、gmssl_sm3:sm3算法;
+
+5、gmssl_sm4:sm4算法;
+
+6、gmssl_sm2sign:sm2签名和验签;
+
+## 演示功能概述
+
+1、创建一个task;
+
+2、演示gmssl国密算法包含SM2算法, 含密钥生成,SM3算法,SM4算法以及sm2签名和验签;
+
+
+## 演示硬件环境
+
+![](https://docs.openluat.com/luatos_lesson/image/Evh1bVjatoG1rCxhrdpc9ny7nVf.png)
+
+1、Air8000核心板一块
+
+2、TYPE-C USB数据线一根
+
+4、Air8000核心板和数据线的硬件接线方式为
+
+- Air8000核心板通过TYPE-C USB口连接TYPE-C USB 数据线,数据线的另外一端连接电脑的USB口;
+- 核心板正面的 供电/充电 拨动开关 拨到供电一端;
+- 核心板背面的 USB ON/USB OFF 拨动开关 拨到USB ON一端;
+
+
+## 演示软件环境
+
+1、[Luatools下载调试工具](https://docs.openluat.com/air8000/luatos/common/download/)
+
+2、[Air8000 最新版本的内核固件](https://docs.openluat.com/air8000/luatos/firmware/)
+
+
+## 演示核心步骤
+
+1、搭建好硬件环境
+
+2、Luatools烧录内核固件和demo脚本代码
+
+3、烧录成功后,自动开机运行
+
+4、出现类似于下面的日志,就表示运行成功:
+
+``` lua
+[2025-10-29 16:51:55.069][000000000.365] I/user.==== SM2 默认GMSSL模式
+[2025-10-29 16:51:55.296][000000000.912] I/user.sm2默认模式 加密后 3078022022F0E9C08C45EC2D456C184541900B2D069790DF554BD37183453306E49A474E022100A7220907D53AF4A580B6AEC7B8EA53FF5E51F5E56A8ACC440C86F58C4E3EB9110420A4FCAE7ECF86059FB63B0F82A502223E8B4C7CAECBE29E72C05A87DF8BA3C08F040F63EE6697093A495733939D4D68070F
+[2025-10-29 16:51:55.526][000000001.150] I/user.sm2默认模式 解密后 !!from LuatOS!!
+[2025-10-29 16:51:55.530][000000001.151] I/user.==== SM2 网站兼容模式
+[2025-10-29 16:51:55.977][000000001.601] I/user.sm2网站兼容模式 C1C3C2 加密后 7CD71EFCD699E81C5A320DD78357788BA4A4E87C02691EB73225B6E8CC3F1A95730359208D2E6A375E49D84321C9BB28F0D7B65BC348DD07A9ADE9C1F38D053CA5B4128EE908F4494DB1867F0C48D00FCFE3F6A9C38CDA696CABAF36E9D120244AAEC7B42200A0A9C8321EDEDC9010
+[2025-10-29 16:51:56.177][000000001.800] I/user.sm2网站兼容模式 C1C3C2 解密后 !!from LuatOS!!
+[2025-10-29 16:51:56.182][000000001.800] I/user.==== SM2 网站兼容模式, 但C1C2C3
+[2025-10-29 16:51:56.589][000000002.228] I/user.sm2网站兼容模式 C1C2C3 加密后 0429D777A89C474D468CBB4BDE604C5D0111EF6FEB9AD180A9A5167657C4CFD09A0CAAF6D3467CE2564C73A666EC4DE2CA2E28F5B2BBFA9FE5B30CCA39D0B453DB60AF6B2B6DC1E7D76F3E9FF048FEACC850B37144EC64840A84A1A81B4ACF4BDB851391ECC9F13974A76464C9F9624C
+[2025-10-29 16:51:56.788][000000002.425] I/user.sm2网站兼容模式 C1C2C3 解密后 !!from LuatOS!!
+[2025-10-29 16:51:56.794][000000002.425] I/user.SM2密钥生成测试
+[2025-10-29 16:51:57.048][000000002.660] I/user.==== SM2 默认GMSSL模式
+[2025-10-29 16:51:57.462][000000003.092] I/user.sm2默认模式 加密后 3081820220227403C3A196042379534047850F01BA8EC3603226AF18E0CE65729EBBBDC68C02201D1FBBD3998FDB2757AE55262F1CDD288C6C403766F77F6D7CB9017457E7EE660420B742677896DEDBBEAF55857603EB4C39FA9DFFDAD6E17AFA27FA0D7C7D2F7EF5041A79A2DF1D84C0B449459A4FE6BCC3A494F9F4CC2D00F9A4A7C4FE
+[2025-10-29 16:51:57.674][000000003.301] I/user.sm2默认模式 解密后 32wrniosadnfvnadsio;fasiow
+[2025-10-29 16:51:57.681][000000003.301] I/user.==== SM2 网站兼容模式
+[2025-10-29 16:51:58.092][000000003.717] I/user.sm2网站兼容模式 C1C3C2 加密后 A615127F2C18731AB83CA50CDC386C0F70506EA3BE6B1B1E74E1F417BCFB992AC9B4F91A4233181CD5C419CA21B5AD46BBA7F2E635D4AC317842E8762A19260218921AB2D4C02C8211E2AC28976B61D33E0AB826B2DE223E6E51729B31B02E02E0C73D5822F12FC4618E6E1F7110278CBD273C152B650C75A423
+[2025-10-29 16:51:58.306][000000003.927] I/user.sm2网站兼容模式 C1C3C2 解密后 32wrniosadnfvnadsio;fasiow
+[2025-10-29 16:51:58.313][000000003.927] I/user.==== SM2 网站兼容模式, 但C1C2C3
+[2025-10-29 16:51:58.748][000000004.372] I/user.sm2网站兼容模式 C1C2C3 加密后 045807522541AF430F7D0F3EE27D0718AA33D17E98F04121CC3039A6C7EA5B219751DA6CDC64B805C5BA08E97CFC7546D72BCBF1CD2329F26190A6CF33D76E37B1BFFEDBA05C31D8673F33CFA5925A5EC0DB37A58F74B30020DE25104E47001D02A23C45814230650A1D9961B5BDC69218DF8AEEB9A66266EF175C
+[2025-10-29 16:51:58.947][000000004.581] I/user.sm2网站兼容模式 C1C2C3 解密后 32wrniosadnfvnadsio;fasiow
+[2025-10-29 16:51:58.962][000000004.588] I/user.gmssl.sm3 E64FD76F4078E51DCA428323D3FADBD5D52723BBF1379184650DA5CE6002B2BF 64
+[2025-10-29 16:51:58.964][000000004.588] I/user.gmssl.sm3hmac FBB67FC936777011AA70336F0F0B6305D529A97A87D8ECA8880472CD2C30A721 64
+[2025-10-29 16:51:58.966][000000004.595] I/user.=== SM4测试
+[2025-10-29 16:51:58.971][000000004.596] I/user.sm4.ecb.zero 加密后 E8DF19897C0BF1FFA50910C5C548F5A4E9E34BED9F5CEE519CFA24C37A290B25 64
+[2025-10-29 16:51:58.973][000000004.596] I/user.sm4.ecb.zero 解密后 >>SM4 ECB ZeroPadding test<<
+[2025-10-29 16:51:58.975][000000004.597] I/user.sm4.ecb.pks5 加密后 25B3D6AB8C855115C3A8883FE3ADCC6B9004C83B86CE7A45517CA6736DBA4EFE 64
+[2025-10-29 16:51:58.976][000000004.598] I/user.sm4.ecb.pks5 解密后 >>SM4 ECB Pkcs5Padding test<<
+[2025-10-29 16:51:58.978][000000004.598] I/user.sm4.cbc.pks5 加密后 A11C24BB018C8124FADAFC9B6BF7932C05BA2F24E9DFB9D79D982A676F9C010C 64
+[2025-10-29 16:51:58.979][000000004.599] I/user.sm4.cbc.pks5 解密后 >>SM4 CBC Pkcs5Padding test<<
+[2025-10-29 16:51:58.981][000000004.600] I/user.sm4.ecb.pkcs7 B083DCC0A9F64BD9FAE2FA8C936E3D776C88F739AF2A29A735381F5677BADEF7 64
+[2025-10-29 16:51:58.983][000000004.600] I/user.sm4.ecb.pkcs5 B083DCC0A9F64BD9FAE2FA8C936E3D776C88F739AF2A29A735381F5677BADEF7 64
+[2025-10-29 16:51:58.987][000000004.601] I/user.sm4.ecb.zero B083DCC0A9F64BD9FAE2FA8C936E3D77D2D68ED9FE06CB40C9A150AA5917F15F 64
+[2025-10-29 16:51:58.988][000000004.601] I/user.sm4.ecb.none B083DCC0A9F64BD9FAE2FA8C936E3D77 32
+[2025-10-29 16:51:59.450][000000005.084] I/user.sm2sign 9C2303667887E45ABA016BBACFF1AF2F3ED764CE220A0B0D67CF9206BF48F26AA2797E5478919FB0C6140B89D7DDA33055428A7B3D40F49E0BAD410624D83199
+[2025-10-29 16:51:59.864][000000005.496] I/user.sm2verify true
+[2025-10-29 16:52:00.357][000000005.982] I/user.sm2sign 756D9F37525A543A6647370C22DD71ADEEFBF86D83CE87A28889EAC9F63F0C5CFF334A2D99B067EA676437EE1DEC86B8A8F109568A7CF3AFE70A8DD09562F7E2
+[2025-10-29 16:52:00.782][000000006.411] I/user.sm2verify true
+```

+ 24 - 0
module/Air8000/demo/hmeta/hmeta_app.lua

@@ -0,0 +1,24 @@
+--[[
+@module  hmeta_app
+@summary hmeta_app应用功能模块 
+@version 1.0
+@date    2025.10.20
+@author  沈园园
+@usage
+本文件为hmeta应用功能模块,核心业务逻辑为:
+1、获取模块相关信息包括获取模组名称,硬件版本号,原始芯片型号;
+
+本文件没有对外接口,直接在main.lua中require "hmeta_app"就可以加载运行;
+]]
+
+
+local function hmeta_task_func()
+    while true do
+        -- 打印模组名称,硬件版本号,原始芯片型号
+        log.info("hmeta", hmeta.model(), hmeta.hwver(), hmeta.chip())
+        sys.wait(3000)
+    end
+end
+
+--创建一个task,并且运行task的主函数hmeta_task_func
+sys.taskInit(hmeta_task_func)

+ 61 - 16
module/Air8000/demo/hmeta/main.lua

@@ -1,26 +1,71 @@
+--[[
+@module  main
+@summary LuatOS用户应用脚本文件入口,总体调度应用逻辑 
+@version 1.0
+@date    2025.10.20
+@author  沈园园
+@usage
+本demo演示的核心功能为:
+获取模块相关信息包括获取模组名称,硬件版本号,原始芯片型号
+更多说明参考本目录下的readme.md文件
+]]
 
--- LuaTools需要PROJECT和VERSION这两个信息
-PROJECT = "hmetademo"
-VERSION = "1.0.0"
 
--- sys库是标配
-_G.sys = require("sys")
+--[[
+必须定义PROJECT和VERSION变量,Luatools工具会用到这两个变量,远程升级功能也会用到这两个变量
+PROJECT:项目名,ascii string类型
+        可以随便定义,只要不使用,就行
+VERSION:项目版本号,ascii string类型
+        如果使用合宙iot.openluat.com进行远程升级,必须按照"XXX.YYY.ZZZ"三段格式定义:
+            X、Y、Z各表示1位数字,三个X表示的数字可以相同,也可以不同,同理三个Y和三个Z表示的数字也是可以相同,可以不同
+            因为历史原因,YYY这三位数字必须存在,但是没有任何用处,可以一直写为000
+        如果不使用合宙iot.openluat.com进行远程升级,根据自己项目的需求,自定义格式即可
+]]
+PROJECT = "luatos_hmeta_app"
+VERSION = "001.000.000"
 
 
+-- 在日志中打印项目名和项目版本号
+log.info("main", PROJECT, VERSION)
 
 
-sys.taskInit(function()
-    while hmeta do
-        -- hmeta识别底层模组类型的
-        -- 不同的模组可以使用相同的bsp,但根据封装的不同,根据内部数据仍可识别出具体模块
-        log.info("hmeta", hmeta.model(), hmeta.hwver and hmeta.hwver())
-        log.info("bsp",   rtos.bsp())
-        sys.wait(3000)
-    end
-    log.info("这个bsp不支持hmeta库哦")
-end)
+-- 如果内核固件支持wdt看门狗功能,此处对看门狗进行初始化和定时喂狗处理
+-- 如果脚本程序死循环卡死,就会无法及时喂狗,最终会自动重启
+if wdt then
+    --配置喂狗超时时间为9秒钟
+    wdt.init(9000)
+    --启动一个循环定时器,每隔3秒钟喂一次狗
+    sys.timerLoopStart(wdt.feed, 3000)
+end
+
+
+-- 如果内核固件支持errDump功能,此处进行配置,【强烈建议打开此处的注释】
+-- 因为此功能模块可以记录并且上传脚本在运行过程中出现的语法错误或者其他自定义的错误信息,可以初步分析一些设备运行异常的问题
+-- 以下代码是最基本的用法,更复杂的用法可以详细阅读API说明文档
+-- 启动errDump日志存储并且上传功能,600秒上传一次
+-- if errDump then
+--     errDump.config(true, 600)
+-- end
+
+
+-- 使用LuatOS开发的任何一个项目,都强烈建议使用远程升级FOTA功能
+-- 可以使用合宙的iot.openluat.com平台进行远程升级
+-- 也可以使用客户自己搭建的平台进行远程升级
+-- 远程升级的详细用法,可以参考fota的demo进行使用
+
+
+-- 启动一个循环定时器
+-- 每隔3秒钟打印一次总内存,实时的已使用内存,历史最高的已使用内存情况
+-- 方便分析内存使用是否有异常
+-- sys.timerLoopStart(function()
+--     log.info("mem.lua", rtos.meminfo())
+--     log.info("mem.sys", rtos.meminfo("sys"))
+-- end, 3000)
+
+-- 加载hmeta_app应用功能模块
+require "hmeta_app"
 
 -- 用户代码已结束---------------------------------------------
 -- 结尾总是这一句
 sys.run()
--- sys.run()之后后面不要加任何语句!!!!!
+-- sys.run()之后不要加任何语句!!!!!因为添加的任何语句都不会被执行

+ 52 - 0
module/Air8000/demo/hmeta/readme.md

@@ -0,0 +1,52 @@
+## 功能模块介绍
+
+1、main.lua:主程序入口;
+
+2、hmeta_app.lua:获取模块相关信息包括获取模组名称,硬件版本号,原始芯片型号;
+
+## 演示功能概述
+
+1、创建一个task;
+
+2、在task中的任务处理函数中,每隔三秒钟通过日志输出一次模组名称,硬件版本号,原始芯片型号;
+
+
+## 演示硬件环境
+
+![](https://docs.openluat.com/luatos_lesson/image/Evh1bVjatoG1rCxhrdpc9ny7nVf.png)
+
+1、Air8000核心板一块
+
+2、TYPE-C USB数据线一根
+
+4、Air8000核心板和数据线的硬件接线方式为
+
+- Air8000核心板通过TYPE-C USB口连接TYPE-C USB 数据线,数据线的另外一端连接电脑的USB口;
+- 核心板正面的 供电/充电 拨动开关 拨到供电一端;
+- 核心板背面的 USB ON/USB OFF 拨动开关 拨到USB ON一端;
+
+
+## 演示软件环境
+
+1、[Luatools下载调试工具](https://docs.openluat.com/air8000/luatos/common/download/)
+
+2、[Air8000 最新版本的内核固件](https://docs.openluat.com/air8000/luatos/firmware/)
+
+
+## 演示核心步骤
+
+1、搭建好硬件环境
+
+2、Luatools烧录内核固件和demo脚本代码
+
+3、烧录成功后,自动开机运行
+
+4、出现类似于下面的日志,就表示运行成功:
+
+``` lua
+[2025-10-20 17:46:19.050][000000294.365] I/user.hmeta Air8000 A13 EC718HM
+[2025-10-20 17:46:22.052][000000297.365] I/user.hmeta Air8000 A13 EC718HM
+[2025-10-20 17:46:25.043][000000300.365] I/user.hmeta Air8000 A13 EC718HM
+
+
+```

+ 60 - 30
module/Air8000/demo/miniz/main.lua

@@ -1,41 +1,71 @@
+--[[
+@module  main
+@summary LuatOS用户应用脚本文件入口,总体调度应用逻辑 
+@version 1.0
+@date    2025.10.28
+@author  沈园园
+@usage
+本demo演示的核心功能为:
+演示如何对数据压缩解压
+更多说明参考本目录下的readme.md文件
+]]
 
--- LuaTools需要PROJECT和VERSION这两个信息
-PROJECT = "minizdemo"
-VERSION = "1.0.0"
 
-sys = require("sys")
+--[[
+必须定义PROJECT和VERSION变量,Luatools工具会用到这两个变量,远程升级功能也会用到这两个变量
+PROJECT:项目名,ascii string类型
+        可以随便定义,只要不使用,就行
+VERSION:项目版本号,ascii string类型
+        如果使用合宙iot.openluat.com进行远程升级,必须按照"XXX.YYY.ZZZ"三段格式定义:
+            X、Y、Z各表示1位数字,三个X表示的数字可以相同,也可以不同,同理三个Y和三个Z表示的数字也是可以相同,可以不同
+            因为历史原因,YYY这三位数字必须存在,但是没有任何用处,可以一直写为000
+        如果不使用合宙iot.openluat.com进行远程升级,根据自己项目的需求,自定义格式即可
+]]
+PROJECT = "luatos_miniz_app"
+VERSION = "001.000.000"
 
---添加硬狗防止程序卡死
+
+-- 在日志中打印项目名和项目版本号
+log.info("main", PROJECT, VERSION)
+
+
+-- 如果内核固件支持wdt看门狗功能,此处对看门狗进行初始化和定时喂狗处理
+-- 如果脚本程序死循环卡死,就会无法及时喂狗,最终会自动重启
 if wdt then
-    wdt.init(9000)--初始化watchdog设置为9s
-    sys.timerLoopStart(wdt.feed, 3000)--3s喂一次狗
+    --配置喂狗超时时间为9秒钟
+    wdt.init(9000)
+    --启动一个循环定时器,每隔3秒钟喂一次狗
+    sys.timerLoopStart(wdt.feed, 3000)
 end
 
-sys.taskInit(function()
-    sys.wait(1000)
-    -- 压缩过的字符串, 为了方便演示, 这里用了base64编码
-    -- 大部分MCU设备的内存都比较小, miniz.compress 通常在服务器端完成,这里就不演示了
-    -- miniz能解压标准zlib数据流
-    local b64str = "eAEFQIGNwyAMXOUm+E2+OzjhCCiOjYyhyvbVR7K7IR0l+iau8G82eIW5jXVoPzF5pse/B8FaPXLiWTNxEMsKI+WmIR0l+iayEY2i2V4UbqqPh5bwimyEuY11aD8xeaYHxAquvom6VDFUXqQjG1Fek6efCFfCK0b0LUnQMjiCxhUT05GNL75dFUWCSMcjN3EE5c4Wvq42/36R41fa"
-    local str = b64str:fromBase64()
-
-    local dstr = miniz.uncompress(str)
-    -- 压缩过的数据长度 156
-    -- 解压后的数据长度,即原始数据的长度 235
-    log.info("miniz", "compressed", #str, "uncompressed", #dstr)
-
-    -- 演示压缩解压
-    local ostr = "abcd12345"
-    -- 压缩字符串
-    local zstr = miniz.compress(ostr)
-    log.info("压缩后的字符串:",zstr:toHex())
-    -- 解压字符串
-    local lstr = miniz.uncompress(zstr)
-    log.info("miniz","compress zstr",#zstr,"uncompress lstr data",lstr)
-end)
 
+-- 如果内核固件支持errDump功能,此处进行配置,【强烈建议打开此处的注释】
+-- 因为此功能模块可以记录并且上传脚本在运行过程中出现的语法错误或者其他自定义的错误信息,可以初步分析一些设备运行异常的问题
+-- 以下代码是最基本的用法,更复杂的用法可以详细阅读API说明文档
+-- 启动errDump日志存储并且上传功能,600秒上传一次
+-- if errDump then
+--     errDump.config(true, 600)
+-- end
+
+
+-- 使用LuatOS开发的任何一个项目,都强烈建议使用远程升级FOTA功能
+-- 可以使用合宙的iot.openluat.com平台进行远程升级
+-- 也可以使用客户自己搭建的平台进行远程升级
+-- 远程升级的详细用法,可以参考fota的demo进行使用
+
+
+-- 启动一个循环定时器
+-- 每隔3秒钟打印一次总内存,实时的已使用内存,历史最高的已使用内存情况
+-- 方便分析内存使用是否有异常
+-- sys.timerLoopStart(function()
+--     log.info("mem.lua", rtos.meminfo())
+--     log.info("mem.sys", rtos.meminfo("sys"))
+-- end, 3000)
+
+-- 加载miniz_app应用功能模块
+require "miniz_app"
 
 -- 用户代码已结束---------------------------------------------
 -- 结尾总是这一句
 sys.run()
--- sys.run()之后后面不要加任何语句!!!!!
+-- sys.run()之后不要加任何语句!!!!!因为添加的任何语句都不会被执行

+ 47 - 0
module/Air8000/demo/miniz/miniz_app.lua

@@ -0,0 +1,47 @@
+--[[
+@module  miniz_app
+@summary miniz_app应用功能模块 
+@version 1.0
+@date    2025.10.28
+@author  沈园园
+@usage
+本文件为miniz应用功能模块,核心业务逻辑为:
+1、如何对数据压缩解压;
+
+本文件没有对外接口,直接在main.lua中require "miniz_app"就可以加载运行;
+]]
+
+
+local function miniz_task_func()
+    -- 压缩过的字符串, 为了方便演示, 这里用了base64编码
+    -- miniz能解压标准zlib数据流
+    -- 将字符串进行base64解码
+    local b64str = "eAEFQIGNwyAMXOUm+E2+OzjhCCiOjYyhyvbVR7K7IR0l+iau8G82eIW5jXVoPzF5pse/B8FaPXLiWTNxEMsKI+WmIR0l+iayEY2i2V4UbqqPh5bwimyEuY11aD8xeaYHxAquvom6VDFUXqQjG1Fek6efCFfCK0b0LUnQMjiCxhUT05GNL75dFUWCSMcjN3EE5c4Wvq42/36R41fa"
+    local str = b64str:fromBase64()
+    -- 快速解压
+    local dstr = miniz.uncompress(str) 
+    -- 压缩过的数据长度 156
+    -- 解压后的数据长度,即原始数据的长度 235
+    log.info("miniz", "压缩过的数据长度: ", #str, "解压后的数据长度:", #dstr)    
+    
+    -- 演示压缩解压
+    local ostr = "abcd1234567890efghijklmnopqrstuvwxyzabcd1234567890efghijklmnopqrstuvwxyzabcd1234567890efghijklmnopqrstuvwxyz"
+    log.info("压缩前的字符串:", #ostr, ostr)
+    -- 压缩字符串
+    local zstr = miniz.compress(ostr)
+    log.info("压缩后的字符串:",#zstr, zstr:toHex())
+    -- 解压字符串
+    local lstr = miniz.uncompress(zstr)
+    log.info("解压后的字符串:", #lstr, lstr)
+    
+    -- 演示从文件读取2K数据压缩
+    local ostr = io.readFile("/luadb/test.txt")
+    local zstr = miniz.compress(ostr)
+    if zstr then
+        log.info("miniz", "压缩前的数据长度: ", #ostr, "压缩后的数据长度: ", #zstr) 
+    end  
+end
+
+
+--创建一个task,并且运行task的主函数miniz_task_func
+sys.taskInit(miniz_task_func)

+ 52 - 0
module/Air8000/demo/miniz/readme.md

@@ -0,0 +1,52 @@
+## 功能模块介绍
+
+1、main.lua:主程序入口;
+
+2、miniz_app.lua:如何对数据压缩解压;
+
+## 演示功能概述
+
+1、创建一个task;
+
+2、演示如何对数据压缩解压;
+
+
+## 演示硬件环境
+
+![](https://docs.openluat.com/luatos_lesson/image/Evh1bVjatoG1rCxhrdpc9ny7nVf.png)
+
+1、Air8000核心板一块
+
+2、TYPE-C USB数据线一根
+
+3、Air8000核心板和数据线的硬件接线方式为
+
+- Air8000核心板通过TYPE-C USB口连接TYPE-C USB 数据线,数据线的另外一端连接电脑的USB口;
+- 核心板正面的 供电/充电 拨动开关 拨到供电一端;
+- 核心板背面的 USB ON/USB OFF 拨动开关 拨到USB ON一端;
+
+
+## 演示软件环境
+
+1、[Luatools下载调试工具](https://docs.openluat.com/air8000/luatos/common/download/)
+
+2、[Air8000 最新版本的内核固件](https://docs.openluat.com/air8000/luatos/firmware/)
+
+
+## 演示核心步骤
+
+1、搭建好硬件环境
+
+2、Luatools烧录内核固件和demo脚本代码
+
+3、烧录成功后,自动开机运行
+
+4、出现类似于下面的日志,就表示运行成功:
+
+``` lua
+[2025-10-28 11:39:11.816][000000000.379] I/user.miniz 压缩过的数据长度:  156 解压后的数据长度: 235
+[2025-10-28 11:39:11.821][000000000.380] I/user.压缩前的字符串: 108 abcd1234567890efghijklmnopqrstuvwxyzabcd1234567890efghijklmnopqrstuvwxyzabcd1234567890efghijklmnopqrstuvwxyz
+[2025-10-28 11:39:11.826][000000000.383] I/user.压缩后的字符串: 92 780105C0040D80B04A383CCEDDDD9F9E4184C97E9CD7FDBC1FD828E3422A6DACF321A65C6AEB632E8830D98FF3BA9FF7031B655C48A58D753EC4944B6D7DCC051126FB715EF7F37E60A38C0BA9B4B1CE879872A9AD8FB97E17A42785 184
+[2025-10-28 11:39:11.832][000000000.383] I/user.解压后的字符串: 108 abcd1234567890efghijklmnopqrstuvwxyzabcd1234567890efghijklmnopqrstuvwxyzabcd1234567890efghijklmnopqrstuvwxyz
+[2025-10-28 11:39:11.836][000000000.389] I/user.miniz 压缩前的数据长度:  2048 压缩后的数据长度:  1350
+```

A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 0 - 0
module/Air8000/demo/miniz/test.txt


+ 0 - 97
module/Air8101/demo/fastlz/fastlz.h

@@ -1,97 +0,0 @@
-/*
-  FastLZ - Byte-aligned LZ77 compression library
-  Copyright (C) 2005-2020 Ariya Hidayat <ariya.hidayat@gmail.com>
-
-  Permission is hereby granted, free of charge, to any person obtaining a copy
-  of this software and associated documentation files (the "Software"), to deal
-  in the Software without restriction, including without limitation the rights
-  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-  copies of the Software, and to permit persons to whom the Software is
-  furnished to do so, subject to the following conditions:
-
-  The above copyright notice and this permission notice shall be included in
-  all copies or substantial portions of the Software.
-
-  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-  THE SOFTWARE.
-*/
-
-#ifndef FASTLZ_H
-#define FASTLZ_H
-
-#define FASTLZ_VERSION 0x000500
-
-#define FASTLZ_VERSION_MAJOR 0
-#define FASTLZ_VERSION_MINOR 5
-#define FASTLZ_VERSION_REVISION 0
-
-#define FASTLZ_VERSION_STRING "0.5.0"
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-/**
-  Compress a block of data in the input buffer and returns the size of
-  compressed block. The size of input buffer is specified by length. The
-  minimum input buffer size is 16.
-
-  The output buffer must be at least 5% larger than the input buffer
-  and can not be smaller than 66 bytes.
-
-  If the input is not compressible, the return value might be larger than
-  length (input buffer size).
-
-  The input buffer and the output buffer can not overlap.
-
-  Compression level can be specified in parameter level. At the moment,
-  only level 1 and level 2 are supported.
-  Level 1 is the fastest compression and generally useful for short data.
-  Level 2 is slightly slower but it gives better compression ratio.
-
-  Note that the compressed data, regardless of the level, can always be
-  decompressed using the function fastlz_decompress below.
-*/
-
-int fastlz_compress_level(int level, const void* input, int length, void* output);
-
-/**
-  Decompress a block of compressed data and returns the size of the
-  decompressed block. If error occurs, e.g. the compressed data is
-  corrupted or the output buffer is not large enough, then 0 (zero)
-  will be returned instead.
-
-  The input buffer and the output buffer can not overlap.
-
-  Decompression is memory safe and guaranteed not to write the output buffer
-  more than what is specified in maxout.
-
-  Note that the decompression will always work, regardless of the
-  compression level specified in fastlz_compress_level above (when
-  producing the compressed block).
- */
-
-int fastlz_decompress(const void* input, int length, void* output, int maxout);
-
-/**
-  DEPRECATED.
-
-  This is similar to fastlz_compress_level above, but with the level
-  automatically chosen.
-
-  This function is deprecated and it will be completely removed in some future
-  version.
-*/
-
-int fastlz_compress(const void* input, int length, void* output);
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif /* FASTLZ_H */

+ 68 - 0
module/Air8101/demo/fastlz/fastlz_app.lua

@@ -0,0 +1,68 @@
+--[[
+@module  fastlz_app
+@summary fastlz_app 
+@version 1.0
+@date    2025.10.28
+@author  沈园园
+@usage
+本文件为fastlz应用功能模块,核心业务逻辑为:
+1、演示压缩与解压缩的流程;
+
+本文件没有对外接口,直接在main.lua中require "fastlz_app"就可以加载运行;
+]]
+
+
+function fastlz_compress_uncompress_func(mode)
+    -- 原始数据
+    local originStr
+    if mode == 1 then
+        log.info("原始数据文件读取2K数据")
+        originStr = io.readFile("/luadb/test.txt")          
+    else
+        log.info("原始数据108长度字符串")
+        originStr = "abcd1234567890efghijklmnopqrstuvwxyzabcd1234567890efghijklmnopqrstuvwxyzabcd1234567890efghijklmnopqrstuvwxyz"            
+    end
+    
+    local maxOut = #originStr
+    log.info("原始数据长度", #originStr)
+
+    -- 以压缩等级1 进行压缩
+    local L1 = fastlz.compress(originStr,1)
+    log.info("压缩等级1:压缩后的数据长度", #L1)
+
+    -- 解压
+    local dstr1 = fastlz.uncompress(L1,maxOut)
+    log.info("压缩等级1:解压后的的数据长度", #dstr1)
+    -- 判断解压后的数据是否与原始数据相同
+    if originStr == dstr1 then
+        log.info("压缩等级1:解压后的数据与原始数据相同")
+    else
+        log.info("压缩等级1:解压后的数据与原始数据不同")
+    end
+
+    -- 以压缩等级2 进行压缩
+    local L2 = fastlz.compress(originStr, 2)
+    log.info("压缩等级2:压缩后的数据长度", #L2)
+
+    -- 解压
+    local dstr2 = fastlz.uncompress(L2,maxOut)
+    log.info("压缩等级2:解压后的数据长度", #dstr2)
+
+    -- 判断解压后的数据是否与原始数据相同
+    if originStr == dstr2 then
+        log.info("压缩等级2:解压后的数据与原始数据相同")
+    else
+        log.info("压缩等级2:解压后的数据与原始数据不同")
+    end     
+end
+
+function fastlz_task_func()
+    -- 原始数据108长度字符串
+    fastlz_compress_uncompress_func()
+    -- 原始数据文件读取2K数据
+    fastlz_compress_uncompress_func(1)   
+end
+
+
+--创建一个task,并且运行task的主函数fastlz_task_func
+sys.taskInit(fastlz_task_func)

+ 55 - 40
module/Air8101/demo/fastlz/main.lua

@@ -1,56 +1,71 @@
+--[[
+@module  main
+@summary LuatOS用户应用脚本文件入口,总体调度应用逻辑 
+@version 1.0
+@date    2025.10.28
+@author  沈园园
+@usage
+本demo演示的核心功能为:
+演示如何对数据压缩解压
+更多说明参考本目录下的readme.md文件
+]]
 
--- LuaTools需要PROJECT和VERSION这两个信息
-PROJECT = "FastLZ"
-VERSION = "1.0.0"
 
---添加硬狗防止程序卡死
-if wdt then
-    wdt.init(9000)--初始化watchdog设置为9s
-    sys.timerLoopStart(wdt.feed, 3000)--3s喂一次狗
-end
+--[[
+必须定义PROJECT和VERSION变量,Luatools工具会用到这两个变量,远程升级功能也会用到这两个变量
+PROJECT:项目名,ascii string类型
+        可以随便定义,只要不使用,就行
+VERSION:项目版本号,ascii string类型
+        如果使用合宙iot.openluat.com进行远程升级,必须按照"XXX.YYY.ZZZ"三段格式定义:
+            X、Y、Z各表示1位数字,三个X表示的数字可以相同,也可以不同,同理三个Y和三个Z表示的数字也是可以相同,可以不同
+            因为历史原因,YYY这三位数字必须存在,但是没有任何用处,可以一直写为000
+        如果不使用合宙iot.openluat.com进行远程升级,根据自己项目的需求,自定义格式即可
+]]
+PROJECT = "luatos_fastlz_app"
+VERSION = "001.000.000"
+
 
-sys.taskInit(function()
-    sys.wait(1000)
+-- 在日志中打印项目名和项目版本号
+log.info("main", PROJECT, VERSION)
 
-    -- 原始数据
-    local originStr = io.readFile("/luadb/fastlz.h") or "q309pura;dsnf;asdouyf89q03fonaewofhaeop;fhiqp02398ryhai;ofinap983fyua0weo;ifhj3p908fhaes;iofaw789prhfaeiwop;fhaesp98fadsjklfhasklfsjask;flhadsfk"
-    log.info("原始数据长度", #originStr)
 
-    -- 以压缩等级1 进行压缩
-    local L1 = fastlz.compress(originStr)
-    log.info("压缩等级1:压缩后的数据长度", #L1)
+-- 如果内核固件支持wdt看门狗功能,此处对看门狗进行初始化和定时喂狗处理
+-- 如果脚本程序死循环卡死,就会无法及时喂狗,最终会自动重启
+if wdt then
+    --配置喂狗超时时间为9秒钟
+    wdt.init(9000)
+    --启动一个循环定时器,每隔3秒钟喂一次狗
+    sys.timerLoopStart(wdt.feed, 3000)
+end
 
-    -- 解压
-    local dstr1 = fastlz.uncompress(L1)
-    log.info("压缩等级1:解压后的的数据长度", #dstr1)
 
-    -- 判断解压后的数据是否与原始数据相同
-    if originStr == dstr1 then
-        log.info("压缩等级1:解压后的数据与原始数据相同")
-    else
-        log.info("压缩等级1:解压后的数据与原始数据不同")
-    end
+-- 如果内核固件支持errDump功能,此处进行配置,【强烈建议打开此处的注释】
+-- 因为此功能模块可以记录并且上传脚本在运行过程中出现的语法错误或者其他自定义的错误信息,可以初步分析一些设备运行异常的问题
+-- 以下代码是最基本的用法,更复杂的用法可以详细阅读API说明文档
+-- 启动errDump日志存储并且上传功能,600秒上传一次
+-- if errDump then
+--     errDump.config(true, 600)
+-- end
 
-    sys.wait(1000)
 
-    -- 以压缩等级2 进行压缩
-    local L2 = fastlz.compress(originStr, 2)
-    log.info("压缩等级2:压缩后的数据长度", #L2)
+-- 使用LuatOS开发的任何一个项目,都强烈建议使用远程升级FOTA功能
+-- 可以使用合宙的iot.openluat.com平台进行远程升级
+-- 也可以使用客户自己搭建的平台进行远程升级
+-- 远程升级的详细用法,可以参考fota的demo进行使用
 
-    -- 解压
-    local dstr2 = fastlz.uncompress(L2)
-    log.info("压缩等级2:解压后的数据长度", #dstr2)
 
-    -- 判断解压后的数据是否与原始数据相同
-    if originStr == dstr2 then
-        log.info("压缩等级2:解压后的数据与原始数据相同")
-    else
-        log.info("压缩等级2:解压后的数据与原始数据不同")
-    end
-end)
+-- 启动一个循环定时器
+-- 每隔3秒钟打印一次总内存,实时的已使用内存,历史最高的已使用内存情况
+-- 方便分析内存使用是否有异常
+-- sys.timerLoopStart(function()
+--     log.info("mem.lua", rtos.meminfo())
+--     log.info("mem.sys", rtos.meminfo("sys"))
+-- end, 3000)
 
+-- 加载fastlz_app应用功能模块
+require "fastlz_app"
 
 -- 用户代码已结束---------------------------------------------
 -- 结尾总是这一句
 sys.run()
--- sys.run()之后后面不要加任何语句!!!!!
+-- sys.run()之后不要加任何语句!!!!!因为添加的任何语句都不会被执行

+ 62 - 0
module/Air8101/demo/fastlz/readme.md

@@ -0,0 +1,62 @@
+## 功能模块介绍
+
+1、main.lua:主程序入口;
+
+2、fastlz_app.lua:如何对数据压缩解压;
+
+## 演示功能概述
+
+1、创建一个task;
+
+2、演示如何对数据压缩解压;
+
+
+## 演示硬件环境
+
+![](https://docs.openluat.com/air8101/luatos/common/hwenv/image/Air8101.png)
+
+1、Air8101核心板一块
+
+2、TYPE-C USB数据线一根
+
+3、Air8101核心板和数据线的硬件接线方式为
+
+- Air8101核心板通过TYPE-C USB口连接TYPE-C USB 数据线,数据线的另外一端连接电脑的USB口;
+- Air8101核心板通过TYPE-C USB口供电(核心板背面的功耗测试开关拨到OFF一端);
+
+
+## 演示软件环境
+
+1、[Luatools下载调试工具](https://docs.openluat.com/air8101/luatos/common/download/)
+
+2、[Air8101 最新版本的内核固件](https://docs.openluat.com/air8101/luatos/firmware/)
+
+
+## 演示核心步骤
+
+1、搭建好硬件环境
+
+2、Luatools烧录内核固件和demo脚本代码
+
+3、烧录成功后,自动开机运行
+
+4、出现类似于下面的日志,就表示运行成功:
+
+``` lua
+[2025-10-28 17:11:11.613][000000000.368] I/user.原始数据108长度字符串
+[2025-10-28 17:11:11.613][000000000.369] I/user.原始数据长度 108
+[2025-10-28 17:11:11.623][000000000.370] I/user.压缩等级1:压缩后的数据长度 47
+[2025-10-28 17:11:11.623][000000000.371] I/user.压缩等级1:解压后的的数据长度 108
+[2025-10-28 17:11:11.623][000000000.371] I/user.压缩等级1:解压后的数据与原始数据相同
+[2025-10-28 17:11:11.623][000000000.373] I/user.压缩等级2:压缩后的数据长度 47
+[2025-10-28 17:11:11.633][000000000.374] I/user.压缩等级2:解压后的数据长度 108
+[2025-10-28 17:11:11.637][000000000.374] I/user.压缩等级2:解压后的数据与原始数据相同
+[2025-10-28 17:11:11.637][000000000.374] I/user.原始数据文件读取2K数据
+[2025-10-28 17:11:11.643][000000000.375] I/user.原始数据长度 2048
+[2025-10-28 17:11:11.643][000000000.377] I/user.压缩等级1:压缩后的数据长度 128
+[2025-10-28 17:11:11.643][000000000.378] I/user.压缩等级1:解压后的的数据长度 2048
+[2025-10-28 17:11:11.653][000000000.378] I/user.压缩等级1:解压后的数据与原始数据相同
+[2025-10-28 17:11:11.653][000000000.379] I/user.压缩等级2:压缩后的数据长度 116
+[2025-10-28 17:11:11.693][000000000.380] I/user.压缩等级2:解压后的数据长度 2048
+[2025-10-28 17:11:11.713][000000000.380] I/user.压缩等级2:解压后的数据与原始数据相同
+```

A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 0 - 0
module/Air8101/demo/fastlz/test.txt


+ 71 - 0
module/Air8101/demo/gmssl/gmssl_sm2.lua

@@ -0,0 +1,71 @@
+--[[
+@module  gmssl_sm2
+@summary gmssl_sm2 
+@version 1.0
+@date    2025.10.29
+@author  沈园园
+@usage
+本文件为gmssl sm2应用功能模块,核心业务逻辑为:
+1、演示国密sm2加密和解码的应用;
+
+本文件没有对外接口,直接在main.lua中require "gmssl_sm2"就可以加载运行;
+]]
+
+
+function gmssl_sm2_encrypt_decrypt(originStr, pkx, pky, private)
+    -- GMSSL默认格式
+    log.info("==== SM2 默认GMSSL模式")
+    local encodeStr = gmssl.sm2encrypt(pkx,pky,originStr)
+    log.info("sm2默认模式", "加密后", encodeStr and  string.toHex(encodeStr))
+    if encodeStr then
+        log.info("sm2默认模式", "解密后", gmssl.sm2decrypt(private,encodeStr))
+    end
+    
+
+    -- 网站兼容模式 https://i.goto327.top/CryptTools/SM2.aspx
+    -- 密文格式 C1C3C2, 新国标, 一般是这种
+    log.info("==== SM2 网站兼容模式")
+    local encodeStr = gmssl.sm2encrypt(pkx,pky,originStr, true)
+    log.info("sm2网站兼容模式 C1C3C2", "加密后", encodeStr and  string.toHex(encodeStr))
+    if encodeStr then
+        log.info("sm2网站兼容模式 C1C3C2", "解密后", gmssl.sm2decrypt(private,encodeStr, true))
+    else
+        log.info("解密失败")
+    end
+    -- 密文格式 C1C2C3, 老国标, 老的Java库通常支持这种
+    log.info("==== SM2 网站兼容模式, 但C1C2C3")
+    local encodeStr = gmssl.sm2encrypt(pkx,pky,originStr, true, true)
+    log.info("sm2网站兼容模式 C1C2C3", "加密后", encodeStr and  string.toHex(encodeStr))
+    if encodeStr then
+        log.info("sm2网站兼容模式 C1C2C3", "解密后", gmssl.sm2decrypt(private,encodeStr, true, true))
+    else
+        log.info("解密失败")
+    end
+end
+
+
+local function gmssl_sm2_task_func()
+    -- 未加密字符串
+    local originStr = "!!from LuatOS!!"
+
+    -- SM2 , 非对称加密, 类似于RSA,但属于椭圆算法
+    -- 就当前实现还是比较慢的
+    if gmssl.sm2encrypt then -- 部分BSP不支持
+        local pkx = "ABE87C924B7ECFDEA1748A06E89003C9F7F4DC5C3563873CE2CAE46F66DE8141"
+        local pky = "9514733D38CC026F2452A6A3A3A4DA0C28F864AFA5FE2C45E0EB6B761FBB5286"
+        local private = "129EDC282CD2E9C1144C2E7315F926D772BC96600D2771E8BE02060313FE00D5"
+        gmssl_sm2_encrypt_decrypt(originStr, pkx, pky, private)
+    end
+
+    -- SM密钥生成
+    if gmssl.sm2keygen then
+        log.info("SM2密钥生成测试")
+        originStr = "32wrniosadnfvnadsio;fasiow"
+        local pkx, pky, private = gmssl.sm2keygen()
+        gmssl_sm2_encrypt_decrypt(originStr, pkx, pky, private)
+    end
+
+end
+
+sys.taskInit(gmssl_sm2_task_func)
+

+ 43 - 0
module/Air8101/demo/gmssl/gmssl_sm2sign.lua

@@ -0,0 +1,43 @@
+--[[
+@module  gmssl_sm2sign
+@summary gmssl_sm2sign 
+@version 1.0
+@date    2025.10.29
+@author  沈园园
+@usage
+本文件为gmssl sm2sign应用功能模块,核心业务逻辑为:
+1、演示国密SM2签名和验签的应用;
+
+本文件没有对外接口,直接在main.lua中require "gmssl_sm2sign"就可以加载运行;
+]]
+
+
+local function gmssl_sm2sign_task_func()
+
+    -- SM2签名和验签
+    if gmssl.sm2sign then
+        local originStr = string.fromHex("434477813974bf58f94bcf760833c2b40f77a5fc360485b0b9ed1bd9682edb45")
+        local pkx = "ABE87C924B7ECFDEA1748A06E89003C9F7F4DC5C3563873CE2CAE46F66DE8141"
+        local pky = "9514733D38CC026F2452A6A3A3A4DA0C28F864AFA5FE2C45E0EB6B761FBB5286"
+        local private = "129EDC282CD2E9C1144C2E7315F926D772BC96600D2771E8BE02060313FE00D5"
+
+        -- 不带id的情况,即默认id="1234567812345678"
+        local sig = gmssl.sm2sign(private, originStr, nil)
+        log.info("sm2sign", sig and sig:toHex())
+        if sig then
+            local ret = gmssl.sm2verify(pkx, pky, originStr, nil, sig)
+            log.info("sm2verify", ret or "false")
+        end
+
+        -- 带id的情况
+        local id = "1234"
+        local sig = gmssl.sm2sign(private, originStr, id)
+        log.info("sm2sign", sig and sig:toHex())
+        if sig then
+            local ret = gmssl.sm2verify(pkx, pky, originStr, id, sig)
+            log.info("sm2verify", ret or "false")
+        end
+    end
+end
+
+sys.taskInit(gmssl_sm2sign_task_func)

+ 26 - 0
module/Air8101/demo/gmssl/gmssl_sm3.lua

@@ -0,0 +1,26 @@
+--[[
+@module  gmssl_sm3
+@summary gmssl_sm3
+@version 1.0
+@date    2025.10.29
+@author  沈园园
+@usage
+本文件为gmssl sm3应用功能模块,核心业务逻辑为:
+1、演示国密sm3算法;
+
+本文件没有对外接口,直接在main.lua中require "gmssl_sm3"就可以加载运行;
+]]
+
+
+local function gmssl_sm3_task_func()
+    -- sm3算法,算HASH值
+    local encodeStr = gmssl.sm3("lqlq666lqlq946")
+    log.info("gmssl.sm3",string.toHex(encodeStr))
+    
+    -- sm3算法,算HASH值,但带HMAC
+    local encodeStr = gmssl.sm3hmac("lqlq666lqlq946", "123")
+    log.info("gmssl.sm3hmac",string.toHex(encodeStr))    
+
+end
+
+sys.taskInit(gmssl_sm3_task_func)

+ 53 - 0
module/Air8101/demo/gmssl/gmssl_sm4.lua

@@ -0,0 +1,53 @@
+--[[
+@module  gmssl_sm4
+@summary gmssl_sm4 
+@version 1.0
+@date    2025.10.29
+@author  沈园园
+@usage
+本文件为gmssl sm4应用功能模块,核心业务逻辑为:
+1、演示国密sm4加密和解码的应用;
+
+本文件没有对外接口,直接在main.lua中require "gmssl_sm4"就可以加载运行;
+]]
+
+
+local function gmssl_sm4_task_func()
+
+    if gmssl.sm4encrypt then
+        log.info("=== SM4测试")
+        local passwd = "1234567890123456"
+        local iv = "1234567890666666"
+        -- SM4 算法, 对称加密
+        originStr = ">>SM4 ECB ZeroPadding test<<"
+        --加密模式:ECB;填充方式:ZeroPadding;密钥:1234567890123456;
+        encodeStr = gmssl.sm4encrypt("ECB", "ZERO", originStr, passwd)
+        log.info("sm4.ecb.zero", "加密后", string.toHex(encodeStr))
+        log.info("sm4.ecb.zero", "解密后", gmssl.sm4decrypt("ECB","ZERO",encodeStr,passwd))
+
+        originStr = ">>SM4 ECB Pkcs5Padding test<<"
+        --加密模式:ECB;填充方式:Pkcs5Padding;密钥:1234567890123456;
+        encodeStr = gmssl.sm4encrypt("ECB", "PKCS5", originStr, passwd)
+        log.info("sm4.ecb.pks5", "加密后", string.toHex(encodeStr))
+        log.info("sm4.ecb.pks5", "解密后", gmssl.sm4decrypt("ECB","PKCS5",encodeStr,passwd))
+
+        originStr = ">>SM4 CBC Pkcs5Padding test<<"
+        --加密模式:CBC;填充方式:Pkcs5Padding;密钥:1234567890123456;偏移量:1234567890666666
+        encodeStr = gmssl.sm4encrypt("CBC","PKCS5", originStr, passwd, iv)
+        log.info("sm4.cbc.pks5", "加密后", string.toHex(encodeStr))
+        log.info("sm4.cbc.pks5", "解密后", gmssl.sm4decrypt("CBC","PKCS5",encodeStr,passwd, iv))
+
+        -- 完全对齐16字节的对比测试
+        originStr = "1234567890123456"
+        encodeStr = gmssl.sm4encrypt("ECB","PKCS7",originStr,passwd)
+        log.info("sm4.ecb.pkcs7", encodeStr:toHex())
+        encodeStr = gmssl.sm4encrypt("ECB","PKCS5",originStr,passwd)
+        log.info("sm4.ecb.pkcs5", encodeStr:toHex())
+        encodeStr = gmssl.sm4encrypt("ECB","ZERO",originStr,passwd)
+        log.info("sm4.ecb.zero", encodeStr:toHex())
+        encodeStr = gmssl.sm4encrypt("ECB","NONE",originStr,passwd)
+        log.info("sm4.ecb.none", encodeStr:toHex())
+    end
+end
+
+sys.taskInit(gmssl_sm4_task_func)

+ 78 - 0
module/Air8101/demo/gmssl/main.lua

@@ -0,0 +1,78 @@
+--[[
+@module  main
+@summary LuatOS用户应用脚本文件入口,总体调度应用逻辑 
+@version 1.0
+@date    2025.10.29
+@author  沈园园
+@usage
+本demo演示的核心功能为:
+演示有关gmssl国密算法的功能包含SM2,SM3,SM4
+更多说明参考本目录下的readme.md文件
+]]
+
+
+--[[
+必须定义PROJECT和VERSION变量,Luatools工具会用到这两个变量,远程升级功能也会用到这两个变量
+PROJECT:项目名,ascii string类型
+        可以随便定义,只要不使用,就行
+VERSION:项目版本号,ascii string类型
+        如果使用合宙iot.openluat.com进行远程升级,必须按照"XXX.YYY.ZZZ"三段格式定义:
+            X、Y、Z各表示1位数字,三个X表示的数字可以相同,也可以不同,同理三个Y和三个Z表示的数字也是可以相同,可以不同
+            因为历史原因,YYY这三位数字必须存在,但是没有任何用处,可以一直写为000
+        如果不使用合宙iot.openluat.com进行远程升级,根据自己项目的需求,自定义格式即可
+]]
+PROJECT = "luatos_gmssl_app"
+VERSION = "001.000.000"
+
+
+-- 在日志中打印项目名和项目版本号
+log.info("main", PROJECT, VERSION)
+
+
+-- 如果内核固件支持wdt看门狗功能,此处对看门狗进行初始化和定时喂狗处理
+-- 如果脚本程序死循环卡死,就会无法及时喂狗,最终会自动重启
+if wdt then
+    --配置喂狗超时时间为9秒钟
+    wdt.init(9000)
+    --启动一个循环定时器,每隔3秒钟喂一次狗
+    sys.timerLoopStart(wdt.feed, 3000)
+end
+
+
+-- 如果内核固件支持errDump功能,此处进行配置,【强烈建议打开此处的注释】
+-- 因为此功能模块可以记录并且上传脚本在运行过程中出现的语法错误或者其他自定义的错误信息,可以初步分析一些设备运行异常的问题
+-- 以下代码是最基本的用法,更复杂的用法可以详细阅读API说明文档
+-- 启动errDump日志存储并且上传功能,600秒上传一次
+-- if errDump then
+--     errDump.config(true, 600)
+-- end
+
+
+-- 使用LuatOS开发的任何一个项目,都强烈建议使用远程升级FOTA功能
+-- 可以使用合宙的iot.openluat.com平台进行远程升级
+-- 也可以使用客户自己搭建的平台进行远程升级
+-- 远程升级的详细用法,可以参考fota的demo进行使用
+
+
+-- 启动一个循环定时器
+-- 每隔3秒钟打印一次总内存,实时的已使用内存,历史最高的已使用内存情况
+-- 方便分析内存使用是否有异常
+-- sys.timerLoopStart(function()
+--     log.info("mem.lua", rtos.meminfo())
+--     log.info("mem.sys", rtos.meminfo("sys"))
+-- end, 3000)
+
+
+-- 加载sm2算法, 含密钥生成应用功能模块
+require "gmssl_sm2"
+-- 加载sm3算法应用功能模块
+require "gmssl_sm3"
+-- 加载sm4算法应用功能模块
+require "gmssl_sm4"
+-- 加载sm2签名和验签应用功能模块
+require "gmssl_sm2sign"
+
+-- 用户代码已结束---------------------------------------------
+-- 结尾总是这一句
+sys.run()
+-- sys.run()之后不要加任何语句!!!!!因为添加的任何语句都不会被执行

+ 88 - 0
module/Air8101/demo/gmssl/readme.md

@@ -0,0 +1,88 @@
+## 功能模块介绍
+
+1、main.lua:主程序入口;
+
+2、gmssl_sm2.lua:sm2算法, 含密钥生成;
+
+3、gmssl_sm3:sm3算法;
+
+5、gmssl_sm4:sm4算法;
+
+6、gmssl_sm2sign:sm2签名和验签;
+
+## 演示功能概述
+
+1、创建一个task;
+
+2、演示gmssl国密算法包含SM2算法, 含密钥生成,SM3算法,SM4算法以及sm2签名和验签;
+
+
+## 演示硬件环境
+
+![](https://docs.openluat.com/air8101/luatos/common/hwenv/image/Air8101.png)
+
+1、Air8101核心板一块
+
+2、TYPE-C USB数据线一根
+
+3、Air8101核心板和数据线的硬件接线方式为
+
+- Air8000核心板通过TYPE-C USB口连接TYPE-C USB 数据线,数据线的另外一端连接电脑的USB口;
+- Air8101核心板通过TYPE-C USB口供电(核心板背面的功耗测试开关拨到OFF一端);
+
+
+## 演示软件环境
+
+1、[Luatools下载调试工具](https://docs.openluat.com/air8101/luatos/common/download/)
+
+2、[Air8101 最新版本的内核固件](https://docs.openluat.com/air8101/luatos/firmware/)
+
+
+## 演示核心步骤
+
+1、搭建好硬件环境
+
+2、Luatools烧录内核固件和demo脚本代码
+
+3、烧录成功后,自动开机运行
+
+4、出现类似于下面的日志,就表示运行成功:
+
+``` lua
+[2025-10-29 16:51:55.069][000000000.365] I/user.==== SM2 默认GMSSL模式
+[2025-10-29 16:51:55.296][000000000.912] I/user.sm2默认模式 加密后 3078022022F0E9C08C45EC2D456C184541900B2D069790DF554BD37183453306E49A474E022100A7220907D53AF4A580B6AEC7B8EA53FF5E51F5E56A8ACC440C86F58C4E3EB9110420A4FCAE7ECF86059FB63B0F82A502223E8B4C7CAECBE29E72C05A87DF8BA3C08F040F63EE6697093A495733939D4D68070F
+[2025-10-29 16:51:55.526][000000001.150] I/user.sm2默认模式 解密后 !!from LuatOS!!
+[2025-10-29 16:51:55.530][000000001.151] I/user.==== SM2 网站兼容模式
+[2025-10-29 16:51:55.977][000000001.601] I/user.sm2网站兼容模式 C1C3C2 加密后 7CD71EFCD699E81C5A320DD78357788BA4A4E87C02691EB73225B6E8CC3F1A95730359208D2E6A375E49D84321C9BB28F0D7B65BC348DD07A9ADE9C1F38D053CA5B4128EE908F4494DB1867F0C48D00FCFE3F6A9C38CDA696CABAF36E9D120244AAEC7B42200A0A9C8321EDEDC9010
+[2025-10-29 16:51:56.177][000000001.800] I/user.sm2网站兼容模式 C1C3C2 解密后 !!from LuatOS!!
+[2025-10-29 16:51:56.182][000000001.800] I/user.==== SM2 网站兼容模式, 但C1C2C3
+[2025-10-29 16:51:56.589][000000002.228] I/user.sm2网站兼容模式 C1C2C3 加密后 0429D777A89C474D468CBB4BDE604C5D0111EF6FEB9AD180A9A5167657C4CFD09A0CAAF6D3467CE2564C73A666EC4DE2CA2E28F5B2BBFA9FE5B30CCA39D0B453DB60AF6B2B6DC1E7D76F3E9FF048FEACC850B37144EC64840A84A1A81B4ACF4BDB851391ECC9F13974A76464C9F9624C
+[2025-10-29 16:51:56.788][000000002.425] I/user.sm2网站兼容模式 C1C2C3 解密后 !!from LuatOS!!
+[2025-10-29 16:51:56.794][000000002.425] I/user.SM2密钥生成测试
+[2025-10-29 16:51:57.048][000000002.660] I/user.==== SM2 默认GMSSL模式
+[2025-10-29 16:51:57.462][000000003.092] I/user.sm2默认模式 加密后 3081820220227403C3A196042379534047850F01BA8EC3603226AF18E0CE65729EBBBDC68C02201D1FBBD3998FDB2757AE55262F1CDD288C6C403766F77F6D7CB9017457E7EE660420B742677896DEDBBEAF55857603EB4C39FA9DFFDAD6E17AFA27FA0D7C7D2F7EF5041A79A2DF1D84C0B449459A4FE6BCC3A494F9F4CC2D00F9A4A7C4FE
+[2025-10-29 16:51:57.674][000000003.301] I/user.sm2默认模式 解密后 32wrniosadnfvnadsio;fasiow
+[2025-10-29 16:51:57.681][000000003.301] I/user.==== SM2 网站兼容模式
+[2025-10-29 16:51:58.092][000000003.717] I/user.sm2网站兼容模式 C1C3C2 加密后 A615127F2C18731AB83CA50CDC386C0F70506EA3BE6B1B1E74E1F417BCFB992AC9B4F91A4233181CD5C419CA21B5AD46BBA7F2E635D4AC317842E8762A19260218921AB2D4C02C8211E2AC28976B61D33E0AB826B2DE223E6E51729B31B02E02E0C73D5822F12FC4618E6E1F7110278CBD273C152B650C75A423
+[2025-10-29 16:51:58.306][000000003.927] I/user.sm2网站兼容模式 C1C3C2 解密后 32wrniosadnfvnadsio;fasiow
+[2025-10-29 16:51:58.313][000000003.927] I/user.==== SM2 网站兼容模式, 但C1C2C3
+[2025-10-29 16:51:58.748][000000004.372] I/user.sm2网站兼容模式 C1C2C3 加密后 045807522541AF430F7D0F3EE27D0718AA33D17E98F04121CC3039A6C7EA5B219751DA6CDC64B805C5BA08E97CFC7546D72BCBF1CD2329F26190A6CF33D76E37B1BFFEDBA05C31D8673F33CFA5925A5EC0DB37A58F74B30020DE25104E47001D02A23C45814230650A1D9961B5BDC69218DF8AEEB9A66266EF175C
+[2025-10-29 16:51:58.947][000000004.581] I/user.sm2网站兼容模式 C1C2C3 解密后 32wrniosadnfvnadsio;fasiow
+[2025-10-29 16:51:58.962][000000004.588] I/user.gmssl.sm3 E64FD76F4078E51DCA428323D3FADBD5D52723BBF1379184650DA5CE6002B2BF 64
+[2025-10-29 16:51:58.964][000000004.588] I/user.gmssl.sm3hmac FBB67FC936777011AA70336F0F0B6305D529A97A87D8ECA8880472CD2C30A721 64
+[2025-10-29 16:51:58.966][000000004.595] I/user.=== SM4测试
+[2025-10-29 16:51:58.971][000000004.596] I/user.sm4.ecb.zero 加密后 E8DF19897C0BF1FFA50910C5C548F5A4E9E34BED9F5CEE519CFA24C37A290B25 64
+[2025-10-29 16:51:58.973][000000004.596] I/user.sm4.ecb.zero 解密后 >>SM4 ECB ZeroPadding test<<
+[2025-10-29 16:51:58.975][000000004.597] I/user.sm4.ecb.pks5 加密后 25B3D6AB8C855115C3A8883FE3ADCC6B9004C83B86CE7A45517CA6736DBA4EFE 64
+[2025-10-29 16:51:58.976][000000004.598] I/user.sm4.ecb.pks5 解密后 >>SM4 ECB Pkcs5Padding test<<
+[2025-10-29 16:51:58.978][000000004.598] I/user.sm4.cbc.pks5 加密后 A11C24BB018C8124FADAFC9B6BF7932C05BA2F24E9DFB9D79D982A676F9C010C 64
+[2025-10-29 16:51:58.979][000000004.599] I/user.sm4.cbc.pks5 解密后 >>SM4 CBC Pkcs5Padding test<<
+[2025-10-29 16:51:58.981][000000004.600] I/user.sm4.ecb.pkcs7 B083DCC0A9F64BD9FAE2FA8C936E3D776C88F739AF2A29A735381F5677BADEF7 64
+[2025-10-29 16:51:58.983][000000004.600] I/user.sm4.ecb.pkcs5 B083DCC0A9F64BD9FAE2FA8C936E3D776C88F739AF2A29A735381F5677BADEF7 64
+[2025-10-29 16:51:58.987][000000004.601] I/user.sm4.ecb.zero B083DCC0A9F64BD9FAE2FA8C936E3D77D2D68ED9FE06CB40C9A150AA5917F15F 64
+[2025-10-29 16:51:58.988][000000004.601] I/user.sm4.ecb.none B083DCC0A9F64BD9FAE2FA8C936E3D77 32
+[2025-10-29 16:51:59.450][000000005.084] I/user.sm2sign 9C2303667887E45ABA016BBACFF1AF2F3ED764CE220A0B0D67CF9206BF48F26AA2797E5478919FB0C6140B89D7DDA33055428A7B3D40F49E0BAD410624D83199
+[2025-10-29 16:51:59.864][000000005.496] I/user.sm2verify true
+[2025-10-29 16:52:00.357][000000005.982] I/user.sm2sign 756D9F37525A543A6647370C22DD71ADEEFBF86D83CE87A28889EAC9F63F0C5CFF334A2D99B067EA676437EE1DEC86B8A8F109568A7CF3AFE70A8DD09562F7E2
+[2025-10-29 16:52:00.782][000000006.411] I/user.sm2verify true
+```

+ 24 - 0
module/Air8101/demo/hmeta/hmeta_app.lua

@@ -0,0 +1,24 @@
+--[[
+@module  hmeta_app
+@summary hmeta_app应用功能模块 
+@version 1.0
+@date    2025.10.20
+@author  沈园园
+@usage
+本文件为hmeta应用功能模块,核心业务逻辑为:
+1、获取模块相关信息包括获取模组名称,硬件版本号,原始芯片型号;
+
+本文件没有对外接口,直接在main.lua中require "hmeta_app"就可以加载运行;
+]]
+
+
+local function hmeta_task_func()
+    while true do
+        -- 打印模组名称,硬件版本号,原始芯片型号
+        log.info("hmeta", hmeta.model(), hmeta.hwver(), hmeta.chip())
+        sys.wait(3000)
+    end
+end
+
+--创建一个task,并且运行task的主函数hmeta_task_func
+sys.taskInit(hmeta_task_func)

+ 67 - 18
module/Air8101/demo/hmeta/main.lua

@@ -1,22 +1,71 @@
--- LuaTools需要PROJECT和VERSION这两个信息
-PROJECT = "hmetademo"
-VERSION = "1.0.0"
-
-sys.taskInit(function()
-    while hmeta do
-        -- hmeta识别底层模组类型的
-        -- 不同的模组可以使用相同的bsp,但根据封装的不同,根据内部数据仍可识别出具体模块
-        log.info("hmeta", hmeta.model(), hmeta.hwver and hmeta.hwver())
-        log.info("bsp",   rtos.bsp())
-        local unique_id = mcu.unique_id()
-        log.info("unique_id", unique_id:toHex())
-        log.info("luatos_version ", rtos.version())
-        sys.wait(3000)
-    end
-    log.info("这个bsp不支持hmeta库哦")
-end)
+--[[
+@module  main
+@summary LuatOS用户应用脚本文件入口,总体调度应用逻辑 
+@version 1.0
+@date    2025.10.20
+@author  沈园园
+@usage
+本demo演示的核心功能为:
+获取模块相关信息包括获取模组名称,硬件版本号,原始芯片型号
+更多说明参考本目录下的readme.md文件
+]]
+
+
+--[[
+必须定义PROJECT和VERSION变量,Luatools工具会用到这两个变量,远程升级功能也会用到这两个变量
+PROJECT:项目名,ascii string类型
+        可以随便定义,只要不使用,就行
+VERSION:项目版本号,ascii string类型
+        如果使用合宙iot.openluat.com进行远程升级,必须按照"XXX.YYY.ZZZ"三段格式定义:
+            X、Y、Z各表示1位数字,三个X表示的数字可以相同,也可以不同,同理三个Y和三个Z表示的数字也是可以相同,可以不同
+            因为历史原因,YYY这三位数字必须存在,但是没有任何用处,可以一直写为000
+        如果不使用合宙iot.openluat.com进行远程升级,根据自己项目的需求,自定义格式即可
+]]
+PROJECT = "luatos_hmeta_app"
+VERSION = "001.000.000"
+
+
+-- 在日志中打印项目名和项目版本号
+log.info("main", PROJECT, VERSION)
+
+
+-- 如果内核固件支持wdt看门狗功能,此处对看门狗进行初始化和定时喂狗处理
+-- 如果脚本程序死循环卡死,就会无法及时喂狗,最终会自动重启
+if wdt then
+    --配置喂狗超时时间为9秒钟
+    wdt.init(9000)
+    --启动一个循环定时器,每隔3秒钟喂一次狗
+    sys.timerLoopStart(wdt.feed, 3000)
+end
+
+
+-- 如果内核固件支持errDump功能,此处进行配置,【强烈建议打开此处的注释】
+-- 因为此功能模块可以记录并且上传脚本在运行过程中出现的语法错误或者其他自定义的错误信息,可以初步分析一些设备运行异常的问题
+-- 以下代码是最基本的用法,更复杂的用法可以详细阅读API说明文档
+-- 启动errDump日志存储并且上传功能,600秒上传一次
+-- if errDump then
+--     errDump.config(true, 600)
+-- end
+
+
+-- 使用LuatOS开发的任何一个项目,都强烈建议使用远程升级FOTA功能
+-- 可以使用合宙的iot.openluat.com平台进行远程升级
+-- 也可以使用客户自己搭建的平台进行远程升级
+-- 远程升级的详细用法,可以参考fota的demo进行使用
+
+
+-- 启动一个循环定时器
+-- 每隔3秒钟打印一次总内存,实时的已使用内存,历史最高的已使用内存情况
+-- 方便分析内存使用是否有异常
+-- sys.timerLoopStart(function()
+--     log.info("mem.lua", rtos.meminfo())
+--     log.info("mem.sys", rtos.meminfo("sys"))
+-- end, 3000)
+
+-- 加载hmeta_app应用功能模块
+require "hmeta_app"
 
 -- 用户代码已结束---------------------------------------------
 -- 结尾总是这一句
 sys.run()
--- sys.run()之后后面不要加任何语句!!!!!
+-- sys.run()之后不要加任何语句!!!!!因为添加的任何语句都不会被执行

+ 49 - 0
module/Air8101/demo/hmeta/readme.md

@@ -0,0 +1,49 @@
+## 功能模块介绍
+
+1、main.lua:主程序入口;
+
+2、hmeta_app.lua:获取模块相关信息包括获取模组名称,硬件版本号,原始芯片型号;
+
+## 演示功能概述
+
+1、创建一个task;
+
+2、在task中的任务处理函数中,每隔三秒钟通过日志输出一次模组名称,硬件版本号,原始芯片型号;
+
+
+## 演示硬件环境
+
+![](https://docs.openluat.com/air8101/luatos/common/hwenv/image/Air8101.png)
+
+1、Air8101核心板一块
+
+2、TYPE-C USB数据线一根
+
+3、Air8101核心板和数据线的硬件接线方式为
+
+- Air8101核心板通过TYPE-C USB口连接TYPE-C USB 数据线,数据线的另外一端连接电脑的USB口;
+- Air8101核心板通过TYPE-C USB口供电(核心板背面的功耗测试开关拨到OFF一端);
+
+
+## 演示软件环境
+
+1、[Luatools下载调试工具](https://docs.openluat.com/air8101/luatos/common/download/)
+
+2、[Air8101 最新版本的内核固件](https://docs.openluat.com/air8101/luatos/firmware/)
+
+
+## 演示核心步骤
+
+1、搭建好硬件环境
+
+2、Luatools烧录内核固件和demo脚本代码
+
+3、烧录成功后,自动开机运行
+
+4、出现类似于下面的日志,就表示运行成功:
+
+``` lua
+[2025-10-21 10:21:33.774] I/user.hmeta	Air8101	A10	BK7258
+[2025-10-21 10:21:36.749] I/user.hmeta	Air8101	A10	BK7258
+[2025-10-21 10:21:39.756] I/user.hmeta	Air8101	A10	BK7258
+```

+ 71 - 0
module/Air8101/demo/miniz/main.lua

@@ -0,0 +1,71 @@
+--[[
+@module  main
+@summary LuatOS用户应用脚本文件入口,总体调度应用逻辑 
+@version 1.0
+@date    2025.10.28
+@author  沈园园
+@usage
+本demo演示的核心功能为:
+演示如何对数据压缩解压
+更多说明参考本目录下的readme.md文件
+]]
+
+
+--[[
+必须定义PROJECT和VERSION变量,Luatools工具会用到这两个变量,远程升级功能也会用到这两个变量
+PROJECT:项目名,ascii string类型
+        可以随便定义,只要不使用,就行
+VERSION:项目版本号,ascii string类型
+        如果使用合宙iot.openluat.com进行远程升级,必须按照"XXX.YYY.ZZZ"三段格式定义:
+            X、Y、Z各表示1位数字,三个X表示的数字可以相同,也可以不同,同理三个Y和三个Z表示的数字也是可以相同,可以不同
+            因为历史原因,YYY这三位数字必须存在,但是没有任何用处,可以一直写为000
+        如果不使用合宙iot.openluat.com进行远程升级,根据自己项目的需求,自定义格式即可
+]]
+PROJECT = "luatos_miniz_app"
+VERSION = "001.000.000"
+
+
+-- 在日志中打印项目名和项目版本号
+log.info("main", PROJECT, VERSION)
+
+
+-- 如果内核固件支持wdt看门狗功能,此处对看门狗进行初始化和定时喂狗处理
+-- 如果脚本程序死循环卡死,就会无法及时喂狗,最终会自动重启
+if wdt then
+    --配置喂狗超时时间为9秒钟
+    wdt.init(9000)
+    --启动一个循环定时器,每隔3秒钟喂一次狗
+    sys.timerLoopStart(wdt.feed, 3000)
+end
+
+
+-- 如果内核固件支持errDump功能,此处进行配置,【强烈建议打开此处的注释】
+-- 因为此功能模块可以记录并且上传脚本在运行过程中出现的语法错误或者其他自定义的错误信息,可以初步分析一些设备运行异常的问题
+-- 以下代码是最基本的用法,更复杂的用法可以详细阅读API说明文档
+-- 启动errDump日志存储并且上传功能,600秒上传一次
+-- if errDump then
+--     errDump.config(true, 600)
+-- end
+
+
+-- 使用LuatOS开发的任何一个项目,都强烈建议使用远程升级FOTA功能
+-- 可以使用合宙的iot.openluat.com平台进行远程升级
+-- 也可以使用客户自己搭建的平台进行远程升级
+-- 远程升级的详细用法,可以参考fota的demo进行使用
+
+
+-- 启动一个循环定时器
+-- 每隔3秒钟打印一次总内存,实时的已使用内存,历史最高的已使用内存情况
+-- 方便分析内存使用是否有异常
+-- sys.timerLoopStart(function()
+--     log.info("mem.lua", rtos.meminfo())
+--     log.info("mem.sys", rtos.meminfo("sys"))
+-- end, 3000)
+
+-- 加载miniz_app应用功能模块
+require "miniz_app"
+
+-- 用户代码已结束---------------------------------------------
+-- 结尾总是这一句
+sys.run()
+-- sys.run()之后不要加任何语句!!!!!因为添加的任何语句都不会被执行

+ 47 - 0
module/Air8101/demo/miniz/miniz_app.lua

@@ -0,0 +1,47 @@
+--[[
+@module  miniz_app
+@summary miniz_app应用功能模块 
+@version 1.0
+@date    2025.10.28
+@author  沈园园
+@usage
+本文件为miniz应用功能模块,核心业务逻辑为:
+1、如何对数据压缩解压;
+
+本文件没有对外接口,直接在main.lua中require "miniz_app"就可以加载运行;
+]]
+
+
+local function miniz_task_func()
+    -- 压缩过的字符串, 为了方便演示, 这里用了base64编码
+    -- miniz能解压标准zlib数据流
+    -- 将字符串进行base64解码
+    local b64str = "eAEFQIGNwyAMXOUm+E2+OzjhCCiOjYyhyvbVR7K7IR0l+iau8G82eIW5jXVoPzF5pse/B8FaPXLiWTNxEMsKI+WmIR0l+iayEY2i2V4UbqqPh5bwimyEuY11aD8xeaYHxAquvom6VDFUXqQjG1Fek6efCFfCK0b0LUnQMjiCxhUT05GNL75dFUWCSMcjN3EE5c4Wvq42/36R41fa"
+    local str = b64str:fromBase64()
+    -- 快速解压
+    local dstr = miniz.uncompress(str) 
+    -- 压缩过的数据长度 156
+    -- 解压后的数据长度,即原始数据的长度 235
+    log.info("miniz", "压缩过的数据长度: ", #str, "解压后的数据长度:", #dstr)    
+    
+    -- 演示压缩解压
+    local ostr = "abcd1234567890efghijklmnopqrstuvwxyzabcd1234567890efghijklmnopqrstuvwxyzabcd1234567890efghijklmnopqrstuvwxyz"
+    log.info("压缩前的字符串:", #ostr, ostr)
+    -- 压缩字符串
+    local zstr = miniz.compress(ostr)
+    log.info("压缩后的字符串:",#zstr, zstr:toHex())
+    -- 解压字符串
+    local lstr = miniz.uncompress(zstr)
+    log.info("解压后的字符串:", #lstr, lstr)
+    
+    -- 演示从文件读取2K数据压缩
+    local ostr = io.readFile("/luadb/test.txt")
+    local zstr = miniz.compress(ostr)
+    if zstr then
+        log.info("miniz", "压缩前的数据长度: ", #ostr, "压缩后的数据长度: ", #zstr) 
+    end  
+end
+
+
+--创建一个task,并且运行task的主函数miniz_task_func
+sys.taskInit(miniz_task_func)

+ 51 - 0
module/Air8101/demo/miniz/readme.md

@@ -0,0 +1,51 @@
+## 功能模块介绍
+
+1、main.lua:主程序入口;
+
+2、miniz_app.lua:如何对数据压缩解压;
+
+## 演示功能概述
+
+1、创建一个task;
+
+2、演示如何对数据压缩解压;
+
+
+## 演示硬件环境
+
+![](https://docs.openluat.com/air8101/luatos/common/hwenv/image/Air8101.png)
+
+1、Air8101核心板一块
+
+2、TYPE-C USB数据线一根
+
+3、Air8101核心板和数据线的硬件接线方式为
+
+- Air8101核心板通过TYPE-C USB口连接TYPE-C USB 数据线,数据线的另外一端连接电脑的USB口;
+- Air8101核心板通过TYPE-C USB口供电(核心板背面的功耗测试开关拨到OFF一端);
+
+
+## 演示软件环境
+
+1、[Luatools下载调试工具](https://docs.openluat.com/air8101/luatos/common/download/)
+
+2、[Air8101 最新版本的内核固件](https://docs.openluat.com/air8101/luatos/firmware/)
+
+
+## 演示核心步骤
+
+1、搭建好硬件环境
+
+2、Luatools烧录内核固件和demo脚本代码
+
+3、烧录成功后,自动开机运行
+
+4、出现类似于下面的日志,就表示运行成功:
+
+``` lua
+[2025-10-28 11:39:11.816][000000000.379] I/user.miniz 压缩过的数据长度:  156 解压后的数据长度: 235
+[2025-10-28 11:39:11.821][000000000.380] I/user.压缩前的字符串: 108 abcd1234567890efghijklmnopqrstuvwxyzabcd1234567890efghijklmnopqrstuvwxyzabcd1234567890efghijklmnopqrstuvwxyz
+[2025-10-28 11:39:11.826][000000000.383] I/user.压缩后的字符串: 92 780105C0040D80B04A383CCEDDDD9F9E4184C97E9CD7FDBC1FD828E3422A6DACF321A65C6AEB632E8830D98FF3BA9FF7031B655C48A58D753EC4944B6D7DCC051126FB715EF7F37E60A38C0BA9B4B1CE879872A9AD8FB97E17A42785 184
+[2025-10-28 11:39:11.832][000000000.383] I/user.解压后的字符串: 108 abcd1234567890efghijklmnopqrstuvwxyzabcd1234567890efghijklmnopqrstuvwxyzabcd1234567890efghijklmnopqrstuvwxyz
+[2025-10-28 11:39:11.836][000000000.389] I/user.miniz 压缩前的数据长度:  2048 压缩后的数据长度:  1350
+```

A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 0 - 0
module/Air8101/demo/miniz/test.txt


Nem az összes módosított fájl került megjelenítésre, mert túl sok fájl változott