Flutter NTRIP/RTCM数据解析插件ntrip_rtcm_parser_flutter的使用

发布于 1周前 作者 gougou168 来自 Flutter

Flutter NTRIP/RTCM数据解析插件ntrip_rtcm_parser_flutter的使用

ntrip_rtcm_parser_flutter

一个用于Flutter的新FFI插件项目。


开始使用

这个项目是一个起点,用于构建一个Flutter的FFI插件。FFI插件是一种专门的包,它直接调用Dart FFI中的本地代码。


项目结构

该项目使用以下结构:

  • src: 包含本地源代码以及用于将这些源代码构建为动态库的Cmake文件。

  • lib: 包含定义插件API的Dart代码,并使用dart:ffi调用本地代码。

  • 平台文件夹 (android, ios, windows 等): 包含用于在平台应用程序中构建和捆绑本地代码库的构建文件。


构建和捆绑本地代码

pubspec.yaml中指定FFI插件的方式如下:

plugin:
  platforms:
    some_platform:
      ffiPlugin: true

这种配置会为各种目标平台调用本地构建,并将二进制文件捆绑到使用这些FFI插件的Flutter应用程序中。

可以与dartPluginClass结合使用,例如当FFI用于实现联合插件中的某个平台时:

plugin:
  implements: some_other_plugin
  platforms:
    some_platform:
      dartPluginClass: SomeClass
      ffiPlugin: true

插件可以同时具有FFI和方法通道:

plugin:
  platforms:
    some_platform:
      pluginClass: SomeName
      ffiPlugin: true

FFI(和方法通道)插件调用的本地构建系统包括:

  • Android: Gradle,它调用Android NDK进行本地构建。

  • iOS 和 MacOS: Xcode,通过CocoaPods。

  • Linux 和 Windows: CMake。


绑定到本地代码

要使用本地代码,需要在Dart中创建绑定。为了避免手动编写这些绑定,它们是从头文件src/ntrip_rtcm_parser_flutter.h生成的,使用的是package:ffigen

通过运行以下命令重新生成绑定:

dart run ffigen --config ffigen.yaml

调用本地代码

非常短的本地函数可以直接从任何隔离中调用。例如,查看lib/ntrip_rtcm_parser_flutter.dart中的sum函数。

长时间运行的函数应该在一个辅助隔离中调用,以避免在Flutter应用程序中丢失帧。例如,查看lib/ntrip_rtcm_parser_flutter.dart中的sumAsync函数。


示例代码

以下是完整的示例代码,展示如何使用ntrip_rtcm_parser_flutter插件解析NTRIP/RTCM数据。

示例代码:example/lib/main.dart

import 'dart:convert';
import 'dart:developer';

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

// 初始化Rust库
Future<void> main() async {
  await RustLib.init(); // 初始化Rust库
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        floatingActionButton: FloatingActionButton(
          onPressed: () async {
            // 解析RTCM数据
            var rtc = await rtcmParserData(
              rtcmData: [
                0xD3, 0x00, 0xC4, 0x3E, 0xC0, 0x00, 0x38, 0x49, 0x7C, 0x22, 0xC0, 0x69, 0x66, 0xE9, 0x70,
                0x02, 0x95, 0xDC, 0x54, 0x67, 0x00, 0x3B, 0x81, 0x30, 0x9B, 0x84, 0xC1, 0x27, 0x6D, 0xDD,
                0x81, 0x35, 0x4C, 0xFE, 0x8F, 0x80, 0x00, 0x5A, 0x41, 0xEB, 0xFF, 0xEF, 0x03, 0x16, 0xD3,
                0x58, 0x07, 0xBE, 0xA7, 0xF4, 0x5C, 0x40, 0x03, 0x01, 0x8C, 0x3A, 0xFF, 0x80, 0x32, 0xCF,
                0x64, 0xE4, 0x0C, 0x22, 0x3F, 0xA4, 0x5A, 0x00, 0x31, 0x84, 0x01, 0x67, 0xFB, 0x41, 0xC4,
                0x56, 0xCC, 0x7F, 0xFD, 0xEC, 0xB9, 0x52, 0x40, 0x05, 0x5F, 0x30, 0xC2, 0xC1, 0x3E, 0x22,
                0x2E, 0xBF, 0x0B, 0xFF, 0xB2, 0x0F, 0xEA, 0x15, 0x80, 0x0A, 0xE0, 0x04, 0x75, 0xFE, 0x50,
                0x22, 0x99, 0xC6, 0x67, 0xFF, 0xE4, 0xFF, 0x53, 0x9C, 0x20, 0x00, 0x80, 0x00, 0x0F, 0xE0,
                0x0F, 0xA1, 0x41, 0xFD, 0x42, 0x9E, 0x07, 0xFA, 0x55, 0x60, 0x01, 0x48, 0x6A, 0x71, 0x7F,
                0xA8, 0x04, 0xE3, 0x23, 0x2E, 0x09, 0xAC, 0xBF, 0xD3, 0xEC, 0x00, 0x28, 0x82, 0x45, 0x07,
                0xFD, 0x60, 0x85, 0xD5, 0x20, 0x41, 0x3F, 0xE0, 0xFE, 0x87, 0x88, 0x7F, 0x7C, 0x45, 0x06,
                0xFF, 0xF3, 0x1C, 0x4B, 0xE6, 0x62, 0x02, 0x88, 0x17, 0xF5, 0x28, 0x80, 0x04, 0xE0, 0x9E,
                0xB3, 0x21, 0x08, 0x99, 0x9B, 0x81, 0x50, 0x0A, 0x10, 0x3F, 0xA6, 0xD8, 0x10, 0x00, 0x40,
                0x00, 0x07, 0xF0, 0x00, 0x87, 0xBB, 0x66,
              ],
            );
            print(rtc); // 输出解析结果
          },
        ),
        appBar: AppBar(title: const Text('ntrip_rtcm_parser_flutter 示例')),
        body: Center(
          child: Text(
            '点击按钮解析RTCM数据',
          ),
        ),
      ),
    );
  }
}

