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版本开始,已经支持通话过程中,给对端播放音频文件功能,接口如下: ![image.png](https://cdn.openluat-luatcommunity.openluat.com/images/20210615140007798_image.png) 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卡