高通平台DTMF流程分析

DTMF配置

         DTMF的配置只会影响接收到的DTMF数据,并不会影响DTMF数据的发送和接收。

        一般不进行DTMF配置,UE在接收到DTMF数据后就会丢弃,所以听不到DTMF音。一般运营商默认不配置,需要在 overideconfig 文件中进行“DLDtmfMode=1”配置

        overideconfig 文件在设备中的路径:EFS --> efsprofiles

DTMF配置排查

        成功配置DTMF后,空闲时“DLDtmfMode=2”,工作时“DLDtmfMode=1”

        如果没有进行DTMF配置,DTMF全程都为2(“DLDtmfMode=2”)

        关键字:DLDtmfMode

//配置后的DTMF
15:29:38.433984    IMS RTP/Medium    [qvp_rtp_app_cmd.c   9498] DLDtmfMode=1 disableVarDjtrOpt=0, fltrAlphaVar=90minWVar=3, maxWVar=4, wVarstep=3 sldWinSize=150    //工作态:DLDtmfMode=1
15:29:38.433984    IMS RTP/Medium    [qvp_rtp_app_cmd.c   9498] DLDtmfMode=1 disableVarDjtrOpt=0, fltrAlphaVar=90minWVar=3, maxWVar=4, wVarstep=3 sldWinSize=150
15:29:38.810026    IMS RTP/Medium    [qvp_rtp_app_cmd.c   9498] DLDtmfMode=1 disableVarDjtrOpt=0, fltrAlphaVar=90minWVar=3, maxWVar=4, wVarstep=3 sldWinSize=150
15:29:38.810026    IMS RTP/Medium    [qvp_rtp_app_cmd.c   9498] DLDtmfMode=1 disableVarDjtrOpt=0, fltrAlphaVar=90minWVar=3, maxWVar=4, wVarstep=3 sldWinSize=150
15:29:51.720990    IMS RTP/Medium    [qvp_rtp_app_cmd.c   9498] DLDtmfMode=2 disableVarDjtrOpt=0, fltrAlphaVar=90minWVar=3, maxWVar=4, wVarstep=3 sldWinSize=150    //空闲态:DLDtmfMode=2
//未配置的DTMF
15:23:32.890000    IMS RTP/Medium    [qvp_rtp_app_cmd.c   9498] DLDtmfMode=2 disableVarDjtrOpt=0, fltrAlphaVar=90minWVar=3, maxWVar=4, wVarstep=3 sldWinSize=150
15:23:32.890000    IMS RTP/Medium    [qvp_rtp_app_cmd.c   9498] DLDtmfMode=2 disableVarDjtrOpt=0, fltrAlphaVar=90minWVar=3, maxWVar=4, wVarstep=3 sldWinSize=150
15:23:46.297161    IMS RTP/Medium    [qvp_rtp_app_cmd.c   9498] DLDtmfMode=2 disableVarDjtrOpt=0, fltrAlphaVar=90minWVar=3, maxWVar=4, wVarstep=3 sldWinSize=150

 DTMF配置

        关于在overideconfig 文件中配置DTMF:

  1. 首先在设备中激活当前问题的MBN
  2. 导出设备中的 overideconfig 文件
  3. 根据导出的 overideconfig 文件,匹配代码中的 overideconfig 文件
  4. 在代码中的 overideconfig 文件中添加配置。

    [MEDIA:MediaCommon]

    *DLDtmfMode = 1

        关于 overideconfig 文件的修改,请参考 KBA-170531044543 

DTMG发送流程

1.DTMF发送流程图

 2.DTMF发送流程

  1. CM通过QMI消息接收DTMF启动请求 (RIL --> CM)
  2. CM向IMS发送带内的DTMF开始发送消息 (CM --> IMS)
  3. IMS第一次发送DTMF到网络 (IMS --> NW)
  4. IMS接收DTMF发送消息并完成DTMF发送相关配置(IMS配置)
  5. CM通过QMI消息返回DTMF启动请求(CM --> RIL)
  6. IMS继续向网络发送DTMF(IMS --> NW)
  7. CM通过QMI消息接收DTMF释放/停止请求(RIL --> CM)
  8. CM向IMS发送带内的DTMF结束发送消息(CM --> IMS)
  9. IMS接收DTMF结束消息并完成DTMF结束相关配置(IIMS配置)
  10. CM通过QMI消息返回DTMF释放/停止请求(CM --> RIL)
  11. DTMF发送结束标识(IMS --> NW)
  12. IMS发送DTMF到网络的 RTP 数据包(IMS --> NW)
