Beispiel #1
0
        public ReplicaService(IPublisher publisher,
                              TFChunkDb db,
                              IEpochManager epochManager,
                              IPublisher networkSendQueue,
                              IAuthenticationProvider authProvider,
                              VNodeInfo nodeInfo,
                              bool useSsl,
                              string sslTargetHost,
                              bool sslValidateServer)
        {
            Ensure.NotNull(publisher, "publisher");
            Ensure.NotNull(db, "db");
            Ensure.NotNull(epochManager, "epochManager");
            Ensure.NotNull(networkSendQueue, "networkSendQueue");
            Ensure.NotNull(authProvider, "authProvider");
            Ensure.NotNull(nodeInfo, "nodeInfo");
            if (useSsl)
            {
                Ensure.NotNull(sslTargetHost, "sslTargetHost");
            }

            _publisher        = publisher;
            _db               = db;
            _epochManager     = epochManager;
            _networkSendQueue = networkSendQueue;
            _authProvider     = authProvider;

            _nodeInfo          = nodeInfo;
            _useSsl            = useSsl;
            _sslTargetHost     = sslTargetHost;
            _sslValidateServer = sslValidateServer;

            _connector = new TcpClientConnector();
        }
        private static bool IsOnline(string baseUrl, int millisecondsTimeout = 2000)
        {
            try
            {
                if (string.IsNullOrEmpty(baseUrl))
                {
                    return(false);
                }

                var redisClientUrl = GetUrl(baseUrl);

                var urlSegments = redisClientUrl.Split(':');
                if (urlSegments.Length == 2)
                {
                    var isOnline = TcpClientConnector.IsOnline(urlSegments[0], int.Parse(urlSegments[1]), millisecondsTimeout);
                    return(isOnline);
                }
                else
                {
                    return(false);
                }
            }
            catch
            {
                return(false);
            }
        }
        public TcpConnectionManager(string connectionName,
                                    ITcpDispatcher dispatcher,
                                    IPublisher publisher,
                                    IPEndPoint remoteEndPoint,
                                    TcpClientConnector connector)
        {
            Ensure.NotNull(dispatcher, "dispatcher");
            Ensure.NotNull(publisher, "publisher");
            Ensure.NotNull(remoteEndPoint, "remoteEndPoint");
            Ensure.NotNull(connector, "connector");

            _connectionName = connectionName;

            _tcpEnvelope = new SendOverTcpEnvelope(this);
            _publisher   = publisher;
            _dispatcher  = dispatcher;

            EndPoint = remoteEndPoint;

            _framer = new LengthPrefixMessageFramer();
            _framer.RegisterMessageArrivedCallback(OnMessageArrived);

            _connection = connector.ConnectTo(remoteEndPoint, OnConnectionEstablished, OnConnectionFailed);
            _connection.ConnectionClosed += OnConnectionClosed;
        }
        public TcpConnectionManager(string connectionName,
                                    Guid connectionId,
                                    ITcpDispatcher dispatcher,
                                    IPublisher publisher,
                                    string targetHost,
                                    EndPoint remoteEndPoint,
                                    TcpClientConnector connector,
                                    bool useSsl,
                                    Func <X509Certificate, X509Chain, SslPolicyErrors, ValueTuple <bool, string> > sslServerCertValidator,
                                    Func <X509CertificateCollection> sslClientCertificatesSelector,
                                    IPublisher networkSendQueue,
                                    IAuthenticationProvider authProvider,
                                    AuthorizationGateway authorization,
                                    TimeSpan heartbeatInterval,
                                    TimeSpan heartbeatTimeout,
                                    Action <TcpConnectionManager> onConnectionEstablished,
                                    Action <TcpConnectionManager, SocketError> onConnectionClosed)
        {
            Ensure.NotEmptyGuid(connectionId, "connectionId");
            Ensure.NotNull(dispatcher, "dispatcher");
            Ensure.NotNull(publisher, "publisher");
            Ensure.NotNull(authProvider, "authProvider");
            Ensure.NotNull(authorization, "authorization");
            Ensure.NotNull(remoteEndPoint, "remoteEndPoint");
            Ensure.NotNull(connector, "connector");

            ConnectionId   = connectionId;
            ConnectionName = connectionName;

            _tcpEnvelope   = new SendOverTcpEnvelope(this, networkSendQueue);
            _publisher     = publisher;
            _dispatcher    = dispatcher;
            _authProvider  = authProvider;
            _authorization = authorization;

            _framer = new LengthPrefixMessageFramer();
            _framer.RegisterMessageArrivedCallback(OnMessageArrived);

            _weakThisEnvelope  = new SendToWeakThisEnvelope(this);
            _heartbeatInterval = heartbeatInterval;
            _heartbeatTimeout  = heartbeatTimeout;
            _connectionPendingSendBytesThreshold = ESConsts.UnrestrictedPendingSendBytes;
            _connectionQueueSizeThreshold        = ESConsts.MaxConnectionQueueSize;

            _connectionEstablished = onConnectionEstablished;
            _connectionClosed      = onConnectionClosed;

            RemoteEndPoint = remoteEndPoint;
            _connection    = useSsl
                                ? connector.ConnectSslTo(ConnectionId, targetHost, remoteEndPoint.ResolveDnsToIPAddress(), ConnectionTimeout,
                                                         sslServerCertValidator, sslClientCertificatesSelector, OnConnectionEstablished, OnConnectionFailed)
                                : connector.ConnectTo(ConnectionId, remoteEndPoint.ResolveDnsToIPAddress(), ConnectionTimeout, OnConnectionEstablished,
                                                      OnConnectionFailed);
            _connection.ConnectionClosed += OnConnectionClosed;
            if (_connection.IsClosed)
            {
                OnConnectionClosed(_connection, SocketError.Success);
            }
        }
