Qt Positioning NMEA 插件
概述
Qt Positioning 附带了一个位置插件,该插件可将 NMEA 语句解析为位置更新数据。该插件可使用串口、套接字或文件作为数据源。
可通过提供程序名称nmea 加载此插件。
参数
下表列出了可传递给 nmea 插件的参数。
| 参数 | 描述 |
|---|---|
| nmea.source | 用于获取 NMEA 数据的来源。 |
| nmea.baudrate | 串行端口连接所使用的波特率,以正整数表示。通常应为QSerialPort::BaudRate 枚举中的某个值。如果未指定该参数或其值不是正整数,则使用默认值4800 。 |
| nmea.satellite_info_simulation_interval | 在模拟模式下从文件中读取卫星信息数据的间隔时间。 |
不同的数据源需要采用不同的数据提供方式。下表列出了针对套接字、串口和文件输入时提供 `nmea.source ` 参数的不同方式。
| 方案 | 示例 | 说明 |
|---|---|---|
| socket://主机名:端口 | socket://localhost:12345 | 使用socket:关键字指定要从套接字获取 NMEA 数据。系统将创建一个 TCP 套接字,并尝试通过端口port 连接到主机hostname 。连接成功后,预计将从服务器接收 NMEA 文本数据流。 |
| serial:portname | serial:/dev/ttyUSB0 | 使用serial:关键字指定从串口获取 NMEA 数据。 该插件将尝试以默认波特率 4800 Bd 连接至端口portname (波特率值可通过nmea.baudrate参数指定)。连接成功后,预计将从串口接收 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: 一样)。
警告: socket:// 方案 仅支持未加密的连接。因此,它仅适用于主机内部或受信任的网络环境。
位置数据源使用示例
以下示例演示了如何使用不同的数据源创建一个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()) 。在运行时,可以使用QNmeaSatelliteInfoSource::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 ,就无法将其重新配置为使用其他类型的数据源。
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.