Luat Demo | 给我十分钟,教你实现Cat.1语音通话功能!
作者:互联网
语音通话是Cat.1模组的重要应用功能之一,合宙官方提供了Luat Demo,便于广大客户在手机、对讲机、电话手表等终端开发中参考运用。
合宙Cat.1系列中,Air720UH模组支持4G+2G,可直接使用语音通话功能;其他只支持4G制式的模组(如Air720UG、Air724UG),均需先打开VoLTE功能才能进行语音通话。
本文将以Air724UG开发板为例进行实操演示,Demo源码可通过LuaTools或LuatIDE获取。
前期主要准备工作
硬件准备:
EVB_Air724UG_A13开发板(本文操作适用于合宙Cat.1系列的开发板),以及天线、SIM卡、USB线。
软件准备:
Windows电脑搭建Luat开发环境,可参考下文:
https://doc.openluat.com/wiki/21?wiki_page_id=1923
API说明:
https://doc.openluat.com/wiki/21?wiki_page_id=2267
通话功能Demo实操演示
例程参考:
CALL通话功能相关实例程序,在LuaTools/LuatIDE脚本库的demo\call文件夹下。
最新版LuatIDE下载:
https://marketplace.visualstudio.com/items?itemName=luater.luatide
脚本逻辑:
1)订阅信息函数
通话的相关事件是通过消息驱动的,首先通过sys.subscribe()注册消息处理函数。我们通过订阅来电、接通、结束消息的处理函数,来做不同场景的处理。
sys.subscribe("CALL_INCOMING",incoming)
sys.subscribe("CALL_CONNECTED",connected)
sys.subscribe("CALL_DISCONNECTED",disconnected)
2)播放来电铃音
通过来电消息处理函数,当有电话打进来的时候,模块会上报CALL_INCOMING来电的消息,我们在上面注册的消息回调函数incoming()里去做处理。
此处主要是播放来电铃音,也可以通过TTS方式播放一段语言,同时注册了一个按键消息用于接通电话。
local function incoming(num)
log.info("testCall.incoming:"..num)
if not coIncoming then
coIncoming = sys.taskInit(function()
while true do
--audio.play(1,"TTS","来电话啦",4,function() sys.publish("PLAY_INCOMING_RING_IND") end,true)
audio.play(1,"FILE","/lua/call.mp3",4,function() sys.publish("PLAY_INCOMING_RING_IND") end,true)
sys.waitUntil("PLAY_INCOMING_RING_IND")
break
end
end)
sys.subscribe("POWER_KEY_IND",function() audio.stop(function() cc.accept(num) end) end)
end
end
3)接通来电
通过注册开机键的消息来接通电话,收到POWER_KEY_IND按键消息后,先停止之前的来电铃声,然后调用cc.accept()函数来接电话。
sys.subscribe("POWER_KEY_IND",function() audio.stop(function() cc.accept(num) end) end)
4)设置mic增益等级及相关操作
通话建立,电话接通后会上报CALL_CONNECTED消息。此时我们就可以在上面注册的connected()函数里做想做的事情了。
比如:设置MIC增益,调用callVolTest()接口5秒钟调节一次音量,通过TTS播放的方式向对面播放一段语音,最后启动一个110S的定时器通过cc.hangUp()挂断电话。
local function callVolTest()
local curVol = audio.getCallVolume()
curVol = (curVol>=7) and 1 or (curVol+1)
log.info("testCall.setCallVolume",curVol)
audio.setCallVolume(curVol)
end
local function connected(num)
log.info("testCall.connected")
coIncoming = nil
--通话中设置mic增益,必须在通话建立以后设置
--audio.setMicGain("call",7)
--通话中音量测试
sys.timerLoopStart(callVolTest,5000)
--通话中向对方播放TTS测试
audio.play(7,"TTS","通话中TTS测试",7,nil,true,2000)
--110秒之后主动结束通话
sys.timerStart(cc.hangUp,110000,num)
end
5)挂断电话
通话结束,电话挂断之后会上报CALL_DISCONNECTED消息,用来通知通话结束。在disconnected()消息处理函数中,主要是置位一些变量,停止之前开启的定时器、音频播放等。
local function disconnected()
coIncoming = nil
log.info("testCall.disconnected")
sys.timerStopAll(cc.hangUp)
sys.timerStop(callVolTest)
audio.stop()
end
6)拨打电话
这里是在收到网络注册NET_STATE_REGISTERED的消息后,启动了一个定时器10秒后通过调用cc.dial()来拨打电话。
--- “通话功能模块准备就绪””消息处理函数
-- @return 无
local function ready()
log.info("tesCall.ready") --呼叫10086
sys.timerStart(cc.dial,10000,"10086")
end
7)通话过程中给对方播放音频
添加demo/audio/testAudioStream.lua的testAudioStream.,在以下代码中添加参数audiocore.PLAY_VOLTE:
curr_len = curr_len +
audiocore.streamplay(tStreamType,string.sub(data,curr_len,-1),audiocore.PLAY_VOLTE)
local function testAudioStream(streamType)
sys.taskInit(
function()
while true do
tStreamType = streamType
log.info("AudioTest.AudioStreamTest", "AudioStreamPlay Start", streamType)
local tAudioFile =
{
[audiocore.AMR] = "tip.amr",
[audiocore.SPX] = "record.spx",
[audiocore.PCM] = "alarm_door.pcm",
[audiocore.MP3] = "sms.mp3"
}
local fileHandle = io.open("/lua/" .. tAudioFile[streamType], "rb")
if not fileHandle then
log.error("AudioTest.AudioStreamTest", "Open file error")
return
end
while true do
local data = fileHandle:read(streamType == audiocore.SPX and 1200 or 1024)
if not data then
fileHandle:close()
while audiocore.streamremain() ~= 0 do
sys.wait(20)
end
sys.wait(1000)
audiocore.stop() --添加audiocore.stop()接口,否则再次播放会播放不出来
log.warn("AudioTest.AudioStreamTest", "AudioStreamPlay Over")
return
end
local data_len = string.len(data)
local curr_len = 1
while true do
curr_len = curr_len + audiocore.streamplay(tStreamType,string.sub(data,curr_len,-1),audiocore.PLAY_VOLTE)
if curr_len>=data_len then
break
elseif curr_len == 0 then
log.error("AudioTest.AudioStreamTest", "AudioStreamPlay Error", streamType) return
end
sys.wait(10)
end
sys.wait(10)
end
end
end
)
end
在connected添加一行testAudioStream(audiocore.AMR) ,添加tip.amr烧录。调试电话接通后对方即有tip.amr的音频播放。
通话功能常见问题
打不了电话,如何排查原因:
确认能不能正常注册上网络,有没有欠费;
确认是否开通VoLTE功能,只有开通VoLTE功能才能进行语音通话;
确认固件是否支持VoLTE功能。
调试天线时,如何设置来电自动接听:
ril.regUrc(“RING”,function()ril.request(“ATA”) end)
Cat.1是否支持视频通话?
不支持
mic增益设置:
audio.setMicGain()通话中设置mic增益,必须在通话建立以后设置。
固件是否支持VoLTE:
可以通过固件名称判断,带有NOVoLTE标志的,说明不支持VoLET。 也可以通过AT口发送AT+SETVOLTE?查询,0
表示关闭VoLET,1表示打开VoLET功能。
标签:function,end,Luat,Demo,Cat.1,len,sys,通话,audiocore 来源: https://www.cnblogs.com/luat/p/14987653.html