其他分享
首页 > 其他分享> > Luat Demo | 给我十分钟,教你实现Cat.1语音通话功能!

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功能。

上海合宙通信模块 - 合宙Luat,让万物互联更简单

标签:function,end,Luat,Demo,Cat.1,len,sys,通话,audiocore
来源: https://www.cnblogs.com/luat/p/14987653.html