欢迎大家加入开源鸿蒙跨平台开发者社区,一起共建开源鸿蒙跨平台生态。
跨平台硬件直连:基于Flutter+鸿蒙的轻量化IoT解决方案
在物联网开发中,跨平台兼容性与硬件直连能力至关重要。本方案结合Flutter的跨平台特性和鸿蒙系统的Sensor API,构建了一套轻量级IoT管控平台。以下是完整的技术实现方案。
Flutter跨平台控制界面实现
Flutter凭借其出色的跨平台性能,成为IoT前端开发的理想选择。以下代码展示了基础控制界面实现,包含温度监控和LED控制功能:
dart
import 'package:flutter/material.dart';
void main() => runApp(IoTApp());
class IoTApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'IoT管控平台',
theme: ThemeData(
primarySwatch: Colors.blue,
visualDensity: VisualDensity.adaptivePlatformDensity,
),
home: ControlPanel(),
);
}
}
class ControlPanel extends StatefulWidget {
@override
_ControlPanelState createState() => _ControlPanelState();
}
class _ControlPanelState extends State<ControlPanel> {
double temperature = 0.0;
bool ledStatus = false;
String connectionStatus = '未连接';
// 定时更新温度数据
@override
void initState() {
super.initState();
Timer.periodic(Duration(seconds: 2), (timer) {
getTemperature();
});
}
void updateTemperature(double newTemp) {
setState(() {
temperature = newTemp;
connectionStatus = '已连接';
});
}
void toggleLed() {
setState(() => ledStatus = !ledStatus);
// 调用鸿蒙硬件控制接口
_sendCommandToDevice(ledStatus ? 'LED_ON' : 'LED_OFF');
}
Future<void> _sendCommandToDevice(String command) async {
// 实现命令发送逻辑
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('IoT管控平台'),
actions: [
IconButton(
icon: Icon(Icons.settings),
onPressed: () {
// 打开设置页面
},
)
],
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text('设备状态: $connectionStatus',
style: TextStyle(color: Colors.grey)),
SizedBox(height: 30),
CircularProgressIndicator(
value: temperature / 100,
backgroundColor: Colors.grey[200],
valueColor: AlwaysStoppedAnimation<Color>(
temperature > 30 ? Colors.red : Colors.blue,
),
),
SizedBox(height: 20),
Text('当前温度: ${temperature.toStringAsFixed(1)}°C',
style: TextStyle(fontSize: 24)),
SizedBox(height: 30),
ElevatedButton(
onPressed: toggleLed,
style: ElevatedButton.styleFrom(
primary: ledStatus ? Colors.orange : Colors.grey,
padding: EdgeInsets.symmetric(horizontal: 30, vertical: 15),
),
child: Text(
ledStatus ? '关闭LED' : '打开LED',
style: TextStyle(fontSize: 18),
),
),
],
),
),
);
}
}
鸿蒙硬件接入方案
鸿蒙系统提供完善的Sensor API支持,以下Java代码演示了完整的温度传感器接入和管理:
java
import ohos.app.Context;
import ohos.sensor.agent.SensorAgent;
import ohos.sensor.bean.CategoryEnvironment;
import ohos.sensor.data.CategoryEnvironmentData;
import ohos.sensor.listener.ICategoryEnvironmentDataCallback;
import ohos.hiviewdfx.HiLog;
import ohos.hiviewdfx.HiLogLabel;
public class SensorManager {
private static final HiLogLabel LABEL = new HiLogLabel(3, 0xD001100, "SensorManager");
private final SensorAgent sensorAgent;
private final ICategoryEnvironmentDataCallback callback;
private static float currentTemperature = 0f;
private boolean isSensorActive = false;
public SensorManager(Context context) {
sensorAgent = new SensorAgent(context);
callback = new ICategoryEnvironmentDataCallback() {
@Override
public void onSensorDataModified(CategoryEnvironmentData data) {
currentTemperature = data.getTemperature();
HiLog.info(LABEL, "温度更新: %{public}f°C", currentTemperature);
// 数据推送至Flutter界面
EventBus.getInstance().post(new TemperatureEvent(currentTemperature));
}
@Override
public void onAccuracyDataModified(CategoryEnvironmentData data, int accuracy) {
HiLog.debug(LABEL, "传感器精度变化: %{public}d", accuracy);
}
};
}
public void startTemperatureSensor() {
if (!isSensorActive) {
int result = sensorAgent.startSensorData(
CategoryEnvironment.SENSOR_TYPE_AMBIENT_TEMPERATURE,
1000000, // 1秒采样间隔
callback
);
if (result == 0) {
isSensorActive = true;
HiLog.info(LABEL, "温度传感器启动成功");
} else {
HiLog.error(LABEL, "温度传感器启动失败, 错误码: %{public}d", result);
}
}
}
public void stopTemperatureSensor() {
if (isSensorActive) {
sensorAgent.stopSensorData(
CategoryEnvironment.SENSOR_TYPE_AMBIENT_TEMPERATURE,
callback
);
isSensorActive = false;
HiLog.info(LABEL, "温度传感器已停止");
}
}
public static float getCurrentTemperature() {
return currentTemperature;
}
// LED控制方法
public void controlLed(boolean isOn) {
String command = isOn ? "LED_ON" : "LED_OFF";
HiLog.info(LABEL, "执行LED控制命令: %{public}s", command);
// 实际硬件控制逻辑
}
}
跨平台通信方案
提供两种可靠的通信实现方式,满足不同场景需求:
1. 平台通道方案
Flutter端完整实现:
dart
import 'package:flutter/services.dart';
const platform = MethodChannel('samples.flutter.dev/sensor');
const eventChannel = EventChannel('samples.flutter.dev/sensor_updates');
class SensorService {
static Future<double> getTemperature() async {
try {
final result = await platform.invokeMethod('getTemperature');
return double.parse(result.toString());
} on PlatformException catch (e) {
print("温度获取失败: '${e.message}'.");
throw Exception('温度获取失败');
}
}
static Stream<double> get temperatureUpdates {
return eventChannel
.receiveBroadcastStream()
.map((event) => double.parse(event.toString()))
.handleError((error) {
print('温度数据流错误: $error');
});
}
static Future<void> controlLed(bool isOn) async {
try {
await platform.invokeMethod('controlLed', {'status': isOn});
} on PlatformException catch (e) {
print("LED控制失败: '${e.message}'.");
throw Exception('LED控制失败');
}
}
}
鸿蒙端完整实现:
java
import ohos.aafwk.ability.AbilitySlice;
import ohos.aafwk.content.Intent;
import ohos.app.Context;
import ohos.eventhandler.EventHandler;
import ohos.eventhandler.EventRunner;
import ohos.eventhandler.InnerEvent;
import io.flutter.embedding.android.FlutterAbilitySlice;
import io.flutter.embedding.engine.FlutterEngine;
import io.flutter.plugin.common.EventChannel;
import io.flutter.plugin.common.MethodChannel;
public class MainAbilitySlice extends FlutterAbilitySlice {
private static final String CHANNEL = "samples.flutter.dev/sensor";
private static final String EVENT_CHANNEL = "samples.flutter.dev/sensor_updates";
private SensorManager sensorManager;
private EventChannel.EventSink eventSink;
private final EventHandler handler = new EventHandler(EventRunner.getMainEventRunner()) {
@Override
protected void processEvent(InnerEvent event) {
if (eventSink != null) {
eventSink.success(SensorManager.getCurrentTemperature());
}
}
};
@Override
public void onStart(Intent intent) {
super.onStart(intent);
sensorManager = new SensorManager(this);
// 方法通道
new MethodChannel(getFlutterEngine().getDartExecutor(), CHANNEL)
.setMethodCallHandler((call, result) -> {
switch (call.method) {
case "getTemperature":
result.success(SensorManager.getCurrentTemperature());
break;
case "controlLed":
boolean status = call.argument("status");
sensorManager.controlLed(status);
result.success(null);
break;
default:
result.notImplemented();
}
});
// 事件通道
new EventChannel(getFlutterEngine().getDartExecutor(), EVENT_CHANNEL)
.setStreamHandler(new EventChannel.StreamHandler() {
@Override
public void onListen(Object args, EventChannel.EventSink sink) {
eventSink = sink;
sensorManager.startTemperatureSensor();
handler.sendEvent(InnerEvent.get(0, 0, null), 1000);
}
@Override
public void onCancel(Object args) {
eventSink = null;
sensorManager.stopTemperatureSensor();
}
});
}
}
2. RESTful API方案
适用于远程控制场景,鸿蒙设备作为服务端提供数据接口:
鸿蒙端REST服务实现:
java
import ohos.app.Context;
import ohos.net.http.HttpRequest;
import ohos.net.http.HttpResponse;
import ohos.net.http.HttpURLConnection;
import ohos.app.Context;
import ohos.app.AbilityContext;
import ohos.app.ServiceAbility;
import ohos.rpc.IRemoteObject;
import ohos.hiviewdfx.HiLog;
import ohos.hiviewdfx.HiLogLabel;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
public class RestService extends ServiceAbility {
private static final HiLogLabel LABEL = new HiLogLabel(3, 0xD001100, "RestService");
private static final int PORT = 8080;
private HttpServer httpServer;
private SensorManager sensorManager;
@Override
public void onStart(AbilityContext abilityContext) {
super.onStart(abilityContext);
HiLog.info(LABEL, "REST服务启动");
sensorManager = new SensorManager(abilityContext);
startHttpServer();
}
private void startHttpServer() {
try {
httpServer = new HttpServer(PORT);
httpServer.addHandler("/api/temperature", (request, response) -> {
response.setContentType("application/json");
Map<String, Object> data = new HashMap<>();
data.put("temperature", SensorManager.getCurrentTemperature());
data.put("timestamp", System.currentTimeMillis());
response.send(200, new Gson().toJson(data));
});
httpServer.addHandler("/api/led", (request, response) -> {
String method = request.getMethod();
if ("POST".equals(method)) {
Map<String, String> params = request.getParams();
boolean status = Boolean.parseBoolean(params.get("status"));
sensorManager.controlLed(status);
response.send(200, "{\"status\":\"success\"}");
} else {
response.send(405, "{\"error\":\"Method not allowed\"}");
}
});
httpServer.start();
HiLog.info(LABEL, "HTTP服务器已启动,监听端口: %{public}d", PORT);
} catch (IOException e) {
HiLog.error(LABEL, "HTTP服务器启动失败: %{public}s", e.getMessage());
}
}
@Override
public void onStop() {
super.onStop();
if (httpServer != null) {
httpServer.stop();
HiLog.info(LABEL, "HTTP服务器已停止");
}
}
}
Flutter端HTTP客户端实现:
dart
import 'package:http/http.dart' as http;
import 'dart:convert';
class HttpSensorService {
static const String baseUrl = 'http://192.168.1.100:8080';
static Future<double> getTemperature() async {
try {
final response = await http.get(Uri.parse('$baseUrl/api/temperature'));
if (response.statusCode == 200) {
final data = json.decode(response.body);
return data['temperature'].toDouble();
}
throw Exception('Failed to get temperature');
} catch (e) {
throw Exception('HTTP请求失败: $e');
}
}
static Future<void> controlLed(bool isOn) async {
try {
final response = await http.post(
Uri.parse('$baseUrl/api/led'),
body: {'status': isOn.toString()}
);
if (response.statusCode != 200) {
throw Exception('LED控制失败');
}
} catch (e) {
throw Exception('HTTP请求失败: $e');
}
}
}
系统架构设计
完整的系统采用三层架构方案:
-
硬件层:
- 鸿蒙设备作为硬件接入节点
- 支持多种传感器接入(温度、湿度、光照等)
- 提供执行器控制接口(LED、继电器等)
- 实现设备管理(连接状态、固件版本等)
-
通信层:
- 本地通信:平台通道(MethodChannel/EventChannel)
- 远程通信:RESTful API(HTTP/HTTPS)
- 数据协议:JSON格式统一数据交换
- 安全机制:TLS加密、访问令牌
-
应用层:
- Flutter跨平台UI(Android/iOS/Web)
- 设备管理界面(添加/删除/配置设备)
- 实时数据监控(图表展示、历史记录)
- 控制面板(场景模式、定时任务)
- 告警系统(阈值设置、推送通知)
部署流程
完整的部署实施流程:
-
鸿蒙应用开发与传感器集成
- 配置鸿蒙开发环境(DevEco Studio)
- 实现传感器数据采集模块
- 开发硬件控制接口
- 集成通信服务(平台通道/REST API)
-
Flutter界面开发与通信模块实现
- 搭建Flutter开发环境
- 设计响应式UI布局
- 实现与鸿蒙设备的通信模块
- 开发数据可视化组件
-
硬件连接测试与性能优化
- 功能测试(传感器数据准确性、控制响应)
- 压力测试(多设备连接、大数据量传输)
- 功耗优化(传感器采样频率调整)
- 稳定性测试(长时间运行)
-
多平台应用打包发布
- 鸿蒙应用打包(HAP包)
- Flutter应用打包(Android APK/iOS IPA/Web)
- 部署文档编写
- 应用商店发布
方案优势
本方案融合了Flutter的跨平台优势与鸿蒙的硬件接入能力,具有以下特点:
-
开发效率高:
- 一套代码多平台运行(Android/iOS/Web)
- 热重载快速迭代开发
- 丰富的Flutter插件生态系统
-
维护成本低:
- 统一代码库,减少维护工作量
- 模块化设计,易于功能扩展
- 自动化测试框架支持
-
性能优异:
- Flutter高性能渲染引擎
- 鸿蒙轻量化系统资源占用低
- 优化的通信协议减少延迟
-
应用场景广泛:
- 智能家居(温控系统、智能照明)
- 工业监测(设备状态监控)
- 环境监测(气象站、水质检测)
- 农业物联网(温室控制、精准灌溉)
-
扩展性强:
- 支持多种通信协议(BLE/WiFi/LoRa)
- 可接入第三方云平台
- 支持边缘计算功能扩展
欢迎大家加入开源鸿蒙跨平台开发者社区,一起共建开源鸿蒙跨平台生态。