Sistema de control de hogar inteligente

Sistema de control de hogar inteligente

● Antecedentes de desarrollo: diseño curricular

● Tiempo de desarrollo: 2021-06-21 ~ 2021-07-02

● Descripción del artículo:

Se usa para monitorear el entorno doméstico, usando SpringBoot + Mybatis + Java + JavaScrpit + CSS + Html para escribir la página web y la parte de back-end, pero el programa Java simula los datos del sensor y los transmite al servidor.

● Contenido del trabajo: Soy responsable del diseño y desarrollo de todo el proyecto en este proyecto.


● visualización de la página

inserte la descripción de la imagen aquí


diseño general

El sistema adopta el programa Java para cargar los datos del sensor simulados en el servidor de la nube. En el servidor de la nube, el programa de servicio escrito con Spring Framework recibe los datos y los guarda en la base de datos del servidor. El servidor también proporciona una visualización en tiempo real de datos y servicios de control en tiempo real de algunos equipos. Los usuarios pueden acceder a la página web del servidor en la nube en el lado de la PC para obtener datos en tiempo real y controlar algunos servicios del equipo. El diagrama de flujo es el siguiente:
inserte la descripción de la imagen aquí

diseño detallado


● Datos de sensores simulados

Primero, use el método Math.random() de Java para generar datos aleatoriamente. Este método generará un decimal entre [0,1), y restando 0.5 de este número resultará en un valor entre [-0.5,+0.5). En este manera, las fluctuaciones en los datos se pueden simular. El desplazamiento aleatorio () en el código fuente puede reducir aún más el rango de fluctuación de los datos, haciéndolo más estable para simular los datos.

//偏移值作用类似于0.5 但是为了更逼真的模拟,限制一下波动范围
//波动范围 [-0.4,0.4)
static double offset = 0.4; 
public static double random() {
    
    
    return Math.random() * 0.8;//缩小生成随机数的范围
}

//数据生成的函数
public static void generatStart() {
    
    
	//新建线程单独生成数据
	(new Thread(() -> {
    
    
		while (true) {
    
    
		//定义数据的趋向稳定波动范围在指定值为centralAirConditioningControler的±2个单位之内
		double scope = 2;
		//获取当前传感器温度 和 控制温度(控制者期望到达的温度) 的差值
		double temX = sd.centralAirConditioningControler - sd.airTemperatureInSide;
		//如果差值大于 控制温度的可控波动范围的±2
		if (temX > scope)
		    //数据直接 + random() 即 数据 + [0,0.8)
		    sd.airTemperatureInSide = dataFormater(sd.airTemperatureInSide + random(), 1);
		if (temX < - scope)
		    sd.airTemperatureInSide = dataFormater(sd.airTemperatureInSide - random(), 1);
		//如果数据在指定的范围内则进行随机加减 等价于 ‘数据’+ [-0.4 , 0.4)
		if (temX >= - scope && temX <= scope)
		    sd.airTemperatureInSide = dataFormater(sd.airTemperatureInSide + random() - offset, 1);
//.....省略代码

El control de la fluctuación de temperatura se realiza aquí. Por ejemplo, cuando el usuario envía un comando de control desde el navegador, centralAirConditioningControler se designará como la temperatura especificada por el usuario. En este momento, la temperatura continuará acercándose a la temperatura especificada, y finalmente permanezca en la temperatura objetivo ± 2 unidades
Tipos de datos transferidos :

double airTemperatureOutSide;//室外温度
double airTemperatureInSide;//室内温度
double humidity;//湿度
double internetSpeed;//网速
double lightingIntensity;//灯光亮度
double solarBattery;//太阳能
double waterTemperature;//水温
double powerConsumption;//功率
int deviceNumber;//设备数量
double waterTemperatureController;//水温调节
double lightingControler;//亮度调节
double centralAirConditioningControler;//中央空调控制




● Protocolo de transferencia de datos

Use el método de protocolo Http = HttpMethod.POST para convertir los datos en formato de cadena JSON y enviarlos al servidor, y luego espere a que el servidor devuelva el conjunto de datos de control.

//服务器地址
String url = "http://**.**.**.***:8080/student4/json/data";
//post请求
HttpMethod method = HttpMethod.POST;
//发送的json数据
String json = JSON.toJSONString(sd);
//发送http请求并返回结果
String result = HttpRestClient(url, method, json);
//接收反馈数据用于控制设备的模拟数据
SensorReturn sr = JSONObject.parseObject(result,SensorReturn.class);




● Recepción y almacenamiento de datos

El lado del servidor usa el controlador de Spring Framework para recibir datos json y, después de analizar la cadena json, llama a la instrucción SQL para insertar los datos en la base de datos para su almacenamiento.

	@ResponseBody//访问/json/data来传输数据
    @RequestMapping(value = "/json/data", method = RequestMethod.POST, produces = "application/json;charset=UTF-8")
    public String getByJSON(@RequestBody JSONObject jsonParam) {
    
    
	    //将json数据转化成java对象
        SensorData sd = jsonParam.toJavaObject(SensorData.class);
        //调用mapper中的sql语句
		homeService.insertMsg(sd);
        return JSON.toJSONString(sr).toString();
    }
    
//将数据插入数据库
<insert id="insertMsg">
        insert into smart_home(airTemperatureOutSide,airTemperatureInSide, humidity,internetSpeed,lightingIntensity,solarBattery,waterTemperature,
powerConsumption,deviceNumber,waterTemperatureController,lightingControler,centralAirConditioningControler)values(#{
    
    airTemperatureOutSide},#{
    
    airTemperatureInSide},#{
    
     humidity},#{
    
    internetSpeed},#{
    
    lightingIntensity},#{
    
    solarBattery},#{
    
    waterTemperature},#{
    
    