15:30:05.694244    QMI_MCS_QCSI_PKT       Length:   49                                                                                                 //CM通过QMI消息接收DTMF启动请求
15:30:05.694219    Call Manager/Medium    [cmipapp.c   5645] =CM= CM->IMS: CMIPAPP: Send start inband DTMF for call 10, as_id 0                        //CM向IMS发送带内的DTMF开始发送消息
15:30:05.694219    IMS/Medium             [qipcalldtmf.c    896] -----> Sending dtmf for digit = 49, duration = 20, end_bit = 0                        //IMS第一次发送DTMF到网络
15:30:05.694219    IMS/High               [qipcalldtmf.c    373] qipcall_start_dtmf_rpt_conf: Block call rpt ind = 0,Call Id=10, State=14, status = 1  //IMS接收DTMF发送消息并完成DTMF发送相关配置
15:30:05.695010    QMI_MCS_QCSI_PKT       Length:   55                                                                                                 //CM通过QMI消息返回DTMF启动请求
15:30:05.714271    IMS/Medium             [qipcalldtmf.c    896] -----> Sending dtmf for digit = 49, duration = 40, end_bit = 0                        //IMS继续向网络发送DTMF
15:30:05.735052    IMS/Medium             [qipcalldtmf.c    896] -----> Sending dtmf for digit = 49, duration = 60, end_bit = 0
15:30:05.755000    IMS/Medium             [qipcalldtmf.c    896] -----> Sending dtmf for digit = 49, duration = 80, end_bit = 0
15:30:05.775104    IMS/Medium             [qipcalldtmf.c    896] -----> Sending dtmf for digit = 49, duration = 100, end_bit = 0
15:30:05.795313    IMS/Medium             [qipcalldtmf.c    896] -----> Sending dtmf for digit = 49, duration = 120, end_bit = 0
15:30:05.815469    IMS/Medium             [qipcalldtmf.c    896] -----> Sending dtmf for digit = 49, duration = 140, end_bit = 0
15:30:05.835521    IMS/Medium             [qipcalldtmf.c    896] -----> Sending dtmf for digit = 49, duration = 160, end_bit = 0
15:30:05.853073    QMI_MCS_QCSI_PKT       Length:   48                                                                                                 //CM通过QMI消息接收DTMF释放/停止请求
15:30:05.853073    Call Manager/Medium    [cmipapp.c   5703] =CM= CMIPAPP: Send stop inband DTMF for call 10, sub 0                                    //CM向IMS发送带内的DTMF结束发送消息
15:30:05.853073    IMS/High               [qipcalldtmf.c    418] qipcall_stop_dtmf_rpt_conf: Block call rpt ind 0. Call Id=10, State=14, status =1     //IMS接收DTMF结束消息并完成DTMF结束相关配置
15:30:05.853073    QMI_MCS_QCSI_PKT       Length:   55                                                                                                 //CM通过QMI消息返回DTMF释放/停止请求
15:30:05.855339    IMS/Medium             [qipcalldtmf.c    896] -----> Sending dtmf for digit = 49, duration = 180, end_bit = 1                       //DTMF发送结束标识
15:30:05.875990    IMS/Medium             [qipcalldtmf.c    896] -----> Sending dtmf for digit = 49, duration = 180, end_bit = 1
15:30:05.895990    IMS/Medium             [qipcalldtmf.c    896] -----> Sending dtmf for digit = 49, duration = 180, end_bit = 1

3.DTMF发送详细过程及log分析

3.1、CM通过QMI消息接收DTMF启动请求

        在DTMF开始发送时,首先通过QMI消息的下发,UE接收到DTMF发送的命令及相关信息。QMI的请求消息正常情况下,都会有响应消息相对应

        关键字:QMI --> voice_start_cont_dtmf

