示例#1
0
 public MCUDevice(string _ipAddress, int _port, Enums.EnumDeviceType _deviceType) : base(_ipAddress, _port)
 {
     this.remoteDeviceId = 0;
     this.configId       = 0;
     this.remoteDeviceId = 0;
     this.deviceType     = _deviceType;
 }
        public override async Task <WebSocketConnection> OnConnected(HttpContext context)
        {
            var    name       = context.Request.Query["Name"];
            string deviceType = context.Request.Query["DeviceType"];
            var    clientIP   = context.Connection.RemoteIpAddress.ToString();

            _logger.LogInformation($"OnConnected({clientIP}) DeviceType: {deviceType}");

            if (!string.IsNullOrEmpty(name))
            {
                int iDevType;
                if (!Int32.TryParse(deviceType, out iDevType))
                {
                    _logger.LogError($"OnConnected({clientIP}) Envalid DeviceType: {deviceType}");
                    return(null);
                }
                Enums.EnumDeviceType devType = (Enums.EnumDeviceType)iDevType;

                //var connection = Connections.FirstOrDefault(m => ((RFSocketConnection)m).NickName == name);
                var connection = Connections.FirstOrDefault(m => m.NickName == name && m.DeviceType == devType);

                if (connection != null)
                {
                    if (connection.WebSocket.State == WebSocketState.Aborted)
                    {
                        _logger.LogWarning($"OnConnected({clientIP}) Existing Connection State  is {connection.WebSocket.State} so Disposing it.");

                        Connections.Remove(connection);
                        connection.WebSocket.Dispose();
                        connection = null;
                    }
                    else
                    {
                        _logger.LogInformation($"OnConnected({clientIP}) Using existing {devType} Connection");
                        return(connection);
                    }
                }


                var webSocket = await context.WebSockets.AcceptWebSocketAsync();

                _logger.LogInformation($"OnConnected({clientIP}) Newing up {devType} Connection.");

                switch (devType)
                { //RFSwitch, HS100, CeilingFan, Speed, Motion, Relay
                case Enums.EnumDeviceType.Relay:
                    connection = new RelaySocketConnection(this)
                    {
                        NickName   = name,
                        DeviceType = devType,
                        WebSocket  = webSocket
                    };
                    foreach (var relay in relayDevices.Where(s => s.mcu != null && s.mcu.ipAddress == name && s.deviceType == Enums.EnumDeviceType.Relay))
                    {
                        relay.setWebSocketConnection(0, connection);
                        //relay.mcu.connection = connection;
                        //connection.mcuList.Add(relay.mcu);
                        //connection.mcu = relay.mcu;
                    }
                    break;

                case Enums.EnumDeviceType.Motion:
                    connection = new PIRSocketConnection(this)
                    {
                        NickName   = name,
                        DeviceType = devType,
                        WebSocket  = webSocket
                    };
                    foreach (var pir in pirDevices.Where(s => s.mcu != null && s.mcu.ipAddress == name && s.deviceType == Enums.EnumDeviceType.Motion))
                    {
                        pir.setWebSocketConnection(0, connection);
                        //pir.mcu.connection = connection;
                        //connection.mcuList.Add(pir.mcu);
                    }
                    break;

                case Enums.EnumDeviceType.RFSwitch:
                    connection = new RFSocketConnection(this)
                    {
                        NickName   = name,
                        DeviceType = devType,
                        WebSocket  = webSocket
                    };
                    foreach (var sw in rfSwitches)
                    {
                        sw.setWebSocketConnection(0, connection);
                        //var mcu = sw.slaves.Where(s => s.ipAddress == name && s.deviceType == Enums.EnumDeviceType.RFSwitch).FirstOrDefault();
                        //                     if (mcu != null)
                        //                     {
                        //	sw.setWebSocketConnection(0, connection);
                        //                         mcu.connection = connection;
                        //                         connection.mcuList.Add(mcu);
                        //                     }
                    }
                    break;

                default:
                    _logger.LogInformation($"OnConnected({clientIP}) Unhandled MCU name: {name}");
                    break;
                }
                Connections.Add(connection);
                return(connection);
            }

            _logger.LogError($"OnConnected({clientIP}) Request missing Name parameter.");
            return(null);
        }
示例#3
0
 public HomeControlDevice(Enums.ControlledAreas area, /*int localDeviceId,*/ string deviceName, string mcuIpAddress, Enums.EnumDeviceType deviceType)
 {
     this.area          = area;
     this.localDeviceId = HomeControlDevice.getNextDeviceId();
     this.deviceName    = deviceName;
     this.deviceType    = deviceType;
     this.mcu           = new MCUDevice(mcuIpAddress, 80, deviceType);
 }