diff --git a/Modbus.Net/ModBus.Net/FBox/SignalRConnector.cs b/Modbus.Net/ModBus.Net/FBox/SignalRConnector.cs index 710d15d..499a024 100644 --- a/Modbus.Net/ModBus.Net/FBox/SignalRConnector.cs +++ b/Modbus.Net/ModBus.Net/FBox/SignalRConnector.cs @@ -24,13 +24,15 @@ namespace ModBus.Net.FBox public class SignalRConnector : BaseConnector { private static Dictionary _oauth2; - private HttpClient _httpClient; + + private static Dictionary _httpClient; private static Dictionary _httpClient2; private static Dictionary _hubConnections; - private static HashSet _boxSessionIds; - private static Dictionary> _boxSessionDataGroups; - private static Dictionary _groupNameUid; + private static Dictionary _boxUidSessionId; + private static Dictionary> _boxUidDataGroups; + private static Dictionary _groupNameUid; + private static Dictionary _groupNameBoxUid; private static Dictionary> _machineData; private static Dictionary> _machineDataType; @@ -57,14 +59,16 @@ namespace ModBus.Net.FBox ConnectionToken = machineId; if (_oauth2 == null) { + _httpClient = new Dictionary(); _oauth2 = new Dictionary(); _hubConnections = new Dictionary(); _httpClient2 = new Dictionary(); _machineData = new Dictionary>(); _machineDataType = new Dictionary>(); - _boxSessionIds = new HashSet(); + _boxUidSessionId = new Dictionary(); _groupNameUid = new Dictionary(); - _boxSessionDataGroups = new Dictionary>(); + _groupNameBoxUid = new Dictionary(); + _boxUidDataGroups = new Dictionary>(); } if (!_oauth2.ContainsKey(msg)) @@ -81,7 +85,7 @@ namespace ModBus.Net.FBox msg.SigninAdditionalValues ).Result; if (tokenResponse != null) - AsyncHelper.RunSync(() => CallService(tokenResponse.AccessToken)); + AsyncHelper.RunSync(() => CallService(msg, tokenResponse.AccessToken)); } } @@ -94,9 +98,9 @@ namespace ModBus.Net.FBox { try { - if (_hubConnections.ContainsKey(ConnectionToken) && _httpClient2.ContainsKey(ConnectionToken) && _groupNameUid.ContainsKey(ConnectionToken)) + if (_hubConnections.ContainsKey(_groupNameBoxUid[ConnectionToken]) && _httpClient2.ContainsKey(_groupNameBoxUid[ConnectionToken]) && _groupNameUid.ContainsKey(ConnectionToken)) { - await _httpClient2[ConnectionToken].PostAsync("dmon/group/" + _groupNameUid[ConnectionToken] + "/start", + await _httpClient2[_groupNameBoxUid[ConnectionToken]].PostAsync("dmon/group/" + _groupNameUid[ConnectionToken] + "/start", null); _connected = true; Console.WriteLine("SignalR Connected success"); @@ -115,25 +119,29 @@ namespace ModBus.Net.FBox } } - private async Task CallService(string token) + private async Task CallService(SignalRSigninMsg msg, string token) { var guid = Guid.NewGuid().ToString(); var baseAddress = Constants.AspNetWebApiSampleApi; - _httpClient = new HttpClient + if (!_httpClient.ContainsKey(msg)) { - BaseAddress = new Uri(baseAddress) - }; + _httpClient.Add(msg, new HttpClient + { + BaseAddress = new Uri(baseAddress) + }); + } - _httpClient.SetBearerToken(token); + _httpClient[msg].SetBearerToken(token); /*var response = await _httpClient.GetStringAsync("device/spec"); List deviceSpecs = JsonConvert.DeserializeObject>(response); deviceSpecs = deviceSpecs.OrderBy(p => p.Id).ToList(); */ - var response = await _httpClient.GetStringAsync("boxgroup"); + + var response = await _httpClient[msg].GetStringAsync("boxgroup"); List boxGroups = JsonConvert.DeserializeObject>(response); @@ -148,21 +156,122 @@ namespace ModBus.Net.FBox var boxUid = box.Box.Uid; //var currentStat = box.Box.ConnectionState; - var client3 = new HttpClient + var client2 = new HttpClient { BaseAddress = new Uri(baseUrl) }; - client3.SetBearerToken(token); - client3.DefaultRequestHeaders.Add("X-FBox-ClientId", guid); + client2.SetBearerToken(token); + client2.DefaultRequestHeaders.Add("X-FBox-ClientId", guid); - response = await client3.GetStringAsync("box/" + box.Box.Uid + "/dmon/def/grouped"); + response = await client2.GetStringAsync("box/" + box.Box.Uid + "/dmon/def/grouped"); List dataGroups = JsonConvert.DeserializeObject>(response); - _boxSessionDataGroups.Add(sessionId, dataGroups); + _boxUidDataGroups.Add(boxUid, dataGroups); + + var hubConnection = new HubConnection(signalrUrl); + _hubConnections.Add(boxUid, hubConnection); + hubConnection.Headers.Add("Authorization", "Bearer " + token); + hubConnection.Headers.Add("X-FBox-ClientId", guid); + hubConnection.Headers.Add("X-FBox-Session", sessionId.ToString()); + + IHubProxy dataHubProxy = hubConnection.CreateHubProxy("clientHub"); + dataHubProxy.On>("dMonUpdateValue", + (boxSessionId, values) => + { + if (_boxUidSessionId.ContainsValue(boxSessionId)) + { + var localBoxUid = _boxUidSessionId.FirstOrDefault(p => p.Value == boxSessionId).Key; + foreach (var value in values) + { + lock (_machineData) + { + if (_boxUidDataGroups.ContainsKey(localBoxUid)) + { + foreach (var dataGroupInner in _boxUidDataGroups[localBoxUid]) + { + if (dataGroupInner.DMonEntries.Any(p => p.Uid == value.Id)) + { + if (!_machineData.ContainsKey(dataGroupInner.Name)) + { + _machineData.Add(dataGroupInner.Name, + new Dictionary()); + } + if (_machineData[dataGroupInner.Name] == null) + { + _machineData[dataGroupInner.Name] = + new Dictionary(); + } + + var dMonEntry = + dataGroupInner.DMonEntries.FirstOrDefault(p => p.Uid == value.Id); + + if (value.Value.HasValue && dMonEntry != null) + { + if (_machineData[dataGroupInner.Name].ContainsKey(dMonEntry.Desc)) + { + _machineData[dataGroupInner.Name][dMonEntry.Desc] = + value.Value.Value; + } + else + { + _machineData[dataGroupInner.Name].Add(dMonEntry.Desc, + value.Value.Value); + } + } + break; + } + } + } + } + } + } + }); + + dataHubProxy.On("boxConnectionStateChanged", + async (newConnectionToken, getBoxUid, oldStatus, newStatus) => + { + if (_httpClient2.ContainsKey(getBoxUid)) + { + sessionId = newConnectionToken; + _boxUidSessionId[getBoxUid] = sessionId; + _httpClient2[getBoxUid].DefaultRequestHeaders.Remove("X-FBox-Session"); + _httpClient2[getBoxUid].DefaultRequestHeaders.Add("X-FBox-Session", sessionId.ToString()); + + if (newStatus == 1 && IsConnected) + { + var localDataGroups = _boxUidDataGroups[getBoxUid]; + foreach (var localDataGroup in localDataGroups) + { + await + _httpClient2[getBoxUid].PostAsync( + "dmon/group/" + localDataGroup.Uid + "/start", null); + } + } + else + { + var localDataGroups = _boxUidDataGroups[getBoxUid]; + foreach (var localDataGroup in localDataGroups) + { + if (_machineData.ContainsKey(localDataGroup.Name)) + { + _machineData.Remove(localDataGroup.Name); + } + await + _httpClient2[getBoxUid].PostAsync( + "dmon/group/" + localDataGroup.Uid + "/stop", null); + } + } + } + } + ); + + hubConnection.Error += ex => Console.WriteLine(@"SignalR error: {0}", ex.Message); + ServicePointManager.DefaultConnectionLimit = 10; + foreach (var dataGroup in dataGroups) { if (dataGroup == null) return; - _boxSessionIds.Add(sessionId); + _boxUidSessionId.Add(boxUid, sessionId); var groupUid = dataGroup.Uid; var groupName = dataGroup.Name; @@ -170,22 +279,16 @@ namespace ModBus.Net.FBox { _groupNameUid.Add(groupName, groupUid); } - - var client2 = new HttpClient + if (groupName != "(Default)" && !_groupNameBoxUid.ContainsKey(groupName)) { - BaseAddress = new Uri(baseUrl) - }; - if (groupName != "(Default)" && !_httpClient2.ContainsKey(groupName)) + _groupNameBoxUid.Add(groupName, boxUid); + } + if (groupName != "(Default)" && !_httpClient2.ContainsKey(boxUid)) { - _httpClient2.Add(groupName, client2); + _httpClient2.Add(boxUid, client2); } - client2.SetBearerToken(token); - client2.DefaultRequestHeaders.Add("X-FBox-ClientId", guid); - var hubConnection = new HubConnection(signalrUrl); - if (groupName != "(Default)") - _hubConnections.Add(groupName, hubConnection); if (!_machineDataType.ContainsKey(groupName)) { @@ -284,91 +387,10 @@ namespace ModBus.Net.FBox _machineDataType[groupName][dMonEntry.Desc] = type; } } - - hubConnection.Headers.Add("Authorization", "Bearer " + token); - hubConnection.Headers.Add("X-FBox-ClientId", guid); - hubConnection.Headers.Add("X-FBox-Session", sessionId.ToString()); - - IHubProxy dataHubProxy = hubConnection.CreateHubProxy("clientHub"); - dataHubProxy.On>("dMonUpdateValue", - (boxSessionId, values) => - { - if (_boxSessionIds.Contains(boxSessionId)) - { - foreach (var value in values) - { - lock (_machineData) - { - if (_boxSessionDataGroups.ContainsKey(boxSessionId)) - { - foreach (var dataGroupInner in _boxSessionDataGroups[boxSessionId]) - { - if (dataGroupInner.DMonEntries.Any(p => p.Uid == value.Id)) - { - if (!_machineData.ContainsKey(dataGroupInner.Name)) - { - _machineData.Add(dataGroupInner.Name, new Dictionary()); - } - if (_machineData[dataGroupInner.Name] == null) - { - _machineData[dataGroupInner.Name] = new Dictionary(); - } - - var dMonEntry = - dataGroupInner.DMonEntries.FirstOrDefault(p => p.Uid == value.Id); - - if (value.Value.HasValue && dMonEntry != null) - { - if (_machineData[dataGroupInner.Name].ContainsKey(dMonEntry.Desc)) - { - _machineData[dataGroupInner.Name][dMonEntry.Desc] = - value.Value.Value; - } - else - { - _machineData[dataGroupInner.Name].Add(dMonEntry.Desc, - value.Value.Value); - } - } - break; - } - } - } - } - } - } - } - ); - dataHubProxy.On("boxConnectionStateChanged", - async (newConnectionToken, getBoxUid, oldStatus, newStatus) => - { - if (getBoxUid == boxUid) - { - sessionId = newConnectionToken; - client2.DefaultRequestHeaders.Remove("X-FBox-Session"); - client2.DefaultRequestHeaders.Add("X-FBox-Session", sessionId.ToString()); - if (newStatus == 1 && IsConnected) - { - await client2.PostAsync("dmon/group/" + groupUid + "/start", null); - } - else - { - if (_machineData.ContainsKey(groupName)) - { - _machineData.Remove(groupName); - } - await client2.PostAsync("dmon/group/" + groupUid + "/stop", null); - } - } - } - ); - hubConnection.Error += ex => Console.WriteLine(@"SignalR error: {0}", ex.Message); - ServicePointManager.DefaultConnectionLimit = 10; - await hubConnection.Start(); - await dataHubProxy.Invoke("updateClientId", guid); - - client2.DefaultRequestHeaders.Add("X-FBox-Session", sessionId.ToString()); } + + await hubConnection.Start(); + await dataHubProxy.Invoke("updateClientId", guid); } } } @@ -382,9 +404,9 @@ namespace ModBus.Net.FBox { try { - if (_hubConnections.ContainsKey(ConnectionToken) && _httpClient2.ContainsKey(ConnectionToken) && _groupNameUid.ContainsKey(ConnectionToken)) + if (_hubConnections.ContainsKey(_groupNameBoxUid[ConnectionToken]) && _httpClient2.ContainsKey(_groupNameBoxUid[ConnectionToken]) && _groupNameUid.ContainsKey(ConnectionToken)) { - await _httpClient2[ConnectionToken].PostAsync("dmon/group/" + _groupNameUid[ConnectionToken] + "/stop", + await _httpClient2[_groupNameBoxUid[ConnectionToken]].PostAsync("dmon/group/" + _groupNameUid[ConnectionToken] + "/stop", null); _connected = false; Console.WriteLine("SignalR Disconnect success");