homework: smart house mocks example

This commit is contained in:
3 changed files with 32 additions and 7 deletions

View File

@@ -140,13 +140,13 @@
- [x] Термометр может имитировать удалённое получение данных о температуре (для тестов).
Для имитатора умного термометра:
- [ ] Реализован с использованием неблокирующего сетевого взаимодействия.
- [ ] Читает адрес для отправки UDP-пакетов и временной период отправки из файла.
- [ ] Отправляет произвольное значение температуры на указанный адрес с указанной периодичностью.
- [x] Реализован с использованием неблокирующего сетевого взаимодействия.
- [x] Читает адрес для отправки UDP-пакетов и временной период отправки из файла.
- [x] Отправляет произвольное значение температуры на указанный адрес с указанной периодичностью.
Добавлен дополнительный пример умного дома с розетками и термометрами, которые работают с имитаторами. Данный пример должен запускаться и:
- [ ] Выводить отчёт о состоянии дома, если имитаторы запущены.
- [ ] Сообщать об ошибке, если устройству не удалось получить данные.
- [x] Выводить отчёт о состоянии дома, если имитаторы запущены.
- [x] Сообщать об ошибке, если устройству не удалось получить данные.
**Критерии оценки:**

View File

@@ -0,0 +1,25 @@
//! Пример работы умного дома с имитаторами
use smart_house::{House, PowerSocket, PrintStatus, Room, Thermometer, room};
fn main() -> Result<(), Box<dyn std::error::Error>> {
let house = create_house_demo()?;
house.print_status();
Ok(())
}
fn create_house_demo() -> Result<House, Box<dyn std::error::Error>> {
println!("# Create new smart house");
let house = House::new(
[(
"Main".to_string(),
room!(
"PSocA" => PowerSocket::connect("127.0.0.1:10001")?,
"ThermA" => Thermometer::connect("127.0.0.1:10002")?,
),
)]
.into_iter()
.collect(),
);
Ok(house)
}

View File

@@ -2,7 +2,7 @@
use rand::prelude::*;
use std::io::Read;
use std::net::SocketAddr;
use std::net::{IpAddr, SocketAddr};
use std::str::FromStr;
use std::sync::Arc;
use std::time::Duration;
@@ -41,7 +41,7 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
let params = read_parameters_from_file()?;
let rt = tokio::runtime::Builder::new_current_thread().enable_all().build()?;
rt.block_on(async move {
let socket = Arc::new(tokio::net::UdpSocket::bind(params.addr).await?);
let socket = Arc::new(tokio::net::UdpSocket::bind(SocketAddr::new(IpAddr::from([127, 0, 0, 1]), 10003)).await?);
let mut interval = tokio::time::interval(params.interval);
loop {
interval.tick().await;