//DTMF按键请求
15:30:05.694244	[0x1544]	QMI_MCS_QCSI_PKT
packetVersion = 2
V2 {
   MsgType = Request                              //DTMF请求消息
   Counter = 419
   ......
   Service_VOICE {
      ServiceVOICEV2 {
         voice_start_cont_dtmf {
            voice_start_cont_dtmf_reqTlvs[0] {
               Type = 0x01
               Length = 2
               cont_dtmf_info {
                  call_id = 255
                  digit = 49           //键值对应ASCALL值,这是49即数字1
               }
            }
         }
      }
   }
}
//DTMF按键请求响应
15:30:05.695010	[0x1544]	QMI_MCS_QCSI_PKT
packetVersion = 2
V2 {
   MsgType = Response                            //DTMF请求响应
   Counter = 419
   ...
   Service_VOICE {
      ServiceVOICEV2 {
         voice_start_cont_dtmf {
            voice_start_cont_dtmf_respTlvs[0] {
               Type = 0x02
               Length = 4
               resp {
                  result = QMI_RESULT_SUCCESS        //DTMF请求成功
                  error = QMI_ERR_NONE
               }
            }
            voice_start_cont_dtmf_respTlvs[1] {
               Type = 0x10
               Length = 1
               call_id {
                  call_id = 1
               }
            }
         }
      }
   }
}

3.2、CM向IMS发送带内的DTMF开始发送消息

        CM接收到DTMF发送的消息,然后发送带内的消息,告诉IMS:需要发送DTMF到网络

        关键字:Send start inband DTMF

15:30:05.694219    Call Manager/Medium    [cmipapp.c   5645] =CM= CM->IMS: CMIPAPP: Send start inband DTMF for call 10, as_id 0

3.3、IMS第一次发送DTMF到网络

        IMS接收到来自CM的消息后,开始第一次尝试发送DTMF到网络。如果发送成功,会在后续进行资源分配。第一次的发送可以认为是与网络初次连接

        第一次发送的“持续时间(duration)"一般从20ms开始,当然也有少数从40ms开始。)。正常的数据发送的结束bit位都为0(end_bit = 0)

        第一次发送也会携带“键值”

        关键字:Sending dtmf for digit

15:30:05.694219    IMS/Medium    [qipcalldtmf.c    896] -----> Sending dtmf for digit = 49, duration = 20, end_bit = 0

3.4、IMS接收DTMF发送消息并完成DTMF发送相关配置

        在第一次发送成功后,IMS与网络建立通信,IMS开始进行配置,分配资源。在发送结束时会再次进行配置,将资源回收

        关键字:qipcall_start_dtmf_rpt_conf

15:30:05.694219    IMS/High    [qipcalldtmf.c    373] qipcall_start_dtmf_rpt_conf: Block call rpt ind = 0,Call Id=10, State=14, status = 1

3.5、CM通过QMI消息返回DTMF启动请求

        在第一次发送完成,并完成配置后,IMS与网络的通道已经建立,CM通过QMI返回DTMF发送的请求

        关键字:QMI --> voice_start_cont_dtmf

//DTMF按键请求响应 --- 同上
15:30:05.695010	[0x1544]	QMI_MCS_QCSI_PKT
packetVersion = 2
V2 {
   MsgType = Response                            //DTMG请求响应
   Counter = 419
   ...
   Service_VOICE {
      ServiceVOICEV2 {
         voice_start_cont_dtmf {
            voice_start_cont_dtmf_respTlvs[0] {
               Type = 0x02
               Length = 4
               resp {
                  result = QMI_RESULT_SUCCESS        //DTMF请求成功
                  error = QMI_ERR_NONE
               }
            }
            voice_start_cont_dtmf_respTlvs[1] {
               Type = 0x10
               Length = 1
               call_id {
                  call_id = 1
               }
            }
         }
      }
   }
}

3.6、IMS继续向网络发送DTMF

        QMI的返回标志着准备工作已经就绪,接着IMS会把DTMF信息发送到网络。如果第一次发送时20ms开始,DTMF信息发送到160ms就会完成,后续从180ms开始停止工作。如果第一次发送时40ms开始,DTMF信息发送到180ms就会完成,后续从200ms开始停止工作

        关键字:Sending dtmf for digit

