コード例 #1
0
        public static void ConfigureMqtt(this DeviceEmulator device, MqttConfiguration configuration)
        {
            device.MqttConfiguration = configuration.Clone();

            // Updates MqttClient
            device.Startup();
        }
コード例 #2
0
        public static void AssertPowerWorks(this DeviceEmulator device, int?powerIndex)
        {
            var i = powerIndex ?? 1;

            device.Status.StatusSts.Power("OFF", powerIndex);

            device.ExecuteCommand($"power{i} ON");
            Assert.AreEqual("ON", device.Status.StatusSts.Power(powerIndex));

            device.ExecuteCommand($"power{i} OFF");
            Assert.AreEqual("OFF", device.Status.StatusSts.Power(powerIndex));

            device.ExecuteCommand($"power{i} TOGGLE");
            Assert.AreEqual("ON", device.Status.StatusSts.Power(powerIndex));

            device.ExecuteCommand($"power{i} TOGGLE");
            Assert.AreEqual("OFF", device.Status.StatusSts.Power(powerIndex));

            device.ExecuteCommand($"power{i} 1");
            Assert.AreEqual("ON", device.Status.StatusSts.Power(powerIndex));

            device.ExecuteCommand($"power{i} 0");
            Assert.AreEqual("OFF", device.Status.StatusSts.Power(powerIndex));

            device.ExecuteCommand($"power{i} 2");
            Assert.AreEqual("ON", device.Status.StatusSts.Power(powerIndex));

            device.ExecuteCommand($"power{i} 2");
            Assert.AreEqual("OFF", device.Status.StatusSts.Power(powerIndex));
        }
コード例 #3
0
        public static void AssertDeviceRestart(this DeviceEmulator device)
        {
            const double toleranceFactor = 1.2;

            WaitForDevice(device, true, DeviceEmulator.RestartDelayBefore * toleranceFactor);
            Assert.IsTrue(device.IsOffline);

            WaitForDevice(device, false, DeviceEmulator.RestartDelayAfter * toleranceFactor);
            Assert.IsFalse(device.IsOffline);

            Assert.IsTrue(device.Uptime < (DeviceEmulator.RestartDelayBefore + DeviceEmulator.RestartDelayAfter) * toleranceFactor);
        }
コード例 #4
0
        public static void WaitForDevice(this DeviceEmulator device, bool offline, TimeSpan timeout)
        {
            using var ev  = new AutoResetEvent(false);
            using var cts = new CancellationTokenSource();

            Task.Run(() =>
            {
                while (device.IsOffline == offline)
                {
                    Thread.Sleep(200);
                    cts.Token.ThrowIfCancellationRequested();
                }
            });

            ev.WaitOne(timeout);
            cts.Cancel();
        }
コード例 #5
0
        /// <param name="deviceID">Yandex.Cloud IoTCore DeviceID</param>
        /// <param name="password">Yandex.Cloud IoTCore Device password</param>
        static void Main(string deviceID, string password)
        {
            Logger.Instance.LoggerOutputs.Add(Logger.ConsoleOutput);

            if (string.IsNullOrEmpty(deviceID))
            {
                Logger.Instance.AppendLog(new LogRecord(DateTime.Now, new List <string>()
                {
                    "deviceID can't be empty"
                }, LogRecordLevel.Error));
                return;
            }

            if (string.IsNullOrEmpty(password))
            {
                Logger.Instance.AppendLog(new LogRecord(DateTime.Now, new List <string>()
                {
                    "password can't be empty"
                }, LogRecordLevel.Error));
                return;
            }

            var rootCaCrt = new X509Certificate2(X509Certificate.CreateFromSignedFile("rootCA.crt"));

            var deviceEmulator = new DeviceEmulator(Guid.NewGuid().ToString(),
                                                    new IDataSource[]
            {
                new HumidityDataSource(),
                new CarbonDioxideDataSource(),
                new PressureDataSource(),
                new TemperatureDataSource()
            },
                                                    new YandexCloudCommunicationInterface(deviceID, password, String.Empty, String.Empty, rootCaCrt)
                                                    );


            while (true)
            {
                Thread.Sleep(100);
            }
        }
コード例 #6
0
 public CommandController(DeviceEmulator device)
 {
     _device = device;
 }
