1  呼叫保持整体流程

        以下是呼叫保持的整体流程图

 

 前提条件UE1 和 UE2 已经建立正常通话

2  呼叫保持流程及 log 分析

1  UI 向 QMI 发送 Hold  Call 请求

        关键字:QMI --> Service_VOICE --> VOIP_SUPS_TYPE_CALL_HOLD

02:36:06.580172	[0x1544]	QMI_MCS_QCSI_PKT
packetVersion = 2
V2 {
   MsgType = Request										//Hold call 请求消息
   MinorRev = 106											//消息 ID
   Service_VOICE {
      ServiceVOICEV2 {
         voice_manage_ip_calls {
            voice_manage_ip_calls_reqTlvs[0] {
               sups_type {
                  sups_type = VOIP_SUPS_TYPE_CALL_HOLD		//Hold Call请求标志
               }
            }
         }
      }
   }
}

2  QMI 向 CM 发送 Hold  Call 请求

        关键字:Call Manager

        QMI调用cm_mm_call_cmd_sups()函数向CM发送Hold Call请求

02:36:06.580156        Call Manager/High      [        cm.c   6963] =CM= CM_CALL_CMD_SUPS client 17, sups_type 16, as_id 0	//QMI命令 cm 发送呼叫相关的补充服务
02:36:06.580156        Call Manager/High      [     cmdbg.c   3646] >>CM callcmd 3, tsk=qmi_mmode, client_type=17			//CM收到来自QMI的Hold Call请求
cm_mm_call_cmd_sups() --> 命令 cm 发送呼叫相关的补充服务
sups_type:16 --> CM_CALL_SUPS_TYPE_HOLD_PER_CALL
call cmd:3 --> CM_CALL_SUPS_TYPE_HOLD_CALL

3  CM 向 IMS 发送 CM_CALL_SUPS_TYPE_HOLD_CALL(cmd:3) 命令以保持呼叫,IMS 使用 CM_CALL_EVENT_SUPS(Call_event 4) 响应 CM

        关键字:Call Manager | Data Services --> qmi_if_call_event_cb

02:36:06.581042      Call Manager/High     [    cmipcall.c   5583] =CM= IP CALLCMD: cmd=3, as_id=0, is_ims_cap_on_sub=1
02:36:06.581042      Call Manager/Medium   [     cmipapp.c   5759] =CM= CM->IMS: CMIPAPP: Send Hold for call 0, as_id 0	   //“呼叫保持”请求从CM发送到IMS
02:36:06.581042      Data Services/Medium  [   ds_qmi_if.c   2130] Call_event 4 received in qmi_if_call_event_cb		   //CM收到IMS的响应
all cmd:3 --> CM_CALL_SUPS_TYPE_HOLD_CALL
Call_event:4 --> CM_CALL_EVENT_SUPS

4  IMS 向 SIP 服务器发送邀请

        关键字:OTA

02:36:06.590046	[0x156E]	IMS SIP Message
Version = 1
Version 1 {
   Direction = UE_TO_NETWORK
   Message ID = IMS_SIP_INVITE
   Response Code = INFORMAL_RESPONSE (0)	//IMS向SIP服务器发送“连接请求”
}
02:36:06.636014	[0x156E]	IMS SIP Message
Version = 1
Version 1 {
   Direction = NETWORK_TO_UE
   Message ID = IMS_SIP_INVITE
   Response Code = TRYING (100)				//SIP服务器返回100 TRYING
}

5  SIP 服务器向 IMS 发送 200 OK

        关键字:OTA

02:36:07.099004	[0x156E]	IMS SIP Message
Version = 1
Version 1 {
   Direction = NETWORK_TO_UE
   Message ID = IMS_SIP_INVITE
   Response Code = OK (200)					//SIP服务器回复200 OK
}
02:36:07.103012	[0x156E]	IMS SIP Message
Version = 1
Version 1 {
   Direction = UE_TO_NETWORK
   Message ID = IMS_SIP_ACK
   Response Code = INFORMAL_RESPONSE (0)	//IMS向SIP服务器回复ACK
}

