Qt 定位 NMEA 插件

读取NMEA流以提供位置更新。

概述

Qt Positioning 包含一个位置插件,该插件将 NMEA 语句解析为位置更新。此插件可以使用串行端口、套接字或文件作为源。

此插件可以通过使用提供者名称 nmea 来加载。

参数

下表列出了可以传递给nmea插件的参数。

参数

描述

nmea.source

将用于获取NMEA数据的源。

nmea.baudrate

串口连接使用的波特率,用一个正整数表示。通常它应该是QSerialPort::BaudRate枚举中的一个值。如果未指定参数或参数不包含正整数,则使用默认值4800

nmea.satellite_info_simulation_interval

在模拟模式下从文件中读取卫星信息数据的时间间隔。

不同的数据源需要不同的数据提供方式。下表列出了为套接字、串行端口和文件输入提供nmea.source参数的不同方式。

方案

示例

描述

socket://hostname:port

socket://localhost:12345

使用socket:关键字来指定您希望从套接字获取NMEA数据。将创建一个TCP套接字,它将尝试使用端口port连接到主机hostname。成功连接后,预计将从服务器接收到文本NMEA流。

serial:portname

serial:/dev/ttyUSB0

使用serial:关键字来指定您希望从串行端口获取nmea数据。插件将尝试以默认波特率=4800 Bd(波特率值可以使用nmea.baudrate参数指定)连接到端口portname。成功连接后,预计将从串行端口接收到文本NMEA流。如果您使用serial:而不指定任何端口名称,插件将尝试使用供应商标识符查找已知的串行设备之一。但请注意,这不是推荐的使用串行端口连接的方式,因为已知设备列表很小,很可能不包括您的硬件。

serial:COM1

serial:

文件路径

/home/user/nmealog.txt

使用 file:/// 或直接使用完整文件路径来指定本地文件的路径。

file:///filepath

file:///home/user/nmealog.txt

qrc:///filepath

qrc:///nmealog.txt

使用 qrc:/// 前缀来指定应用程序资源中的文件路径。

注意

如果未指定nmea.source参数,插件将尝试定位一个已知的串行设备(就像指定了nmea.source = serial:一样)。

位置源使用示例

以下示例展示了如何使用不同的数据源创建nmea PositionSource

QML

// text file
PositionSource {
    name: "nmea"
    PluginParameter { name: "nmea.source"; value: "qrc:///nmealog.txt" }
}

// socket
PositionSource {
    name: "nmea"
    PluginParameter { name: "nmea.source"; value: "socket://localhost:22222" }
}

// serial port
PositionSource {
    name: "nmea"
    PluginParameter { name: "nmea.source"; value: "serial:/dev/ttyACM0" }
    PluginParameter { name: "nmea.baudrate"; value: 4800 }
}

C++

// text file
QVariantMap params;
params["nmea.source"] = "qrc:///nmealog.txt";
QGeoPositionInfoSource *textPositionSource = QGeoPositionInfoSource::createSource("nmea", params, this);

// socket
params["nmea.source"] = "socket://localhost:22222";
QGeoPositionInfoSource *socketPositionSource = QGeoPositionInfoSource::createSource("nmea", params, this);

// serial port
params["nmea.source"] = "serial:/dev/ttyACM0";
params["nmea.baudrate"] = 4800;
QGeoPositionInfoSource *serialPositionSource = QGeoPositionInfoSource::createSource("nmea", params, this);

注意

一旦创建了PositionSource,就无法重新配置以使用其他类型的源数据。

卫星信息源使用示例

除了位置信息,nmea 插件还能够提供卫星信息。

QML

// serial port
SatelliteSource {
    name: "nmea"
    PluginParameter { name: "nmea.source"; value: "serial:/dev/ttyUSB0" }
    PluginParameter { name: "nmea.baudrate"; value: 9600 }
}

// socket
SatelliteSource {
    name: "nmea"
    PluginParameter { name: "nmea.source"; value: "socket://localhost:22222" }
}

C++

// serial port
QVariantMap parameters;
parameters["nmea.source"] = "serial:/dev/ttyUSB0";
params["nmea.baudrate"] = 9600;
QGeoSatelliteInfoSource *serialSource = QGeoSatelliteInfoSource::createSource("nmea", parameters, this);

// socket
parameters["nmea.source"] = "socket://localhost:22222";
QGeoSatelliteInfoSource *socketSource = QGeoSatelliteInfoSource::createSource("nmea", parameters, this);

设置自定义模拟速度

如果你想使用QGeoSatelliteInfoSource来读取带有NMEA流的文件,你也可以使用额外的参数"nmea.satellite_info_simulation_interval"。此参数用于指定卫星信息消息的播放速率(以毫秒为单位)。最小允许频率由minimumUpdateInterval()指定。如果你指定了一个更小的值,它将被忽略。如果没有指定值,默认值为qMax(100, minimumUpdateInterval())。在运行时,可以使用setBackendProperty()方法来更新此参数。

// file
QVariantMap parameters;
parameters["nmea.source"] = "qrc:///nmealog.txt";
parameters["nmea.satellite_info_simulation_interval"] = 1000;
QGeoSatelliteInfoSource *fileSource = QGeoSatelliteInfoSource::createSource("nmea", parameters, this);

此参数不适用于位置源,因为NMEA协议已经在位置消息中包含了时间戳。这些时间戳用于在使用QGeoPositionInfoSource并将文件作为数据源时模拟正确的消息速率。

注意

一旦创建了QGeoSatelliteInfoSource,就无法重新配置以使用其他类型的源数据。