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); } }