/// <summary> /// 短信发送 /// </summary> /// <param name="tel"></param> /// <param name="content"></param> /// <param name="res"></param> /// <returns></returns> public LocalErrCode SendMsg(string tel, string content, out CMPP_SUBMIT_RESP res, string spNumber = null) { if (spNumber == null) { spNumber = spPhoneNumber; } CMPP_SUBMIT[] subMsg = CreateSubmitMsg(serviceId, spId, spNumber, tel, content); //服务器响应 CMPPMsgBody_Base resp = null; LocalErrCode localRes = LocalErrCode.组件未启动; res = null; for (int i = 0; i < subMsg.Length; i++) { localRes = clien.Submit(subMsg[i], out resp); res = resp as CMPP_SUBMIT_RESP; if (localRes != LocalErrCode.成功 || res.Result != DeliverResult.正确) { break; } } return(localRes); }
/// <summary> /// 发送消息(同步等待服务器响应) /// (0命令成功处理 -1组件未启动 -2通道不可用 -3生成下发数据时错误 -4命令超时 -5指令异常丢失 -6重复的命令序列号 -7返回值类型非期望) /// </summary> /// <returns>返回值errorCode</returns> public LocalErrCode Submit(CMPPMsgBody_Base sendMsg, out CMPPMsgBody_Base resp, bool waitResp = true) { int currentChannelSN = channelSN; //记录当前通道序列号 DateTime cmdSendTime; //处理命令超时 resp = null; //响应 if (waitResp) { //等待命令响应锁 if (!System.Threading.Monitor.TryEnter(waitRespLock, MaxTimeOut * 1000)) { return(LocalErrCode.命令超时); } //添加命令队列 if (!CmppCmdQueue.TryAdd(sendMsg.MyHead.Sequence_Id, null)) { return(LocalErrCode.重复的命令序列号);//重复的命令序列号 } } cmdSendTime = DateTime.Now; //组件未启动,不能处理操作指令 if (!runFlag) { return(LocalErrCode.组件未启动); } //判断通道是否可用,不可用进行绑定 if (!channelStateReady) { Bind(); } //false通道未建立 true通道已建立可以发送数据 if (!channelStateReady) { return(LocalErrCode.通道不可用);//通道不可用 } //信道建立 开心进行初始短信信息 byte[] data; //填充 data = sendMsg.WriteBytes(); //进行发送,然后判断是否有返回值 try { lock (channelLockFlag) { currentChannelSN = channelSN; client_sk.GetStream().Write(data, 0, data.Length); } } catch (Exception ex) { //写入操作失败,通道作废 移除命令 // CloseSoket(); WriteLog(ex.Message); if (waitResp) { CmppCmdQueue.TryRemove(sendMsg.MyHead.Sequence_Id, out resp); } return(LocalErrCode.通道不可用); } channelLastUpdate = DateTime.Now; if (waitResp) { LocalErrCode result = WaiteResp(cmdSendTime, currentChannelSN, (uint)sendMsg.MyHead.Command_Id, sendMsg.MyHead.Sequence_Id, out resp); Monitor.Exit(waitRespLock); return(result);// } return(LocalErrCode.成功); }