Fix SignalRConnector bug and add modbus support in SignalR

This commit is contained in:
parallelbgls@outlook.com
2015-11-19 16:27:24 +08:00
parent bc2db78435
commit a33512ca6a
2 changed files with 74 additions and 57 deletions

View File

@@ -30,14 +30,18 @@ namespace ModBus.Net.FBox
{"MW", 14}, {"MW", 14},
{"MD", 15}, {"MD", 15},
{"M.B", 16}, {"M.B", 16},
{"0X", 20},
{"1X", 21},
{"2X", 22},
{"3X", 23},
{"4X", 24},
{"DB", 10000}, {"DB", 10000},
}; };
} }
public override KeyValuePair<int, int> AddressTranslate(string address, bool isRead) public override KeyValuePair<int, int> AddressTranslate(string address, bool isRead)
{ {
var tmpAddress = address.Replace(" ", ""); var tmpAddress = address.Trim().ToUpper();
tmpAddress = tmpAddress.ToUpper();
if (tmpAddress.Substring(0, 2) == "DB") if (tmpAddress.Substring(0, 2) == "DB")
{ {
var addressSplit = tmpAddress.Split('.'); var addressSplit = tmpAddress.Split('.');
@@ -48,15 +52,9 @@ namespace ModBus.Net.FBox
return new KeyValuePair<int, int>(int.Parse(addressSplit[1]), return new KeyValuePair<int, int>(int.Parse(addressSplit[1]),
int.Parse(addressSplit[0]) + AreaCodeDictionary["DB"]); int.Parse(addressSplit[0]) + AreaCodeDictionary["DB"]);
} }
int i = 0; var tmpAddressArray = (tmpAddress.Split(' '));
int t; string head = tmpAddressArray[0];
while (!int.TryParse(tmpAddress[i].ToString(), out t) && i < tmpAddress.Length) string tail = tmpAddressArray[1];
{
i++;
}
if (i == 0 || i >= tmpAddress.Length) throw new FormatException();
string head = tmpAddress.Substring(0, i);
string tail = tmpAddress.Substring(i);
return return
new KeyValuePair<int, int>(int.Parse(tail), new KeyValuePair<int, int>(int.Parse(tail),
AreaCodeDictionary[head]); AreaCodeDictionary[head]);

View File

@@ -11,7 +11,7 @@ using Thinktecture.IdentityModel.Client;
namespace ModBus.Net.FBox namespace ModBus.Net.FBox
{ {
public class SignalRSigninMsg public struct SignalRSigninMsg
{ {
public string ClientId { get; set; } public string ClientId { get; set; }
public string ClientSecret { get; set; } public string ClientSecret { get; set; }
@@ -23,12 +23,14 @@ namespace ModBus.Net.FBox
public class SignalRConnector : BaseConnector public class SignalRConnector : BaseConnector
{ {
private static OAuth2Client _oauth2; private static Dictionary<SignalRSigninMsg, OAuth2Client> _oauth2;
private HttpClient _httpClient; private HttpClient _httpClient;
private readonly Dictionary<string, HttpClient> _httpClient2; private static Dictionary<string, HttpClient> _httpClient2;
private readonly Dictionary<string, HubConnection> _hubConnections; private static Dictionary<string, HubConnection> _hubConnections;
private Dictionary<string, string> GroupNameUid { get; } private static HashSet<int> _boxSessionIds;
private static Dictionary<int, List<DMonGroup>> _boxSessionDataGroups;
private static Dictionary<string, string> _groupNameUid;
private static Dictionary<string, Dictionary<string, double>> _machineData; private static Dictionary<string, Dictionary<string, double>> _machineData;
private static Dictionary<string, Dictionary<string, Type>> _machineDataType; private static Dictionary<string, Dictionary<string, Type>> _machineDataType;
@@ -55,25 +57,31 @@ namespace ModBus.Net.FBox
ConnectionToken = machineId; ConnectionToken = machineId;
if (_oauth2 == null) if (_oauth2 == null)
{ {
_oauth2 = new OAuth2Client( _oauth2 = new Dictionary<SignalRSigninMsg, OAuth2Client>();
new Uri(Constants.TokenEndpoint),
msg.ClientId,
msg.ClientSecret
);
_hubConnections = new Dictionary<string, HubConnection>(); _hubConnections = new Dictionary<string, HubConnection>();
_httpClient2 = new Dictionary<string, HttpClient>(); _httpClient2 = new Dictionary<string, HttpClient>();
_machineData = new Dictionary<string, Dictionary<string, double>>(); _machineData = new Dictionary<string, Dictionary<string, double>>();
_machineDataType = new Dictionary<string, Dictionary<string, Type>>(); _machineDataType = new Dictionary<string, Dictionary<string, Type>>();
GroupNameUid = new Dictionary<string, string>(); _boxSessionIds = new HashSet<int>();
var tokenResponse = _oauth2.RequestResourceOwnerPasswordAsync _groupNameUid = new Dictionary<string, string>();
_boxSessionDataGroups = new Dictionary<int, List<DMonGroup>>();
}
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.UserId,
msg.Password, msg.Password,
msg.SigninAdditionalValues msg.SigninAdditionalValues
).Result; ).Result;
if (tokenResponse != null) if (tokenResponse != null)
AsyncHelper.RunSync(()=>CallService(tokenResponse.AccessToken)); AsyncHelper.RunSync(() => CallService(tokenResponse.AccessToken));
} }
} }
@@ -86,9 +94,9 @@ namespace ModBus.Net.FBox
{ {
try 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); null);
_connected = true; _connected = true;
Console.WriteLine("SignalR Connected success"); Console.WriteLine("SignalR Connected success");
@@ -150,15 +158,17 @@ namespace ModBus.Net.FBox
response = await client3.GetStringAsync("box/" + box.Box.Uid + "/dmon/def/grouped"); response = await client3.GetStringAsync("box/" + box.Box.Uid + "/dmon/def/grouped");
List<DMonGroup> dataGroups = JsonConvert.DeserializeObject<List<DMonGroup>>(response); List<DMonGroup> dataGroups = JsonConvert.DeserializeObject<List<DMonGroup>>(response);
_boxSessionDataGroups.Add(sessionId, dataGroups);
foreach (var dataGroup in dataGroups) foreach (var dataGroup in dataGroups)
{ {
if (dataGroup == null) return; if (dataGroup == null) return;
_boxSessionIds.Add(sessionId);
var groupUid = dataGroup.Uid; var groupUid = dataGroup.Uid;
var groupName = dataGroup.Name; 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 var client2 = new HttpClient
@@ -279,39 +289,48 @@ namespace ModBus.Net.FBox
hubConnection.Headers.Add("X-FBox-ClientId", guid); hubConnection.Headers.Add("X-FBox-ClientId", guid);
hubConnection.Headers.Add("X-FBox-Session", sessionId.ToString()); hubConnection.Headers.Add("X-FBox-Session", sessionId.ToString());
IHubProxy stockTickerHubProxy = hubConnection.CreateHubProxy("clientHub"); IHubProxy dataHubProxy = hubConnection.CreateHubProxy("clientHub");
stockTickerHubProxy.On<int, List<GetValue>>("dMonUpdateValue", dataHubProxy.On<int, List<GetValue>>("dMonUpdateValue",
(boxSessionId, values) => (boxSessionId, values) =>
{ {
if (boxSessionId == sessionId) if (_boxSessionIds.Contains(boxSessionId))
{ {
foreach (var value in values) 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<string, double>()); if (dataGroupInner.DMonEntries.Any(p => p.Uid == value.Id))
}
if (_machineData[groupName] == null)
{
_machineData[groupName] = new Dictionary<string, double>();
}
var dMonEntry =
dataGroup.DMonEntries.FirstOrDefault(p => p.Uid == value.Id);
if (value.Value.HasValue && dMonEntry != null)
{
if (_machineData[groupName].ContainsKey(dMonEntry.Desc))
{ {
_machineData[groupName][dMonEntry.Desc] = value.Value.Value; if (!_machineData.ContainsKey(dataGroupInner.Name))
} {
else _machineData.Add(dataGroupInner.Name, new Dictionary<string, double>());
{ }
_machineData[groupName].Add(dMonEntry.Desc, value.Value.Value); if (_machineData[dataGroupInner.Name] == null)
{
_machineData[dataGroupInner.Name] = new Dictionary<string, double>();
}
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<int, string, int, int>("boxConnectionStateChanged", dataHubProxy.On<int, string, int, int>("boxConnectionStateChanged",
async (newConnectionToken, getBoxUid, oldStatus, newStatus) => async (newConnectionToken, getBoxUid, oldStatus, newStatus) =>
{ {
if (getBoxUid == boxUid) if (getBoxUid == boxUid)
@@ -346,7 +365,7 @@ namespace ModBus.Net.FBox
hubConnection.Error += ex => Console.WriteLine(@"SignalR error: {0}", ex.Message); hubConnection.Error += ex => Console.WriteLine(@"SignalR error: {0}", ex.Message);
ServicePointManager.DefaultConnectionLimit = 10; ServicePointManager.DefaultConnectionLimit = 10;
await hubConnection.Start(); await hubConnection.Start();
await stockTickerHubProxy.Invoke("updateClientId", guid); await dataHubProxy.Invoke("updateClientId", guid);
client2.DefaultRequestHeaders.Add("X-FBox-Session", sessionId.ToString()); client2.DefaultRequestHeaders.Add("X-FBox-Session", sessionId.ToString());
} }
@@ -363,9 +382,9 @@ namespace ModBus.Net.FBox
{ {
try 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); null);
_connected = false; _connected = false;
Console.WriteLine("SignalR Disconnect success"); Console.WriteLine("SignalR Disconnect success");