15:30:05.714271    IMS/Medium    [qipcalldtmf.c    896] -----> Sending dtmf for digit = 49, duration = 40, end_bit = 0
15:30:05.735052    IMS/Medium    [qipcalldtmf.c    896] -----> Sending dtmf for digit = 49, duration = 60, end_bit = 0
15:30:05.755000    IMS/Medium    [qipcalldtmf.c    896] -----> Sending dtmf for digit = 49, duration = 80, end_bit = 0
15:30:05.775104    IMS/Medium    [qipcalldtmf.c    896] -----> Sending dtmf for digit = 49, duration = 100, end_bit = 0
15:30:05.795313    IMS/Medium    [qipcalldtmf.c    896] -----> Sending dtmf for digit = 49, duration = 120, end_bit = 0
15:30:05.815469    IMS/Medium    [qipcalldtmf.c    896] -----> Sending dtmf for digit = 49, duration = 140, end_bit = 0
15:30:05.835521    IMS/Medium    [qipcalldtmf.c    896] -----> Sending dtmf for digit = 49, duration = 160, end_bit = 0

3.7、CM通过QMI消息接收DTMF释放/停止请求

        在DTMF发送结束时,CM收到QMI消息,UE接收到DTMF发送结束的命令及相关信息,开始执行DTMF结束相关的操作

        关键字:QMI  -->  voice_stop_cont_dtmf

15:30:05.853073	[0x1544]	QMI_MCS_QCSI_PKT
packetVersion = 2
V2 {
   MsgType = Request                              //DTMF发送结束请求
   Counter = 420
   ...
   Service_VOICE {
      ServiceVOICEV2 {
         voice_stop_cont_dtmf {
            voice_stop_cont_dtmf_reqTlvs[0] {
               Type = 0x01
               Length = 1
               call_id {
                  call_id = 255
               }
            }
         }
      }
   }
}

3.8、CM向IMS发送带内的DTMF结束发送消息  

        CM接收到DTMF结束发送的消息,然后发送带内的消息,告诉IMS:DTMF发送结束

        关键字:Send stop inband DTMF

15:30:05.853073    Call Manager/Medium    [cmipapp.c   5703] =CM= CMIPAPP: Send stop inband DTMF for call 10, sub 0

3.9、IMS接收DTMF结束消息并完成DTMF结束相关配置

         IMS收到DTMF发送结束的信息,IMS开始进行结束配置,回收资源。结束DTMF发送

        关键字:qipcall_stop_dtmf_rpt_conf

15:30:05.853073    IMS/High    [qipcalldtmf.c    418] qipcall_stop_dtmf_rpt_conf: Block call rpt ind 0. Call Id=10, State=14, status =1

3.10、CM通过QMI消息返回DTMF释放/停止请求

        IMS进行结束配置成功后,DTMF发送基本完成,QMI返回结束

        关键字:QMI  -->  voice_stop_cont_dtmf

15:30:05.853073	[0x1544]	QMI_MCS_QCSI_PKT
packetVersion = 2
V2 {
   MsgType = Response                              //DTMF发送结束请求响应
   Counter = 420
   ...
   Service_VOICE {
      ServiceVOICEV2 {
         voice_stop_cont_dtmf {
            voice_stop_cont_dtmf_respTlvs[0] {
               Type = 0x02
               Length = 4
               resp {
                  result = QMI_RESULT_SUCCESS      //操作成功
                  error = QMI_ERR_NONE
               }
            }
            voice_stop_cont_dtmf_respTlvs[1] {
               Type = 0x10
               Length = 1
               call_id {
                  call_id = 1
               }
            }
         }
      }
   }
}

3.11、DTMF发送结束标识

        在”DTMF发送结束配置成功”及“结束DTMF发送请求QMI响应成功”后,最后发送 3次 DTMF结束标志(end_bit = 1),跟网络再见

         关键字:Sending dtmf for digit

15:30:05.855339    IMS/Medium    [ qipcalldtmf.c    896] -----> Sending dtmf for digit = 49, duration = 180, end_bit = 1
15:30:05.875990    IMS/Medium    [ qipcalldtmf.c    896] -----> Sending dtmf for digit = 49, duration = 180, end_bit = 1
15:30:05.895990    IMS/Medium    [ qipcalldtmf.c    896] -----> Sending dtmf for digit = 49, duration = 180, end_bit = 1