コード例 #7
0
        private static DeviceEmulator CreateDeviceEmulator(IServiceProvider sp)
        {
            // https://stackoverflow.com/questions/850650/reliable-method-to-get-machines-mac-address-in-c-sharp#comment107946437_7661829
            var nic = NetworkInterface.GetAllNetworkInterfaces()
                      .FirstOrDefault(nic => nic.OperationalStatus == OperationalStatus.Up &&
                                      nic.NetworkInterfaceType != NetworkInterfaceType.Loopback);

            var ipProperties = nic.GetIPProperties();

            var ipAddress = ipProperties
                            .UnicastAddresses.FirstOrDefault(a => a.Address.AddressFamily == AddressFamily.InterNetwork)
                            ?.Address?.ToString();

            var gateway = ipProperties
                          .GatewayAddresses.FirstOrDefault(a => a.Address.AddressFamily == AddressFamily.InterNetwork)
                          ?.Address?.ToString();

            var subnetMask = ipProperties
                             .UnicastAddresses.FirstOrDefault(a => a.Address.AddressFamily == AddressFamily.InterNetwork)
                             ?.IPv4Mask?.ToString();

            var dnsServer = ipProperties
                            .DnsAddresses.FirstOrDefault(a => a.AddressFamily == AddressFamily.InterNetwork)
                            ?.ToString();

            var macSegments = nic.GetPhysicalAddress()
                              .GetAddressBytes();

            var macSegmentsHex = macSegments
                                 .Select(b => b.ToString("x2"));

            var topicSuffixHex = macSegments
                                 .Skip(3)
                                 .Select(b => b.ToString("X2"));

            var topic             = "tasmota_" + string.Join("", topicSuffixHex);
            var hostnameSuffixDec = (macSegments[4] << 8 | macSegments[5]) % 10000;

            var status = new TasmotaStatus()
            {
                Status = new DeviceStatus()
                {
                    FriendlyName = new[] { "Tasmota" },
                    Topic        = topic
                },
                StatusPrm = new ParametersStatus
                {
                    RestartReason = "Powered on"
                },
                StatusFwr = new FirmwareStatus
                {
                    Version  = "1.0.0",
                    Hardware = "Emulator"
                },
                StatusLog = new LogStatus
                {
                    TelePeriod = 300
                },
                StatusMem = new MemoryStatus
                {
                    ProgramSize = 999,
                    FlashSize   = 999
                },
                StatusNet = new NetworkStatus
                {
                    HostName   = $"{topic}-{hostnameSuffixDec}",
                    IpAddress  = ipAddress ?? string.Empty,
                    Gateway    = gateway ?? string.Empty,
                    SubnetMask = subnetMask ?? string.Empty,
                    DnsServer  = dnsServer ?? string.Empty,
                    Mac        = string.Join(":", macSegmentsHex)
                },
                StatusSts = new TelemetryStatus
                {
                    UptimeSec = 0,
                    Heap      = 24,
                    LoadAvg   = 0,
                    MqttCount = 0,
                    Power     = "OFF",
                    WiFi      = new TelemetryStatus.WifiStatus
                    {
                        Rssi      = 100,
                        Signal    = -30,
                        LinkCount = 0,
                        Downtime  = "0T00:00:00",
                    }
                },
                Template = "{\"NAME\":\"Generic\",\"GPIO\":[255,255,255,255,255,255,255,255,255,255,255,255,255],\"FLAG\":15,\"BASE\":18}",
            };

            var hubContext = sp.GetService <IHubContext <DeviceHub, IDeviceHubClient> >();

            var client = sp.GetService <IMqttClient>();

            var result = new DeviceEmulator(status, client);

            result.DeviceChanged += (s, e) => hubContext.Clients.All.DeviceChanged(result);

            var logger = sp.GetService <ILogger <DeviceEmulator> >();

            logger.LogInformation("Device emulator created with initial status = " + JsonConvert.SerializeObject(status, Formatting.Indented));

            return(result);
        }
コード例 #8
0
ファイル: DeviceHub.cs プロジェクト: fdcastel/TasmoCC
 public DeviceHub(ILogger <DeviceHub> logger, DeviceEmulator device)
 {
     _logger = logger;
     _device = device;
 }
コード例 #9
0
 public Commands(DeviceEmulator pEmulator)
 {
     _emulator = pEmulator;
 }