A-A+
UCMA开发-自动回复机器人
本文将基于之前介绍的开发基础,来讲述如何使用UCMA创建一个可以自动回复的机器人程序。
第一步:创建ConnectionManager,这是通讯的基础。参考《UCMA开发之ConnectionManager》一文中所介绍的方法完成创建。
第二步:生成SipEndPoint。此SipEndPoint就代表所要创建的机器人,SipEndPoint创建时依赖唯一的SIP地址,所以创建此机器人后,凡是发送给此SIP地址的信息,都会获得自动回复。可以参考《UCMA开发-SipEndPoint》一文中所介绍的方法完成创建,但是实际的创建要稍显复杂一些。
- SipEndpoint sipEndPoint;
- try
- {
- //《UCMA开发之SipEndPoint》中的new SipEndPoint()代码段
- ……
- //注册Session接收事件
- //如果发起了新的会话就会被触发,此时需要参与至新会话中
- sipEndPoint.SessionReceived += SipEndpoint_SessionReceived;
- }
- catch (Exception ex)
- {
- throw ex;
- }
- //如果是注册状态则注销,为下一次注册准备
- if (sipEndPoint.RegistrationState == RegistrationState.Registered)
- {
- sipEndPoint.Unregister();
- }
- //创建信号头
- List<SignalingHeader> headers = new List<SignalingHeader>();
- headers.Add(SignalingHeader.MicrosoftSupportedForking);
- //如果是未注册状态则注册
- if (sipEndPoint.RegistrationState == RegistrationState.Unregistered)
- {
- sipEndPoint.Register(headers);
- }
- //如果是注册状态则注销,为下一次注册准备
- if (sipEndPoint.RegistrationState == RegistrationState.Registered)
- {
- sipEndPoint.Unregister();
- }
- //如果未注册则注册
- //两次注册以保证服务器正确发布注册终端及其端口号
- if (sipEndPoint.RegistrationState == RegistrationState.Unregistered)
- {
- sipEndPoint.Register(headers);
- }
第三步:处理SessionReceived事件。当其他联系人向第二步生成的SipEndPoint发送消息时,会首先创建新的SignalingSession,并且触发SessionReceived事件将其抛出,当事件被触发时,需要控制当前的SipEndPoint参与至此会话。
- void SipEndpoint_SessionReceived(object sender, SessionReceivedEventArgs e)
- {
- //参见《UCMA开发之SignalingSession》
- e.Session.OfferAnswerNegotiation = this;
- //开始参与该会话Session
- e.Session.BeginParticipate(new AsyncCallback(ParticipateCallback), e.Session);
- }
- void ParticipateCallback(IAsyncResult ar)
- {
- SignalingSession session = ar.AsyncState as SignalingSession;
- SipMessageData response = null;
- try
- {
- response = session.EndParticipate(ar);
- //参与至新会话后,就可以注册消息接收事件
- //当新消息到达时,会触发此事件
- session.MessageReceived += SipEndpoint_MessageReceived;
- }
- catch(Exception ex)
- {
- throw ex;
- }
- }
第四步:处理SignalSession的MessageReceived事件。在这一步中,其实就是机器人的最终实现,可以根据联系人发送的消息内容进行回复。
- void SipEndpoint_MessageReceived(object sender, MessageReceivedEventArgs e)
- {
- SignalingSession session = sender as SignalingSession;
- //如果信息类型是消息,则触发接收事件并自动进行回复
- if (e.MessageType == MessageType.Message)
- {
- //自动回复
- session.SendMessage(MessageType.Message
- , new System.Net.Mime.ContentType("text/plain")
- , Encoding.UTF8.GetBytes("信息已被机器人自动接收!"));
- }
- }
在第四步中,其实可以按照业务逻辑完成不同的操作或者回复不同的消息,比如:当天天气信息,联系人电话等等。这个示例就是介绍如何使用UCMA制作一个无人值守的机器人,在创建时主要要注意以下几点:
- 使用最新的凭证来创建RealTimeConnectionManager,否则很容易在接下来的的步骤中发生“UnKnown Error”。
- 将SipEndPoint注册两次,以保证其能够正确发布。
- 必须调用BeginParticipate方法参与至新的会话中,否则对方有可能会收不到自动回复的消息。