A-A+

UCMA开发-自动回复机器人

2016年01月01日 技术 暂无评论 阅读 3,764 次

索引请点击这里

本文将基于之前介绍的开发基础,来讲述如何使用UCMA创建一个可以自动回复的机器人程序。

第一步:创建ConnectionManager,这是通讯的基础。参考《UCMA开发之ConnectionManager》一文中所介绍的方法完成创建。

第二步:生成SipEndPoint。此SipEndPoint就代表所要创建的机器人,SipEndPoint创建时依赖唯一的SIP地址,所以创建此机器人后,凡是发送给此SIP地址的信息,都会获得自动回复。可以参考《UCMA开发-SipEndPoint》一文中所介绍的方法完成创建,但是实际的创建要稍显复杂一些。

  1. SipEndpoint sipEndPoint;
  2. try
  3. {
  4.     //《UCMA开发之SipEndPoint》中的new SipEndPoint()代码段
  5.     ……
  6.     //注册Session接收事件
  7.     //如果发起了新的会话就会被触发,此时需要参与至新会话中
  8.     sipEndPoint.SessionReceived += SipEndpoint_SessionReceived;
  9. }
  10. catch (Exception ex)
  11. {
  12.     throw ex;
  13. }
  14. //如果是注册状态则注销,为下一次注册准备
  15. if (sipEndPoint.RegistrationState == RegistrationState.Registered)
  16. {
  17.     sipEndPoint.Unregister();
  18. }
  19. //创建信号头
  20. List<SignalingHeader> headers = new List<SignalingHeader>();
  21. headers.Add(SignalingHeader.MicrosoftSupportedForking);
  22. //如果是未注册状态则注册
  23. if (sipEndPoint.RegistrationState == RegistrationState.Unregistered)
  24. {
  25.     sipEndPoint.Register(headers);
  26. }
  27. //如果是注册状态则注销,为下一次注册准备
  28. if (sipEndPoint.RegistrationState == RegistrationState.Registered)
  29. {
  30.     sipEndPoint.Unregister();
  31. }
  32. //如果未注册则注册
  33. //两次注册以保证服务器正确发布注册终端及其端口号
  34. if (sipEndPoint.RegistrationState == RegistrationState.Unregistered)
  35. {
  36.     sipEndPoint.Register(headers);
  37. }

第三步:处理SessionReceived事件。当其他联系人向第二步生成的SipEndPoint发送消息时,会首先创建新的SignalingSession,并且触发SessionReceived事件将其抛出,当事件被触发时,需要控制当前的SipEndPoint参与至此会话。

  1. void SipEndpoint_SessionReceived(object sender, SessionReceivedEventArgs e)
  2. {
  3.     //参见《UCMA开发之SignalingSession》
  4.     e.Session.OfferAnswerNegotiation = this;
  5.     //开始参与该会话Session
  6.     e.Session.BeginParticipate(new AsyncCallback(ParticipateCallback), e.Session);
  7. }
  8. void ParticipateCallback(IAsyncResult ar)
  9. {
  10.     SignalingSession session = ar.AsyncState as SignalingSession;
  11.     SipMessageData response = null;
  12.     try
  13.     {
  14.         response = session.EndParticipate(ar);
  15.         //参与至新会话后,就可以注册消息接收事件
  16.         //当新消息到达时,会触发此事件
  17.         session.MessageReceived += SipEndpoint_MessageReceived;
  18.     }
  19.     catch(Exception ex)
  20.     {
  21.         throw ex;
  22.     }
  23. }

第四步:处理SignalSession的MessageReceived事件。在这一步中,其实就是机器人的最终实现,可以根据联系人发送的消息内容进行回复。

  1. void SipEndpoint_MessageReceived(object sender, MessageReceivedEventArgs e)
  2. {
  3.      SignalingSession session = sender as SignalingSession;
  4.      //如果信息类型是消息,则触发接收事件并自动进行回复
  5.      if (e.MessageType == MessageType.Message)
  6.      {
  7.          //自动回复
  8.           session.SendMessage(MessageType.Message
  9.                     , new System.Net.Mime.ContentType("text/plain")
  10.                     , Encoding.UTF8.GetBytes("信息已被机器人自动接收!"));
  11.      }
  12. }

在第四步中,其实可以按照业务逻辑完成不同的操作或者回复不同的消息,比如:当天天气信息,联系人电话等等。这个示例就是介绍如何使用UCMA制作一个无人值守的机器人,在创建时主要要注意以下几点:

  • 使用最新的凭证来创建RealTimeConnectionManager,否则很容易在接下来的的步骤中发生“UnKnown Error”。
  • 将SipEndPoint注册两次,以保证其能够正确发布。
  • 必须调用BeginParticipate方法参与至新的会话中,否则对方有可能会收不到自动回复的消息。

给我留言

Copyright © 字痕随行 保留所有权利.   Theme  Ality

用户登录

分享到: