Vue.js является легковесным и реактивным фронтенд-фреймворком, который идеально подходит для создания интерфейсов управления и мониторинга IoT-устройств. Ключевой особенностью является двусторонняя привязка данных, позволяющая мгновенно отображать изменения состояния устройств в интерфейсе пользователя.
Типичное приложение состоит из следующих компонентов:
App.vue) — центральная
точка управления, в которой подключаются глобальные состояния и
маршрутизация.Пример структуры проекта:
src/
├─ components/
│ ├─ SensorCard.vue
│ └─ ActuatorControl.vue
├─ store/
│ └─ index.js
├─ services/
│ └─ IoTService.js
├─ App.vue
└─ main.js
Vue позволяет реагировать на изменения состояния сенсоров в
реальном времени. Для этого часто используется ref
или reactive:
import { reactive, onMounted } from 'vue';
import IoTService from './services/IoTService';
export default {
setup() {
const deviceState = reactive({ temperature: 0, humidity: 0 });
onMounted(() => {
IoTService.subscribeToSensor('sensor-1', (data) => {
deviceState.temperature = data.temperature;
deviceState.humidity = data.humidity;
});
});
return { deviceState };
}
};
Здесь deviceState автоматически обновляет интерфейс при
получении новых данных с сенсора.
Для IoT-устройств с высокой частотой обновления данных рекомендуется использовать WebSocket или MQTT, поскольку стандартный HTTP-подход (REST API) может не справляться с нагрузкой.
Пример подключения через WebSocket:
import { reactive, onMounted, onUnmounted } from 'vue';
export default {
setup() {
const sensorData = reactive({ temperature: 0, humidity: 0 });
let ws;
onMounted(() => {
ws = new WebSocket('ws://iot-server.example.com');
ws.onmess age = (event) => {
const data = JSON.parse(event.data);
sensorData.temperature = data.temperature;
sensorData.humidity = data.humidity;
};
});
onUnmounted(() => {
ws.close();
});
return { sensorData };
}
};
MQTT интеграция может быть реализована через клиентскую библиотеку,
например, mqtt.js:
import mqtt from 'mqtt';
import { reactive, onMounted, onUnmounted } from 'vue';
export default {
setup() {
const state = reactive({ temperature: 0 });
let client;
onMounted(() => {
client = mqtt.connect('ws://broker.example.com:8080');
client.on('connect', () => {
client.subscribe('home/sensor/temperature');
});
client.on('message', (topic, message) => {
state.temperature = parseFloat(message.toString());
});
});
onUnmounted(() => {
client.end();
});
return { state };
}
};
Централизованное состояние с использованием Pinia или Vuex упрощает взаимодействие компонентов с данными устройств. Пример с Pinia:
import { defineStore } from 'pinia';
import IoTService from '../services/IoTService';
export const useDeviceStore = defineStore('device', {
state: () => ({
temperature: 0,
humidity: 0,
}),
actions: {
subscribeSensor(sensorId) {
IoTService.subscribeToSensor(sensorId, (data) => {
this.temperature = data.temperature;
this.humidity = data.humidity;
});
}
}
});
Компоненты могут обращаться к этому хранилищу для отображения текущего состояния и управления устройствами.
Для IoT-дашбордов важна визуализация в реальном времени. Vue интегрируется с библиотеками, такими как Chart.js, ECharts или D3.js. Использование реактивного состояния позволяет обновлять графики без ручного рендеринга:
<template>
<LineChart :data="chartData" />
</template>
<script>
import { reactive, watch } from 'vue';
import LineChart from './LineChart.vue';
import { useDeviceStore } from './store/device';
export default {
components: { LineChart },
setup() {
const store = useDeviceStore();
const chartData = reactive({ labels: [], datasets: [{ data: [] }] });
watch(() => store.temperature, (newTemp) => {
chartData.labels.push(new Date().toLocaleTimeString());
chartData.datasets[0].data.push(newTemp);
});
return { chartData };
}
};
</script>
IoT-приложения генерируют большой поток данных. Для Vue-приложений важны следующие практики:
lodash.debounce для снижения частоты рендеринга.vue-virtual-scroller.IoT-приложения должны учитывать безопасность:
Vue.js обеспечивает только интерфейсную часть, поэтому сервисы IoT должны реализовывать проверку и обработку данных на стороне сервера.