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 插件允许您通过内置流轻松获取 GNSSMeasurementEventsGNSSNavigationMessagesGNSSStatus


使用方法

获取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值)。


注意事项

  1. 平台限制:iOS尚未公开原始位置数据,因此该插件目前仅支持Android。
  2. 权限配置:确保在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

1 回复

更多关于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 来安装插件。

使用插件

  1. 导入插件

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

    import 'package:raw_gnss_flutter/raw_gnss_flutter.dart';
    
  2. 初始化插件

    在使用插件之前,你需要初始化它。通常,你可以在 initState 方法中进行初始化:

    RawGnssFlutter rawGnss = RawGnssFlutter();
    
    [@override](/user/override)
    void initState() {
      super.initState();
      rawGnss.initialize();
    }
    
  3. 监听原始 GNSS 数据

    你可以通过监听 rawGnss.onRawGnssData 来获取原始的 GNSS 数据。这个流会持续地发送 GNSS 数据,你可以在回调中处理这些数据:

    rawGnss.onRawGnssData.listen((RawGnssData data) {
      // 处理原始 GNSS 数据
      print('Received raw GNSS data: $data');
    });
    
  4. 启动和停止 GNSS 数据获取

    你可以使用 start()stop() 方法来控制 GNSS 数据的获取:

    rawGnss.start();  // 开始获取 GNSS 数据
    rawGnss.stop();   // 停止获取 GNSS 数据
    
  5. 处理数据

    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...'),
      ),
    );
  }
}
回到顶部