2015-12-25 update 3 fix bugs in fboxconnector

This commit is contained in:
parallelbgls@outlook.com
2015-12-25 16:41:47 +08:00
6 changed files with 80 additions and 70 deletions

View File

@@ -5,11 +5,11 @@ namespace ModBus.Net.FBox
{ {
public class FBoxMachine : BaseMachine public class FBoxMachine : BaseMachine
{ {
public FBoxMachine(FBoxType fBoxType, string connectionString, SignalRSigninMsg msg, IEnumerable<AddressUnit> getAddresses, bool keepConnect) : base(getAddresses, keepConnect) public FBoxMachine(FBoxType fBoxType, string connectionString, string localSequence, SignalRSigninMsg msg, IEnumerable<AddressUnit> getAddresses, bool keepConnect) : base(getAddresses, keepConnect)
{ {
AddressFormater = new AddressFormaterFBox(); AddressFormater = new AddressFormaterFBox();
AddressCombiner = new AddressCombinerFBox(); AddressCombiner = new AddressCombinerFBox();
BaseUtility = new FBoxUtility(fBoxType, connectionString, CommunicateAddresses, msg); BaseUtility = new FBoxUtility(fBoxType, connectionString, localSequence, CommunicateAddresses, msg);
} }
} }
} }

View File

@@ -8,9 +8,9 @@ namespace ModBus.Net.FBox
{ {
public class FBoxSignalRProtocal : FBoxProtocal public class FBoxSignalRProtocal : FBoxProtocal
{ {
public FBoxSignalRProtocal(string machineId, SignalRSigninMsg msg) public FBoxSignalRProtocal(string machineId, string localSequence, SignalRSigninMsg msg)
{ {
ProtocalLinker = new FBoxSignalRProtocalLinker(machineId, msg); ProtocalLinker = new FBoxSignalRProtocalLinker(machineId, localSequence, msg);
} }
} }
} }

View File

