Beispiel #1
0
        private void DownloadPackage()
        {
            try
            {
                ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

                // 声明HTTP请求
                HttpWebRequest myRequest = (HttpWebRequest)HttpWebRequest.Create(new Uri(otaPackage.url));

                // SSL安全通道认证证书
                ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback((a, b, c, d) => { return(true); });

                myRequest.ClientCertificates.Add(IotUtil.GetCert(@"\certificate\DigiCertGlobalRootCA.crt.pem"));

                WebHeaderCollection wc = new WebHeaderCollection();
                wc.Add("Authorization", "Bearer " + otaPackage.token);
                myRequest.Headers = wc;

                int nfileSize = 0;
                using (WebResponse webResponse = myRequest.GetResponse())
                {
                    using (Stream myStream = webResponse.GetResponseStream())
                    {
                        using (FileStream fs = new FileStream(packageSavePath, FileMode.Create))
                        {
                            using (BinaryWriter bw = new BinaryWriter(fs))
                            {
                                using (BinaryReader br = new BinaryReader(myStream))
                                {
                                    // 向服务器请求,获得服务器的回应数据流
                                    byte[] nbytes    = new byte[1024 * 10];
                                    int    nReadSize = 0;
                                    nReadSize = br.Read(nbytes, 0, 1024 * 10);
                                    nfileSize = nReadSize;
                                    while (nReadSize > 0)
                                    {
                                        bw.Write(nbytes, 0, nReadSize);
                                        nReadSize = br.Read(nbytes, 0, 1024 * 10);
                                    }
                                }
                            }
                        }
                    }
                }

                if (nfileSize == otaPackage.fileSize)
                {
                    string strSHA256 = IotUtil.GetSHA256HashFromFile(packageSavePath);
                    Log.Info("SHA256 = " + strSHA256);

                    otaService.ReportOtaStatus(OTAService.OTA_CODE_SUCCESS, 100, version, null);
                    OnUpgradeSuccess(strSHA256);
                }
            }
            catch (WebException exp)
            {
                otaService.ReportOtaStatus(OTAService.OTA_CODE_DOWNLOAD_TIMEOUT, 0, version, exp.Message);
                OnUpgradeFailure();
            }
            catch (Exception ex)
            {
                otaService.ReportOtaStatus(OTAService.OTA_CODE_INNER_ERROR, 0, version, ex.Message);
                OnUpgradeFailure();
            }
        }
        /// <summary>
        /// 连接服务器
        /// </summary>
        /// <returns></returns>
        public int Connect()
        {
            string caCertPath = @"\certificate\DigiCertGlobalRootCA.crt.pem";

            try
            {
                string timestamp = DateTime.Now.ToString("yyyyMMddHH");
                string clientID  = clientConf.DeviceId + "_0_0_" + timestamp;

                // 对密码进行HmacSHA256加密
                string secret = string.Empty;
                if (!string.IsNullOrEmpty(clientConf.Secret))
                {
                    secret = EncryptUtil.HmacSHA256(clientConf.Secret, timestamp);
                }

                client = new MqttFactory().CreateManagedMqttClient();

                // 判断是否为安全连接
                if (clientConf.Port == 1883)
                {
                    options = new ManagedMqttClientOptionsBuilder()
                              .WithAutoReconnectDelay(TimeSpan.FromSeconds(RECONNECT_TIME))
                              .WithClientOptions(new MqttClientOptionsBuilder()
                                                 .WithTcpServer(clientConf.ServerUri, clientConf.Port)
                                                 .WithCommunicationTimeout(TimeSpan.FromSeconds(DEFAULT_CONNECT_TIMEOUT))
                                                 .WithCredentials(clientConf.DeviceId, secret)
                                                 .WithClientId(clientID)
                                                 .WithKeepAlivePeriod(TimeSpan.FromSeconds(DEFAULT_KEEPLIVE))
                                                 .WithCleanSession(false)
                                                 .WithProtocolVersion(MqttProtocolVersion.V311)
                                                 .Build())
                              .Build();
                }
                else if (clientConf.Port == 8883 && clientConf.DeviceCert == null)
                {
                    options = new ManagedMqttClientOptionsBuilder()
                              .WithAutoReconnectDelay(TimeSpan.FromSeconds(RECONNECT_TIME))
                              .WithClientOptions(new MqttClientOptionsBuilder()
                                                 .WithTcpServer(clientConf.ServerUri, clientConf.Port)
                                                 .WithCommunicationTimeout(TimeSpan.FromSeconds(DEFAULT_CONNECT_TIMEOUT))
                                                 .WithCredentials(clientConf.DeviceId, secret)
                                                 .WithClientId(clientID)
                                                 .WithKeepAlivePeriod(TimeSpan.FromSeconds(DEFAULT_KEEPLIVE))
                                                 .WithCleanSession(false)
                                                 .WithTls(new MqttClientOptionsBuilderTlsParameters()
                    {
                        AllowUntrustedCertificates = true,
                        UseTls       = true,
                        Certificates = new List <X509Certificate> {
                            IotUtil.GetCert(caCertPath)
                        },
                        CertificateValidationHandler      = delegate { return(true); },
                        IgnoreCertificateChainErrors      = false,
                        IgnoreCertificateRevocationErrors = false
                    })
                                                 .WithProtocolVersion(MqttProtocolVersion.V311)
                                                 .Build())
                              .Build();
                }
                else
                {
                    // 证书接入平台
                    options = new ManagedMqttClientOptionsBuilder()
                              .WithAutoReconnectDelay(TimeSpan.FromSeconds(RECONNECT_TIME))
                              .WithClientOptions(new MqttClientOptionsBuilder()
                                                 .WithTcpServer(clientConf.ServerUri, clientConf.Port)
                                                 .WithCommunicationTimeout(TimeSpan.FromSeconds(DEFAULT_CONNECT_TIMEOUT))
                                                 .WithCredentials(clientConf.DeviceId, string.Empty)
                                                 .WithClientId(clientID)
                                                 .WithKeepAlivePeriod(TimeSpan.FromSeconds(DEFAULT_KEEPLIVE))
                                                 .WithCleanSession(false)
                                                 .WithTls(new MqttClientOptionsBuilderTlsParameters()
                    {
                        AllowUntrustedCertificates = true,
                        UseTls       = true,
                        Certificates = new List <X509Certificate> {
                            IotUtil.GetCert(caCertPath), clientConf.DeviceCert
                        },
                        CertificateValidationHandler      = delegate { return(true); },
                        IgnoreCertificateChainErrors      = false,
                        IgnoreCertificateRevocationErrors = false
                    })
                                                 .WithProtocolVersion(MqttProtocolVersion.V311)
                                                 .Build())
                              .Build();
                }

                // 注册事件
                client.ApplicationMessageProcessedHandler = new ApplicationMessageProcessedHandlerDelegate(new Action <ApplicationMessageProcessedEventArgs>(ApplicationMessageProcessedHandlerMethod)); // 消息发布回调

                client.ApplicationMessageReceivedHandler = new MqttApplicationMessageReceivedHandlerDelegate(new Action <MqttApplicationMessageReceivedEventArgs>(MqttApplicationMessageReceived));      // 命令下发回调

                client.ConnectedHandler = new MqttClientConnectedHandlerDelegate(new Action <MqttClientConnectedEventArgs>(OnMqttClientConnected));

                client.DisconnectedHandler = new MqttClientDisconnectedHandlerDelegate(new Action <MqttClientDisconnectedEventArgs>(OnMqttClientDisconnected)); // 连接断开回调

                client.ConnectingFailedHandler = new ConnectingFailedHandlerDelegate(new Action <ManagedProcessFailedEventArgs>(OnMqttClientConnectingFailed));

                Log.Info("try to connect to server " + clientConf.ServerUri);

                // 连接平台设备
                client.StartAsync(options);

                mre.WaitOne();

                return(client.IsConnected ? 0 : -1);
            }
            catch (Exception ex)
            {
                Log.Error("SDK.Error: Connect to mqtt server fail, the deviceid is " + clientConf.DeviceId);

                return(-1);
            }
        }