6   IMS 向 CM 发送 CM_IP_CALL_IND_CALL_HOLD 指示

        关键字:Call Manager

02:36:07.107995          Call Manager/High        [           cmipapp.c   4078] =CM= IMS_RPT: RPT name 606
02:36:07.107995          Call Manager/High        [            cmtask.c  10965] =CM= CM<< IP cmd:606
02:36:07.107995          Call Manager/High        [          cmipcall.c   4265] =CM= IP RXD: CALL_HOLD, id=0, as_id=0
cmd:606 --> CM_IP_CALL_IND_CALL_HOLD
IMS到QMI的流程:
IMS主动上报到CM,CM转发到QMI

7  CM 向 QMI 发送 CM_CALL_EVENT_CALL_ON_HOLD 事件

        关键字:Call Manager

02:36:07.107995      Call Manager/High    [   cmdbg.c   3914] =CM= <<CM1 callevt=46 <0>    //cm 发送CM_CALL_EVENT_CALL_ON_HOLD事件
callevt:46 -->  CM_CALL_EVENT_CALL_ON_HOLD

8  IMS 向 CM 发送 CM_IP_CALL_IND_SUPS_CONF 指示

        关键字:Call Manager

02:36:07.107995    Call Manager/High    [  cmipcall.c   2202] =CM= CM->CM: CM_IP_CALL_IND_SUPS_CONF, call_success 1, sups_type 0, as_id 0	//这里应该是IMS->CM
02:36:07.107995    Call Manager/High    [   cmipapp.c   4078] =CM= IMS_RPT: RPT name 609
609 --> CM_IP_CALL_IND_SUPS_CONF

9  CM 向 QMI 发送 CM_CALL_EVENT_MNG_CALLS_CONF 指示

        关键字:Call Manager

02:36:07.107995    Call Manager/High    [    cmtask.c  10965] =CM= CM<< IP cmd:609
02:36:07.107995    Call Manager/High    [  cmipcall.c   4625] =CM= IP RXD: SUPS_CONF, sups_type=16, num_part=0, participant=0x0 id=0, rpt asubs_id=0, is_ims_cap_on_sub=1
sups_type:16 --> CM_CALL_SUPS_TYPE_HOLD_PER_CALL

10  QMI 向 UI 返回 Hold Call 请求响应

        关键字:QMI --> Service_VOICE

02:36:07.109004	[0x1544]	QMI_MCS_QCSI_PKT
packetVersion = 2
V2 {
   MsgType = Response                                //Hold Call请求响应消息
   MinorRev = 106                                    //消息 ID
   Service_VOICE {
      ServiceVOICEV2 {
         voice_manage_ip_calls {
            voice_manage_ip_calls_respTlvs[0] {
               resp {
                  result = QMI_RESULT_SUCCESS        //Hold Call请求成功
                  error = QMI_ERR_NONE
               }
            }
         }
      }
   }
}

11 QMI 上报当前的电话状态

        关键字:QMI --> Service_VOICE --> voice_all_call_status

02:36:07.109004	[0x1544]	QMI_MCS_QCSI_PKT
packetVersion = 2
V2 {
   MsgType = Indication								//通话状态上报
   Service_VOICE {									//语音通话关键字
      ServiceVOICEV2 {
         voice_all_call_status {
            voice_all_call_status_indTlvs[0] {
               call_info {
                  num_of_instances = 1
                  call_info[0] {
                     call_id = 1
                     call_state = CALL_STATE_HOLD	//UE1和UE2处于HOLD状态
                     call_type = CALL_TYPE_VOICE_IP
                  }
               }
            }
            voice_all_call_status_indTlvs[2] {
               remote_party_number {
                  num_instances = 1					//当前有1路通话
                  remote_party_number[0] {			//当前通话(UE2)信息
                     call_id = 1
                     number_len = 11
                     number = { 
                        1, 5, 0, 2, 9, 2, 3, 0, 
                        0, 8, 6
                     }
                  }
               }
            }
         }
      }
   }
}

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