Просмотр исходного кода

fix: 优化AirTalk 的 扩展库和demo

梁健 6 месяцев назад
Родитель
Сommit
962061c90a

+ 30 - 17
module/Air8000/demo/airtalk/extalk.lua

@@ -76,6 +76,23 @@ local function check_param(param, expected_type, name)
     return true
 end
 
+-- MQTT消息发布函数,集中处理所有发布操作并打印日志
+local function publish_message(topic, payload)
+    if g_mqttc then
+        log.info("MQTT发布 - 主题:", topic, "内容:", payload)
+        g_mqttc:publish(topic, payload)
+    else
+        log.error("MQTT客户端未初始化,无法发布消息")
+    end
+end
+
+
+-- 对讲超时处理
+local function wait_speech_to()
+    log.info("主动请求对讲超时无应答")
+    speech_off(true, false)
+end
+
 -- 发送鉴权消息
 local function auth()
     if g_state == SP_T_NO_READY and g_mqttc then
@@ -84,7 +101,7 @@ local function auth()
             ["key"] = extalk_configs_local.key, 
             ["device_type"] = 1
         })
-        g_mqttc:publish(topic, payload)
+        publish_message(topic, payload)
     end
 end
 
@@ -96,7 +113,7 @@ local function heart()
             ["from"] = g_local_id, 
             ["to"] = g_remote_id
         })
-        g_mqttc:publish(topic, payload)
+        publish_message(topic, payload)
     end
 end
 
@@ -124,11 +141,12 @@ local function speech_off(need_upload, need_ind)
     g_state = SP_T_IDLE
     sys.timerStopAll(auth)
     sys.timerStopAll(heart)
+    log.info("wait_speech_to",wait_speech_to)
     sys.timerStopAll(wait_speech_to)
     
     if need_upload and g_mqttc then
         local topic = string.format("ctrl/uplink/%s/0004", g_local_id)
-        g_mqttc:publish(topic, json.encode({["to"] = g_remote_id}))
+        publish_message(topic, json.encode({["to"] = g_remote_id}))
     end
 
     if need_ind then
@@ -136,11 +154,6 @@ local function speech_off(need_upload, need_ind)
     end
 end
 
--- 对讲超时处理
-local function wait_speech_to()
-    log.info("主动请求对讲超时无应答")
-    speech_off(true, false)
-end
 
 -- 命令处理:请求对讲应答
 local function handle_speech_response(obj)
@@ -171,7 +184,7 @@ local function handle_incoming_call(obj)
             ["topic"] = obj and obj["topic"] or "", 
             ["info"] = "无效的请求参数"
         }
-        g_mqttc:publish(string.format("ctrl/uplink/%s/8102", g_local_id), json.encode(response))
+        publish_message(string.format("ctrl/uplink/%s/8102", g_local_id), json.encode(response))
         return
     end
 
@@ -183,7 +196,7 @@ local function handle_incoming_call(obj)
             ["topic"] = obj["topic"], 
             ["info"] = "device is busy"
         }
-        g_mqttc:publish(string.format("ctrl/uplink/%s/8102", g_local_id), json.encode(response))
+        publish_message(string.format("ctrl/uplink/%s/8102", g_local_id), json.encode(response))
         return
     end
 
@@ -197,7 +210,7 @@ local function handle_incoming_call(obj)
             ["topic"] = obj["topic"], 
             ["info"] = "topic error"
         }
-        g_mqttc:publish(string.format("ctrl/uplink/%s/8102", g_local_id), json.encode(response))
+        publish_message(string.format("ctrl/uplink/%s/8102", g_local_id), json.encode(response))
         return
     end
 
@@ -242,7 +255,7 @@ local function handle_incoming_call(obj)
     end
 
     -- 发送响应
-    g_mqttc:publish(string.format("ctrl/uplink/%s/8102", g_local_id), json.encode(response))
+    publish_message(string.format("ctrl/uplink/%s/8102", g_local_id), json.encode(response))
 end
 
 -- 命令处理:对端挂断
@@ -261,7 +274,7 @@ local function handle_remote_hangup(obj)
         end
     end
     
-    g_mqttc:publish(string.format("ctrl/uplink/%s/8103", g_local_id), json.encode(response))
+    publish_message(string.format("ctrl/uplink/%s/8103", g_local_id), json.encode(response))
 end
 
 -- 命令处理:更新设备列表
@@ -274,13 +287,13 @@ local function handle_device_list_update(obj)
         response = {["result"] = "failed", ["info"] = "json info error"}
     end
     
-    g_mqttc:publish(string.format("ctrl/uplink/%s/8101", g_local_id), json.encode(response))
+    publish_message(string.format("ctrl/uplink/%s/8101", g_local_id), json.encode(response))
 end
 
 -- 命令处理:鉴权结果
 local function handle_auth_result(obj)
     if obj and obj["result"] == SUCC then
