Flutter蓝牙Mesh网络插件nrf_ble_mesh_plugin的使用

Flutter蓝牙Mesh网络插件nrf_ble_mesh_plugin的使用

开始使用

本项目是一个用于Flutter的插件包,它包含针对Android和/或iOS平台的特定实现代码。

示例代码

以下是一个完整的示例代码,展示了如何在Flutter应用中使用nrf_ble_mesh_plugin插件。

import 'dart:ffi';

import 'package:flutter/material.dart';
import 'dart:async';
import 'package:flutter/services.dart';
import 'package:nrf_ble_mesh_plugin/nrf_ble_mesh_plugin.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  [@override](/user/override)
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String _platformVersion = '未知';

  [@override](/user/override)
  void initState() {
    super.initState();
    initPlatformState();

    NrfBleMeshPlugin.instance.onMessageReceived(resultCallback: (data) {
      print(data);
      if (data["detectUnprovisionDevice"] != null) {
        setState(() {
          _platformVersion = data["detectUnprovisionDevice"]["uuid"];
        });
      }
    });
  }

  // 平台消息是异步的,因此我们在异步方法中初始化。
  Future<void> initPlatformState() async {
    String platformVersion;
    // 平台消息可能会失败,所以我们使用try/catch处理PlatformException。
    // 我们还处理消息可能返回null的情况。
    try {
      platformVersion = await NrfBleMeshPlugin.instance.platformVersion ?? '未知平台版本';
    } on PlatformException {
      platformVersion = '获取平台版本失败。';
    }

    // 如果小部件从树中移除而异步平台消息仍在进行中,我们希望丢弃回复而不是调用setState来更新我们的不存在的外观。
    if (!mounted) return;

    setState(() {
      _platformVersion = platformVersion;
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('插件示例应用'),
        ),
        body: Padding(
          padding: EdgeInsets.all(20),
          child: SingleChildScrollView(
            child: Column(
              children: [
                TextButton(
                  onPressed: () async {
                    NrfBleMeshPlugin.instance.initMeshNetworkManager();
                  },
                  child: Text('启动Mesh管理器'),
                ),
                TextButton(
                  onPressed: () {
                    NrfBleMeshPlugin.instance.createOrLoadSavedMeshNetwork();
                  },
                  child: Text('创建并加载Mesh网络'),
                ),
                TextButton(
                  onPressed: () {
                    NrfBleMeshPlugin.instance.importMeshNetworkFromJson(jsonStr: _platformVersion);
                  },
                  child: Text('导入Mesh网络'),
                ),
                TextButton(
                  onPressed: () async {
                    _platformVersion = await NrfBleMeshPlugin.instance.exportMeshNetwork();
                    setState(() {});
                  },
                  child: Text('导出Mesh网络'),
                ),
                TextButton(
                  onPressed: () {
                    NrfBleMeshPlugin.instance.scanUnProvisionDevice();
                  },
                  child: Text('扫描未配置设备'),
                ),
                TextButton(
                  onPressed: () {
                    NrfBleMeshPlugin.instance.stopScanUnProvisionDevice();
                  },
                  child: Text('停止扫描未配置设备'),
                ),
                TextButton(
                  onPressed: () {
                    NrfBleMeshPlugin.instance.selectedProvisionDevice(
                      uuid: _platformVersion,
                      unicastAddress: int.parse('0002', radix: 16),
                    );
                  },
                  child: Text('选择未配置设备'),
                ),
                TextButton(
                  onPressed: () {
                    NrfBleMeshPlugin.instance.startProvisioning();
                  },
                  child: Text('开始配置'),
                ),
                TextButton(
                  onPressed: () {
                    NrfBleMeshPlugin.instance.generateAppKeyForNewMeshNetwork();
                  },
                  child: Text('生成应用密钥'),
                ),
                TextButton(
                  onPressed: () {
                    NrfBleMeshPlugin.instance.resetAllProcess();
                  },
                  child: Text('重置所有进程'),
                ),
                TextButton(
                  onPressed: () {
                    NrfBleMeshPlugin.instance.sendMessageToAddress(
                      address: 0x02,
                      vendorModelId: 0x0211,
                      companyId: 0x01,
                      opCodeString: '0F',
                      param: "030101",
                    );
                  },
                  child: Text('发送消息'),
                ),
                TextButton(
                  onPressed: () {
                    NrfBleMeshPlugin.instance.bindAppKeyToModel(
                      nodeAddress: 0x02,
                      modelId: 0x1000,
                    );
                  },
                  child: Text('绑定应用密钥'),
                ),
                TextButton(
                  onPressed: () {
                    NrfBleMeshPlugin.instance.setPublicationToAddress(
                      nodeAddress: 0x02,
                      modelId: 0x1000,
                      publicAddress: 0xF000,
                    );
                  },
                  child: Text('设置发布'),
                ),
                TextButton(
                  onPressed: () {
                    NrfBleMeshPlugin.instance.disConnectProvisionNode();
                  },
                  child: Text('断开连接'),
                ),
                Text(_platformVersion),
              ],
            ),
          ),
        ),
      ),
    );
  }
}

