Exemplo n.º 1
0
        private string SendRequest(RequestCommand request, out string statusCode, out string errMsg)
        {
            request.timeoutSeconds = iotParam.timeoutSeconds;  //追加超时参数

            SuperSocketTCPClientOper tcpClientOper = new SuperSocketTCPClientOper(iotParam.commandIP, iotParam.port);

            tcpClientOper.DataReceived += WriteResponseReceiveHandle;
            if (!tcpClientOper.Connect(out string clienName, out errMsg))
            {
                errMsg     = "连接物联网服务失败,请检查服务服务器是否打开:" + errMsg;
                statusCode = "410";
                return("");
            }
            string jsonStr = ByteUtil.AddLineBreak(ByteUtil.ToSerializeObject(request));
            // 实现内部协议 GUID-key,T-body
            string key  = Guid.NewGuid().ToString();
            string data = key + " " + jsonStr;

            byte[] sendBuffer = ByteUtil.ToSerializeBuffer(data);
            tcpClientOper.SendData(clienName, sendBuffer, out errMsg);
            if (!string.IsNullOrWhiteSpace(errMsg))
            {
                errMsg     = "请求物联网服务数据包发送失败:" + errMsg;
                statusCode = "412";
                return("");
            }

            // 主线程等待设定秒 不返回认定为超时
            SpinWait wait = new SpinWait();
            DateTime dt   = DateTime.Now;

            while ((DateTime.Now - dt) < TimeSpan.FromSeconds(iotParam.timeoutSeconds + 4))
            {
                if (this.responseFlag)
                {
                    break;
                }
                wait.SpinOnce();
            }
            if (this.responseFlag) // 服务成功返回
            {
                try
                {
                    ResponseCommand response = ByteUtil.ToDeserializeObject <ResponseCommand>(reciveBuffer);
                    statusCode = response.statusCode;
                    errMsg     = response.errMsg;
                    return(response.info);
                }
                catch (Exception e)
                {
                    statusCode = "413";
                    errMsg     = "物联网服务返回参数反序列化失败:" + e.Message;
                    return("");
                }
            }
            else
            {
                statusCode = "414";
                errMsg     = "服务超时未返回";
                return("");
            }
        }