Przeglądaj źródła

update:airtalk demo支持1对多对讲
remove:airtalk.uplink不再保留

alienwalker 7 miesięcy temu
rodzic
commit
29276fc365

+ 17 - 17
components/airtalk/binding/luat_lib_airtalk.c

@@ -233,22 +233,22 @@ static int l_airtalk_speech(lua_State *L)
 }
 
 
-/*
-airtalk上行控制
-@api airtalk.uplink(on_off)
-@boolean  录音上行控制,true开始,false停止
-@return nil
-@usage
---开始录音
-airtalk.uplink(true)
---停止录音
-airtalk.uplink(false)
-*/
-static int l_airtalk_uplink(lua_State *L)
-{
-	luat_airtalk_speech_record_switch(lua_toboolean(L, 1));
-    return 0;
-}
+///*
+//airtalk上行控制
+//@api airtalk.uplink(on_off)
+//@boolean  录音上行控制,true开始,false停止
+//@return nil
+//@usage
+//--开始录音
+//airtalk.uplink(true)
+//--停止录音
+//airtalk.uplink(false)
+//*/
+//static int l_airtalk_uplink(lua_State *L)
+//{
+//	luat_airtalk_speech_record_switch(lua_toboolean(L, 1));
+//    return 0;
+//}
 
 /*
 airtalk的详细调试信息开关
@@ -273,7 +273,7 @@ static const rotable_Reg_t reg_airtalk[] =
     { "start",      ROREG_FUNC(l_airtalk_start)},
 	{ "set_ssrc",      ROREG_FUNC(l_airtalk_set_ssrc)},
 	{ "set_topic",      ROREG_FUNC(l_airtalk_set_mqtt_topic)},
-    { "uplink",      ROREG_FUNC(l_airtalk_uplink)},
+//    { "uplink",      ROREG_FUNC(l_airtalk_uplink)},
 	{ "debug",      ROREG_FUNC(l_airtalk_debug)},
 	//@const PROTOCOL_MQTT number 语音数据用MQTT传输
     { "PROTOCOL_MQTT",        ROREG_INT(LUAT_AIRTALK_PROTOCOL_MQTT)},

+ 1 - 0
components/airtalk/include/luat_airtalk.h

@@ -14,6 +14,7 @@ enum
 	LUAT_AIRTALK_SPEECH_MODE_PERSON = 0,
 	LUAT_AIRTALK_SPEECH_MODE_GROUP_SPEAKER,
 	LUAT_AIRTALK_SPEECH_MODE_GROUP_LISTENER,
+	LUAT_AIRTALK_SPEECH_MODE_ROOM,
 
 	LUAT_AIRTALK_CB_OFF_LINE = 0,
 	LUAT_AIRTALK_CB_ON_LINE_IDLE,

+ 33 - 14
luat/demo/airtalk/airtalk_dev_ctrl.lua

@@ -31,12 +31,12 @@ local function heart()
 end
 
 --对讲开始,topic,ssrc,采样率(8K或者16K)这3个参数都有了之后就能进行对讲了,可以通过其他协议传入
-local function speech_on(mode, ssrc, sample)
+local function speech_on(ssrc, sample)
     g_state = SP_T_CONNECTED
-    g_s_mode = mode
     g_mqttc:subscribe(g_s_topic)
     airtalk.set_topic(g_s_topic)
     airtalk.set_ssrc(ssrc)
+    log.info("对讲模式", g_s_mode)
     airtalk.speech(true, g_s_mode, sample)
     sys.sendMsg(AIRTALK_TASK_NAME, MSG_SPEECH_ON_IND, true) 
     sys.timerLoopStart(heart, 150000)
@@ -64,7 +64,7 @@ local function analyze_v1(cmd, topic, obj)
             return
         else
             if obj and obj["result"] == SUCC and g_s_topic == obj["topic"]then  --完全正确,开始对讲
-                speech_on(airtalk.MODE_PERSON, obj["ssrc"], obj["audio_code"] == "amr-nb" and 8000 or 16000)
+                speech_on(obj["ssrc"], obj["audio_code"] == "amr-nb" and 8000 or 16000)
                 return
             else
                 sys.sendMsg(AIRTALK_TASK_NAME, MSG_SPEECH_ON_IND, false)   --有异常,无法对讲
@@ -77,20 +77,28 @@ local function analyze_v1(cmd, topic, obj)
     end
     local new_obj = nil
     if cmd == "0102" then       -- 对端打过来
-        if obj and obj["topic"] and obj["ssrc"] and obj["audio_code"] then
-            if g_state ~= SP_T_IDLE then
+        if obj and obj["topic"] and obj["ssrc"] and obj["audio_code"] and obj["type"] then
+            if g_state ~= SP_T_IDLE then    -- 空闲状态下才可以进入对讲状态
                 log.error("state", g_state, "need", SP_T_IDLE)
                 new_obj = {["result"] = "failed", ["topic"] = obj["topic"], ["info"] = "device is busy"}
             else
-                local from = string.match(obj["topic"], "audio/.*/(.*)/.*")
-                if from then
-                    log.info("remote id ", from)
+                if obj["type"] == "one-on-one" then -- 1对1对讲
+                    local from = string.match(obj["topic"], "audio/.*/(.*)/.*")
+                    if from then
+                        log.info("remote id ", from)
+                        g_s_topic = obj["topic"]
+                        g_remote_id = from
+                        new_obj = {["result"] = SUCC, ["topic"] = obj["topic"], ["info"] = ""}
+                        g_s_mode = airtalk.MODE_PERSON
+                        speech_on(obj["ssrc"], obj["audio_code"] == "amr-nb" and 8000 or 16000)
+                    else
+                        new_obj = {["result"] = "failed", ["topic"] = obj["topic"], ["info"] = "topic error"}
+                    end
+                elseif obj["type"] == "broadcast" then  -- 1对多对讲
                     g_s_topic = obj["topic"]