3.12、IMS发送DTMF到网络的 RTP 数据包(IMS --> NW)

        IMS是通过RTP包将DTMF信息发送到网络,RTP包是UE与网络数据交互的一种方式

         关键字:0x1568

15:30:05.694219    IMS/Medium               [qipcalldtmf.c    896] -----> Sending dtmf for digit = 49, duration = 20, end_bit = 0
15:30:05.694244    IMS RTP SN and Payload   Length:   62      //RTP包
Version = 12
Version 12 {
   Direction = UE_TO_NETWORK
   Rat Type = LTE
   Sequence = 304
   Ssrc = 1114439703
   Rtp Time stamp = 174400
   CodecType = TELEPHONY_EVENT
   mediaType = AUDIO
   PayLoad Size = 16
   Logged Payload Size = 4
   DTMF {
      Marker = 1
      Event = 1
      End bit = 0
      Volume dbm0 = 10 dBm
      Volume DbFs = 13
      Duration = 320                                            //320开始
      High Frequency = 1209
      Low Frequency = 697
   }
   Latency Info Present = 0
   Latency Block None {
   }
   Rtp Raw Payload = { 1, 10, 1, 64 }
   Rtp Redundant Indicator = Original RTP Packet
}
15:30:05.714271    IMS/Medium               [qipcalldtmf.c    896] -----> Sending dtmf for digit = 49, duration = 40, end_bit = 0
15:30:05.715010    IMS RTP SN and Payload   Length:   62
   DTMF {
      Duration = 640
   }
15:30:05.735052    IMS/Medium               [qipcalldtmf.c    896] -----> Sending dtmf for digit = 49, duration = 60, end_bit = 0
15:30:05.735054    IMS RTP SN and Payload   Length:   62
   DTMF {
      Duration = 960
   }
15:30:05.755000    IMS/Medium               [qipcalldtmf.c    896] -----> Sending dtmf for digit = 49, duration = 80, end_bit = 0
15:30:05.755001    IMS RTP SN and Payload   Length:   62
   DTMF {
      Duration = 1280
   }
15:30:05.775104    IMS/Medium               [qipcalldtmf.c    896] -----> Sending dtmf for digit = 49, duration = 100, end_bit = 0
15:30:05.775112    IMS RTP SN and Payload   Length:   62
   DTMF {
      Duration = 1600
   }
15:30:05.795313    IMS/Medium               [qipcalldtmf.c    896] -----> Sending dtmf for digit = 49, duration = 120, end_bit = 0
15:30:05.795337    IMS RTP SN and Payload   Length:   62
   DTMF {
      Duration = 1920
   }
15:30:05.815469    IMS/Medium               [qipcalldtmf.c    896] -----> Sending dtmf for digit = 49, duration = 140, end_bit = 0
15:30:05.815488    IMS RTP SN and Payload   Length:   62
   DTMF {
      Duration = 2240
   }
15:30:05.835521    IMS/Medium               [qipcalldtmf.c    896] -----> Sending dtmf for digit = 49, duration = 160, end_bit = 0
15:30:05.835532    IMS RTP SN and Payload   Length:   62
   DTMF {
      Duration = 2560
   }
15:30:05.855339    IMS/Medium               [qipcalldtmf.c    896] -----> Sending dtmf for digit = 49, duration = 180, end_bit = 1
15:30:05.856003    IMS RTP SN and Payload   Length:   62
   DTMF {
      Duration = 2880
   }
15:30:05.875990    IMS/Medium               [qipcalldtmf.c    896] -----> Sending dtmf for digit = 49, duration = 180, end_bit = 1
15:30:05.876003    IMS RTP SN and Payload   Length:   62
   DTMF {
      Duration = 2880
   }
15:30:05.895990    IMS/Medium               [qipcalldtmf.c    896] -----> Sending dtmf for digit = 49, duration = 180, end_bit = 1
15:30:05.896014    IMS RTP SN and Payload   Length:   62
   DTMF {
      Duration = 2880
   }

