From a33512ca6a6bf572f4a2c123e31da42b436d67f8 Mon Sep 17 00:00:00 2001 From: "parallelbgls@outlook.com" Date: Thu, 19 Nov 2015 16:27:24 +0800 Subject: [PATCH] Fix SignalRConnector bug and add modbus support in SignalR --- .../ModBus.Net/FBox/AddressTranslatorFBox.cs | 20 ++-- .../ModBus.Net/FBox/SignalRConnector.cs | 111 ++++++++++-------- 2 files changed, 74 insertions(+), 57 deletions(-) diff --git a/Modbus.Net/ModBus.Net/FBox/AddressTranslatorFBox.cs b/Modbus.Net/ModBus.Net/FBox/AddressTranslatorFBox.cs index 29421a1..69eb337 100644 --- a/Modbus.Net/ModBus.Net/FBox/AddressTranslatorFBox.cs +++ b/Modbus.Net/ModBus.Net/FBox/AddressTranslatorFBox.cs @@ -30,14 +30,18 @@ namespace ModBus.Net.FBox {"MW", 14}, {"MD", 15}, {"M.B", 16}, + {"0X", 20}, + {"1X", 21}, + {"2X", 22}, + {"3X", 23}, + {"4X", 24}, {"DB", 10000}, }; } public override KeyValuePair AddressTranslate(string address, bool isRead) { - var tmpAddress = address.Replace(" ", ""); - tmpAddress = tmpAddress.ToUpper(); + var tmpAddress = address.Trim().ToUpper(); if (tmpAddress.Substring(0, 2) == "DB") { var addressSplit = tmpAddress.Split('.'); @@ -48,15 +52,9 @@ namespace ModBus.Net.FBox return new KeyValuePair(int.Parse(addressSplit[1]), int.Parse(addressSplit[0]) + AreaCodeDictionary["DB"]); } - int i = 0; - int t; - while (!int.TryParse(tmpAddress[i].ToString(), out t) && i < tmpAddress.Length) - { - i++; - } - if (i == 0 || i >= tmpAddress.Length) throw new FormatException(); - string head = tmpAddress.Substring(0, i); - string tail = tmpAddress.Substring(i); + var tmpAddressArray = (tmpAddress.Split(' ')); + string head = tmpAddressArray[0]; + string tail = tmpAddressArray[1]; return new KeyValuePair(int.Parse(tail), AreaCodeDictionary[head]); diff --git a/Modbus.Net/ModBus.Net/FBox/SignalRConnector.cs b/Modbus.Net/ModBus.Net/FBox/SignalRConnector.cs index d90e1cd..710d15d 100644 --- a/Modbus.Net/ModBus.Net/FBox/SignalRConnector.cs +++ b/Modbus.Net/ModBus.Net/FBox/SignalRConnector.cs @@ -11,7 +11,7 @@ using Thinktecture.IdentityModel.Client; namespace ModBus.Net.FBox { - public class SignalRSigninMsg + public struct SignalRSigninMsg { public string ClientId { get; set; } public string ClientSecret { get; set; } @@ -23,12 +23,14 @@ namespace ModBus.Net.FBox public class SignalRConnector : BaseConnector { - private static OAuth2Client _oauth2; + private static Dictionary _oauth2; private HttpClient _httpClient; - private readonly Dictionary _httpClient2; - private readonly Dictionary _hubConnections; + private static Dictionary _httpClient2; + private static Dictionary _hubConnections; - private Dictionary GroupNameUid { get; } + private static HashSet _boxSessionIds; + private static Dictionary> _boxSessionDataGroups; + private static Dictionary _groupNameUid; private static Dictionary> _machineData; private static Dictionary> _machineDataType; @@ -55,25 +57,31 @@ namespace ModBus.Net.FBox ConnectionToken = machineId; if (_oauth2 == null) { - _oauth2 = new OAuth2Client( - new Uri(Constants.TokenEndpoint), - msg.ClientId, - msg.ClientSecret - ); + _oauth2 = new Dictionary(); _hubConnections = new Dictionary(); _httpClient2 = new Dictionary(); _machineData = new Dictionary>(); _machineDataType = new Dictionary>(); - GroupNameUid = new Dictionary(); - var tokenResponse = _oauth2.RequestResourceOwnerPasswordAsync + _boxSessionIds = new HashSet(); + _groupNameUid = new Dictionary(); + _boxSessionDataGroups = new Dictionary>(); + } + + if (!_oauth2.ContainsKey(msg)) + { + _oauth2.Add(msg, new OAuth2Client( + new Uri(Constants.TokenEndpoint), + msg.ClientId, + msg.ClientSecret + )); + var tokenResponse = _oauth2[msg].RequestResourceOwnerPasswordAsync ( msg.UserId, msg.Password, msg.SigninAdditionalValues ).Result; if (tokenResponse != null) - AsyncHelper.RunSync(()=>CallService(tokenResponse.AccessToken)); - + AsyncHelper.RunSync(() => CallService(tokenResponse.AccessToken)); } } @@ -86,9 +94,9 @@ namespace ModBus.Net.FBox { try { - if (_hubConnections.ContainsKey(ConnectionToken) && _httpClient2.ContainsKey(ConnectionToken) && GroupNameUid.ContainsKey(ConnectionToken)) + if (_hubConnections.ContainsKey(ConnectionToken) && _httpClient2.ContainsKey(ConnectionToken) && _groupNameUid.ContainsKey(ConnectionToken)) { - await _httpClient2[ConnectionToken].PostAsync("dmon/group/" + GroupNameUid[ConnectionToken] + "/start", + await _httpClient2[ConnectionToken].PostAsync("dmon/group/" + _groupNameUid[ConnectionToken] + "/start", null); _connected = true; Console.WriteLine("SignalR Connected success"); @@ -150,15 +158,17 @@ namespace ModBus.Net.FBox response = await client3.GetStringAsync("box/" + box.Box.Uid + "/dmon/def/grouped"); List dataGroups = JsonConvert.DeserializeObject>(response); + _boxSessionDataGroups.Add(sessionId, dataGroups); foreach (var dataGroup in dataGroups) { if (dataGroup == null) return; + _boxSessionIds.Add(sessionId); var groupUid = dataGroup.Uid; var groupName = dataGroup.Name; - if (groupName != "(Default)" && !GroupNameUid.ContainsKey(groupName)) + if (groupName != "(Default)" && !_groupNameUid.ContainsKey(groupName)) { - GroupNameUid.Add(groupName, groupUid); + _groupNameUid.Add(groupName, groupUid); } var client2 = new HttpClient @@ -279,39 +289,48 @@ namespace ModBus.Net.FBox hubConnection.Headers.Add("X-FBox-ClientId", guid); hubConnection.Headers.Add("X-FBox-Session", sessionId.ToString()); - IHubProxy stockTickerHubProxy = hubConnection.CreateHubProxy("clientHub"); - stockTickerHubProxy.On>("dMonUpdateValue", + IHubProxy dataHubProxy = hubConnection.CreateHubProxy("clientHub"); + dataHubProxy.On>("dMonUpdateValue", (boxSessionId, values) => { - if (boxSessionId == sessionId) + if (_boxSessionIds.Contains(boxSessionId)) { foreach (var value in values) { - lock(_machineData) + lock (_machineData) { - if (dataGroup.DMonEntries.Any(p => p.Uid == value.Id)) + if (_boxSessionDataGroups.ContainsKey(boxSessionId)) { - if (!_machineData.ContainsKey(groupName)) + foreach (var dataGroupInner in _boxSessionDataGroups[boxSessionId]) { - _machineData.Add(groupName, new Dictionary()); - } - if (_machineData[groupName] == null) - { - _machineData[groupName] = new Dictionary(); - } - - var dMonEntry = - dataGroup.DMonEntries.FirstOrDefault(p => p.Uid == value.Id); - - if (value.Value.HasValue && dMonEntry != null) - { - if (_machineData[groupName].ContainsKey(dMonEntry.Desc)) + if (dataGroupInner.DMonEntries.Any(p => p.Uid == value.Id)) { - _machineData[groupName][dMonEntry.Desc] = value.Value.Value; - } - else - { - _machineData[groupName].Add(dMonEntry.Desc, value.Value.Value); + 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; } } } @@ -320,7 +339,7 @@ namespace ModBus.Net.FBox } } ); - stockTickerHubProxy.On("boxConnectionStateChanged", + dataHubProxy.On("boxConnectionStateChanged", async (newConnectionToken, getBoxUid, oldStatus, newStatus) => { if (getBoxUid == boxUid) @@ -346,7 +365,7 @@ namespace ModBus.Net.FBox hubConnection.Error += ex => Console.WriteLine(@"SignalR error: {0}", ex.Message); ServicePointManager.DefaultConnectionLimit = 10; await hubConnection.Start(); - await stockTickerHubProxy.Invoke("updateClientId", guid); + await dataHubProxy.Invoke("updateClientId", guid); client2.DefaultRequestHeaders.Add("X-FBox-Session", sessionId.ToString()); } @@ -363,9 +382,9 @@ namespace ModBus.Net.FBox { try { - if (_hubConnections.ContainsKey(ConnectionToken) && _httpClient2.ContainsKey(ConnectionToken) && GroupNameUid.ContainsKey(ConnectionToken)) + if (_hubConnections.ContainsKey(ConnectionToken) && _httpClient2.ContainsKey(ConnectionToken) && _groupNameUid.ContainsKey(ConnectionToken)) { - await _httpClient2[ConnectionToken].PostAsync("dmon/group/" + GroupNameUid[ConnectionToken] + "/stop", + await _httpClient2[ConnectionToken].PostAsync("dmon/group/" + _groupNameUid[ConnectionToken] + "/stop", null); _connected = false; Console.WriteLine("SignalR Disconnect success");