internal void Radio(C2CRadioPackage radioPkg) { //配置请求包 ServerRequestPackage reqtPkg = new ServerRequestPackage(true); IRadioMessageRequest reqtInterface = reqtPkg.Active_RadioMessageRequest(); reqtInterface.RadioMessage(radioPkg.Group.Token, radioPkg); BinTransferLayer binProcessor = _mclLayerProcessor.BinTransferProcessor; ServerReplyPackage replyPkg = null; try { replyPkg = binProcessor.SynSendMessage(reqtPkg, 100000); } catch (System.Exception ex) { throw new RadioGroupExcetion(ex.ToString()); } IRadioReply replyInterface = replyPkg.Active_RadioGroupReply(); bool ret; string errorDetail; replyInterface.RadioRet(out ret, out errorDetail); if (true == ret) { //nothing to do } else { throw new RadioGroupExcetion(errorDetail); } }
internal GroupDevice GetGroup(string detail) { //配置请求包 ServerRequestPackage reqtPkg = new ServerRequestPackage(true); IOnlineGroupListRequest reqtInterface = reqtPkg.Active_OnlineGroupListRequest(); reqtInterface.OnlineGroupRequest(); BinTransferLayer binprocessor = _mclLayerProcessor.BinTransferProcessor; ServerReplyPackage replyPkg = null; try { replyPkg = binprocessor.SynSendMessage(reqtPkg, 100000); } catch (Exception ex) { throw new GetOnlineGroupExcetion(ex.ToString()); } IOnlineGroupReply replyInterface = replyPkg.Active_OnlineGroupReply(); bool ret; string errorDetail; List <CSCommunicateClass.GroupInfo> onlineGroupInfo; replyInterface.OnlineGroupRet(out ret, out errorDetail, out onlineGroupInfo); if (true == ret) { foreach (CSCommunicateClass.GroupInfo item in onlineGroupInfo) { if (item.Detail.Equals(detail)) { GroupDevice gropInst = new GroupDevice(_mclLayerProcessor); GroupDevice.Parse(item, gropInst); try { //check join statucs List <CSCommunicateClass.ClientInfo> clients = null; GetGroupMembers(gropInst, out clients); if ((null != clients) && (0 < clients.Count)) { gropInst.Joined = true; } } catch (System.Exception ex) { //nothing to do } return(gropInst); } } throw new GetOnlineGroupExcetion("不存在指定名称的群组"); } else { throw new GetOnlineGroupExcetion(errorDetail); } }
internal void JoinGroup(GroupDevice group, GroupMemberRole role) { //配置请求包 ServerRequestPackage reqtPkg = new ServerRequestPackage(true); IJoinGroupRequest reqtInterface = reqtPkg.Active_JoinGroupRequest(); if (group.Ready && !string.IsNullOrEmpty(group.Token)) { reqtInterface.JoinGroup(group.Token, role); } else { throw new ArgumentNullException("Group token is null"); } BinTransferLayer binprocessor = _mclLayerProcessor.BinTransferProcessor; ServerReplyPackage replyPkg = null; try { replyPkg = binprocessor.SynSendMessage(reqtPkg, 100000); } catch (System.Exception ex) { throw new JoinGroupExcetion(ex.ToString()); } IJoinGroupReply replyInterface = replyPkg.Active_JoinGroupReply(); bool ret; string detail; replyInterface.JoinGroupRet(out ret, out detail); if (true == ret) { //该部分逻辑内聚到Group内部 ////加入成功 //group.Joined = true; //try //{ // //从接口的使用习惯上考虑,立即返回成员列表 // group.Referesh(); //} //catch (RefereshGroupInfo ex) //{ // //虽然刷新讯息抛出错误,但仍可以判定客户端已加入 // throw ex; //} } else { throw new JoinGroupExcetion(detail); } }
/// <summary> /// 非阻塞式执行一次消息发送请求 /// </summary> /// <param name="mtPkg">发往远程中间件设备的消息包</param> internal void AsynSendMessage(MiddlewareTransferPackage mtPkg) { //will send a message if ((mtPkg is RequestMTPackage) && ((mtPkg as RequestMTPackage).WattingResponse)) { __ActiveMiddlewareMessageWattinghere(mtPkg); } bool mustWaitReponse = true; ServerRequestPackage wilSendScsMsg = new ServerRequestPackage(mustWaitReponse); //配置为Middleware传输包 IMiddleware2MiddlewareCommunicatRequest statSeter = wilSendScsMsg.Active_MiddlewareCommunicatRequest(); statSeter.WilSendMiddleware2MiddlewareMessage(mtPkg.TargetDevice, mtPkg); BinTransferLayer btlprocessor = _middlewareCorelogicLayer.BinTransferProcessor; ServerReplyPackage replyServPkg = null; try { replyServPkg = btlprocessor.SynSendMessage(wilSendScsMsg, 100000); } catch (System.Exception ex) { //TODO throw new MiddlewareTransferErrorExcetion(ex); } //分析服务端报文 IMiddleware2MiddlewareCommunicatReply replyInterface = replyServPkg.Active_Middleware2MiddlewareCommunicatReply(); bool ret; string detail; try { replyInterface.SendMiddlewareMsgOprRet(out ret, out detail); } catch (Exception ex) { throw new MiddlewareTransferErrorExcetion(ex.ToString()); } if (true == ret) { //noting to do } else { throw new MiddlewareTransferErrorExcetion(detail); } }
internal MiddlewareCorelogicLayer() { _binProcessferProcessor = new BinTransferLayer(this); _middlewareCommunicateProcessor = new MiddlewareCommunicateLayer(this); _groupCommunicateProcessor = new GroupCommunicateLayer(this); mMiddlewareMessenger = MiddlewareMessenger.Instance; _asynSendRequestRunner = new SequentialItemProcessor <RequestCommunicatePackage>(this.__CoAsynSendRequestRunning); _asynFeedbackCommunicateReplyMessageRunner = new SequentialItemProcessor <ReplyCommunicatePackage>(this.__AsynFeedbackCommunicateReplyMessageRunning); _asynGetGroupRunner = new SequentialItemProcessor <KeyValuePair <string, GroupDevice> >(this.__AsynCoGetGroupRunning); _asynJoinGroupRunner = new SequentialItemProcessor <KeyValuePair <GroupDevice, GroupMemberRole> >(this.__CoAsynJoinGroupRunning); _asynExitGroupRunner = new SequentialItemProcessor <GroupDevice>(this.__CoAsynExitGroupRunning); _asynRadioRunner = new SequentialItemProcessor <GroupComunicatePackage>(this.__CoAsynRadioRunning); _asynCreategroupRunner = new SequentialItemProcessor <KeyValuePair <string, GroupDevice> >(this.__CoAsynCreateGroupRunning); }
internal void ExitGroup(GroupDevice group) { if (!group.Ready || string.IsNullOrEmpty(group.Token)) { throw new ExitGroupExcetion((new NullReferenceException("Group token is null")).ToString()); } //配置请求包 ServerRequestPackage reqtPkg = new ServerRequestPackage(true); IExitGroupRequest reqtInterface = reqtPkg.Active_ExitGroupRequest(); reqtInterface.ExitGroup(group.Token); BinTransferLayer binprocessor = _mclLayerProcessor.BinTransferProcessor; ServerReplyPackage replyPkg = null; try { replyPkg = binprocessor.SynSendMessage(reqtPkg, 100000); } catch (Exception ex) { throw new ExitGroupExcetion(ex.ToString()); } IExitGroupRely replyInterface = replyPkg.Active_ExitGroupReply(); bool ret; string errorDetail; replyInterface.ExitGroupRet(out ret, out errorDetail); if (true == ret) { //该部分逻辑内聚到Group内部 //group.Joined = false; //try //{ // group.Referesh(); //}catch(RefereshGroupInfo ex) //{ // throw ex; //} } else { throw new ExitGroupExcetion(errorDetail); } }
internal void GetGroupMembers(GroupDevice gropDevice, out List <CSCommunicateClass.ClientInfo> onlineGroupMembers) { //配置数据包 ServerRequestPackage servReqtPkg = new ServerRequestPackage(true); IOnlineGroupClientRequest reqtInterface = servReqtPkg.Active_OnlineGroupClientRequest(); reqtInterface.OnlineGroupClientRequest(gropDevice.Token); BinTransferLayer binprocessor = _mclLayerProcessor.BinTransferProcessor; ServerReplyPackage servReplyPkg = null; try { servReplyPkg = binprocessor.SynSendMessage(servReqtPkg, 100000); } catch (System.Exception ex) { throw new GetOnlineGroupClientExcetion(ex.ToString()); } IOnlineGroupClientReply replyInterface = servReplyPkg.Active_OnlineGroupClientReply(); bool ret; string errorDetail; try { replyInterface.OnlineGroupClientRet(out ret, out errorDetail, out onlineGroupMembers); } catch (Exception ex) { throw new GetOnlineGroupClientExcetion(ex.ToString()); } if (true == ret) { //nothing to do } else { throw new GetOnlineGroupClientExcetion(errorDetail); } }
internal GroupDevice CreateGroup(string detail) { //配置请求包 ServerRequestPackage reqtPkg = new ServerRequestPackage(true); ICreateGroupRequest reqtInterface = reqtPkg.Active_CreateGroupRequest(); reqtInterface.CreateNewGroup(detail); BinTransferLayer binprocessor = _mclLayerProcessor.BinTransferProcessor; ServerReplyPackage replyPkg = null; try { replyPkg = binprocessor.SynSendMessage(reqtPkg, 100000); } catch (System.Exception ex) { //throw timeout excetion throw new CreateGroupExcetion(ex.ToString()); } ICreateGroupReply replyInterface = replyPkg.Active_CreateGroupReply(); bool ret; string detailOrToken; replyInterface.CreateGroupRet(out ret, out detailOrToken); if (true == ret) { GroupDevice retGrop = new GroupDevice(_mclLayerProcessor); retGrop.Token = detailOrToken; retGrop.Detail = detail; retGrop.Ready = true; return(retGrop); } else { throw new CreateGroupExcetion(detailOrToken); } }
private MiddlewareTransferPackage __SendMessageAndWattingForResponse(MiddlewareTransferPackage msg, int timeoutMilliseconds) { WaitingMessage waitMsg = new WaitingMessage(); lock (_synWriteLockObject) { _synWattingMiddlewareReplyMessages[msg.MessageId] = waitMsg; } //send message bool mustWaitReponse = true; ServerRequestPackage wilSendServMsg = new ServerRequestPackage(mustWaitReponse); //配置为中间件传输包 IMiddleware2MiddlewareCommunicatRequest statSetter = wilSendServMsg.Active_MiddlewareCommunicatRequest(); statSetter.WilSendMiddleware2MiddlewareMessage(msg.TargetDevice, msg); BinTransferLayer btlpeocessor = _middlewareCorelogicLayer.BinTransferProcessor; ServerReplyPackage replyServPkg = null; try { replyServPkg = btlpeocessor.SynSendMessage(wilSendServMsg, 100000); } catch (System.Exception ex) { //释放锁记录 lock (_synWriteLockObject) { _synWattingMiddlewareReplyMessages.Remove(msg.MessageId); } throw new MiddlewareTransferErrorExcetion(ex.ToString()); } //分析服务端报文 IMiddleware2MiddlewareCommunicatReply replyInterface = replyServPkg.Active_Middleware2MiddlewareCommunicatReply(); bool ret; string detail; replyInterface.SendMiddlewareMsgOprRet(out ret, out detail); if (true == ret) { //noting to do } else { throw new MiddlewareTransferErrorExcetion(detail); } //wait for the recived event waitMsg.WaitEvent.Wait(timeoutMilliseconds); //Check for exceptions switch (waitMsg.State) { case MiddlewareTransferServerStateInfo.WaittingForResponse: { //同步超时 lock (_synWriteLockObject) { _synWattingMiddlewareReplyMessages.Remove(msg.MessageId); } throw new MiddlewareTransferErrorExcetion(MiddlewareTransferServerStateInfo.TimeOut.ToString()); } case MiddlewareTransferServerStateInfo.ResponseReceived: { lock (_synWriteLockObject) { _synWattingMiddlewareReplyMessages.Remove(msg.MessageId); } break; } } return(waitMsg.ResponseMessage); }