Beispiel #5
0
        public TcpConnectionManager(string connectionName,
                                    Guid connectionId,
                                    ITcpDispatcher dispatcher,
                                    IPublisher publisher,
                                    IPEndPoint remoteEndPoint,
                                    TcpClientConnector connector,
                                    bool useSsl,
                                    string sslTargetHost,
                                    bool sslValidateServer,
                                    IPublisher networkSendQueue,
                                    IAuthenticationProvider authProvider,
                                    TimeSpan heartbeatInterval,
                                    TimeSpan heartbeatTimeout,
                                    Action <TcpConnectionManager> onConnectionEstablished,
                                    Action <TcpConnectionManager, SocketError> onConnectionClosed)
        {
            Ensure.NotEmptyGuid(connectionId, "connectionId");
            Ensure.NotNull(dispatcher, "dispatcher");
            Ensure.NotNull(publisher, "publisher");
            Ensure.NotNull(authProvider, "authProvider");
            Ensure.NotNull(remoteEndPoint, "remoteEndPoint");
            Ensure.NotNull(connector, "connector");
            if (useSsl)
            {
                Ensure.NotNull(sslTargetHost, "sslTargetHost");
            }

            ConnectionId   = connectionId;
            ConnectionName = connectionName;

            _tcpEnvelope  = new SendOverTcpEnvelope(this, networkSendQueue);
            _publisher    = publisher;
            _dispatcher   = dispatcher;
            _authProvider = authProvider;

            _framer = new LengthPrefixMessageFramer();
            _framer.RegisterMessageArrivedCallback(OnMessageArrived);

            _weakThisEnvelope  = new SendToWeakThisEnvelope(this);
            _heartbeatInterval = heartbeatInterval;
            _heartbeatTimeout  = heartbeatTimeout;
            _connectionPendingSendBytesThreshold = ESConsts.UnrestrictedPendingSendBytes;
            _connectionQueueSizeThreshold        = ESConsts.MaxConnectionQueueSize;

            _connectionEstablished = onConnectionEstablished;
            _connectionClosed      = onConnectionClosed;

            RemoteEndPoint = remoteEndPoint;
            _connection    = useSsl
                                ? connector.ConnectSslTo(ConnectionId, remoteEndPoint, ConnectionTimeout,
                                                         sslTargetHost, sslValidateServer, OnConnectionEstablished, OnConnectionFailed)
                                : connector.ConnectTo(ConnectionId, remoteEndPoint, ConnectionTimeout, OnConnectionEstablished,
                                                      OnConnectionFailed);
            _connection.ConnectionClosed += OnConnectionClosed;
            if (_connection.IsClosed)
            {
                OnConnectionClosed(_connection, SocketError.Success);
            }
        }
 public static MockTcpConnection CreateConnectingTcpConnection(Guid connectionId,
                                                               IPEndPoint remoteEndPoint,
                                                               TcpClientConnector connector,
                                                               TimeSpan connectionTimeout,
                                                               Action <ITcpConnection> onConnectionEstablished,
                                                               Action <ITcpConnection, SocketError> onConnectionFailed,
                                                               bool verbose)
 {
     _connectionId   = connectionId;
     _remoteEndPoint = remoteEndPoint;
     return(new MockTcpConnection());
 }