powerConsumption},#{
    
    deviceNumber},#{
    
    waterTemperatureController},#{
    
    lightingControler},#{
    
    centralAirConditioningControler}
        )
</insert>




● Visualización de consultas de datos

Acceso web del navegador/ruta de control maestro para obtener los últimos datos y el panel de control

@GetMapping("/mastercontrol")
    public String mastercontrol(Model model) {
    
    
        //查询最近的传感器数据
        SensorData nearMsg = homeService.getNearMsg();
        //将数据放入Attribute 以方便 js 访问数据
        model.addAttribute("sensor", nearMsg);
        model.addAttribute("sr", sr);
        //返回页面
        return "mastercontrol";
    }

En la página web js, use la tarea cronometrada para acceder continuamente al controlador para actualizar los datos

	setInterval(function () {
    
    
        refresh();//刷新数据
    }, 200);  //200ms反复执行函数本身
    
    function refresh(){
    
    
		//发送请求刷新获得返回的数据并刷新指定标签
 	    $.ajax({
    
    
            url: basePath + '/index/refresh',
            type: 'post',
            dataType: 'text',
            data: {
    
    },
            cache: false,
            async: true,
            success: function (data) {
    
    
                $("#statusBar").empty();
                $("#statusBar").append(data);
            }
        });
        //....................省略代码
	}

Incruste los datos obtenidos en los atributos de html y muéstrelos

<br/> <span class="status_data" th:text="${sensor.airTemperatureOutSide}"></span>

inserte la descripción de la imagen aquí





● Control del usuario sobre el dispositivo

inserte la descripción de la imagen aquí

Obtenga los datos ingresados ​​por el usuario en el navegador y almacene los datos en segundo plano accediendo al controlador, y envíe el conjunto de datos de control almacenado al dispositivo cada vez que el sensor envía datos al servidor

$(function () {
    
    
	//监听用户输入数据的动作
   $("#range_waterTemperature").on("input", function () {
    
    
	//获取用户输入的数据
        var percent = $("#range_waterTemperature").val();
		//将数据打包为json发给controller
        $.ajax({
    
    
            url: basePath + '/waterTemperatureControllerReturn',
            type: 'post',
            contentType: "application/json",
            data: JSON.stringify(percent),
            success: function (data) {
    
    
                console.log(data)
            }
        });
        cwSvgProgress.draw($("#cw_svg_waterTemperature"), percent / 100, '.path_waterTemperature');
    });
    cwSvgProgress.draw($('#cw_svg_waterTemperature'), $("#range_waterTemperature").val()/100, '.path_waterTemperature');
    cwSvgProgress.draw($('#circleBg_waterTemperature'), 1, '.circleBg_path_waterTemperature');
});
 	@ResponseBody
    @RequestMapping("/waterTemperatureControllerReturn")
    public String waterTemperatureControllerReturn( @RequestBody Double percent) {
    
    
		//将数据存在java对象中,等待发送
        sr.waterTemperatureControllerReturn = percent;
        return "null";
    }
	@ResponseBody//访问/json/data来传输数据
    @RequestMapping(value = "/json/data", method = RequestMethod.POST, produces = "application/json;charset=UTF-8")
    public String getByJSON(@RequestBody JSONObject jsonParam) {
    
    
	    //将json数据转化成java对象
        SensorData sd = jsonParam.toJavaObject(SensorData.class);
        //调用mapper中的sql语句
		homeService.insertMsg(sd);
		//将数据回传给设备
        return JSON.toJSONString(sr).toString();
    }





Depuración y prueba

Use IntelliJ IDEA IDE para compilar y depurar el programa de simulación de sensores y el paquete war que se implementará en Tomcat en el servidor, use Navicat para conectarse a la base de datos MySQL del servidor e implemente la tabla de la base de datos en la base de datos del servidor, use Google Chrome y Microsoft edge para la interacción front-end Adaptador para adaptar y depurar la interfaz front-end. Use Xshell y Xftp para conectarse al servidor en la nube y cargar archivos al servidor

Supongo que te gusta

Origin blog.csdn.net/qq_44965927/article/details/118487009
Recomendado
Clasificación