DTMF接收流程

         Qualcomm IMS解决方案提供FR#25100支持播放接收方向DTMF事件通过 IMS -> MMODE -> QMI 报告路径,以便 OEM 可以在 AP 侧实现。已集成 FR#25100 的构建,IMS 将报告接收方向 DTMF 到模式。

        在发送端发送DTMF包后,通过网络发送到接收端。接收端开始接收DTMF数据并处理。发送端发送DTMF与接收端接收DTMF是一个相互的过程,即发送端发送一次,接收端就需要接收一次,如果中间有差别,很可能网络出现了问题

  1. IMS收到DTMF的网络数据包 (NW --> IMS)
  2. IMS将DTMF信息发送到CM (IMS --> CM)
  3. CM中的call进行进行DL DTMF时间接收
  4. CM进行DTMF发送其他模块响应
15:30:05.276019    IMS RTP SN and Payload   Length:   62																									//IMS收到DTMF的网络数据包
15:30:05.296006    IMS RTP SN and Payload   Length:   62
15:30:05.317045    IMS RTP SN and Payload   Length:   62
15:30:05.330990    Call Manager/High        [cmtask.c  10918] =CM= CM<< IP cmd:642																			//IMS将DTMF信息发送到CM/MMODE
15:30:05.330990    IMS/Medium               [qipcalldtmf.c    658] qipcall_process_dl_dtmf_event: indication type = 0, call_id = 1, volume = 10, digit = 49	//CM中的call进行进行DL DTMF时间接收
15:30:05.330990    Call Manager/High        [cmdbg.c   3957] =CM= <<CM inbandevt=9 <1>																		//CM进行DTMF发送其他模块响应
15:30:05.341097    IMS RTP SN and Payload   Length:   62																									//IMS收到DTMF的网络数据包
15:30:05.360008    IMS RTP SN and Payload   Length:   62
15:30:05.401042    IMS RTP SN and Payload   Length:   62
15:30:05.440002    IMS RTP SN and Payload   Length:   62
15:30:05.481025    IMS RTP SN and Payload   Length:   62
15:30:05.490260    Call Manager/High        [cmtask.c  10918] =CM= CM<< IP cmd:643																			//IMS将DTMF信息发送到CM/MMODE
15:30:05.490260    IMS/Medium               [qipcalldtmf.c    658] qipcall_process_dl_dtmf_event: indication type = 2, call_id = 1, volume = 10, digit = 49	//CM中的call进行进行DL DTMF时间接收
15:30:05.490260    Call Manager/High        [cmdbg.c   3957] =CM= <<CM inbandevt=10 <1>																		//CM进行DTMF发送其他模块响应

1.IMS收到DTMF的网络数据包

       IMS通过RTP包与网络进行交互,在LTE产品中,RTP包是 0x1568。一般RTP包中从320开始,一次增加320,并且与发送端一一对应

        关键字:0x1568 --> DTMF

//发送端