Beispiel #7
0
        public ReplicaService(IPublisher publisher,
                              TFChunkDb db,
                              IEpochManager epochManager,
                              IPublisher networkSendQueue,
                              IAuthenticationProvider authProvider,
                              AuthorizationGateway authorizationGateway,
                              EndPoint internalTcp,
                              bool isReadOnlyReplica,
                              bool useSsl,
                              Func <X509Certificate, X509Chain, SslPolicyErrors, ValueTuple <bool, string> > sslServerCertValidator,
                              Func <X509Certificate> sslClientCertificateSelector,
                              TimeSpan heartbeatTimeout,
                              TimeSpan heartbeatInterval,
                              TimeSpan writeTimeout)
        {
            Ensure.NotNull(publisher, "publisher");
            Ensure.NotNull(db, "db");
            Ensure.NotNull(epochManager, "epochManager");
            Ensure.NotNull(networkSendQueue, "networkSendQueue");
            Ensure.NotNull(authProvider, "authProvider");
            Ensure.NotNull(authorizationGateway, "authorizationGateway");
            Ensure.NotNull(internalTcp, nameof(internalTcp));

            _publisher            = publisher;
            _db                   = db;
            _epochManager         = epochManager;
            _networkSendQueue     = networkSendQueue;
            _authProvider         = authProvider;
            _authorizationGateway = authorizationGateway;

            _internalTcp                  = internalTcp;
            _isReadOnlyReplica            = isReadOnlyReplica;
            _useSsl                       = useSsl;
            _sslServerCertValidator       = sslServerCertValidator;
            _sslClientCertificateSelector = sslClientCertificateSelector;
            _heartbeatTimeout             = heartbeatTimeout;
            _heartbeatInterval            = heartbeatInterval;

            _connector     = new TcpClientConnector();
            _tcpDispatcher = new InternalTcpDispatcher(writeTimeout);
        }
Beispiel #8
0
        public ReplicaService(IPublisher publisher,
                              TFChunkDb db,
                              IEpochManager epochManager,
                              IPublisher networkSendQueue,
                              IAuthenticationProvider authProvider,
                              AuthorizationGateway authorizationGateway,
                              VNodeInfo nodeInfo,
                              bool useSsl,
                              bool sslValidateServer,
                              X509CertificateCollection sslClientCertificates,
                              TimeSpan heartbeatTimeout,
                              TimeSpan heartbeatInterval,
                              TimeSpan writeTimeout)
        {
            Ensure.NotNull(publisher, "publisher");
            Ensure.NotNull(db, "db");
            Ensure.NotNull(epochManager, "epochManager");
            Ensure.NotNull(networkSendQueue, "networkSendQueue");
            Ensure.NotNull(authProvider, "authProvider");
            Ensure.NotNull(authorizationGateway, "authorizationGateway");
            Ensure.NotNull(nodeInfo, "nodeInfo");

            _publisher            = publisher;
            _db                   = db;
            _epochManager         = epochManager;
            _networkSendQueue     = networkSendQueue;
            _authProvider         = authProvider;
            _authorizationGateway = authorizationGateway;

            _nodeInfo              = nodeInfo;
            _useSsl                = useSsl;
            _sslValidateServer     = sslValidateServer;
            _sslClientCertificates = sslClientCertificates;
            _heartbeatTimeout      = heartbeatTimeout;
            _heartbeatInterval     = heartbeatInterval;

            _connector     = new TcpClientConnector();
            _tcpDispatcher = new InternalTcpDispatcher(writeTimeout);
        }
Beispiel #9
0
        private void Connect()
        {
            // TODO: implement some kind of master discovery
            var endPoint = new IPEndPoint(IPAddress.Parse(_ip), _port);

            var clientConnector = new TcpClientConnector();

            _connectionManager = new TcpConnectionManager(
                "projection",
                new ClientTcpDispatcher(),
                _bus,
                endPoint,
                clientConnector);

            _connectionManager.ConnectionEstablished += manager =>
            {
                Console.WriteLine("Connection established: " + manager.EndPoint);
                _bus.Publish(new ProjectionMessage.CoreService.Start());
                _bus.Publish(new ProjectionMessage.CoreService.Connected(connection: manager));
                _connectionManager.ConnectionClosed += OnConnectionClosed;
                _connectionManager.StartReceiving();
            };
        }
 private void StartSend(int port)
 {
     var client = new TcpClientConnector();
     client.ConnectTo(new IPEndPoint(IPAddress.Loopback, port), ClientOnConnectionEstablished,
                      ClientOnConnectionFailed);
 }
