main.lua 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. -- LuaTools需要PROJECT和VERSION这两个信息
  2. PROJECT = "web_audio"
  3. VERSION = "1.0.0"
  4. --[[
  5. 如果没有外挂spi flash,就选用后缀是不带外挂flash的固件;
  6. 如果外挂了spi flash,就选用后缀是带外挂flash的固件。
  7. 区别:不带外部flash的版本,因为内存空间小,删除了大部分功能,仅供测试web_audio使用
  8. 带外部flash的版本功能齐全,和官方发布的固件功能相同。
  9. 固件地址:https://gitee.com/openLuat/LuatOS/attach_files/1342571/download
  10. ]]
  11. -- sys库是标配
  12. _G.sys = require("sys")
  13. --[[特别注意, 使用mqtt库需要下列语句]]
  14. _G.sysplus = require("sysplus")
  15. require "audio_play"
  16. -- 根据自己的服务器修改以下参数
  17. local mqtt_host = "lbsmqtt.airm2m.com"
  18. local mqtt_port = 1883
  19. local mqtt_isssl = false
  20. local client_id = "audio"
  21. local user_name = "username"
  22. local password = "password"
  23. local mqttc = nil
  24. -- ************************云端音频MQTT 负载消息类型***************************************
  25. -- 0---4字节大端文字长度--文字的gbk编码--1--4字节大端音频url长度--url的gbk编码
  26. -- 0表示后面是普通文字。1表示后面是音频。两种任意组合。长度是后面编码的长度
  27. -- ************************云端音频MQTT 负载消息类型***************************************
  28. -- ************************HTTP 音频下载处理**************************************
  29. --- gb2312编码 转化为 utf8编码
  30. -- @string gb2312s gb2312编码数据
  31. -- @return string data,utf8编码数据
  32. -- @usage local data = common.gb2312ToUtf8(gb2312s)
  33. function gb2312ToUtf8(gb2312s)
  34. local cd = iconv.open("ucs2", "gb2312")
  35. local ucs2s = cd:iconv(gb2312s)
  36. cd = iconv.open("utf8", "ucs2")
  37. return cd:iconv(ucs2s)
  38. end
  39. sys.subscribe("payload_msg", function()
  40. sys.taskInit(function()
  41. local result, data = sys.waitUntil("payload_msg")
  42. payload_table, payload_table_len = {}, 0
  43. local pbuff = zbuff.create(10240)
  44. local plen = pbuff:write(data)
  45. for i = 0, plen - 1, 1 do
  46. if pbuff[i] == 0 or pbuff[i] == 1 then
  47. if pbuff[i + 1] == 0 and pbuff[i + 2] == 0 and pbuff[i + 3] == 0 then
  48. log.info("111")
  49. payload_table[payload_table_len] = pbuff[i]
  50. payload_table_len = payload_table_len + 1
  51. payload_table[payload_table_len] = pbuff[i + 4]
  52. payload_table_len = payload_table_len + 1
  53. local a = pbuff[i + 4]
  54. local s = pbuff:toStr(i + 5, a)
  55. log.info("s", s)
  56. payload_table[payload_table_len] = s
  57. log.info("payload_table[payload_table_len]",
  58. payload_table[payload_table_len])
  59. payload_table_len = payload_table_len + 1
  60. end
  61. end
  62. --log.info("测试", pbuff[i], i)
  63. end
  64. log.info("payload_table_len", payload_table_len)
  65. for i = 0, payload_table_len, 3 do
  66. if i ~= 0 then sys.waitUntil("audio_end") end
  67. if payload_table[i] == 0 then -- tts播放
  68. local ttstext = payload_table[i + 2]
  69. log.info("音频", gb2312ToUtf8(ttstext))
  70. sys.publish("TTS_msg", gb2312ToUtf8(ttstext))
  71. elseif payload_table[i] == 1 then -- 音频文件播放
  72. local url = tostring(payload_table[i + 2])
  73. log.info("url", url)
  74. sys.publish("HTTP_msg", url)
  75. end
  76. end
  77. end)
  78. end)
  79. sys.taskInit(function()
  80. sys.wait(1000)
  81. LED = gpio.setup(27, 0, gpio.PULLUP)
  82. device_id = mobile.imei()
  83. local result= sys.waitUntil("IP_READY", 30000)
  84. if not result then
  85. log.info("网络连接失败")
  86. end
  87. mqttc = mqtt.create(nil, mqtt_host, mqtt_port, mqtt_isssl, ca_file)
  88. mqttc:auth(client_id, user_name, password) -- client_id必填,其余选填
  89. mqttc:keepalive(30) -- 默认值240s
  90. mqttc:autoreconn(true, 3000) -- 自动重连机制
  91. mqttc:on(function(mqtt_client, event, data, payload)
  92. -- 用户自定义代码
  93. log.info("mqtt", "event", event, mqtt_client, data, payload)
  94. if event == "conack" then
  95. sys.publish("mqtt_conack")
  96. mqtt_client:subscribe("test20220929/" .. device_id)
  97. elseif event == "recv" then
  98. log.info("mqtt", "downlink", "topic", data, "payload",
  99. payload:toHex())
  100. sys.publish("payload_msg", payload)
  101. -- mqttmsg(payload)
  102. elseif event == "sent" then
  103. log.info("mqtt", "sent", "pkgid", data)
  104. -- elseif event == "disconnect" then
  105. -- -- 非自动重连时,按需重启mqttc
  106. -- log.info("mqtt链接断开")
  107. -- -- mqtt_client:connect()
  108. end
  109. end)
  110. mqttc:connect()
  111. sys.wait(1000)
  112. local error = mqttc:ready()
  113. if not error then
  114. log.info("mqtt 连接失败")
  115. else
  116. log.info("mqtt 连接成功")
  117. end
  118. sys.waitUntil("mqtt_conack")
  119. while true do
  120. -- mqttc自动处理重连
  121. local ret, topic, data, qos = sys.waitUntil("mqtt_pub", 30000)
  122. end
  123. mqttc:close()
  124. mqttc = nil
  125. end)
  126. sys.taskInit(function()
  127. while 1 do
  128. -- 最普通的Http GET请求
  129. local result, data = sys.waitUntil("HTTP_msg")
  130. if result then
  131. log.info("data", data)
  132. local code, headers, body = http.request("GET", data, {}, "",
  133. {dst = "/audio.mp3"})
  134. .wait()
  135. log.info("http", code, json.encode(headers or {}))
  136. if code == 200 then
  137. sys.wait(1000)
  138. log.info("fsize", fs.fsize("/audio.mp3"))
  139. sys.publish("Audio_msg")
  140. else
  141. log.info("http下载失败")
  142. end
  143. end
  144. end
  145. end)
  146. -- 用户代码已结束---------------------------------------------
  147. -- 结尾总是这一句
  148. sys.run()
  149. -- sys.run()之后后面不要加任何语句!!!!!