Flutter原始GNSS数据获取插件raw_gnss_flutter的使用
Flutter原始GNSS数据获取插件raw_gnss_flutter的使用
raw_gnss 📡
raw_gnss 📡
可以轻松获取原始GNSS数据,包括GNSS测量事件、GNSS导航消息和GNSS状态事件。
在Android上获取原始GNSS数据
从Android 7.0开始,Android开放了获取原始数据点所需的GNSS API,从而打开了位置信息的黑盒子。
raw_gnss
插件允许您通过内置流轻松获取 GNSSMeasurementEvents
、GNSSNavigationMessages
和 GNSSStatus
。
使用方法
获取GNSS测量事件
RawGnss().gnssMeasurementEvents.listen((e) {});
获取GNSS导航消息事件
RawGnss().gnssNavigationMessageEvents.listen((e) {});
获取GNSS状态事件
RawGnss().gnssStatusEvents.listen((e) {});
示例:获取GNSSMeasurementModels
以下是一个完整的示例,展示如何使用 StreamBuilder
来获取并显示卫星测量数据。
import 'package:flutter/material.dart';
import 'package:raw_gnss_flutter/raw_gnss_flutter.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(title: Text('GNSS 测量数据示例')),
body: GNSSMeasurementPage(),
),
);
}
}
class GNSSMeasurementPage extends StatefulWidget {
@override
_GNSSMeasurementPageState createState() => _GNSSMeasurementPageState();
}
class _GNSSMeasurementPageState extends State<GNSSMeasurementPage> {
@override
Widget build(BuildContext context) {
return StreamBuilder<GnssMeasurementModel>(
stream: RawGnss().gnssMeasurementEvents,
builder: (context, snapshot) {
// 如果数据为空,显示加载指示器
if (!snapshot.hasData) {
return Center(child: CircularProgressIndicator());
}
final measurements = snapshot.data?.measurements;
// 如果没有测量数据,返回提示信息
if (measurements == null || measurements.isEmpty) {
return Center(child: Text('没有可用的GNSS测量数据'));
}
// 使用ListView展示卫星数据
return ListView.builder(
itemCount: measurements.length,
itemBuilder: (context, index) {
final measurement = measurements[index];
return ListTile(
title: Text(
"卫星编号: ${measurement.svid}, 精度因子: ${measurement.cN0DbHz}",
),
subtitle: Text("信号强度: ${measurement.cN0DbHz} dBHz"),
);
},
);
},
);
}
}
示例运行效果
运行上述代码后,界面将显示类似以下内容:
每个条目表示一个卫星的测量数据,包括卫星编号(SVID)和信号强度(C/N0值)。
注意事项
- 平台限制:iOS尚未公开原始位置数据,因此该插件目前仅支持Android。
- 权限配置:确保在AndroidManifest.xml中添加必要的权限:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
更多关于Flutter原始GNSS数据获取插件raw_gnss_flutter的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter原始GNSS数据获取插件raw_gnss_flutter的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
raw_gnss_flutter
是一个 Flutter 插件,用于从 Android 设备获取原始的 GNSS(全球导航卫星系统)数据。这个插件允许开发者访问设备上的 GNSS 接收器,并获取原始的卫星信号数据,如伪距、载波相位、多普勒频移等。这些数据通常用于高精度的定位应用,如测绘、自动驾驶等。
安装插件
首先,你需要在 pubspec.yaml
文件中添加 raw_gnss_flutter
插件的依赖:
dependencies:
flutter:
sdk: flutter
raw_gnss_flutter: ^1.0.0 # 请使用最新版本
然后运行 flutter pub get
来安装插件。
使用插件
-
导入插件:
在你的 Dart 文件中导入
raw_gnss_flutter
插件:import 'package:raw_gnss_flutter/raw_gnss_flutter.dart';
-
初始化插件:
在使用插件之前,你需要初始化它。通常,你可以在
initState
方法中进行初始化:RawGnssFlutter rawGnss = RawGnssFlutter(); [@override](/user/override) void initState() { super.initState(); rawGnss.initialize(); }
-
监听原始 GNSS 数据:
你可以通过监听
rawGnss.onRawGnssData
来获取原始的 GNSS 数据。这个流会持续地发送 GNSS 数据,你可以在回调中处理这些数据:rawGnss.onRawGnssData.listen((RawGnssData data) { // 处理原始 GNSS 数据 print('Received raw GNSS data: $data'); });
-
启动和停止 GNSS 数据获取:
你可以使用
start()
和stop()
方法来控制 GNSS 数据的获取:rawGnss.start(); // 开始获取 GNSS 数据 rawGnss.stop(); // 停止获取 GNSS 数据
-
处理数据:
RawGnssData
对象包含了从 GNSS 接收器获取的原始数据。你可以访问这些数据来进行进一步的处理,例如计算位置、分析信号质量等。rawGnss.onRawGnssData.listen((RawGnssData data) { // 访问伪距、载波相位等数据 for (var measurement in data.measurements) { print('Satellite PRN: ${measurement.prn}'); print('Pseudorange: ${measurement.pseudorange}'); print('Carrier Phase: ${measurement.carrierPhase}'); print('Doppler Shift: ${measurement.dopplerShift}'); } });
注意事项
-
权限:在 Android 设备上获取 GNSS 数据需要
ACCESS_FINE_LOCATION
权限。确保你在AndroidManifest.xml
文件中声明了该权限,并在运行时请求用户授权。<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
-
设备支持:并非所有 Android 设备都支持获取原始 GNSS 数据。通常,只有较新的设备或专门的高精度定位设备才支持此功能。
-
电池消耗:持续获取 GNSS 数据可能会显著增加电池消耗,因此在实际应用中需要合理管理数据的获取频率。
示例代码
以下是一个完整的示例代码,展示了如何使用 raw_gnss_flutter
插件获取并打印原始 GNSS 数据:
import 'package:flutter/material.dart';
import 'package:raw_gnss_flutter/raw_gnss_flutter.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: RawGnssScreen(),
);
}
}
class RawGnssScreen extends StatefulWidget {
[@override](/user/override)
_RawGnssScreenState createState() => _RawGnssScreenState();
}
class _RawGnssScreenState extends State<RawGnssScreen> {
RawGnssFlutter rawGnss = RawGnssFlutter();
[@override](/user/override)
void initState() {
super.initState();
rawGnss.initialize();
rawGnss.start();
rawGnss.onRawGnssData.listen((RawGnssData data) {
for (var measurement in data.measurements) {
print('Satellite PRN: ${measurement.prn}');
print('Pseudorange: ${measurement.pseudorange}');
print('Carrier Phase: ${measurement.carrierPhase}');
print('Doppler Shift: ${measurement.dopplerShift}');
}
});
}
[@override](/user/override)
void dispose() {
rawGnss.stop();
super.dispose();
}
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Raw GNSS Data'),
),
body: Center(
child: Text('Listening for raw GNSS data...'),
),
);
}
}