Flutter NTRIP/RTCM数据解析插件ntrip_rtcm_parser_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
更多关于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');
}
}