首页 技术 正文
技术 2022年11月15日
0 收藏 746 点赞 2,839 浏览 16508 个字

mtk 的conferrence call建立流程(重点看main_log与)

抓mtk log:

1、*#*#82533284#*#*      进入抓log UI

2、*#*#825364#*#*      进入工程模式

3、进入”Log and Debuging”栏  –> Telephony Log Setting –>ENABLE(然后重启生效,这样log会抓的全面,不会影藏信息,log等级会由I变成D)

A call B:

mtk 的conferrence call建立流程

A put B on hold:

mtk 的conferrence call建立流程

A call Conference Server:

mtk 的conferrence call建立流程

A refer B:

mtk 的conferrence call建立流程

流程图:

10010就是上图中的B;13267945631的号就是上图的C;18507524845就是上图的A。

mtk 的conferrence call建立流程

注意:refer邀请成员与refer挂断成员的refer主要通过后面BYE区分,有BYE就是邀请,没有就是挂断成员。

关键AT指令:

//获取2G/3G/4G cell(包括服务和邻居 cell)信息,属性命令.//AT+ECELL=<mode>//mode:0 disable,1 enable//+ECELL:<num_of_cell>[,<Act>,<cid>,<lac_or_tac>,<mcc>,<mnc>,<sig2_in_dbm>,<ta>,<ext1>,<ext2>][,]//Act:0 GSM,2 UMTS ,7 LTE//cid:Cell Identity//mcc:mobile country code//mnc:mobile network code//lac_or_tac:GSM/UMTS ,location area code;LTE,tracking area code+ECELL: 1,7,"065F4402","25C7",460,1,448,54,29,-348,-22,0,,,,1650    //用来使能VDM ADS支持报告URC +EVADSREP<domain>,该指令被VDM执行//+EVADSREP=<mode>//+EVADSREP:<domain>//0 disable,1 enable//domain :0 cs domain,1 volte (IMS call over volte)AT+EVADSREP=1
//用来设置VDM access domain 选择模式,该指令被VDM执行//0 自动模式(both IMS and cs domian),1 cs domain only.AT+EVADSMOD=0,0//VDM用来FDN检查和批准紧急号码,该指令被VDM执行//+EAPPROVE=<dial number>//+EAPPROVE: <is_allowed><is_emgerency><err>AT+EAPPROVE="10010"+EAPPROVE: 1,0,0//+ECPI 属性命令,使能/禁止call处理信息//+ECPI:<call_id>,<msg_type>,<is_ibt>,<is_tch>,<dir>,<call_mode>,<number>,<type>,"<pau>"[,<disc_cause>]//+ECPI=<mode>//+ECPI? 可能响应+ECPI:<mode>//+ECPI=? 可能响应+ECPI:(0~4294967295)//mode:    bit1=1    CSMCC_SETUP_MSG(MT_CALL)    bit2=1    CSMCC_DISCONNECT_MSG    bit3=1    CSMCC_ALERT_MSG    bit4=1    CSMCC_CALL_PROCESS_MSG    bit5=1    CSMCC_SYNC_MSG    bit6=1    CSMCC_PROCESS_MSG    bit7=1    CSMCC_CALL_CONNECTED_MSG    bit8=1    CSMCC_ALL_CALLS_DISC_MSG    bit9=1    CSMCC_CALL_ID_ASSIGN_MSG    bit10=1    CSMCC_STATE_CHANGE_HELD    bit11=1    CSMCC_STATE_CHANGE_ACTIVE    bit12=1    CSMCC_STATE_CHANGE_DISCONNECTED    bit13=1    CSMCC_STATE_CHANGE_MO_DISCONNECTED//msg_type:CSMCC_ALL_CALLS_DISC_MSG    0    CLCC_MT_CALL    1    CSMCC_DISCONNECT_MSG    2    CSMCC_ALERT_MSG    3    CLCC_CALL_PROCESS_MSG    4    CSMCC_SYNC_MSG    5    CSMCC_PROCESS_MSG    6    CSMCC_CALL_CONNECTED_MSG    129    CSMCC_ALL_CALLS_DISC_MSG    130    CSMCC_CALL_ID_ASSIGN_MSG    131    CSMCC_STATE_CHANGE_HELD    132    CSMCC_STATE_CHANGE_ACTIVE    133    CSMCC_STATE_CHANGE_DISCONNECTED    134    CSMCC_STATE_CHANGE_MO_DISCONNECTED    135    CSMCC_STATE_HELD_BY_REMOTE    136    CSMCC_STATE_ACTIVE_BY_REMOTE//dir : 0 CLCC_MO ,1 CLCC_MT//call_mode:    0    CLCC_VOICE_CALL              1    CLCC_DATA_CALL              3    CLCC_VFD_VOICE              4    CLCC_AVD_VOICE              5    CLCC_AVF_VOICE              6    CLCC_AFD_DATA              7    CLCC_AVD_DATA              20    IMS_VOICE_CALL              21    IMS_VIDEO_CALL              22    IMS_VOICE_CONFERENCE//type: 145 国际呼叫,129 国内呼叫+ECPI: 1,130,0,0,0,0,"10010",129,""   // MO  voice call 10010//该URC被用来告知AP,UA从NW接收的响应码//+ESIPCPI:<call_id>,<dir>,<sip_msg_type>,<method>,<response_code>,"<reason_text>"//call_id:0~255整数//dir:0 send,1 receive//sip_msg_type:0 request,1 response//method:  1 INVITE           2 REFER         3 UPDATE         4 CANCEL         5 MESSAGE         6 ACK         7 BYE         8 OPTIONS         9 SUBSCRIBE         10 NOTITY         11 PUBLISH         12 INFO         13 PRACK//response_code:method为0时,100~600,request时为0.+ESIPCPI: 1,0,0,1,0,""         //+EIMSCI=<ims_call_status>,<is_emergency>,<ims_access_rat>ims_call_status: 0 IMS stop or SRVCC to CS call                 1 IMS call ongoingis_emergency:    0 no                 1 yes ims_access_rat:  0  LTE                 1  WIFI                 2  eHRPDAT+EIMSCI=1,0,0// start , end 智能缓解阻塞,该指令不被用在UTRAN、GERAN 的UE//+CSCM=<application>,<start-end_indication>application:    0    MMTEL voice    1    MMTEL video    2    SMS over IPstart-end_indication:    1    start 指示    2    end 指示AT+CSCM= 0,1//IMS call 信息,该指令被用来告知协议栈IMS call信息//+EIMSCI=<ims_call_status>,<is_emergency>,<ims_access_rat>ims_call_status:   0 IMS stop or SRVCC to CS call  1 IMS call ongoingis_emergency:      0 no  1 yes ims_access_rat:    0  LTE  1  WIFI  2  eHRPDAT+EIMSCI=1,0,0//IMS 会议控制,该指令被IMC处理,用在PS(IMS)call domain 的call的 hold\resume。在cs call,用AT+CHLD指令。//+ECCTRL=<call_id>,<call_state>//call_state:131 hold,132 activeAT+ECCTRL=1,131+ECCTRL:0,131//Call相关的SS(补充业务)//+CHLD=[<n>]//+CHLD=? 可能响应[+CHLD:<n>]//n:    0    释放所有的hold calls,或对于waiting call设置用户决定用户忙(UDUB)    1    释放所有的active calls并接受其他waiting or held call.    1x   释放特定的active call    2    放所有的active call在 hold并接受其他的waiting or held call.    2x   除了特定call x,放其余所有active call在hold    3    add a held call 到会议电话中    4    连接2个calls并断开这两个calls subscriber.    5    主动完成对占线用户的呼叫请求(CCBS)AT+CHLD=3//该URC由IMC发送,被用来告知AP call改变源于哪里//+EIMSCMODE:<call_id>,<call_mode>,<camera_direction>,<audio_direction>,"<p_assert_url>",<audio_codec>//call_mode:    20  IMS_VOICE_CALL    21    IMS_VIDEO_CALL    22    IMS_VOICE_CONFERENCE    23    IMS_VIDEO_CONFERENCE    24    IMS_VOICE_CONFERENCE_PARTICIPANT    25    IMS_VIDEO_CONFERENCE_PARTICIPANT//camera_direction\audio_direction:    0    inactive    1    sendonly    2    recvonly    3    sendrecv//audio_codec:    1    AMR    2    AMR-WB    3    H264    16    H265    17    EVS+EIMSCMODE: 3,22,0,3,"",2//+CEER 错误报告+CEER:<cause>,<report>+CEER: 16,CM_NORMAL_CALL_CLR//(1)For network attachment:+CGEV:NW DETACH,网络已强制PS分离,这意味着所有活动上下文已停用,这些没有单独报告。+CGEV:ME DETACH,移动终端已强制PS分离,这意味着所有活动上下文已停用,这些没有单独报告。//(2)For PDP context activation+CGEV:NW PDN ACT <cid>,其中<cid>参考+CGDCONT,这事件不被用于EPS,PDP context是在GSM/UMTS.+CGEV:ME PDN ACT <cid>[,<reason>],PDN 连接在LTE,PDP context是在GSM/UMTS.reason:网络为指定的PDP类型为IPV4或IPV6。  0    IPV4 only allowed  1    IPV6 only allowed  2    single address bearers only allowed.  3    single address bearers only allowed and MT initated 第二地址类型承载器的模拟上下文未成功。.+CGEV:ME ACT <p_cid>,<cid>,<event_type>  +CGEV:NW ACT <p_cid>,<cid>,<event_type> event_type:    0    information event_type    1    information request:acknowledgement required,acknowledgement 能够被接受或拒绝,see +CGANS.+CGEV:ME PDN DEACT <cid>+CGEV:NW PDN DEACT <cid>+CGEV:NW DEACT <p_cid>,<cid>,<event_type>+CGEV:ME DEACT <p_cid>,<cid>,<event_type>//(3)For PDP context modification,+CGEV:NW MODIFY <cid>,<change_reason>,<event_type>+CGEV:ME MODIFY <cid>,<change_reason>,<event_type>change_reason:    1    TFT only changed    2    Qos only changed    3    both TTF and Qos changed    //(4)For other PDP context handling+CGEV:REJECT<PDP_type>,<PDP_addr>,参数see+CGDCONT,当MT无法报告上下文激活时,发生了一个网络请求向TE发出+CRING URC并被自动拒绝。+CGEV:NW REJECT<PDP_type>,<PDP_addr>[,<cid>]+CGEV: NW MODIFY 10, 0, 0//该URC由IMC发送,被用来告知IMS会议电话的subscription状态,URC(unsolicited result code)//+ESUBCTRL:<call_id>,<event>,<result>,<cause>//event:0 unknown, 1 conference//result:0 成功,1 失败//cause:参考+ECONF URC+ESUBCTRL: 3,1,0,0//IMS会议操作,该命令被IMC执行//add or remove 会议成员//+ECONF=<conf_call_id><operation><num>[,<joined_call_id>]//operation:0 add,1 removeAT+ECONF=3,1,"13267945631"//该URC由IMC发送,被用来响应IMS会议电话控制指令AT+ECONF//+ECONF:<conf_call_id>,<operation>,<num>,<result>,<cause>[,<joined_call_id>]//operation:0 add ,1 remove//result:0 success ,1 failure//cause:    NORMAL=0,    ABNORMAL,    NONNUMBER,    UNREGISTERED,    DISCONNECT,    BECANCEL,    BEREJECT,    BEREJECT_380,    BEREJECT_380_EMERGENCY_TO_CS,    BEREJECT_380_EMERGENCY_TO_REREG,    BEREJECT_480,    BEREJECT_503,    TX_TIMEOUT,    NO_PRIVACY,    PRECONDFAIL,    SECONDCALL,    NOMEDIACONTENT,    INVALIDMSG,    INVALIDCMD,    INVALIDIDX,    SRVCC,    FACILITY_REJECTED,    DEDICATED_BEARER_TIMEOUT,    UA_MAX,    UNAVAILABLE_OF_CALLS,    IMS_CC_CAUSE_MAX+ECONF: 3,0,"",0,0,2

