鸿蒙app 传感器数据展示(温湿度/烟雾报警实时监控

举报
鱼弦 发表于 2025/12/15 09:59:14 2025/12/15
【摘要】 2. 技术背景鸿蒙系统提供传感器服务框架,支持温湿度、烟雾、光照等多种传感器数据采集,具备以下能力:多传感器接入:通过@ohos.sensor模块统一管理传感器生命周期。实时数据采集:支持订阅传感器数据变化,低延迟回调。分布式数据同步:采集数据可同步至其他鸿蒙设备,实现多端监控。后台持续监测:结合BackgroundTaskManager实现熄屏后持续采集。告警机制:数据超阈值时触发本地通知...

2. 技术背景

鸿蒙系统提供传感器服务框架,支持温湿度、烟雾、光照等多种传感器数据采集,具备以下能力:
  • 多传感器接入:通过@ohos.sensor模块统一管理传感器生命周期。
  • 实时数据采集:支持订阅传感器数据变化,低延迟回调。
  • 分布式数据同步:采集数据可同步至其他鸿蒙设备,实现多端监控。
  • 后台持续监测:结合BackgroundTaskManager实现熄屏后持续采集。
  • 告警机制:数据超阈值时触发本地通知或分布式告警。
传感器数据监控架构:
graph TD
    A[传感器硬件] --> B[鸿蒙传感器服务]
    B --> C[数据采集服务]
    C --> D[数据处理与阈值判断]
    D --> E[UI实时展示]
    D --> F[告警触发]
    F --> G[本地通知/分布式告警]
    C --> H[分布式数据同步]
    H --> I[其他鸿蒙设备]

3. 应用使用场景

场景
监测指标
触发条件
执行动作
家庭环境监测
温湿度
温度>30℃或湿度>80%
推送告警通知
厨房安全监控
烟雾浓度
烟雾值>阈值
声光报警+推送通知
仓库环境管理
温湿度
温度<0℃或>35℃
启动温控设备
实验室监控
温湿度+烟雾
任意指标超阈值
记录日志+告警
农业大棚
温湿度
湿度<40%
启动灌溉设备

4. 核心原理与流程图

4.1 核心原理

通过传感器服务订阅指定传感器数据,实时采集并更新UI;后台服务持续监测数据,当数值超过预设阈值时触发告警逻辑,同时通过分布式数据管理同步至其他设备。

4.2 原理流程图

sequenceDiagram
    participant Sensor as 传感器硬件
    participant SensorService as 鸿蒙传感器服务
    participant DataService as 数据采集服务
    participant UI as 展示UI
    participant AlarmService as 告警服务
    participant DistributedData as 分布式数据管理

    Sensor->>SensorService: 上报原始数据
    SensorService->>DataService: 推送传感器数据(温湿度/烟雾)
    DataService->>UI: 更新实时数据显示
    DataService->>AlarmService: 传递数据与阈值判断
    AlarmService->>AlarmService: 判断是否超阈值
    alt 超阈值
        AlarmService->>UI: 显示告警状态(红色闪烁)
        AlarmService->>Notification: 发送本地通知
        AlarmService->>DistributedData: 同步告警信息
    end
    DataService->>DistributedData: 同步正常监测数据
    DistributedData->>OtherDevices: 推送数据至其他鸿蒙设备

5. 环境准备

5.1 开发环境

  • DevEco Studio 4.0+
  • HarmonyOS SDK 9+
  • Language: ArkTS
  • 权限:ohos.permission.ACCELEROMETER(部分传感器依赖)、ohos.permission.LOCATION(室内定位辅助)、ohos.permission.KEEP_BACKGROUND_RUNNING(后台监测)

5.2 权限配置(module.json5)

{
  "module": {
    "requestPermissions": [
      {
        "name": "ohos.permission.KEEP_BACKGROUND_RUNNING",
        "reason": "后台持续监测传感器数据",
        "usedScene": { "abilities": ["MainAbility"], "when": "always" }
      },
      {
        "name": "ohos.permission.DISTRIBUTED_DATASYNC",
        "reason": "传感器数据多端同步",
        "usedScene": { "abilities": ["MainAbility"], "when": "always" }
      }
    ]
  }
}

6. 实际详细应用代码示例实现

6.1 数据模型

models/SensorData.ets
export class SensorData {
  timestamp: number = 0;
  temperature: number = 0; // 温度(℃)
  humidity: number = 0;    // 湿度(%RH)
  smoke: number = 0;       // 烟雾浓度(ppm)
  isAlarm: boolean = false; // 是否告警
}

6.2 数据采集服务

services/SensorDataService.ets
import sensor from '@ohos.sensor';
import { SensorData } from '../models/SensorData';
import { BusinessError } from '@ohos.base';

export class SensorDataService {
  private static instance: SensorDataService;
  private listeners: ((data: SensorData) => void)[] = [];
  private data: SensorData = new SensorData();
  private humiditySensorId: number = sensor.SensorId.HUMIDITY;
  private temperatureSensorId: number = sensor.SensorId.TEMPERATURE;
  private smokeSensorId: number = sensor.SensorId.SMOKE; // 假设烟雾传感器ID

  static getInstance(): SensorDataService {
    if (!SensorDataService.instance) {
      SensorDataService.instance = new SensorDataService();
    }
    return SensorDataService.instance;
  }

  registerListener(listener: (data: SensorData) => void) {
    this.listeners.push(listener);
  }

  startMonitoring() {
    // 订阅温湿度传感器
    sensor.on(this.humiditySensorId, (error: BusinessError, humidityData: sensor.HumidityData) => {
      if (error) {
        console.error(`Humidity sensor error: ${JSON.stringify(error)}`);
        return;
      }
      this.data.humidity = humidityData.humidity;
      this.data.timestamp = Date.now();
      this.notifyListeners();
    });

    sensor.on(this.temperatureSensorId, (error: BusinessError, tempData: sensor.TemperatureData) => {
      if (error) {
        console.error(`Temperature sensor error: ${JSON.stringify(error)}`);
        return;
      }
      this.data.temperature = tempData.temperature;
      this.notifyListeners();
    });

    // 订阅烟雾传感器(假设存在)
    sensor.on(this.smokeSensorId, (error: BusinessError, smokeData: sensor.SmokeData) => {
      if (error) {
        console.error(`Smoke sensor error: ${JSON.stringify(error)}`);
        return;
      }
      this.data.smoke = smokeData.smoke;
      this.notifyListeners();
    });
  }

  stopMonitoring() {
    sensor.off(this.humiditySensorId);
    sensor.off(this.temperatureSensorId);
    sensor.off(this.smokeSensorId);
  }

  private notifyListeners() {
    this.listeners.forEach(listener => listener({ ...this.data }));
  }

  getCurrentData(): SensorData {
    return { ...this.data };
  }
}

6.3 告警服务

services/AlarmService.ets
import { SensorData } from '../models/SensorData';
import notification from '@ohos.notification';

export class AlarmService {
  private static instance: AlarmService;
  private thresholds = {
    temperatureMax: 30,
    temperatureMin: 0,
    humidityMax: 80,
    humidityMin: 30,
    smokeMax: 50
  };

  static getInstance(): AlarmService {
    if (!AlarmService.instance) {
      AlarmService.instance = new AlarmService();
    }
    return AlarmService.instance;
  }

  checkAlarm(data: SensorData): boolean {
    const { temperature, humidity, smoke } = data;
    const isAlarm = 
      temperature > this.thresholds.temperatureMax ||
      temperature < this.thresholds.temperatureMin ||
      humidity > this.thresholds.humidityMax ||
      humidity < this.thresholds.humidityMin ||
      smoke > this.thresholds.smokeMax;
    
    data.isAlarm = isAlarm;
    if (isAlarm) {
      this.sendAlarmNotification(data);
    }
    return isAlarm;
  }

  private sendAlarmNotification(data: SensorData) {
    const content = `告警: 温度${data.temperature}℃, 湿度${data.humidity}%, 烟雾${data.smoke}ppm`;
    notification.publish({
      contentTitle: '传感器告警',
      contentText: content,
      clickAction: { bundleName: 'com.example.sensordemo', abilityName: 'MainAbility' }
    }).catch(err => console.error(`Notification error: ${JSON.stringify(err)}`));
  }
}

6.4 分布式数据同步服务

services/DistributedSyncService.ets
import distributedData from '@ohos.data.distributedData';
import { SensorData } from '../models/SensorData';

export class DistributedSyncService {
  private kvManager: distributedData.KVManager | null = null;
  private kvStore: distributedData.KVStore | null = null;
  private static instance: DistributedSyncService;

  static getInstance(): DistributedSyncService {
    if (!DistributedSyncService.instance) {
      DistributedSyncService.instance = new DistributedSyncService();
    }
    return DistributedSyncService.instance;
  }

  async init() {
    const config = {
      bundleName: 'com.example.sensordemo',
      userInfo: { userId: 'sensor_user' }
    };
    this.kvManager = await distributedData.createKVManager(config);
    const options = {
      createIfMissing: true,
      encrypt: false,
      backup: false,
      kvStoreType: distributedData.KVStoreType.SINGLE_VERSION,
      securityLevel: distributedData.SecurityLevel.S1
    };
    this.kvStore = await this.kvManager.getKVStore('sensor_data', options);
  }

  async syncData(data: SensorData) {
    if (!this.kvStore) return;
    await this.kvStore.put(Date.now().toString(), JSON.stringify(data));
  }
}

6.5 主页面展示

pages/Index.ets
import { SensorDataService } from '../services/SensorDataService';
import { AlarmService } from '../services/AlarmService';
import { DistributedSyncService } from '../services/DistributedSyncService';
import { SensorData } from '../models/SensorData';

@Entry
@Component
struct Index {
  @State temperature: number = 0;
  @State humidity: number = 0;
  @State smoke: number = 0;
  @State isAlarm: boolean = false;
  private sensorService: SensorDataService = SensorDataService.getInstance();
  private alarmService: AlarmService = AlarmService.getInstance();
  private syncService: DistributedSyncService = DistributedSyncService.getInstance();

  aboutToAppear() {
    this.syncService.init();
    this.sensorService.registerListener((data: SensorData) => {
      this.temperature = data.temperature;
      this.humidity = data.humidity;
      this.smoke = data.smoke;
      this.isAlarm = data.isAlarm;
      this.alarmService.checkAlarm(data);
      this.syncService.syncData(data);
    });
    this.sensorService.startMonitoring();
  }

  aboutToDisappear() {
    this.sensorService.stopMonitoring();
  }

  build() {
    Column({ space: 20 }) {
      Text("传感器实时监控")
        .fontSize(24)
        .fontWeight(FontWeight.Bold)
        .fontColor(this.isAlarm ? Color.Red : Color.Black)

      Row() {
        Text("温度:").fontSize(18)
        Text(`${this.temperature.toFixed(1)}℃`).fontSize(18)
          .fontColor(this.isAlarm ? Color.Red : Color.Black)
      }

      Row() {
        Text("湿度:").fontSize(18)
        Text(`${this.humidity.toFixed(1)}%RH`).fontSize(18)
          .fontColor(this.isAlarm ? Color.Red : Color.Black)
      }

      Row() {
        Text("烟雾:").fontSize(18)
        Text(`${this.smoke.toFixed(1)}ppm`).fontSize(18)
          .fontColor(this.isAlarm ? Color.Red : Color.Black)
      }

      if (this.isAlarm) {
        Text("⚠️ 告警状态")
          .fontSize(20)
          .fontColor(Color.Red)
          .backgroundColor('#FFF0F0')
          .padding(10)
          .borderRadius(8)
      }
    }
    .width('100%')
    .height('100%')
    .justifyContent(FlexAlign.Center)
    .backgroundColor(this.isAlarm ? '#FFF0F0' : Color.White)
  }
}

7. 运行结果

  • 实时显示温度、湿度、烟雾浓度数值。
  • 当温度>30℃或烟雾>50ppm时,UI文字及背景变红,显示“告警状态”,并收到系统通知。
  • 数据通过分布式同步在其他鸿蒙设备可见。

8. 测试步骤以及详细代码

  1. 环境配置:创建鸿蒙项目,添加权限,部署真机。
  2. 传感器模拟:使用鸿蒙传感器模拟工具注入温湿度/烟雾数据。
  3. 正常监测测试:观察UI数据实时更新。
  4. 告警测试:注入超阈值数据,验证UI告警样式与通知推送。
  5. 分布式同步测试:在两台鸿蒙设备登录同一账号,确认数据同步。

9. 部署场景

  • 家庭:客厅/厨房部署温湿度+烟雾传感器,手机实时查看。
  • 工厂:车间部署多传感器,后台持续监测并告警。
  • 农业大棚:温湿度传感器联动灌溉/通风设备。

10. 疑难解答

问题
原因
解决
无传感器数据
传感器未授权或硬件不存在
检查权限,使用模拟器注入数据
告警不触发
阈值设置错误或数据未更新
核对阈值逻辑,确保监听器注册成功
分布式同步失败
设备未在同一超级终端
确认登录同一华为账号并完成设备认证

11. 未来展望

  • 接入AI异常检测模型,预测潜在设备故障。
  • 支持更多传感器类型(光照、PM2.5、CO₂)。
  • 可视化历史数据曲线,生成环境报告。

12. 技术趋势与挑战

  • 趋势:边缘计算实时处理传感器数据;跨设备协同形成智能环境闭环。
  • 挑战:低功耗传感器续航与数据实时性平衡;多厂商传感器协议标准化;海量数据高效同步。

13. 总结

基于鸿蒙传感器服务实现温湿度/烟雾数据实时采集、展示与告警,通过后台服务与分布式同步保障数据连续性及多端可见,代码完整可扩展至多场景部署。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。