Example #1
0
        /// <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);
        }
Example #2
0
        /// <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.成功);
        }