Qt定位NMEA插件#

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

概述#

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

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

参数#

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

参数

描述

nmea.source

用于获取NMEA数据的数据源。

nmea.baudrate

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

nmea.satellite_info_simulation_interval

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

不同的数据源需要以不同的方式提供数据。以下表格列出了为Socket、串行端口和文件输入提供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

filepath

/home/user/nmealog.txt

使用关键字file:///或只是完整文件路径指定本地文件的路径。

file:///filepath

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

qrc:///filepath

qrc:///nmealog.txt

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

注意

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

位置源用法示例#

以下示例展示了如何使用不同的数据源创建一个 nmea 位置源

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);

注意

创建位置源后,就无法重新配置它以使用其他类型的源数据。

卫星信息源用法示例#

除了位置信息外,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 后,就无法重新配置它以使用其他类型的源数据。