15:30:05.694219    IMS/Medium               [qipcalldtmf.c    896] -----> Sending dtmf for digit = 49, duration = 20, end_bit = 0
15:30:05.694244    IMS RTP SN and Payload   Length:   62		//Duration = 320
15:30:05.714271          IMS/Medium               [qipcalldtmf.c    896] -----> Sending dtmf for digit = 49, duration = 40, end_bit = 0
15:30:05.715010    IMS RTP SN and Payload   Length:   62		//Duration = 640
15:30:05.735052    IMS/Medium               [qipcalldtmf.c    896] -----> Sending dtmf for digit = 49, duration = 60, end_bit = 0
15:30:05.735054    IMS RTP SN and Payload   Length:   62		//Duration = 960
15:30:05.755000    IMS/Medium               [qipcalldtmf.c    896] -----> Sending dtmf for digit = 49, duration = 80, end_bit = 0
15:30:05.755001    IMS RTP SN and Payload   Length:   62		//Duration = 1280
15:30:05.775104    IMS/Medium               [qipcalldtmf.c    896] -----> Sending dtmf for digit = 49, duration = 100, end_bit = 0
15:30:05.775112    IMS RTP SN and Payload   Length:   62		//Duration = 1600
15:30:05.795313    IMS/Medium               [qipcalldtmf.c    896] -----> Sending dtmf for digit = 49, duration = 120, end_bit = 0
15:30:05.795337    IMS RTP SN and Payload   Length:   62		//Duration = 1920
15:30:05.815469    IMS/Medium               [qipcalldtmf.c    896] -----> Sending dtmf for digit = 49, duration = 140, end_bit = 0
15:30:05.815488    IMS RTP SN and Payload   Length:   62		//Duration = 2240
15:30:05.835521    IMS/Medium               [qipcalldtmf.c    896] -----> Sending dtmf for digit = 49, duration = 160, end_bit = 0
15:30:05.835532    IMS RTP SN and Payload   Length:   62		//Duration = 2560
15:30:05.855339    IMS/Medium               [qipcalldtmf.c    896] -----> Sending dtmf for digit = 49, duration = 180, end_bit = 1
15:30:05.856003    IMS RTP SN and Payload   Length:   62		//Duration = 2880
15:30:05.875990    IMS/Medium               [qipcalldtmf.c    896] -----> Sending dtmf for digit = 49, duration = 180, end_bit = 1
15:30:05.876003    IMS RTP SN and Payload   Length:   62		//Duration = 2880
15:30:05.895990    IMS/Medium               [qipcalldtmf.c    896] -----> Sending dtmf for digit = 49, duration = 180, end_bit = 1
15:30:05.896014    IMS RTP SN and Payload   Length:   62    	//Duration = 2880
//接收端

15:29:57.227009    IMS RTP SN and Payload   Length:   62		//接收消息位
Version = 12
Version 12 {
   Direction = UE_TO_NETWORK
   Rat Type = LTE
   Sequence = 260
   Ssrc = 2261344487
   Rtp Time stamp = 87680
   CodecType = TELEPHONY_EVENT
   mediaType = AUDIO
   PayLoad Size = 16
   Logged Payload Size = 4
   DTMF {
      Marker = 1
      Event = 1
      End bit = 0
      Volume dbm0 = 10 dBm
      Volume DbFs = 13
      Duration = 320
      High Frequency = 1209
      Low Frequency = 697
   }
   Latency Info Present = 0
   Latency Block None {
   }
   Rtp Raw Payload = { 1, 10, 1, 64 }
   Rtp Redundant Indicator = Original RTP Packet
}
15:29:57.247093    IMS RTP SN and Payload   Length:   62
   DTMF {
      Duration = 640
   }
15:29:57.267104    IMS RTP SN and Payload   Length:   62
   DTMF {
      Duration = 960
   }
15:29:57.287081    IMS RTP SN and Payload   Length:   62
   DTMF {
      Duration = 1280
   }
15:29:57.307006    IMS RTP SN and Payload   Length:   62
   DTMF {
      Duration = 1600
   }
15:29:57.328016    IMS RTP SN and Payload   Length:   62
   DTMF {
      Duration = 1920
   }
15:29:57.348004    IMS RTP SN and Payload   Length:   62
   DTMF {
      Duration = 2240
   }
15:29:57.368170    IMS RTP SN and Payload   Length:   62
   DTMF {
      Duration = 2560
   }
15:29:57.387013    IMS RTP SN and Payload   Length:   62		//接收结束位
   DTMF {
      Duration = 2880
   }
15:29:57.408157    IMS RTP SN and Payload   Length:   62
   DTMF {
      Duration = 2880
   }
15:29:57.428256    IMS RTP SN and Payload   Length:   62
   DTMF {
      Duration = 2880
   }

2.IMS将DTMF信息发送到CM/MMODE

        IMS将收到DTMF发送到CM,在CM及逆行处理。IMS分两次发送,其中DTMF的标识为”642“,”643“

        关键字:cmtask

15:30:05.330990    Call Manager/High    [cmtask.c  10918] =CM= CM<< IP cmd:642
15:30:05.490260    Call Manager/High    [cmtask.c  10918] =CM= CM<< IP cmd:643

        关于IP cmd 的的说明

cmll.h
typedef enum cm_name_e{
   ...
  CM_IP_CALL_START_DTMF_IND,  /* 642 --> DTMF IMD sent by IMS for starting MT DTMF --> IMS发送用于启动MT DTMF的DTMF IMD */
  CM_IP_CALL_STOP_DTMF_IND,   /* 643 --> DTMF IMD sent by IMS for stopping MT DTMF --> IMS发送用于停止MT DTMF的DTMF IMD */
  ...
}cm_name_type;

3.CM中的call进行进行DL DTMF时间接收

        在CM中我们可以看到来自IMS模块的消息,在消息中我们可以看到”键值(digit = 49)“

        关键字:qipcall_process_dl_dtmf_event

15:30:05.330990    IMS/Medium    [qipcalldtmf.c    658] qipcall_process_dl_dtmf_event: indication type = 0, call_id = 1, volume = 10, digit = 49
15:30:05.490260    IMS/Medium    [qipcalldtmf.c    658] qipcall_process_dl_dtmf_event: indication type = 2, call_id = 1, volume = 10, digit = 49

4.CM进行DTMF发送其他模块响应

        CM在接收到DTMF后会进行会转到响应的模块进行处理。CM会转移很多消息事件到其他模块,其中,DTMG相关的”inbandevt”分别是”9和10”

15:30:05.330990    Call Manager/High    [cmdbg.c   3957] =CM= <<CM inbandevt=9 <1>
15:30:05.490260    Call Manager/High    [cmdbg.c   3957] =CM= <<CM inbandevt=10 <1>

         关于带内事件的说明

/*带内事件的枚举。客户端可以向CM注册,以获得这些带内事件的任何子集的通知。*/
typedef enum cm_inband_event_e {

  /* -1 */
  CM_INBAND_EVENT_NONE=-1,   
  /**< FOR INTERNAL CM USE ONLY! --> 最小值,仅供内部CM使用!*/

  /* 0 */
  CM_INBAND_EVENT_REV_BURST_DTMF,
  /**< Send a CDMA-burst DTMF --> 发送CDMA突发DTMF */

  /* 1 */
  CM_INBAND_EVENT_REV_START_CONT_DTMF,
  /**< Start a continuous DTMF tone --> 开始连续双音多频音 */

  /* 2 */
  CM_INBAND_EVENT_REV_START_CONT_DTMF_CONF,
    /**< Confirm that a continuous DTMF tone is played (WCDMA/GSM/TDS only) --> 确认已连续播放DTMF音调(仅限WCDMA/GMS/TDS) */

  /* 3 */
  CM_INBAND_EVENT_REV_STOP_CONT_DTMF,
    /**< Stop a continuous DTMF tone --> 停止连续的双音多频音 */

  /* 4 */
  CM_INBAND_EVENT_REV_STOP_CONT_DTMF_CONF,
    /**< Confirm a that continuous DTMF tone is stopped (WCDMA/GSM/TDS only) --> 确认连续DTMF音已停止(仅限WCDMA/GMS/TDS) */

  /* 5 */
  CM_INBAND_EVENT_FWD_BURST_DTMF,
    /**< Received a CDMA-burst DTMF message --> 收到CDMA突发DTMF消息 */

  /* 6 */
  CM_INBAND_EVENT_FWD_START_CONT_DTMF,
    /**< Received a start continuous DTMF tone order --> 收到开始连续DTMF音指令 */

  /* 7 */
  CM_INBAND_EVENT_FWD_STOP_CONT_DTMF,
    /**< Received a stop continuous DTMF tone order --> 收到停止连续DTMF音指令 */

  /* 8 */
  CM_INBAND_EVENT_REV_BURST_DTMF_ACK,
    /**< Received an L2 ACK for a CDMA-burst DTMF message (FEATURE_T53) --> 收到CDMA突发DTMF消息的L2 ACK(FEATURE_T53) */

  /* 9 */
  CM_INBAND_EVENT_IP_START_DTMF_IND,
  /**< Start of MT DTMF tone sent by IMS --> 开始发送从IMS接手的DTMF音 */

  /* 10 */
  CM_INBAND_EVENT_IP_STOP_DTMF_IND,
  /**< Stop of MT DTMF tone sent by IMS--> 停止发送从IMS接手的DTMF音 */

  /* MAX */
  CM_INBAND_EVENT_MAX   
  /**< FOR INTERNAL CM USE ONLY! --> 最大值,仅供内部CM使用!*/

} cm_inband_event_e_type;

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值