123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173 |
- using Edge.Core.IndustryStandardInterface.NetworkController;
- using Microsoft.Extensions.Logging;
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Security.Cryptography;
- using System.Text;
- using System.Text.Json;
- using System.Threading.Tasks;
- using static DeviceInfoToAliIotHubViaGateway.App;
- namespace DeviceInfoToAliIotHubViaGateway
- {
-
-
-
- internal class AliIotHubMqttClientInitializer
- {
- private IMqttClientNetworkController mqttClient;
-
- public IMqttClientNetworkController MqttClient => this.mqttClient;
-
-
-
-
-
- internal AliIotHubMqttClientInitializer(IMqttClientNetworkController mqttClient)
- {
- this.mqttClient = mqttClient;
- }
-
-
-
-
-
-
-
-
-
-
-
- public async Task<DynamicDeviceInfo> DynamicRegDeviceWithoutPreRegAsync(string mqttServerUrl, int port,
- string mqttClientIdPrefix, string productKey, string productSecret, string dynamicDeviceName)
- {
- var rebootSucceed = await this.mqttClient.ResetAsync();
- if (!rebootSucceed)
- {
- await Task.Delay(500);
- return null;
- }
- await Task.Delay(2000);
-
- var status = await this.mqttClient.QueryStatusAsync();
-
- if (status != NetworkState.NetworkConnected)
- return null;
- bool succeed = false;
-
-
-
-
-
-
-
-
- succeed = await this.mqttClient.OpenAsync(mqttServerUrl, port);
- if (!succeed)
- {
- await Task.Delay(500);
- await this.mqttClient.CloseAsync();
- return null;
- }
- Random r = new Random();
- int random = 199;
- var toBeHashing = $"deviceName{dynamicDeviceName}productKey{productKey}random{random}";
- var aliIotHubMqttPwd = Encoding.UTF8.GetBytes(toBeHashing).SignWithHMacSHA1(Encoding.UTF8.GetBytes(productSecret));
- string aliIotHub_MqttComplexClientId = mqttClientIdPrefix + "|securemode=2,authType=regnwl,random=" + random + ",signmethod=hmacsha1|";
- var aliIotHubMqttUserName = dynamicDeviceName + "&" + productKey;
- var onMsgReceivedTCS = new TaskCompletionSource<string>();
- EventHandler<OnMqttMessageReceivedEventArg> evtHandler = (s, a) =>
- {
- if (a.Message.Topic == "/ext/regnwl")
- onMsgReceivedTCS.SetResult(Encoding.UTF8.GetString(a.Message.Message));
- };
- this.mqttClient.OnMessageReceived += evtHandler;
- succeed = await this.mqttClient.ConnectAsync(aliIotHub_MqttComplexClientId, aliIotHubMqttUserName, aliIotHubMqttPwd);
- if (!succeed)
- {
- await Task.Delay(500);
- await this.mqttClient.DisconnectAsync();
- return null;
- }
- try
- {
- var ti = Task.WaitAny(new[] { Task.Delay(6000), onMsgReceivedTCS.Task });
- if (ti == 0)
- return null;
- var dynamicRegistedGatewayDeviceInfo = JsonSerializer.Deserialize<DynamicDeviceInfo>(onMsgReceivedTCS.Task.Result);
- return dynamicRegistedGatewayDeviceInfo;
- }
- finally
- {
- this.mqttClient.OnMessageReceived -= evtHandler;
- }
- }
-
-
-
-
-
- public async Task<bool> DynamicDeviceConnAsync(string mqttServerUrl, int port, DynamicDeviceInfo dynamicDeviceInfo)
- {
- var rebootSucceed = await this.mqttClient.ResetAsync();
- if (!rebootSucceed)
- {
- await Task.Delay(500);
- return false;
- }
- await Task.Delay(2000);
-
- var status = await this.mqttClient.QueryStatusAsync();
-
- if (status != NetworkState.NetworkConnected)
- return false;
- bool succeed = false;
-
-
-
-
-
-
-
-
- succeed = await this.mqttClient.OpenAsync(mqttServerUrl, port);
- if (!succeed)
- {
- await Task.Delay(500);
- await this.mqttClient.CloseAsync();
- return false;
- }
- var aliIotHubMqttPwd = dynamicDeviceInfo.deviceToken;
- string aliIotHub_MqttComplexClientId = dynamicDeviceInfo.clientId + "|securemode=-2,authType=connwl|";
- var aliIotHubMqttUserName = dynamicDeviceInfo.deviceName + "&" + dynamicDeviceInfo.productKey;
- succeed = await this.mqttClient.ConnectAsync(aliIotHub_MqttComplexClientId, aliIotHubMqttUserName, aliIotHubMqttPwd);
- if (!succeed)
- {
- await Task.Delay(500);
- await this.mqttClient.DisconnectAsync();
- return false;
- }
- return true;
- }
- }
- }
|