常见log分析:

  1、在mobilelog(主要是main_log、radio_log、sys_log)中查找“AT+CHLD”,有:

- ::   I AT      : [] AT> AT+CHLD= (RIL_CMD_RT_7 tid:)   //add a held call 到会议电话中- ::   I AT      : [] AT> AT+CHLD= (RIL_CMD_RT_7 tid:) //释放特定的active call 

2、在mobilelog(主要是main_log、radio_log、sys_log)中查找“ImsConference”,有:

main_log:    Line : - ::   I MtkImsCall: callSessionConferenceStateUpdated ::           state=[ImsConferenceState <              ***:user-entity=tel:+, status=connected, user=***, display-text=+, endpoint=***,               ***: user-entity=tel:, status=connected, user=***, display-text=, endpoint=***,                       ***: user-entity=tel:+,  onHold:N mute:N mCallProfile:{ serviceType=, callType=, restrictCause=,        mediaProfile={ audioQuality=, audioDirection=, videoQuality=, videoDirection=, rttMode=, hasRttAudioSpeech=, emergencyUrns=[], emergencyCallRouting=, emergencyCallTesting= state:ESTABLISHED callId:] transientSession:null]//////可以看到一个成员断开连接(+8613267945631)    Line : - ::   I MtkImsCall: callSessionConferenceStateUpdated ::      state=[ImsConferenceState <          ***: user-entity=tel:+, status=connected, user=***, display-text=+, endpoint=***,           ***: user-entity=tel:, status=connected, user=***, display-text=, endpoint=***,                 ***: user-entity=tel:+, onHold:N mute:N mCallProfile:{ serviceType=, callType=, restrictCause=, mediaProfile={ audioQuality=, audioDirection=, videoQuality=, videoDirection=, rttMode=, hasRttAudioSpeech=, emergencyUrns=[], emergencyCallRouting=, emergencyCallTesting= state:ESTABLISHED callId:] transientSession:null]
sys_log:I Telephony: ImsConference: handleConferenceParticipantsUpdate: size=3I Telephony: ImsConference: handleConferenceParticipantsUpdate: size=2   //成员只有2个(包括host)I Telephony: ImsConference: startEmulatingSinglePartyCall: conference has a single participant; downgrade to single party call.
radio_log:D RfxRoot : processMessage() msg = [type=REQUEST, source=GSM, dest=GSM,...D RtcImsConference: firstMerge, callId_1: +86*****945631, callId_2: +86*****945631, num_1: +86*****945631, num_2: +86*****945631D RtcCC   : [0] generateImsConference() slot: 0D RfxRoot : processMessage() msg = [type=RESPONSE, source=GSM, dest=GSM,...D RtcImsConference: modifyParticipantCompleteD RtcImsConference: modifyParticipantComplete: mLocalParticipants:752*****752D RtcImsConference: modifyParticipantComplete: mLocalParticipants:+86*****945631D RfxRoot : processMessage() msg = [type=URC, source=GSM, dest=GSM,...D RtcImsConference: handleVolteConfCallMessageD RtcImsConference: startElement Conference uri: xmlns  //---会议信息描述D RtcImsConference: :startElement mCEPState: 1D RtcImsConference: :startElement version: 0D RtcImsConference: startElement MaxUserCount: 0D RtcImsConference: startElement MaxUserCount: 6D RtcImsConference: startElement user - entity: tel*****8507524845D RtcImsConference: startElement display-text: **D RtcImsConference: startElement display-text: +86*****524845D RtcImsConference: startElement endpoint - entity: sip*****0.0:65535D RtcImsConference: startElement status: D RtcImsConference: startElement status: connectedD RtcImsConference: endElement end user mUsers.size: 1D RtcImsConference: startElement user - entity: tel***010D RtcImsConference: startElement endpoint - entity: sip*****0.0:65535D RtcImsConference: startElement status: D RtcImsConference: startElement status: connectedD RtcImsConference: endElement end user mUsers.size: 2D RtcImsConference: startElement user - entity: tel*****3267945631D RtcImsConference: startElement endpoint - entity: sip*****0.0:65535D RtcImsConference: startElement status: D RtcImsConference: startElement status: connectedD RtcImsConference: endElement end user mUsers.size: 3      //和上面描述类似D RtcImsConference: cepState: 1D RtcImsConference: setupHostD RtcImsConference: getUserNameFromSipTelUriString uriString: **D RtcImsConference: setupHost: mHostAddr: **D RtcImsConference: fullUpdateParticipantsD RtcImsConference: getUserNameFromSipTelUriString uriString: tel*****8507524845  //HostD RtcImsConference: getUserNameFromSipTelUriString uriString: tel***010D RtcImsConference: getUserNameFromSipTelUriString uriString: tel*****3267945631D RtcImsConference: isPartialCEP: 0D RtcImsConference: isSelfAddress(): address: **, mHostAddr: **D RtcImsConference: getUserNameFromSipTelUriString uriString: +86*****524845D RtcImsConference: isSelfAddress(): address: **, mHostAddr: **D RtcImsConference: getUserNameFromSipTelUriString uriString: +86*****524845D RtcImsConference: isSelfAddress(): falseD RtcImsConference: isSelfAddress(): address: **, mHostAddr: **D RtcImsConference: getUserNameFromSipTelUriString uriString: +86*****524845D RtcImsConference: isSelfAddress(): falseD RtcImsConference: notifyConfStateUpdate()D RtcImsConference: isEmptyConferenceD RtcImsConference: isSelfAddress(): address: **, mHostAddr: **D RtcImsConference: getUserNameFromSipTelUriString uriString: +86*****524845D RtcImsConference: isSelfAddress(): address: **, mHostAddr: **D RtcImsConference: getUserNameFromSipTelUriString uriString: +86*****524845D RtcImsConference: isSelfAddress(): falseD RtcImsConference: isSelfAddress(): address: **, mHostAddr: **D RtcImsConference: getUserNameFromSipTelUriString uriString: +86*****524845D RtcImsConference: isSelfAddress(): falseD RtcImsConference: isEmptyConference, userCount: 2  (会议成员,不包括host)D RtcImsConference: isEmptyConference, set mHaveUpdatedConferenceWithMember = trueD RILC    : imsConferenceInfoIndicationD RtcImsConference: updateConferenceStateWithLocalCacheD RILC    : controlImsConferenceCallMember: serial 587, controlType 0D RfxRoot : processMessage() msg = [type=REQUEST, source=GSM, dest=GSM, p...D RtcImsConference: getUserNameFromSipTelUriString uriString: +86*****945631D RfxRoot : processMessage() msg = [type=RESPONSE, source=GSM, dest=GSM,..D RtcImsConference: modifyParticipantCompleteD RtcImsConference: modifyParticipantComplete: mLocalParticipants:752*****752D RtcImsConference: modifyParticipantComplete: mLocalParticipants:+86*****945631D RfxRoot : processMessage() msg = [type=URC, source=GSM, dest=GSM,..D RtcImsConference: startElement Conference uri: xmlnsD RtcImsConference: :startElement mCEPState: 1D RtcImsConference: :startElement version: 1D RtcImsConference: startElement MaxUserCount: 0D RtcImsConference: startElement MaxUserCount: 6D RtcImsConference: startElement user - entity: tel*****8507524845D RtcImsConference: startElement display-text: **D RtcImsConference: startElement display-text: +86*****524845D RtcImsConference: startElement endpoint - entity: sip*****0.0:65535D RtcImsConference: startElement status: D RtcImsConference: startElement status: connectedD RtcImsConference: endElement end user mUsers.size: 1D RtcImsConference: startElement user - entity: tel***010D RtcImsConference: startElement endpoint - entity: sip*****0.0:65535D RtcImsConference: startElement status: D RtcImsConference: startElement status: connectedD RtcImsConference: endElement end user mUsers.size: 2D RtcImsConference: startElement user - entity: tel*****3267945631D RtcImsConference: startElement endpoint - entity: sip*****0.0:65535D RtcImsConference: startElement status: D RtcImsConference: startElement status: disconnectedD RtcImsConference: endElement end user mUsers.size: 3D RtcImsConference: cepState: 1D RtcImsConference: setupHostD RtcImsConference: getUserNameFromSipTelUriString uriString: **D RtcImsConference: setupHost: mHostAddr: **D RtcImsConference: fullUpdateParticipantsD RtcImsConference: getUserNameFromSipTelUriString uriString: tel*****8507524845D RtcImsConference: getUserNameFromSipTelUriString uriString: tel***010D RtcImsConference: getUserNameFromSipTelUriString uriString: tel*****3267945631D RtcImsConference: isPartialCEP: 0D RtcImsConference: isSelfAddress(): address: **, mHostAddr: **D RtcImsConference: getUserNameFromSipTelUriString uriString: +86*****524845D RtcImsConference: isSelfAddress(): address: **, mHostAddr: **D RtcImsConference: getUserNameFromSipTelUriString uriString: +86*****524845D RtcImsConference: isSelfAddress(): falseD RtcImsConference: updateLocalCache: remove +86*****945631D RtcImsConference: notifyConfStateUpdate()D RtcImsConference: isEmptyConferenceD RtcImsConference: isSelfAddress(): address: **, mHostAddr: **D RtcImsConference: getUserNameFromSipTelUriString uriString: +86*****524845D RtcImsConference: isSelfAddress(): address: **, mHostAddr: **D RtcImsConference: getUserNameFromSipTelUriString uriString: +86*****524845D RtcImsConference: isSelfAddress(): falseD RtcImsConference: isEmptyConference, userCount: 1D RILC    : imsConferenceInfoIndicationD RtcImsConference: updateConferenceStateWithLocalCacheD RtcImsConference: closeConference()D RfxRoot : processMessage() msg = [type=URC, source=GSM, dest=GSM...D RtcImsConference: handleVolteConfCallMessage 

3、在mobilelog(主要是main_log、radio_log、sys_log)中查找“Telecom :  | Telephony:”,有:

D Telecom : Logging: START_SESSIONI Telecom : Event: RecordEntry ...: REQUEST_DISCONNECT,I Telecom : Call: Send disconnect to connection service for call:       [Capabilities: CAPABILITY_HOLD CAPABILITY_SUPPORT_HOLD CAPABILITY_MUTE],        [Properties: PROPERTY_HIGH_DEF_AUDIO PROPERTY_IMS]]D Telecom : ConnectionServiceWrapper: Telecom -> ConnectionService   TelephonyConnectionService]: disconnect        D Telecom : Logging: END_SESSIOND Telecom : Adapter: disconnect call DisconnectCause [ Code: (LOCAL) Label: () Description: () Reason: (LOCAL) I Telecom : CallsManager: setCallState ACTIVE -> DISCONNECTED, call:...I Telecom : InCallController: Sending updateCallD Telecom : ConnectionServiceFocusManager: handleCallStateChanged I Telecom : PhoneStateBroadcaster: Broadcasted state change: 0I Telecom : IncomingCallNotifier: updateIncomingCallI Telecom : InCallController: onCallAdded:I Telecom : CallsManager: Creating a new outgoing call with handle: tel:***10

4.修改log等级(V>D>I)

adb shell setprop log.tag.Telecom Vadb shell setprop log.tag.Telephony Vadb shell setprop log.tag.TelecomFramework V adb shell setprop persist.log.tag.RtcCC Vadb shell setprop persist.log.tag.RtcImsConference V

常见问题FAQ:

Q1: UE在建立conference call失败。Log中看UE 去refer其他成员时,无响应。

A1: 可以查看REFER中的Call-ID和之前的INVITE的是否一样。如果不一样,可以和网络侧确认他们需要的是in-dialog还是out-dialog的REFER请求。并修改工模中的refer_dialog_to_server值。0表示out-dialog,1表示in-dialog。

Q2: UE显示的成员号码不对

A2: 常见的是网络给的不对。可以在会议建立成功后,网络给的成员信息NOTIFY中的XML查看,网络给的号码是否正确?

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,082
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,556
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,406
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,179
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,815
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,898