PowerTalkBox和飞信结合搞定在线客户端(.net)

来源:互联网 发布:阿里云的cdn怎么用 编辑:程序博客网 时间:2024/05/16 12:05

一个礼拜了,都在搞这个在线客户端,差点没崩溃,最终还是搞定了,嘿嘿,在此感谢一下那些帮助我的同学、朋友、老师、网友,嘿嘿,要不还不知道啥时候才能搞定呢.......

这玩意其实说通了也就两个飞信号在那对发信息,即Web(用PowerTalkBox)--服务端(使用飞信的sdk,这里用一个飞信号)--飞信客户端(这是我们的客服号),基本思路是:用户在Web端发送一条消息,通过socket发送给服务端,服务端接收完成到信息后,将该信息通过飞信的sdk转发给客服,客服回复信息,发送到服务端,服务端利用飞信sdk收到消息,调用一个根据PowerTalkBox写的服务,将消息加入到PowerTalkBox的对话列表中,这样web端就直接将这条消息调出来,客户就可以看到了,哈

客户端那边是用web实现的,以前有看过那个PowerTalkBox,带源码,觉得还不错,这次决定还是用这个进行二次开发,改改,哈哈

首先要搞定的就是服务端调用飞信sdk和飞信客户端通讯,刚开始不懂飞信的sdk怎么用,后面网上找了一下,结果找到的都是php的,哎!看来不行,得自己写,呵呵,找了一些帮助文档,恩,相对来说还是比较简单的,玩了一下,服务端可以和飞信的客户端通讯了......,把飞信的sdk一些基本的东西贴出来....,嘿嘿

/// <summary>
        /// 登陆飞信
        /// </summary>
        private bool FetionLogin(string userName,string pwd)
        {
                sdk.AccountManager.FillUserIdAndPassword(userName, pwd, false);//第三个参数为是否自动登陆
                 bool isOk=sdk.AccountManager.Login();//登陆           
                 return isOk;
        }

        /// <summary>
        /// 发送消息
        /// </summary>
        private void SendFetionMsg(string userName, string msg)
        {       

    //userName为对方的飞信号,msg为要发送的信息

                sdk.ContactControl.SendIM.SendIM(userName, msg);   

        }


        /// <summary>
        /// 发送手机消息
        /// </summary>
        private void SendFetionMobileMsg(string userName, string msg)
        { 

    //userName为对方的飞信号,msg为要发送的信息

               sdk.ContactControl.SendSMS.SendSMS(userName, msg);

        }
        

        /// <summary>
        /// 加载好友列表
        /// </summary>
        /// <param name="psSdk">飞信sdk对象</param>
        /// <returns>返回飞信好友信息集合</returns>
        private List<FetionFriend> GetFetionFriendList(FetionSDK psSdk)
        {
            List<FetionFriend> fetionFriends = new List<FetionFriend>();
            try
            {
                List<Imps.Client.Core.Contact> list = psSdk.ContactControl.getAllContactList();
                for (int i = 0; i < list.Count; i++)
                {
                    try
                    {
                        FetionFriend fetionFriend = new FetionFriend();//自定义飞信用户实体信息类
                        fetionFriend.UserId = int.Parse(list[i].Uri.Id);
                        fetionFriend.Nickname = list[i].DisplayName;
                        fetionFriend.Mobile = list[i].PersonalInfo.MobileNo;
                        fetionFriends.Add(fetionFriend);
                    }
                    catch { }                   
                }
            }
            catch { fetionFriends = new List<FetionFriend>(); }
            return fetionFriends;
        }
        

        /// <summary>
        /// 飞信sdk出现错误
        /// </summary>
        private void Sdk_SDK_Error(object sender, NullStudio.Fetion_SDK.Event.SDK_ErrorEventArgs fe)
        {

        }

 

        /// <summary>
        /// 当前飞信号状态
        /// </summary>
        private void Sdk_SDK_UserSatusChange(object sender, Imps.Client.Core.UserSatusChangedEventArgs e)
        {
            switch (e.NewStatus.ToString())
            {
                case "Disconnected"://断开了网络
                    FetionLogin(userName, userPwd);//重新登陆
                    break;
                case "Initialized"://已初始化
                   
                    break;
                case "Loginning"://登陆中

                    break;
                case "Logon"://已登陆
                     sdk.AccountManager.CurrentUser.Presence.AsyncChangeMainPresence(Imps.Common.MainPresence.Online, Imps.Common.MainPresence.Online.ToString());//设置PC在线
                    break;
                case "Logoff"://离开网络

                    break;
                case "Logouting"://注销中

                    break;
                case "None"://无状态

                    break;
                case "OfflineLogon"://离线

                    break;
                case "StandBy"://待机

                    break;
                case "WaitReconnect"://等待

                    break;
            }      

      }

        /// <summary>
        /// 接收到的消息
        /// </summary>
        private void sdk_SDK_ReceiveMessage(object sender, NullStudio.Fetion_SDK.Event.SDK_ReceiveMessageEventArgs fe)
        {

    //fe.Message为接收到的消息

  }

恩,单这些就可以实现服务器跟客户端通讯的功能了.....

 

接下去就要搞定web和服务端之间的通讯了,这块比较变态点....,在Powertalkbox有接收消息和发送消息的事件刚开始看到的时候,高兴得要死,结果进去一看,只有接收消息的时候,在事件里能获取消息,发送消息获取不到....,悲剧了....,哎!没办法,只能去研究一下PowerTalkBox的发送事件怎么写了,后面看着看着实在不知道该怎么在那发送事件里重写sendevent,火大,直接在事件中弄一个全局静态变量,嘿嘿,这样在外面就可以调用了....,哈,这样就可以从web通过socket发送消息给服务端了。

服务端发送消息给web这个刚开始有点晕,后面干脆就直接去看PowerTalkBox是怎么发送消息的,结果发现那边消息都是全部存到一个list中,嘿嘿,这样就好办了,在PowerTalkBox那边做一个将消息添加到list中的服务,然后在服务端接收飞信消息的那事件中调用一下这个服务,将消息传入list中,嘿嘿,web那边就直接自动将消息显示出来了.....这样就搞定了,哈

感觉web这边用socket发送消息给服务端好像不太好.....,具体怎么个不好法说不大清楚....,嘿嘿,有什么好思路大家共享一下哈,嘿嘿

后记:在服务端这边还有一个小的问题,就是服务端这边飞信登录成功后差不多10分钟,就会掉线,我现在是做一个线程,每隔三分钟重新登录一下飞信,原本是做成改变一下状态的,不过还是不行,这样有时消息会丢失。后面发现好像可以使用一个什么移动的心跳包,在服务端每隔一段时间给移动那边发送一个包,这样就不会掉线了,嘿嘿,这个还值得研究研究

 

后面早上又做了一个监控网站的,如果网站不能浏览就发送短信给站长......,嘿嘿,上面的那些搞定了,其实这个也没什么了,哈,最主要是这里发送短信是直接发送到自己的手机上,嘿嘿,就是在发送消息的时候使用下面这方法:

//第一个参数直接这个,是给自己发送手机消息的意思,msg是要发送的内容

sdk.ContactControl.SendSMS.SendSMS(sdk.ContactControl.getMyself().Uri.Id,msg);