CALL(通话)
# 简介
对于只支持 4G 的 CAT1模块(Air720UG、Air724UG)而言,需要用本命令打开 VOLTE 功能才能进行语音通话。而 Air720UH 模块支持 4G 和 2G,而 2G 支持语音通话,所以不需要打开 VOLTE 就可以进行语音通话。但不支持电信2G
- 注:724 不支持视频通话
---
## API说明
cc的API在LuatOS-Air lib有做封装,建议直接用lib的API接口。
|API接口| 描述|
| --- | --- |
|cc.anyCallExist()|是否存在通话|
|cc.getState(num)|查询某个号码的通话状态|
|cc.dial(num, delay)|呼出电话|
|cc.hangUp(num)|挂断通话|
|cc.accept(num)|接听电话|
|cc.transVoice(data, loop, downLinkPlay)|通话中发送声音到对端,必须是12.2K AMR格式|
|cc.dtmfDetect(enable, sens)|设置dtmf检测是否使能以及灵敏度|
|cc.sendDtmf(str, playtime, intvl)|发送dtmf到对端|
|audio.setMicGain(mode,level)|设置mic增益等级|
> 详细的API介绍见[cc API章节](https://doc.openluat.com/wiki/21?wiki_page_id=2267 "cc API章节")
## 实现流程
- 订阅消息的回调函数
通过sys.subscribe()订阅客户需要处理的消息的回调函数。
- 来电处理
来电会上报CALL_INCOMING消息,我们这里只需要处理上面CALL_INCOMING注册的回调函数就可以了。
- 接通来电
通过调用cc.accept()来接通电话。
- 电话接通
电话接通时会上报CALL_CONNECTED消息,我们这里只需要处理上面CALL_CONNECTED注册的回调函数就可以了。
- 主动挂断电话
主动挂断电话通过调用cc.hangUp()来实现。
- 通话结束
通话结束后会有CALL_DISCONNECTED消息上报,我们这里只需要处理上面CALL_DISCONNECTED注册的回调函数就可以了。
- 拨打电话
拨打电话通过调用cc.dial()来实现。
- 设置mic增益等级
通过audio.setMicGain()接口设置通话中mic增益,且必须在通话建立以后设置。
## 示例
相关实例程序在脚本库的demo\call下,这里主要是大概讲了一下主要流程,其它细节部分可以下载demo研究完整的代码。
### 订阅消息
这里由于一些事件是通过消息驱动处理的,所有我们订阅需要处理的消息,这里我们订阅了,网络注册消息,来电,接通,结束消息。
```lua
sys.subscribe("NET_STATE_REGISTERED",ready)
sys.subscribe("CALL_INCOMING",incoming)
sys.subscribe("CALL_CONNECTED",connected)
sys.subscribe("CALL_DISCONNECTED",disconnected)
```
### 接通来电
这里通过注册按键的方式来接通电话的,这个注册了POWER_KEY_IND按键消息,当收到我们按下键的消息后,这里就会调用cc.accept()来接通电话。
```lua
sys.subscribe("POWER_KEY_IND",function() audio.stop(function() cc.accept(num) end) end)
```
### 挂断电话
这个是在接通电话的处理函数中,开机了一个定时器,通话110秒后,通过调用cc.hangUp()主动挂断电话。
```lua
local function connected(num)
log.info("testCall.connected")
--110秒之后主动结束通话
sys.timerStart(cc.hangUp,110000,num)
end
```
### 拨打电话
这里是在收到网络注册NET_STATE_REGISTERED的消息后,启动了一个定时去10秒后通过调用cc.dial()来拨打电话。
```lua
--- “通话功能模块准备就绪””消息处理函数
-- @return 无
local function ready()
log.info("tesCall.ready")
--呼叫10086
sys.timerStart(cc.dial,10000,"10086")
end
```
### 设置mic增益等级
audio.setMicGain(mode,level)通话中设置mic增益,必须在通话建立以后设置,mode表示增益类型:这里设置为"call",level表示增益等级,取值为0-7。
```
audio.setMicGain("call",7)
```
## 常见问题
1. 打不了电话,确认能不能正常注册上网络,有没有欠费。确认是否开通VOLTE 功能, 只有开通 VOLTE 功能才能进行语音通话。固件是否支持VOLTE功能。
2. 天线厂调试天线时,如何提供来电自动接听的软件
ril.regUrc("RING",function()ril.request("ATA") end)
3. audio.setMicGain()通话中设置mic增益,必须在通话建立以后设置
4. 紧急号码拨号问题:
- 常用紧急号码:报警求助 110 ,火警119 ,医疗救护 120 ,交通事故 122
- 拨号流程: 移动卡注册时拨打110号码时是走的正常号码呼叫,VOLTE正常能正常接通;电信卡注册时网络是提供了一个紧急号码列表给终端,110在其列表里面,所以拨打110时终端走的是紧急呼叫,网络又实际不支持,所以会CSFB TO 2G尝试,所以打不通。而加上区号走的是正常号码呼叫流程,在LTE下可以呼叫成功。
- 具体实测数据如下:
724开发板测试4G情况,720UH开发板测试2G情况,110,119,120,122情况应该一样,这里没有全部拨打,下面列举的是实际测试过的情况。
| 卡 | 网络| 紧急号码是否加区号| 是否可以成功呼叫紧急号码| 成功或失败的原因|
| --- | --- | --- | --- | --- |
| 不插卡| 2G| 加区号| 112打不通,110,119,120,122打不通| 只能拨打紧急号码|
| 不插卡| 2G| 不加区号| 112打通语音提示,110,119,120,122打通语音提示| 属于紧急号码可以打通|
| 不插卡|4G| 加区号| 112打不通,110,119,120,122打不通| 4G网络不支持紧急拨号|
| 不插卡|4G| 不加区号| 112打不通,110,119,120,122打不通| 4G网络不支持紧急拨号|
| 移动卡|2G| 加区号| 112提示号码不存在,110可以正常打通| 112加区号当不存在号码处理,110当普通号码处理|
| 移动卡|2G| 不加区号| 112打通语音提示,110可以正常打通| 属于紧急号码可以打通|
| 移动卡|4G| 加区号| 112打不通,110可以正常打通| 112加区号当不存在号码处理,110当普通号码处理|
| 移动卡|4G| 不加区号| 112打不通,110,119,120可以正常打通| 112当不存在号码处理,110,119,120当普通号码处理|
| 联通卡|2G| 加区号| 112提示号码不存在,110可以正常打通| 112加区号当不存在号码处理,110当普通号码处理|
| 联通卡|2G| 不加区号| 112打通语音提示,110可以正常打通| 属于紧急号码可以打通|
| 联通卡|4G| 加区号| 112打不通,110可以正常打通| 112加区号当不存在号码处理,110当普通号码处理|
| 联通卡|4G| 不加区号| 112打不通,110可以正常打通| 112当不存在号码处理,110当普通号码处理|
| 电信卡|2G| 加区号|112打不通,110打不通| 不支持电信2G|
| 电信卡|2G| 不加区号| 112打不通,110打不通| 不支持电信2G|
| 电信卡|4G| 加区号| 112提示号码不存在,110可以正常打通| 112加区号当不存在号码处理,110当普通号码处理|
| 电信卡|4G| 不加区号|112打不通,110打不通| 当紧急号码处理,4G网络不支持紧急拨号|
5. 通话过程中给对端播放音频文件。
1.3 lua 从3032版本开始,已经支持通话过程中,给对端播放音频文件功能,接口如下:

6. CAT1是否支持视频通话?
不支持
7. 移动、电信,联通卡的通话功能支持情况列表
固件是否支持VOLTE可以通过固件名称判断,带有NOVOLTE标志的,说明不支持VOLET。也可以通过AT口发送AT+SETVOLTE?查询,0 表示关闭VOLET,1表示打开VOLET功能。
| 模块 | 卡 | 固件是否支持VOLTE | 是否支持通话功能 |
| ------ | ---- | ------------------ | ------------------------ |
| 720UH | 移动卡 | 是 | 是 |
| 720UH | 移动卡 | 否 | 是 |
| 720UH | 联通卡 | 是 | 是 |
| 720UH | 联通卡 | 否 | 是 |
| 720UH | 电信卡 | 是 | 是,卡要开通VOLTE功能 |
| 720UH | 电信卡 | 否 | 否 |
| 724UG | 移动卡 | 是 | 是,卡要开通VOLTE功能 |
| 724UG | 移动卡 | 否 | 否 |
| 724UG | 联通卡 | 是 | 是,卡要开通VOLTE功能 |
| 724UG | 联通卡 | 否 | 否 |
| 724UG | 电信卡 | 是 | 是,卡要开通VOLTE功能 |
| 724UG | 电信卡 | 否 | 否 |
8. 模块是否有电话呼入白名单设置?
不支持,脚本处理,设置一个白名单列表,不在白名单的来电直接挂掉就可以。
9. 连接耳机的时候,通电话过程中,耳机没有声音
默认是喇叭输出,可以通过audio.setChannel(1)设置耳机输出。
详细接口说明:[音频播放](https://doc.openluat.com/wiki/21?wiki_page_id=2327 "音频播放")
10. 暂不支持视频通话,且因为只有30W像素,效果较差
11. 支持dtmf解码功能么,模组在电话通话中,能识别对方电话按键吗?
不能,暂不支持。
12. 可以读到SIM卡的手机号码(MSISDN)吗?
目前有两种方式可以获取本机号码:
一. sim卡出厂时,可以写入自己的手机号码到sim卡中,但这不是强制要求的。在中 国,运营商制卡时基本上都不会写入手机号码。如果可以确认自己用的sim卡中已经存储了手机号码,可以通过如下方式读取手机号码:
开机后调用sim.setQueryNumber(true)打开查询本机号码功能,会自动查询本机号码;可通过sim.getNumber()获取查询结果
二. 模块开机后,sim卡向短信平台发送一条短信(短信内容中可以包含imei或者imsi),短信平台收到短信后,识别手机号码后,可通过如下方式通知模块手机号码:
1) 短信平台下发一条短信给模块,短信内容中包含手机号码,模块收到后解析出号码
2) 模块连接一个后台服务器,后台服务器与短信平台相连,根据imei或者imsi读取到对应的手机号码,然后把这个号码,下发给imei或者imsi对应的模块
13. Air720 UH模块,不能通话
1)720UH模块仅支持2G和4G网络
2)可以使用2G网络通话,但是现在全国各地的2G联通网络已经基本退网了
3)可以使用3G网络通话,但是我们的720UH模块不支持3G网络,所以在我们的模块上不能通话
4)可以使用4G网络VoLTE通话,前提是这张卡需要开通VoLTE功能,这样才能在我们的720UH模块上使用4G网络通话
客户想用2G通话,结果不行,因为联通2G已经退网,后来用4G也不能通话,因为他们这张卡未开通VoLTE功能。
14. 4G模块打电话然后手机里面会听到回音
确认是不是喇叭的声音串到Mic声音里了,可以用耳机测试一下,看是否能听到回音
15. 参考DEMO播放来电铃音,用file播放 , 文件是直接放在SD里,播放失败
确认是否有挂载SD卡