talk.lua 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. --[[
  2. @module talk
  3. @summary airtalk测试功能模块
  4. @version 001.000.000
  5. @date 2025.07.11
  6. @author 李源龙
  7. @usage
  8. 使用Air780EHV核心板外接AirAudio_1000,连接MQTT服务器,订阅对应的主题和平台进行对讲功能,还支持使用powerkey按键进行对讲功能:
  9. Air780EHM AirAudio_1000
  10. GND(任意) GND
  11. VDD_EXT VCC
  12. 19/GPIO22 PA_EN
  13. 5/SPK+ SPK+
  14. 4/SPK- SPK-
  15. ]]
  16. local talk = {}
  17. local run_state = false
  18. local airaudio = require "airaudio"
  19. local input_key = false
  20. -- 初始化fskv
  21. --speech_topic是topic,自己设定,需要和平台的topic一致,mqtt_host是mqtt服务器地址,mqtt_port是mqtt服务器端口,
  22. --mqtt_isssl是是否使用ssl连接,client_id是mqtt客户端id,user_name是mqtt用户名,password是mqtt密码
  23. local speech_topic = "12345678910"
  24. local mqtt_host = "lbsmqtt.openluat.com"
  25. local mqtt_port = 1886
  26. local mqtt_isssl = false
  27. local client_id = nil
  28. local user_name = "mqtt_hz_test_1"
  29. local password = "Ck8WpNCp"
  30. local mqttc = nil
  31. local message = ""
  32. local event = ""
  33. local talk_state = ""
  34. local function airtalk_event_cb(event, param)
  35. log.info("talk event", event, param)
  36. event = event
  37. end
  38. -- MQTT回调函数
  39. local function mqtt_cb(mqtt_client, event, data, payload)
  40. log.info("mqtt", "event", event, mqtt_client, data, payload)
  41. -- 连接成功时订阅主题
  42. end
  43. --初始化airtalk,连接MQTT
  44. local function init_talk()
  45. log.info("init_call")
  46. --初始化codec
  47. airaudio.init()
  48. client_id = mobile.imei()
  49. mqttc = mqtt.create(nil, mqtt_host, mqtt_port, mqtt_isssl, {rxSize = 4096})
  50. airtalk.config(airtalk.PROTOCOL_DEMO_MQTT_8K, mqttc, 200) -- 缓冲至少200ms播放
  51. airtalk.on(airtalk_event_cb)
  52. airtalk.start(client_id, speech_topic)
  53. mqttc:auth(client_id,user_name,password) -- client_id必填,其余选填
  54. mqttc:keepalive(240) -- 默认值240s
  55. mqttc:autoreconn(true, 3000) -- 自动重连机制
  56. mqttc:debug(false)
  57. mqttc:on(mqtt_cb)
  58. -- mqttc自动处理重连, 除非自行关闭
  59. mqttc:connect()
  60. end
  61. -- 重新初始化对讲函数
  62. local function reinit_talk()
  63. log.info("talk", "重新初始化对讲")
  64. -- 安全停止对讲
  65. if airtalk and airtalk.stop then
  66. airtalk.stop()
  67. end
  68. if mqttc then
  69. mqttc:close()
  70. end
  71. -- 重新初始化对讲
  72. sys.taskInit(init_talk)
  73. end
  74. --初始化airtalk
  75. function talk.run()
  76. log.info("talk.run")
  77. -- lcd.setFont(lcd.font_opposansm12_chinese)
  78. run_state = true
  79. init_talk()
  80. speech_topic = fskv.get("talk_channel")
  81. log.info("get speech_topic",speech_topic)
  82. end
  83. --停止语音采集
  84. local function stop_talk()
  85. talk_state = "语音停止采集"
  86. airtalk.uplink(false)
  87. log.info("STATE", talk_state)
  88. end
  89. --开启语音采集
  90. local function start_talk()
  91. talk_state = "语音采集上传中"
  92. airtalk.uplink(true)
  93. log.info("STATE", talk_state)
  94. end
  95. --设置防抖
  96. gpio.debounce(gpio.PWR_KEY,1000)
  97. gpio.setup(gpio.PWR_KEY,function(val)
  98. if val == 1 then
  99. log.info("talk", "暂停",val)
  100. stop_talk()
  101. else
  102. log.info("talk2", "录音上传",val)
  103. start_talk()
  104. end
  105. end,gpio.PULLUP)
  106. return talk