接打电话
一、演示功能概述
VoLTE(Voice over LTE)是通过 LTE 网络实现的高清语音通话技术,基于 IMS(IP 多媒体子系统)架构,支持语音与数据并发传输,提供更低时延、更高清晰度的通话体验。
本章节将使用 Air8000 整机开发板演示 VOLTE 通话功能的使用方法。实现拨打接听电话的功能,接听电话是在回调中响铃三声后自动接听;拨打电话是板子上电,volte 初始化好后 10 秒钟拨打一个电话,测试的时候拨打的手机号注意修改成自己的,拨打电话此段代码默认是注释掉状态。
二、准备硬件环境
参考:硬件环境清单第二章节内容,准备以及组装好硬件环境。
2.1 Air8000 整机开发板
开发板购买连接:点击购买 air8000。注意需要购买整机开发板,整机开发板集成了 codec、功放 pa 等。
2.2 喇叭
三、准备软件环境
1. 烧录工具 Luatools;
2. 内核固件文件(底层 core 固件文件):目前先下载此固件,此固件底层集成了 VOLTE 功能
3. LuatOS 需要的脚本和资源文件:https://gitee.com/openLuat/LuatOS-Air8000/tree/master/Core_board_demo/cc
4. lib 脚本文件:使用 Luatools 烧录时,勾选 添加默认 lib 选项,使用默认 lib 脚本文件;
准备好软件环境之后,接下来查看如何烧录项目文件到 Air8000 开发板中,将本篇文章中演示使用的项目文件烧录到 Air8000 开发板中。
四、软硬件资料
4.1 API 接口介绍
cc - luatos@air8000 - 合宙模组资料中心
4.2 硬件设计介绍
要满足 VOLTE 功能的话需要选用带有录音功能的 codec 芯片,开发板上是 es8311,电路参考设计可参考下面。
五、代码示例介绍
5.1 代码介绍
-- LuaTools需要PROJECT和VERSION这两个信息
PROJECT = "ccdemo"
VERSION = "1.0.0"
log.style(1)
--[[
本demo需要外挂ES8311 codec芯片
]]
-- sys库是标配
sys = require("sys")
if wdt then
--添加硬狗防止程序卡死,在支持的设备上启用这个功能
--wdt.init(9000)--初始化watchdog设置为9s
--sys.timerLoopStart(wdt.feed, 3000)--3s喂一次狗
end
local up1 = zbuff.create(6400,0) --上行数据保存区1
local up2 = zbuff.create(6400,0) --上行数据保存区2
local down1 = zbuff.create(6400,0) --下行数据保存区1
local down2 = zbuff.create(6400,0) --下行数据保存区2
local cnt = 0
gpio.setup(24, 1, gpio.PULLUP) -- i2c工作的电压域
mcu.altfun(mcu.I2C, 0, 13, 2, 0) --复用pin80为i2c0_scl
mcu.altfun(mcu.I2C, 0, 14, 2, 0) --复用pin81为i2c0_sda
local multimedia_id = 0 -- 音频通道 0
local i2c_id = 0 -- i2c_id 0
local i2s_id = 0 -- i2s_id 0
local i2s_mode = 0 -- i2s模式 0 主机 1 从机
local i2s_sample_rate = 16000 -- 采样率
local i2s_bits_per_sample = 16 -- 数据位数
local i2s_channel_format = i2s.MONO_R -- 声道, 0 左声道, 1 右声道, 2 立体声
local i2s_communication_format = i2s.MODE_LSB -- 格式, 可选MODE_I2S, MODE_LSB, MODE_MSB
local i2s_channel_bits = 16 -- 声道的BCLK数量
local pa_pin = 16 -- 喇叭pa功放脚
local pa_on_level = 1 -- PA打开电平 1 高电平 0 低电平
local pa_delay = 100 -- 在DAC启动后,延迟多长时间打开PA,单位1ms
local power_pin = 8 -- es8311电源使能脚
local power_on_level = 1 -- 电源控制IO的电平,默认拉高
local power_delay = 3 -- 在DAC启动前插入的冗余时间,单位100ms
local power_time_delay = 100 -- 音频播放完毕时,PA与DAC关闭的时间间隔,单位1ms
local voice_vol = 70 -- 喇叭音量
local mic_vol = 65 -- 麦克风音量
local function record(is_dl, point)
if is_dl then
log.info("下行数据,位于缓存", point+1, "缓存1数据量", down1:used(), "缓存2数据量", down2:used())
else
log.info("上行数据,位于缓存", point+1, "缓存1数据量", up1:used(), "缓存2数据量", up2:used())
end
log.info("通话质量", cc.quality())
-- 可以在初始化串口后,通过uart.tx来发送走对应的zbuff即可
end
sys.subscribe("CC_IND", function(state)
if state == "READY" then
sys.publish("CC_READY")
elseif state == "INCOMINGCALL" then
cnt = cnt + 1
if cnt > 3 then
cc.accept(0) --自动接听
end
elseif state == "HANGUP_CALL_DONE" or state == "MAKE_CALL_FAILED" or state == "DISCONNECTED" then
audio.pm(0,audio.STANDBY)
-- audio.pm(0,audio.SHUTDOWN) --低功耗可以选择SHUTDOWN或者POWEROFF,如果codec无法断电用SHUTDOWN
end
end)
function cc_setup()
cc.record(true, up1, up2, down1, down2)
pm.power(pm.LDO_CTL, false) --开发板上ES8311由LDO_CTL控制上下电
sys.wait(100)
pm.power(pm.LDO_CTL, true) --开发板上ES8311由LDO_CTL控制上下电
i2c.setup(i2c_id,i2c.FAST) --设置i2c
i2s.setup(i2s_id, i2s_mode, i2s_sample_rate, i2s_bits_per_sample, i2s_channel_format, i2s_communication_format,i2s_channel_bits)
audio.config(multimedia_id, pa_pin, pa_on_level, power_delay, pa_delay, power_pin, power_on_level, power_time_delay)
audio.setBus(multimedia_id, audio.BUS_I2S,{chip = "es8311", i2cid = i2c_id, i2sid = i2s_id}) --通道0的硬件输出通道设置为I2S
audio.vol(multimedia_id, voice_vol)
audio.micVol(multimedia_id, mic_vol)
cc.init(multimedia_id) --初始化电话功能
sys.waitUntil("CC_READY")
sys.wait(10000)
--cc.dial(0,"158xxxxxxxxxx") --拨打电话
end
cc.on("record", record)--注册cc事件回调
sys.taskInit(cc_setup) --初始化cc
-- sys.taskInit(function()
-- while 1 do
-- -- 打印内存状态, 调试用
-- sys.wait(1000)
-- log.info("lua", rtos.meminfo())
-- log.info("sys", rtos.meminfo("sys"))
-- end
-- end)
-- 用户代码已结束---------------------------------------------
-- 结尾总是这一句
sys.run()
-- sys.run()之后后面不要加任何语句!!!!!
5.2 功能测试
5.2.1 接听电话情况:
可以通过日志看到模组响三声后成功接听,并打印上下行通话数据,双 buff 缓冲区交替接收打印:
5.2.2 拨打电话情况:
此功能在代码中默认是注释掉的,测试的时候需要打开并修改手机号,VOLTE 初始化成功后延时 10s 拨打电话:
六、总结
至此,我们已经用 Air8000 整机开发板演示了 VOLTE 功能。
七、常见问题与注意事项
打不了电话
- 要确认固件是否支持 VOLTE 功能,只有支持 VOLTE 功能的固件才能进行通话
- 确认 sim 卡是否开通 VOLTE 功能,sim 卡有没有欠费
日志中 LUAT_MOBILE_EVENT_CC status 返回的数字都代表什么意思
0 : 通话准备完成,可以拨打电话了
1 : 有来电
2 : 有来电号码
3 : 已接通电话号码
4 : 电话已经接通
5 : 电话被对方挂断
6 : 通话开始
7 : 拨打电话请求成功
8 : 拨打电话请求失败
9 : 接听电话请求完成
10 : 挂断电话请求完成
11 : 电话列表,未实现
12 : 电话功能相关音频控制