Beispiel #11
0
        public static async Task Get_XAGL_WM3000WXGT_IndicatorDiagram(ModbusRtuOverTcp client, RedisClient redisClient, string messageString)
        {
            var par = messageString.FromJson <ControlRequest>();

            try
            {
                var logIotModbusPoll = par.ConvertTo <LogIotModbusPoll>();

                logIotModbusPoll.State  = 0;
                logIotModbusPoll.Result = "ok";

                var flag = true;

                var indicatorDiagram = new IotDataOilWellIndicatorDiagram()
                {
                    NetworkNode = ClientInfo.ManyIpAddress,
                    AlarmCode   = 0,
                    AlarmMsg    = "正常"
                };

                var jo1 = (JObject)JsonConvert.DeserializeObject(par.CommandParameter);

                double displacement = -1;

                if (jo1["0"] != null)
                {
                    double.TryParse(jo1["0"].ToString().Trim(), out displacement);
                }
                if (displacement > 0)
                {
                    indicatorDiagram.Displacement = displacement;
                }
                var modbusAddress = par.ModbusAddress;
                ClientInfo.CurrentModbusPoolAddress = modbusAddress;
                var commandParameter = par.CommandParameter.ToString();
                var slot             = Convert.ToInt32(jo1["1"].ToString());

                var  host        = par.RemoteHost;
                var  url         = "/getworkgraph/";
                bool IsHostAlive = false;

                if (host.StartsWith("192"))
                {
                    $"无线功图树莓派({host})不正确,或者没有接入无线功图".Error();
                }
                else
                {
                    IsHostAlive = TcpClientConnector.IsOnline(host, null, 1000);
                    if (IsHostAlive)
                    {
                        url = $"http://{host}{url}{slot}";

                        $"请求树莓派api:{url}".Info();

                        var indicatorDiagramJson = await url.GetJsonFromUrlAsync();

                        //$"树莓派api返回数据:{indicatorDiagramJson}".Info();

                        var oilWellIndicatorDiagram = indicatorDiagramJson.FromJson <OilWellIndicatorDiagram>();

                        indicatorDiagram.Stroke = oilWellIndicatorDiagram.chongCheng;
                        indicatorDiagram.L      = oilWellIndicatorDiagram.load;
                        indicatorDiagram.D      = oilWellIndicatorDiagram.displace;



                        var maxDis = indicatorDiagram.D.Max();
                        var minDis = indicatorDiagram.D.Min();

                        if (!indicatorDiagram.Displacement.HasValue)
                        {
                            indicatorDiagram.Displacement = maxDis;
                        }

                        for (var i = 0; i < indicatorDiagram.D.Count; i++)
                        {
                            if (Math.Abs(maxDis - minDis) > 0.1)
                            {
                                indicatorDiagram.D[i] = Math.Round(((indicatorDiagram.D[i] - minDis) / (maxDis - minDis) * (double)indicatorDiagram.Displacement), 2);
                            }
                        }

                        //补点
                        if (indicatorDiagram.L.Count > 0)
                        {
                            indicatorDiagram.L.Add(indicatorDiagram.L[0]);
                        }
                        if (indicatorDiagram.D.Count > 0)
                        {
                            indicatorDiagram.D.Add(indicatorDiagram.D[0]);
                        }

                        indicatorDiagram.MaxLoad = indicatorDiagram.L.Max();
                        indicatorDiagram.MinLoad = indicatorDiagram.L.Min();
                        indicatorDiagram.AvgLoad = indicatorDiagram.L.Average();


                        indicatorDiagram.DateTime = DateTime.Now;  //树莓派时间不准确,取服务器时间
                                                                   //to do 树莓派时间稳定了再换
                        indicatorDiagram.WellId   = oilWellIndicatorDiagram.wellId;
                        indicatorDiagram.Count    = oilWellIndicatorDiagram.count;
                        indicatorDiagram.Interval = oilWellIndicatorDiagram.interval;

                        indicatorDiagram.DeviceTypeId = par.DeviceTypeId;
                        indicatorDiagram.Mock         = par.UseMockData;
                        if (displacement > 0)
                        {
                            indicatorDiagram.Displacement = displacement;
                        }

                        indicatorDiagram.NetworkNode = host;

                        redisClient.AddItemToList("YCIOT:IOT_Data_OilWell_IndicatorDiagram", indicatorDiagram.ToJson().IndentJson());
                        redisClient.Set($"Group:OilWell:{par.DeviceName}-{par.DeviceId}:IndicatorDiagram", indicatorDiagram);
                        redisClient.Set($"Single:OilWell:IndicatorDiagram:{par.DeviceName}-{par.DeviceId}", indicatorDiagram);
                    }
                    else
                    {
                        $"无线功图树莓派({host})网络不通!".Error();
                    }
                }

                //用于通过ServerEvent给调用着返回消息
                if (!par.UserName.IsNullOrEmpty())
                {
                    ServerEventHelper.SendSseMessage(par.UserName, par.SessionId, flag ? 0 : -2, indicatorDiagram.ToJson().IndentJson());
                }
            }
            catch (Exception ex)
            {
                Logger.Error(ex.Message);
                Logger.Error(ex.StackTrace);
                Logger.Error(ex.Source);

                if (!par.UserName.IsNullOrEmpty())
                {
                    ServerEventHelper.SendSseMessage(par.UserName, par.SessionId, -1, ex.Message);
                }
            }
        }