域格模块下呼叫保持
一、呼叫保持是什么?
呼叫保持就是正在通话的移动用户,可以暂时中断数据原来的电话,而打出新的电话,同时与原来的电话保持联系;当需要回复原来的通话时,则使新打出的电话处于保持状态,再继续与原来的通话方通话,即可以通过操作手机的按键选择及切换这两个通话,还可以分别或同时结束与他们的通话。
二、使用步骤
作为一个通讯模块,呼叫保持是支持的。下面我介绍下呼叫保持相关步骤:
1.相关AT指令
模块设置呼叫保持相关示例:
AT+CCWA? //查询控制呼叫参数值
+CCWA:0 //0表示禁用主动请求,1表示启用主动请求
ok
AT+CCWA=1,1 //打开主动请求
ok
ATD10086;(A拨打的电话) //拨打电话
ok
B电话打会上报+CCWA:(B电话号码) //显示B电话打进来
+CCWA:"187****5357"
AT+CHLD=2 //接听B电话,保持A电话
ok
AT+CHLD=3 //还原A电话
ok
2.指令解析
代码如下(示例):
data = pd.read_csv(
'https://labfile.oss.aliyuncs.com/courses/1283/adult.data.csv')
print(data.head())
三、安卓下使用呼叫保持
1.安卓使用相关接口
平时模块较大的作用用于数据传输之类的,呼叫保持用的较多的功能还是属于安卓系统。多方通话的流程:
根据上面的流程下面给大家介绍下安卓打电话需要经常调用的事件接口:
case RIL_REQUEST_GET_CURRENT_CALLS:
requestGetCurrentCalls(data, datalen, t);
break;
case RIL_REQUEST_DIAL:
requestDial(data, datalen, t);
break;
这段是拨号接口
case RIL_REQUEST_HANGUP:
requestHangup(data, datalen, t);
break;
挂断接口
case RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND:
// 3GPP 22.030 6.5.5
at_send_command("AT+CHLD=0", NULL);
/* success or failure is ignored by the upper layer here.
it will call GET_CURRENT_CALLS and determine success that way */
RIL_onRequestComplete(t, RIL_E_SUCCESS, NULL, 0);
break;
释放所有保持的通话或设置“用户确定用户忙” 。
case RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND:
// 3GPP 22.030 6.5.5
at_send_command("AT+CHLD=1", NULL);
/* success or failure is ignored by the upper layer here.
it will call GET_CURRENT_CALLS and determine success that way */
RIL_onRequestComplete(t, RIL_E_SUCCESS, NULL, 0);
break;
释放所有活动调用(如果存在)并接受。
case RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE:
// 3GPP 22.030 6.5.5
// "Places all active calls (if any exist) on hold and accepts
// the other (held or waiting) call."
at_send_command("AT+CHLD=2", NULL);
将所有活跃的电话(如果存在)置于保持状态并接受。
2.安卓相关步骤
呼叫保持需要用到的接口RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE,呼叫保持相关的设置参考如下代码:
static void REQUEST_FUN(RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE)(void *data, size_t datalen, RIL_Token t)
{
RILDEBUG("%s: %d", __FUNCTION__, __LINE__ );
ATResponse *p_response = NULL;
int err = -1;
char buffer_command[128] = {0};
if((g_callcount > 1) && (-1 != s_incomingOrWaitingLine))
{
RILDEBUG(" HOLDING_AND_ACTIVE " );
sprintf(buffer_command, "AT+CHLD=2");
}
else
{
RILDEBUG(" ACTIVE " );
sprintf(buffer_command, "AT+CHLD=2");
}
}