testProtoBuffer.lua 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. --- 模块功能:proto buffer功能测试.
  2. -- @author openLuat
  3. -- @module protoBuffer.testProtoBuffer2
  4. -- @license MIT
  5. -- @copyright openLuat
  6. -- @release 2018.03.27
  7. module(...,package.seeall)
  8. local protobuf = require"protobuf"
  9. require"utils"
  10. --注册proto描述文件
  11. local pbFile = io.open("/lua/tracker.pb","rb")
  12. local pbBuf = pbFile:read("*a")
  13. pbFile:close()
  14. protobuf.register(pbBuf)
  15. local logIn =
  16. {
  17. message_id = "DEV_LOGIN",
  18. log_in =
  19. {
  20. project_id = 29,
  21. project_name = "A9352_Luat_V0020_8955_SSL",
  22. script_version = "1.0.0",
  23. iccid = "8988512345678901",
  24. imsi = "460041111111111",
  25. heart_interval = 120,
  26. }
  27. }
  28. local locationGPS =
  29. {
  30. message_id = "DEV_LOCATION",
  31. location =
  32. {
  33. type = "DEV_TIMER_REPORT",
  34. gps_exist = true,
  35. gps_info =
  36. {
  37. longitude = 1211234567,
  38. latitude = 311234567,
  39. degree = 60,
  40. speed = 15,
  41. viewed_sates = 8,
  42. },
  43. status =
  44. {
  45. shake = false,
  46. charger = false,
  47. acc = false,
  48. gps = true,
  49. rssi = 28,
  50. vbat = 3950,
  51. charge_status = "NOT_CHARGE",
  52. },
  53. }
  54. }
  55. local locationLBS =
  56. {
  57. message_id = "DEV_LOCATION",
  58. location =
  59. {
  60. type = "SVR_QUERY_RSP",
  61. cell_exist = true,
  62. cell_info =
  63. {
  64. cells =
  65. {
  66. {lac_id=6311, cells={{mcc=460,mnc=0,cell_id=83751,cell_rssi=20}, {mcc=460,mnc=2,cell_id=88751,cell_rssi=18}}},
  67. {lac_id=6312, cells={{mcc=460,mnc=0,cell_id=83752,cell_rssi=20}, {mcc=460,mnc=2,cell_id=88752,cell_rssi=18}}},
  68. },
  69. ta = 1,
  70. },
  71. status =
  72. {
  73. shake = true,
  74. charger = true,
  75. acc = true,
  76. gps = false,
  77. rssi = 20,
  78. vbat = 3850,
  79. charge_status = "CHARGING",
  80. },
  81. }
  82. }
  83. local function decodeAndPrint(encodeStream)
  84. --使用protobuf.decode反序列化
  85. --如果成功,反序列化后的数据以table类型赋值给decodeTable
  86. --如果失败,返回false
  87. local decodeTable = protobuf.decode("tracker.Client",encodeStream)
  88. log.info("protobuf.decodeTable",decodeTable)
  89. if decodeTable then
  90. log.info("protobuf.decode message_id",decodeTable.message_id,type(decodeTable.message_id))
  91. if decodeTable.message_id=="DEV_LOGIN" then
  92. log.info("protobuf.decode project_id",decodeTable.log_in.project_id)
  93. log.info("protobuf.decode project_name",decodeTable.log_in.project_name)
  94. log.info("protobuf.decode script_version",decodeTable.log_in.script_version)
  95. log.info("protobuf.decode iccid",decodeTable.log_in.iccid)
  96. log.info("protobuf.decode imsi",decodeTable.log_in.imsi)
  97. log.info("protobuf.decode heart_interval",decodeTable.log_in.heart_interval)
  98. elseif decodeTable.message_id=="DEV_LOCATION" then
  99. log.info("protobuf.decode type",decodeTable.location.type)
  100. if decodeTable.location.gps_exist then
  101. log.info("protobuf.decode gps_info longitude",decodeTable.location.gps_info.longitude)
  102. log.info("protobuf.decode gps_info latitude",decodeTable.location.gps_info.latitude)
  103. log.info("protobuf.decode gps_info degree",decodeTable.location.gps_info.degree)
  104. log.info("protobuf.decode gps_info speed",decodeTable.location.gps_info.speed)
  105. log.info("protobuf.decode gps_info viewed_sates",decodeTable.location.gps_info.viewed_sates)
  106. end
  107. if decodeTable.location.cell_exist then
  108. for k,v in ipairs(decodeTable.location.cell_info.cells) do
  109. if type(v)=="table" then
  110. log.info("protobuf.decode cell_info",k,"lac_id",v.lac_id)
  111. if type(v.cells)=="table" then
  112. for m,n in ipairs(v.cells) do
  113. log.info("protobuf.decode cell_info",k,"cells",m,n.mcc,n.mnc,n.cell_id,n.cell_rssi)
  114. end
  115. end
  116. end
  117. end
  118. log.info("protobuf.decode ta",decodeTable.location.cell_info.ta)
  119. end
  120. if type(decodeTable.location.status)=="table" then
  121. log.info("protobuf.decode status shake",decodeTable.location.status.shake)
  122. log.info("protobuf.decode status charger",decodeTable.location.status.charger)
  123. log.info("protobuf.decode status acc",decodeTable.location.status.acc)
  124. log.info("protobuf.decode status gps",decodeTable.location.status.gps)
  125. log.info("protobuf.decode status rssi",decodeTable.location.status.rssi)
  126. log.info("protobuf.decode status vbat",decodeTable.location.status.vbat)
  127. log.info("protobuf.decode status charge_status",decodeTable.location.status.charge_status)
  128. end
  129. end
  130. end
  131. end
  132. --使用protobuf.encode序列化,序列化后的二进制数据流以string类型赋值给encodeStr
  133. --登录报文的封包和解包
  134. local encodeStr = protobuf.encode("tracker.Client",logIn)
  135. log.info("protobuf.encode logInStr",encodeStr:toHex())
  136. decodeAndPrint(encodeStr)
  137. --GPS位置报文的封包和解包
  138. encodeStr = protobuf.encode("tracker.Client",locationGPS)
  139. log.info("protobuf.encode locationGPSStr",encodeStr:toHex())
  140. decodeAndPrint(encodeStr)
  141. --LBS位置报文的封包和解包
  142. encodeStr = protobuf.encode("tracker.Client",locationLBS)
  143. log.info("protobuf.encode locationLBSStr",encodeStr:toHex())
  144. decodeAndPrint(encodeStr)