main.lua 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. --- 模块功能:Google ProtoBuffs 编解码
  2. -- @module pb
  3. -- @author wendal
  4. -- @release 2022.9.8
  5. -- LuaTools需要PROJECT和VERSION这两个信息
  6. PROJECT = "pbdemo"
  7. VERSION = "1.0.1"
  8. log.info("main", PROJECT, VERSION)
  9. -- sys库是标配
  10. _G.sys = require("sys")
  11. --添加硬狗防止程序卡死
  12. if wdt then
  13. wdt.init(9000)--初始化watchdog设置为9s
  14. sys.timerLoopStart(wdt.feed, 3000)--3s喂一次狗
  15. end
  16. sys.taskInit(function()
  17. sys.wait(500)
  18. -- 如果没有这个库, 证明你选的的固件不支持
  19. if not protobuf then
  20. log.info("protobuf", "this demo need protobuf lib")
  21. return
  22. end
  23. -- 加载 pb 文件, 这个是从pbtxt 转换得到的
  24. -- 下载资源到模块时不需要下载pbtxt
  25. -- 转换命令: protoc.exe -operson.pb person.pbtxt
  26. -- protoc.exe 下载地址: https://github.com/protocolbuffers/protobuf/releases
  27. local pb_file = "/luadb/person.pb"
  28. if io.exists(pb_file) then
  29. protobuf.load(io.readFile(pb_file))
  30. sys.publish("pb_file_exists")
  31. else
  32. log.info("protobuf","Failed to load file")
  33. end
  34. local tb = {
  35. name = "wendal",
  36. id = 123,
  37. email = "abc@qq.com"
  38. }
  39. while 1 do
  40. sys.waitUntil("pb_file_exists")
  41. sys.wait(1000)
  42. -- 用 protobuf 编码数据
  43. local pbdata = protobuf.encode("Person", tb)
  44. if pbdata then
  45. -- 打印数据长度. 编码后的数据含不可见字符, toHex是方便显示
  46. log.info("protobuf", "encode", #pbdata, (pbdata:toHex()))
  47. end
  48. -- 用 json 编码数据, 用于对比大小
  49. local jdata = json.encode(tb)
  50. if jdata then
  51. log.info("json", #jdata, jdata)
  52. end
  53. -- 可见 protobuffs 比 json 节省很多空间
  54. -- 后续是演示解码
  55. local re = protobuf.decode("Person", pbdata)
  56. if re then
  57. -- 打印数据, 因为table不能直接显示, 这里转成json来显示
  58. log.info("protobuf", "decode", json.encode(re))
  59. end
  60. end
  61. end)
  62. -- 主循环, 必须加
  63. sys.run()