-                    g_remote_id = from
                     new_obj = {["result"] = SUCC, ["topic"] = obj["topic"], ["info"] = ""}
-                    speech_on(airtalk.MODE_PERSON, obj["ssrc"], obj["audio_code"] == "amr-nb" and 8000 or 16000)
-                else
-                    new_obj = {["result"] = "failed", ["topic"] = obj["topic"], ["info"] = "topic error"}
+                    g_s_mode = airtalk.MODE_GROUP_LISTENER
+                    speech_on(obj["ssrc"], obj["audio_code"] == "amr-nb" and 8000 or 16000)
                 end
             end
         else
@@ -248,12 +256,23 @@ local function airtalk_mqtt_task()
                             log.info("向", res, "主动发起对讲")
                             g_state = SP_T_CONNECTING
                             g_remote_id = res
-                            g_s_topic = "audio/" .. g_local_id .. "/" .. g_remote_id .. "/" .. mcu.ticks()
-                            g_mqttc:publish("ctrl/uplink/" .. g_local_id .."/0003", json.encode({["topic"] = g_s_topic}))
+                            g_s_mode = airtalk.MODE_PERSON
+                            g_s_topic = "audio/" .. g_local_id .. "/" .. g_remote_id .. "/" .. (string.sub(tostring(mcu.ticks()), -4, -1))
+                            g_mqttc:publish("ctrl/uplink/" .. g_local_id .."/0003", json.encode({["topic"] = g_s_topic, ["type"] = "one-on-one"}))
                         else
                             log.info("找不到有效的设备ID")
                         end
                     end
+                elseif msg[1] == MSG_GROUP_SPEECH_TEST_START then
+                    if g_state ~= SP_T_IDLE then
+                        log.info("正在对讲无法开始")
+                    else
+                        log.info("测试一下1对多对讲功能")
+                        g_state = SP_T_CONNECTING
+                        g_s_mode = airtalk.MODE_GROUP_SPEAKER
+                        g_s_topic = "audio/" .. g_local_id .. "/all/" .. (string.sub(tostring(mcu.ticks()), -4, -1))
+                        g_mqttc:publish("ctrl/uplink/" .. g_local_id .."/0003", json.encode({["topic"] = g_s_topic, ["type"] = "broadcast"}))
+                    end
                 elseif msg[1] == MSG_SPEECH_STOP_TEST_END then
                     if g_state ~= SP_T_CONNECTING and g_state ~= SP_T_CONNECTED then
                         log.info("没有对讲", g_state)

+ 2 - 1
luat/demo/airtalk/demo_define.lua

@@ -9,7 +9,8 @@ MSG_SPEECH_ON_IND = 2
 MSG_SPEECH_OFF_IND = 2
 
 MSG_PERSON_SPEECH_TEST_START = 20
-MSG_SPEECH_STOP_TEST_END = 21
+MSG_GROUP_SPEECH_TEST_START = 21
+MSG_SPEECH_STOP_TEST_END = 22
 
 
 MSG_READY = 10

+ 17 - 5
luat/demo/airtalk/main.lua

@@ -1,3 +1,6 @@
+--演示airtalk基本功能
+--按一次boot,开始1对1对讲,再按一次boot,结束对讲
+--按一次powerkey,开始1对多对讲,再按一次powerkey或者boot,结束对讲
 PROJECT = "airtalk_demo"
 VERSION = "1.0.1"
 PRODUCT_KEY = "s1uUnY6KA06ifIjcutm5oNbG3MZf5aUv" -- 到 iot.openluat.com 创建项目,获取正确的项目id
@@ -9,13 +12,18 @@ require "audio_config"
 
 --errDump.config(true, 600, "airtalk_test")
 mcu.hardfault(0)
-local function key_cb()
-    sys.sendMsg(USER_TASK_NAME, MSG_KEY_PRESS)
-    log.info("boot key press once")
+local function boot_key_cb()
+    sys.sendMsg(USER_TASK_NAME, MSG_KEY_PRESS, false)
+end
+
+local function power_key_cb()
+    sys.sendMsg(USER_TASK_NAME, MSG_KEY_PRESS, true)
 end
 
 --按下boot开始上传,再按下停止,加入了软件去抖,不需要长按了
-gpio.setup(0, key_cb, gpio.PULLDOWN, gpio.RISING)
+gpio.setup(0, boot_key_cb, gpio.PULLDOWN, gpio.RISING)
+gpio.debounce(0, 200, 1)
+gpio.setup(gpio.PWR_KEY, power_key_cb, gpio.PULLUP, gpio.FALLING)
 gpio.debounce(0, 200, 1)
 
 local test_ready = false
@@ -35,7 +43,11 @@ local function user_task()
     local msg
     while true do
         msg = sys.waitMsg(USER_TASK_NAME, MSG_KEY_PRESS)
-        sys.sendMsg(AIRTALK_TASK_NAME, MSG_PERSON_SPEECH_TEST_START)   --测试阶段自动给一个device打
+        if msg[2] then  -- true powerkey false boot key
+            sys.sendMsg(AIRTALK_TASK_NAME, MSG_GROUP_SPEECH_TEST_START)   --测试阶段自动给一个device打
+        else
+            sys.sendMsg(AIRTALK_TASK_NAME, MSG_PERSON_SPEECH_TEST_START)   --测试阶段自动给一个device打
+        end 
         msg = sys.waitMsg(USER_TASK_NAME, MSG_KEY_PRESS)
         sys.sendMsg(AIRTALK_TASK_NAME, MSG_SPEECH_STOP_TEST_END)        --再按一次就自动挂断
     end