更多关于Flutter蓝牙Mesh网络插件nrf_ble_mesh_plugin的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter蓝牙Mesh网络插件nrf_ble_mesh_plugin的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter项目中,使用nrf_ble_mesh_plugin来构建蓝牙Mesh网络涉及多个步骤,包括初始化插件、扫描设备、加入网络、发送和接收消息等。以下是一个简化的代码示例,展示了如何使用nrf_ble_mesh_plugin进行基本操作。请注意,实际项目中可能需要更复杂的错误处理和状态管理。

首先,确保你已经在pubspec.yaml文件中添加了nrf_ble_mesh_plugin依赖:

dependencies:
  flutter:
    sdk: flutter
  nrf_ble_mesh_plugin: ^最新版本号

然后,运行flutter pub get来安装依赖。

接下来是示例代码:

import 'package:flutter/material.dart';
import 'package:nrf_ble_mesh_plugin/nrf_ble_mesh_plugin.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  late NrfBleMeshPlugin _meshPlugin;

  @override
  void initState() {
    super.initState();
    _meshPlugin = NrfBleMeshPlugin();
    _initializeMesh();
  }

  Future<void> _initializeMesh() async {
    try {
      // 初始化Mesh插件
      await _meshPlugin.initialize();
      print('Mesh initialized');

      // 扫描可用的Mesh网络(假设已有网络存在)
      List<MeshNetwork> networks = await _meshPlugin.scanForNetworks();
      if (networks.isNotEmpty) {
        print('Found Mesh Networks: ${networks.map((e) => e.name).join(', ')}');

        // 加入第一个找到的网络(这里仅作为示例)
        MeshNetwork network = networks.first;
        await _meshPlugin.joinNetwork(network.uuid, network.password);
        print('Joined Mesh Network: ${network.name}');

        // 配置节点(发送配置消息等,这里仅展示如何发送一个简单消息)
        String message = "Hello Mesh!";
        await _sendMeshMessage(network.uuid, message);
      } else {
        print('No Mesh Networks Found');
      }
    } catch (e) {
      print('Error initializing Mesh: $e');
    }
  }

  Future<void> _sendMeshMessage(String networkUuid, String message) async {
    try {
      // 发送消息到所有节点(或指定节点,根据需求调整)
      await _meshPlugin.sendMessage(networkUuid, message);
      print('Message sent: $message');
    } catch (e) {
      print('Error sending message: $e');
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Bluetooth Mesh Example'),
        ),
        body: Center(
          child: Text('Initializing Mesh...'),
        ),
      ),
    );
  }
}

注意

  1. 依赖版本:确保你使用的是nrf_ble_mesh_plugin的最新版本,并根据其文档调整API调用。
  2. 错误处理:示例代码中的错误处理较为简单,实际项目中应更全面地处理各种异常情况。
  3. UI交互:示例代码中的UI非常基础,仅用于展示初始化过程。实际项目中,你可能需要更复杂的UI来管理Mesh网络的状态和交互。
  4. 配置信息:在加入网络时,需要提供正确的UUID和密码。这些信息通常由你的Mesh网络配置提供。
  5. 权限:确保你的Android和iOS项目已经配置了必要的蓝牙权限。

由于nrf_ble_mesh_plugin的具体API可能会随着版本更新而变化,建议查阅其官方文档和示例代码以获取最新和最准确的信息。

回到顶部