-        g_mqttc:publish(string.format("ctrl/uplink/%s/0002", g_local_id), "")  -- 更新列表
+        publish_message(string.format("ctrl/uplink/%s/0002", g_local_id), "")  -- 更新列表
     else
         sys.sendMsg(AIRTALK_TASK_NAME, MSG_AUTH_IND, false, 
             "鉴权失败" .. (obj and obj["info"] or "")) 
@@ -520,7 +533,7 @@ function extalk.start(id)
         g_s_topic = string.format("audio/%s/all/%s", 
             g_local_id, string.sub(tostring(mcu.ticks()), -4, -1))
         
-        g_mqttc:publish(string.format("ctrl/uplink/%s/0003", g_local_id), 
+        publish_message(string.format("ctrl/uplink/%s/0003", g_local_id), 
             json.encode({["topic"] = g_s_topic, ["type"] = g_s_type}))
         sys.timerStart(wait_speech_to, 15000)
     else
@@ -538,7 +551,7 @@ function extalk.start(id)
         g_s_topic = string.format("audio/%s/%s/%s", 
             g_local_id, id, string.sub(tostring(mcu.ticks()), -4, -1))
         
-        g_mqttc:publish(string.format("ctrl/uplink/%s/0003", g_local_id), 
+        publish_message(string.format("ctrl/uplink/%s/0003", g_local_id), 
             json.encode({["topic"] = g_s_topic, ["type"] = g_s_type}))
         sys.timerStart(wait_speech_to, 15000)
     end

+ 27 - 1
module/Air8000/demo/airtalk/main.lua

@@ -29,9 +29,10 @@ VERSION:项目版本号,ascii string类型
 
 PROJECT = "audio"
 VERSION = "1.0.0"
+PRODUCT_KEY =  "NrkXcjWwjcc5EFdCrrYnvypBCyJlEaIO"
 -- 在日志中打印项目名和项目版本号
 log.info("main", PROJECT, VERSION)
-
+exnetif = require("exnetif")
 
 -- 如果内核固件支持wdt看门狗功能,此处对看门狗进行初始化和定时喂狗处理
 -- 如果脚本程序死循环卡死,就会无法及时喂狗,最终会自动重启
@@ -42,6 +43,31 @@ if wdt then
     sys.timerLoopStart(wdt.feed, 3000)
 end
 
+exnetif.set_priority_order({ { -- 次优先级:WiFi
+    WIFI = {
+
+        ssid = "机房-降功耗,找合宙!",
+
+        password = "Air123456", 
+
+    }
+}})
+
+-- 设置网络状态回调
+
+exnetif.notify_status(function(net_type, adapter)
+
+    log.info("网络切换至:", net_type)
+
+end)
+
+-- wifi的STA相关事件
+sys.subscribe("WLAN_STA_INC", function(evt, data)
+    -- evt 可能的值有: "CONNECTED", "DISCONNECTED"
+    -- 当evt=CONNECTED, data是连接的AP的ssid, 字符串类型
+    -- 当evt=DISCONNECTED, data断开的原因, 整数类型
+    log.info("收到STA事件", evt, data)
+end)
 
 require "talk"            --  启动airtalk
 

+ 10 - 48
module/Air8000/demo/airtalk/readme.md

@@ -8,48 +8,21 @@
 
 1、main.lua:主程序入口;
 
-2、play_file.lua: 播放音频文件,可支持wav,amr,mp3 格式音频
-
-3、play_tts: 支持文字转普通话输出需要固件支持
-
-4、play_stream: 流式播放音频,仅支持PCM 格式,可以将音频推流到云端,用来对接大模型或者流式录音的应用。
-
-5、record_file: 录音到文件,仅支持PCM 格式
-
-6、record_stream:  流式录音,仅支持PCM,可以将音频流不断的拉取,可用来对接大模型
-
-7、1.mp3: 用于测试本地mp3文件播放
-
-8、test.pcm: 用于测试pcm 流式播放(实际可以云端下载)
-
-
-
-
+2、talk.lua:airtalk 运行主程序
 
 ## 常量的介绍
 
-1、exaudio.PLAY_DONE : 当播放音频结束时,会在回调函数返回播放完成的时间
-
-2、exaudio.RECORD_DONE : 当录音结束时,会在回调函数返回播放完成的时间
-
-3、exaudio.AMR_NB : 仅录音时有用,表示使用AMR_NB 方式录音
-
-4、exaudio.AMR_WB : 仅录音时有用,表示使用AMR_WB 方式录音
-
-5、exaudio.PCM_8000/exaudio.PCM_16000/exaudio.PCM_24000/exaudio.PCM_32000 :  仅录音时有用,表示使用8000/16000/24000/32000/秒 的速度对音频进行采样
+1. extalk.START = 1     -- 通话开始
+2. extalk.STOP = 2      -- 通话结束
+3. extalk.UNRESPONSIVE = 3  -- 对端未响应
+4. extalk.ONE_ON_ONE = 5  -- 一对一来电
+5. extalk.BROADCAST = 6 -- 广播
 
 
 ## 演示功能概述
 
-1、play_flie.lua 自动播放一个1.mp3音乐,点powerkey 按键进行音频切换,点击boot 按键停止音频播放
-
-2、play_tts.lua 播放一个TTS,点powerkey 按键进行tts 的音色切换,点击boot 按键停止音频播放
-
-3、play_stream.lua 流式播放PCM,使用test.pcm 模拟音频来源,通过流式传输不断填入播放的音频,使用powerkey 按键进行音量减小,点击boot 按键进行音量增加
-
-4、record_file.lua 录音到文件,演示了pcm 录音到文件,使用powerkey 按键进行录音音量减小,点击boot 按键进行录音音量增加
-
-5、record_stream.lua 流式录音(仅支持PCM),不断输出录音的数据地址和录音长度,供给应用层调用
+1.    按一次boot,选择群组内第一个联系人,开始1对1对讲,再按一次boot,结束对讲
+2.    按一次powerkey,开始1对多广播,再按一次powerkey或者boot,结束对讲
 
 
 ## 演示硬件环境
@@ -74,22 +47,11 @@
 
 1、搭建好硬件环境
 
-2、demo脚本代码main.lua中,按照自己的需求选择对应的功能
-
-- 如果需要测试播放音频文件,则选择play_file 文件
-
-- 如果需要测试播放tts,则选择play_tts 文件
-
-- 如果需要测试流式播放音频,则选择play_stream 文件
-
-- 如果需要测试录音频到文件,则选择record_file 文件
-
-- 如果需要测试流式录音,则选择record_stream 文件
-
+2、选择本demo 的全部文件(可不包含readme)
 
 3、Luatools烧录内核固件和修改后的demo脚本代码
 
-4、烧录成功后,自动开机运行,如果出现以下日志,播放或者或者录音完成
+4、烧录成功后,自动开机运行,如果出现以下日志
 
 ``` lua
 I/user.播放完成 true

+ 19 - 10
module/Air8000/demo/airtalk/talk.lua

@@ -42,14 +42,21 @@ local function contact_list_callback(dev_list)
     end
 end
 
+local gpio_number = 20 -- air8000 核心板上的23 管脚
+
+LED = gpio.setup(gpio_number, 1) -- 设置GPIO20为输出模式
+
+
 -- 对讲状态回调函数
 local function speech_state_callback(event_table)
     if not event_table then return end
     
     if event_table.state == extalk.START then
         log.info("对讲开始,可以说话了")
+        LED(1)
         g_speech_active = true
     elseif event_table.state == extalk.STOP then
+        LED(0)
         log.info("对讲结束")
         g_speech_active = false
     elseif event_table.state == extalk.UNRESPONSIVE then
@@ -57,7 +64,7 @@ local function speech_state_callback(event_table)
         g_speech_active = false
     elseif event_table.state == extalk.ONE_ON_ONE then
         g_speech_active = true
-        
+        LED(1)
         local dev_name = "未知设备"
         if g_dev_list then
             for i = 1, #g_dev_list do
@@ -70,7 +77,7 @@ local function speech_state_callback(event_table)
         log.info(string.format("%s 来电", dev_name))
     elseif event_table.state == extalk.BROADCAST then
         g_speech_active = true
-        
+        LED(1)
         local dev_name = "未知设备"
         if g_dev_list then
             for i = 1, #g_dev_list do
@@ -94,11 +101,13 @@ local extalk_configs = {
 
 -- 按键回调函数 - Boot键
 local function boot_key_callback()
+    log.info("boot_key_callback++++++")
     sys.sendMsg(USER_TASK_NAME, MSG_KEY_PRESS, false)  -- false表示Boot键
 end
 
 -- 按键回调函数 - Power键
 local function power_key_callback()
+    log.info("power_key_callback++++++")
     sys.sendMsg(USER_TASK_NAME, MSG_KEY_PRESS, true)   -- true表示Power键
 end
 
@@ -162,13 +171,13 @@ end
 
 -- 用户主任务
 local function user_main_task()
-    -- 初始化音频
-    local audio_init_ok = exaudio.setup(audio_setup_param)
-    if not audio_init_ok then
-        log.error("音频初始化失败")
-        return
-    end
-    log.info("音频初始化成功")
+    -- -- 初始化音频
+    -- local audio_init_ok = exaudio.setup(audio_setup_param)
+    -- if not audio_init_ok then
+    --     log.error("音频初始化失败")
+    --     return
+    -- end
+    -- log.info("音频初始化成功")
     
     -- 初始化extalk
     local extalk_init_ok = extalk.setup(extalk_configs)
@@ -177,7 +186,7 @@ local function user_main_task()
         return
     end
     log.info("extalk初始化成功")
-    
+    LED(0)
     -- 等待按键消息并处理
     while true do
         local msg = sys.waitMsg(USER_TASK_NAME, MSG_KEY_PRESS)