public static void ConfigureMqtt(this DeviceEmulator device, MqttConfiguration configuration) { device.MqttConfiguration = configuration.Clone(); // Updates MqttClient device.Startup(); }
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)); }
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); }
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(); }
/// <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); } }
public CommandController(DeviceEmulator device) { _device = device; }
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); }
public DeviceHub(ILogger <DeviceHub> logger, DeviceEmulator device) { _logger = logger; _device = device; }
public Commands(DeviceEmulator pEmulator) { _emulator = pEmulator; }