@@ -8,7 +8,7 @@ namespace ModBus.Net.FBox
{ {
public class FBoxSignalRProtocalLinker : SignalRProtocalLinker public class FBoxSignalRProtocalLinker : SignalRProtocalLinker
{ {
public FBoxSignalRProtocalLinker(string machineId, SignalRSigninMsg msg) : base(machineId, msg) public FBoxSignalRProtocalLinker(string machineId, string localSequence, SignalRSigninMsg msg) : base(machineId, localSequence, msg)
{ {
} }

View File

@@ -17,6 +17,8 @@ namespace ModBus.Net.FBox
private FBoxType _fboxType; private FBoxType _fboxType;
private SignalRSigninMsg SigninMsg { get; set; } private SignalRSigninMsg SigninMsg { get; set; }
public string LocalSequence { get; set; }
protected IEnumerable<CommunicationUnit> CommunicationUnits { get; set; } protected IEnumerable<CommunicationUnit> CommunicationUnits { get; set; }
public FBoxType ConnectionType public FBoxType ConnectionType
{ {
@@ -35,16 +37,17 @@ namespace ModBus.Net.FBox
} }
case FBoxType.CommunicationTagSync: case FBoxType.CommunicationTagSync:
{ {
Wrapper = new FBoxSignalRProtocal(ConnectionString, SigninMsg); Wrapper = new FBoxSignalRProtocal(ConnectionString, LocalSequence, SigninMsg);
break; break;
} }
} }
} }
} }
public FBoxUtility(FBoxType fBoxType, string connectionString, IEnumerable<CommunicationUnit> communicationUnits, SignalRSigninMsg msg) public FBoxUtility(FBoxType fBoxType, string connectionString, string localSequence, IEnumerable<CommunicationUnit> communicationUnits, SignalRSigninMsg msg)
{ {
ConnectionString = connectionString; ConnectionString = connectionString;
LocalSequence = localSequence;
CommunicationUnits = communicationUnits.AsEnumerable(); CommunicationUnits = communicationUnits.AsEnumerable();
SigninMsg = msg; SigninMsg = msg;

View File

@@ -36,9 +36,25 @@ namespace ModBus.Net.FBox
private static Dictionary<string, string> _groupNameBoxUid; private static Dictionary<string, string> _groupNameBoxUid;
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;
private static Dictionary<string, string> _boxUidBoxNo;
public override string ConnectionToken { get; } public override string ConnectionToken { get; }
private string MachineId
{
get
{
return ConnectionToken.Split(',')[0];
}
}
private string LocalSequence {
get
{
return ConnectionToken.Split(',')[1];
}
}
private static AsyncLock _lock = new AsyncLock(); private static AsyncLock _lock = new AsyncLock();
private static bool _retokenFlag; private static bool _retokenFlag;
@@ -77,12 +93,12 @@ namespace ModBus.Net.FBox
} }
} }
public SignalRConnector(string machineId, SignalRSigninMsg msg) public SignalRConnector(string machineId, string localSequence, SignalRSigninMsg msg)
{ {
RetokenFlag = false; RetokenFlag = false;
Constants.SignalRServer = msg.SignalRServer; Constants.SignalRServer = msg.SignalRServer;
System.Net.ServicePointManager.ServerCertificateValidationCallback = delegate { return true; }; System.Net.ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
ConnectionToken = machineId; ConnectionToken = machineId + "," + localSequence;
if (_oauth2 == null) if (_oauth2 == null)
{ {
_httpClient = new Dictionary<SignalRSigninMsg, HttpClient>(); _httpClient = new Dictionary<SignalRSigninMsg, HttpClient>();
@@ -96,9 +112,10 @@ namespace ModBus.Net.FBox
_groupNameUid = new Dictionary<string, string>(); _groupNameUid = new Dictionary<string, string>();
_groupNameBoxUid = new Dictionary<string, string>(); _groupNameBoxUid = new Dictionary<string, string>();
_boxUidDataGroups = new Dictionary<string, List<DMonGroup>>(); _boxUidDataGroups = new Dictionary<string, List<DMonGroup>>();
_boxUidBoxNo = new Dictionary<string, string>();
} }
Msg = msg; Msg = msg;
} }
public override bool Connect() public override bool Connect()
{ {
@@ -149,13 +166,13 @@ namespace ModBus.Net.FBox
_connected = false; _connected = false;
Console.WriteLine("SignalR Connected failed"); Console.WriteLine("SignalR Connected failed");
return false; return false;
} }
} }
} }
catch (Exception e) catch (Exception e)
{ {
if (_oauth2.ContainsKey(Msg)) if (_oauth2.ContainsKey(Msg))
{ {
_oauth2.Remove(Msg); _oauth2.Remove(Msg);
} }
Console.WriteLine("SignalR Connected failed"); Console.WriteLine("SignalR Connected failed");
@@ -198,6 +215,8 @@ namespace ModBus.Net.FBox
var baseUrl = box.Box.CommServer.ApiBaseUrl; var baseUrl = box.Box.CommServer.ApiBaseUrl;
var signalrUrl = box.Box.CommServer.SignalRUrl; var signalrUrl = box.Box.CommServer.SignalRUrl;
var boxUid = box.Box.Uid; var boxUid = box.Box.Uid;
var boxNo = box.Box.BoxNo;
//var currentStat = box.Box.ConnectionState; //var currentStat = box.Box.ConnectionState;
var client2 = new HttpClient var client2 = new HttpClient
@@ -217,6 +236,7 @@ namespace ModBus.Net.FBox
List<DMonGroup> dataGroups = JsonConvert.DeserializeObject<List<DMonGroup>>(response); List<DMonGroup> dataGroups = JsonConvert.DeserializeObject<List<DMonGroup>>(response);
_boxUidDataGroups.Add(boxUid, dataGroups); _boxUidDataGroups.Add(boxUid, dataGroups);
_boxUidSessionId.Add(boxUid, sessionId); _boxUidSessionId.Add(boxUid, sessionId);
_boxUidBoxNo.Add(boxUid, boxNo);
var hubConnection = new HubConnection(signalrUrl); var hubConnection = new HubConnection(signalrUrl);
_hubConnections.Add(boxUid, hubConnection); _hubConnections.Add(boxUid, hubConnection);
@@ -234,6 +254,8 @@ namespace ModBus.Net.FBox
{ {
Console.WriteLine($"Box session {boxSessionId} return at {DateTime.Now}"); Console.WriteLine($"Box session {boxSessionId} return at {DateTime.Now}");
var localBoxUid = _boxUidSessionId.FirstOrDefault(p => p.Value == boxSessionId).Key; var localBoxUid = _boxUidSessionId.FirstOrDefault(p => p.Value == boxSessionId).Key;
var localBoxNo = _boxUidBoxNo[localBoxUid];
foreach (var value in values) foreach (var value in values)
{ {
if (value.Status != 0) return; if (value.Status != 0) return;
@@ -245,14 +267,14 @@ namespace ModBus.Net.FBox
{ {
if (dataGroupInner.DMonEntries.Any(p => p.Uid == value.Id)) if (dataGroupInner.DMonEntries.Any(p => p.Uid == value.Id))
{ {
if (!_machineData.ContainsKey(dataGroupInner.Name)) if (!_machineData.ContainsKey(localBoxNo + "," + dataGroupInner.Name))
{ {
_machineData.Add(dataGroupInner.Name, _machineData.Add(localBoxNo + "," + dataGroupInner.Name,
new Dictionary<string, double>()); new Dictionary<string, double>());
} }
if (_machineData[dataGroupInner.Name] == null) if (_machineData[localBoxNo + "," + dataGroupInner.Name] == null)
{ {
_machineData[dataGroupInner.Name] = _machineData[localBoxNo + "," + dataGroupInner.Name] =
new Dictionary<string, double>(); new Dictionary<string, double>();
} }
@@ -263,15 +285,15 @@ namespace ModBus.Net.FBox
if (value.Value.HasValue && dMonEntry != null) if (value.Value.HasValue && dMonEntry != null)
{ {
if ( if (
_machineData[dataGroupInner.Name].ContainsKey( _machineData[localBoxNo + "," + dataGroupInner.Name].ContainsKey(
dMonEntry.Desc)) dMonEntry.Desc))
{ {
_machineData[dataGroupInner.Name][dMonEntry.Desc] = _machineData[localBoxNo + "," + dataGroupInner.Name][dMonEntry.Desc] =
value.Value.Value; value.Value.Value;
} }
else else
{ {
_machineData[dataGroupInner.Name].Add(dMonEntry.Desc, _machineData[localBoxNo + "," + dataGroupInner.Name].Add(dMonEntry.Desc,
value.Value.Value); value.Value.Value);
} }
} }
@@ -300,18 +322,19 @@ namespace ModBus.Net.FBox
_boxUidSessionId[getBoxUid] = sessionId; _boxUidSessionId[getBoxUid] = sessionId;
} }
var localBoxNo = _boxUidBoxNo[getBoxUid];
var localDataGroups = _boxUidDataGroups[getBoxUid]; var localDataGroups = _boxUidDataGroups[getBoxUid];
lock (_connectionTokenState) lock (_connectionTokenState)
{ {
foreach (var localDataGroup in localDataGroups) foreach (var localDataGroup in localDataGroups)
{ {
if (!_connectionTokenState.ContainsKey(localDataGroup.Name)) if (!_connectionTokenState.ContainsKey(localBoxNo + "," + localDataGroup.Name))
{ {
_connectionTokenState.Add(localDataGroup.Name, newStatus); _connectionTokenState.Add(localBoxNo + "," + localDataGroup.Name, newStatus);
} }
else else
{ {
_connectionTokenState[localDataGroup.Name] = newStatus; _connectionTokenState[localBoxNo + "," + localDataGroup.Name] = newStatus;
} }
} }
} }
@@ -334,22 +357,6 @@ namespace ModBus.Net.FBox
"dmon/group/" + localDataGroup.Uid + "/start", null); "dmon/group/" + localDataGroup.Uid + "/start", null);
} }
} }
else
{
//foreach (var localDataGroup in localDataGroups)
//{
//lock (_machineData)
//{
//if (_machineData.ContainsKey(localDataGroup.Name))
//{
//_machineData.Remove(localDataGroup.Name);
//}
//await
//_httpClient2[getBoxUid].PostAsync(
//"dmon/group/" + localDataGroup.Uid + "/stop", null);
//}
//}
}
} }
} }
}); });
@@ -360,26 +367,26 @@ namespace ModBus.Net.FBox
{ {
try try
{ {
string getBoxUid; string getBoxUid;
lock (_boxUidSessionId) lock (_boxUidSessionId)
{ {
getBoxUid = getBoxUid =
_boxUidSessionId.FirstOrDefault( _boxUidSessionId.FirstOrDefault(
p => p.Value == int.Parse(hubConnection.Headers["X-FBox-Session"])).Key; p => p.Value == int.Parse(hubConnection.Headers["X-FBox-Session"])).Key;
} }
if (hubConnection.State != ConnectionState.Connected) if (hubConnection.State != ConnectionState.Connected)
{ {
await hubConnection.Start(); await hubConnection.Start();
if (IsConnected) if (IsConnected)
{
var localDataGroups = _boxUidDataGroups[getBoxUid];
foreach (var localDataGroup in localDataGroups)
{ {
var localDataGroups = _boxUidDataGroups[getBoxUid]; await
foreach (var localDataGroup in localDataGroups) _httpClient2[getBoxUid].PostAsync(
{ "dmon/group/" + localDataGroup.Uid + "/start", null);
await }
_httpClient2[getBoxUid].PostAsync(
"dmon/group/" + localDataGroup.Uid + "/start", null);
}
} }
} }
} }
@@ -417,7 +424,7 @@ namespace ModBus.Net.FBox
} }
} }
_connected = false; _connected = false;
} }
catch catch
{ {
_connected = false; _connected = false;
@@ -433,26 +440,26 @@ namespace ModBus.Net.FBox
var groupUid = dataGroup.Uid; var groupUid = dataGroup.Uid;
var groupName = dataGroup.Name; var groupName = dataGroup.Name;
if (groupName != "(Default)" && groupName != "默认组" && !_connectionTokenState.ContainsKey(groupName)) if ((groupName != "(Default)" || groupName != "默认组") && !_connectionTokenState.ContainsKey(boxNo + "," + groupName))
{ {
_connectionTokenState.Add(groupName, 1); _connectionTokenState.Add(boxNo + "," + groupName, 1);
} }
if (groupName != "(Default)" && groupName != "默认组" && !_groupNameUid.ContainsKey(groupName)) if ((groupName != "(Default)" || groupName != "默认组") && !_groupNameUid.ContainsKey(boxNo + "," + groupName))
{ {
_groupNameUid.Add(groupName, groupUid); _groupNameUid.Add(boxNo + "," + groupName, groupUid);
} }
if (groupName != "(Default)" && groupName != "默认组" && !_groupNameBoxUid.ContainsKey(groupName)) if ((groupName != "(Default)" || groupName != "默认组") && !_groupNameBoxUid.ContainsKey(boxNo + "," + groupName))
{ {
_groupNameBoxUid.Add(groupName, boxUid); _groupNameBoxUid.Add(boxNo + "," + groupName, boxUid);
} }
if (groupName != "(Default)" && groupName != "默认组" && !_httpClient2.ContainsKey(boxUid)) if (groupName != "(Default)" && groupName != "默认组" && !_httpClient2.ContainsKey(boxUid))
{ {
_httpClient2.Add(boxUid, client2); _httpClient2.Add(boxUid, client2);
} }
if (!_machineDataType.ContainsKey(groupName)) if (!_machineDataType.ContainsKey(boxNo + "," + groupName))
{ {
_machineDataType.Add(groupName, new Dictionary<string, Type>()); _machineDataType.Add(boxNo + "," + groupName, new Dictionary<string, Type>());
} }
foreach (var dMonEntry in dataGroup.DMonEntries) foreach (var dMonEntry in dataGroup.DMonEntries)
{ {
@@ -538,13 +545,13 @@ namespace ModBus.Net.FBox
} }
} }
if (!_machineDataType[groupName].ContainsKey(dMonEntry.Desc)) if (!_machineDataType[boxNo + "," + groupName].ContainsKey(dMonEntry.Desc))
{ {
_machineDataType[groupName].Add(dMonEntry.Desc, type); _machineDataType[boxNo + "," + groupName].Add(dMonEntry.Desc, type);
} }
else else
{ {
_machineDataType[groupName][dMonEntry.Desc] = type; _machineDataType[boxNo + "," + groupName][dMonEntry.Desc] = type;
} }
} }
} }

View File

@@ -8,9 +8,9 @@ namespace ModBus.Net.FBox
{ {
public class SignalRProtocalLinker : ProtocalLinker public class SignalRProtocalLinker : ProtocalLinker
{ {
protected SignalRProtocalLinker(string machineId, SignalRSigninMsg msg) protected SignalRProtocalLinker(string machineId, string localSequence, SignalRSigninMsg msg)
{ {
_baseConnector = new SignalRConnector(machineId, msg); _baseConnector = new SignalRConnector(machineId, localSequence, msg);
} }
} }
} }