更多关于Flutter NTRIP/RTCM数据解析插件ntrip_rtcm_parser_flutter的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter NTRIP/RTCM数据解析插件ntrip_rtcm_parser_flutter的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


ntrip_rtcm_parser_flutter 是一个用于解析 NTRIP/RTCM 数据的 Flutter 插件。RTCM(Radio Technical Commission for Maritime Services)是一种用于传输 GPS 差分校正数据的标准格式,而 NTRIP(Networked Transport of RTCM via Internet Protocol)是一种通过网络传输 RTCM 数据的协议。

以下是如何在 Flutter 项目中使用 ntrip_rtcm_parser_flutter 插件的步骤:

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 ntrip_rtcm_parser_flutter 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  ntrip_rtcm_parser_flutter: ^1.0.0  # 请确保使用最新版本

然后运行 flutter pub get 来获取依赖。

2. 导入插件

在你的 Dart 文件中导入插件:

import 'package:ntrip_rtcm_parser_flutter/ntrip_rtcm_parser_flutter.dart';

3. 解析 RTCM 数据

使用 NtripRtcmParser 类来解析 RTCM 数据。以下是一个简单的示例:

void parseRtcmData(List<int> rtcmData) {
  try {
    var parsedData = NtripRtcmParser.parse(rtcmData);
    print('Parsed RTCM Data: $parsedData');
    
    // 你可以访问解析后的数据
    if (parsedData != null) {
      print('Message Type: ${parsedData.messageType}');
      print('GPS Week: ${parsedData.gpsWeek}');
      print('GPS Time of Week: ${parsedData.gpsTimeOfWeek}');
      print('Satellites: ${parsedData.satellites}');
      // 其他字段...
    }
  } catch (e) {
    print('Failed to parse RTCM data: $e');
  }
}

4. 处理 NTRIP 数据

如果你正在处理 NTRIP 数据流,通常你需要先解析 NTRIP 头,然后再解析 RTCM 数据。以下是一个简单的示例:

void handleNtripData(List<int> ntripData) {
  // 假设你已经从 NTRIP 流中提取了 RTCM 数据
  List<int> rtcmData = extractRtcmDataFromNtrip(ntripData);
  
  // 解析 RTCM 数据
  parseRtcmData(rtcmData);
}

List<int> extractRtcmDataFromNtrip(List<int> ntripData) {
  // 这里你需要实现从 NTRIP 数据中提取 RTCM 数据的逻辑
  // 通常 NTRIP 数据包含一些头信息和 RTCM 数据
  // 返回提取的 RTCM 数据
  return ntripData.sublist(ntripHeaderLength); // 假设 ntripHeaderLength 是 NTRIP 头的长度
}

5. 处理解析结果

根据你的应用需求,你可以进一步处理解析后的 RTCM 数据。例如,你可以将数据用于 GPS 差分校正、显示在 UI 上或记录到日志中。

6. 错误处理

在解析过程中,可能会遇到无效的 RTCM 数据或解析错误。确保你捕获并处理这些异常,以避免应用崩溃。

7. 示例代码

以下是一个完整的示例,展示了如何使用 ntrip_rtcm_parser_flutter 插件解析 RTCM 数据:

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('NTRIP/RTCM Parser Example'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () {
              // 模拟 RTCM 数据
              List<int> rtcmData = [/* 你的 RTCM 数据 */];
              parseRtcmData(rtcmData);
            },
            child: Text('Parse RTCM Data'),
          ),
        ),
      ),
    );
  }
}

void parseRtcmData(List<int> rtcmData) {
  try {
    var parsedData = NtripRtcmParser.parse(rtcmData);
    print('Parsed RTCM Data: $parsedData');
    
    if (parsedData != null) {
      print('Message Type: ${parsedData.messageType}');
      print('GPS Week: ${parsedData.gpsWeek}');
      print('GPS Time of Week: ${parsedData.gpsTimeOfWeek}');
      print('Satellites: ${parsedData.satellites}');
    }
  } catch (e) {
    print('Failed to parse RTCM data: $e');
  }
}
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!