传感器
传感器示例演示了两个应用程序如何通过使用UDP套接字发送protobuf消息来通信。
传感器示例包含以下组件
- 从protobuf模式生成,使用qt_add_protobuf调用生成的
protobuf_sensors
库。 - 模拟简单传感器行为的
protobuf_sensor_emulator
应用程序。 - 显示UDP套接字中传感器数据的
protobuf_sensors_client
应用程序。
客户端应用程序绑定到本地的UDP端口65500
,等待来自仿真应用程序的数据。
使用仿真应用程序更改传感器数据的值,并将数据发送到客户端的UDP端口。
应用程序使用从protobuf_sensors
库生成的消息进行通信。该库从.proto文件中描述的protobuf模式生成。
qt_add_protobuf(protobuf_sensors PROTO_FILES sensors.proto tlv.proto )
第一个文件描述了包装传感器数据的类型-长度-值的消息
package qt.examples.sensors.tlv; enum MessageType { Coordinates = 0; Temperature = 1; WarningNotification = 2; } // Protobuf messages imply inline data size. message TlvMessage { MessageType type = 1; bytes value = 2; }
第二个.proto文件包含传感器消息的描述
package qt.examples.sensors; message Coordinates { double longitude = 1; double latitude = 2; double altitude = 3; } message Temperature { enum Unit { Farenheit = 0; Celsius = 1; } sint32 value = 1; Unit units = 2; } message WarningNotification { string text = 1; }
消息使用您在客户端中实例化的QProtobufSerializer进行序列化
class SensorClient : public QObject { Q_OBJECT ... private: QUdpSocket m_client; QProtobufSerializer m_serializer; };
和仿真器
class SensorEmulator : public QObject { Q_OBJECT ... QUdpSocket m_socket; QProtobufSerializer m_serializer; };
在仿真应用程序中点击发送按钮后,从QLineEdit域转换的数据从字符串格式转换为消息字段特定的格式,例如,双精度对于坐标消息的字段
QObject::connect(ui->sendCoordinates, &QPushButton::clicked, this, [this]() { qt::examples::sensors::Coordinates coord; coord.setLatitude(ui->latitudeValue->text().toDouble()); coord.setLongitude(ui->longitudeValue->text().toDouble()); coord.setAltitude(ui->altitudeValue->text().toDouble()); emit coordinatesUpdated(coord); });
然后,具有所有字段的消息被序列化并包装在类型-长度-值消息中
Q_ASSERT(serializer != nullptr); qt::examples::sensors::tlv::TlvMessage msg; msg.setType(type); msg.setValue(data); return msg.serialize(serializer);
客户端对接收到的数据报执行相反的操作。首先将类型-长度-值消息从数据报数据反序列化
const auto datagram = m_client.receiveDatagram(); qt::examples::sensors::tlv::TlvMessage msg; msg.deserialize(&m_serializer, datagram.data()); if (m_serializer.deserializationError() != QAbstractProtobufSerializer::NoError) { qWarning().nospace() << "Unable to deserialize datagram (" << m_serializer.deserializationError() << ")" << m_serializer.deserializationErrorString(); continue; }
然后将类型-长度-值消息反序列化到传感器消息
qt::examples::sensors::Coordinates coord; coord.deserialize(&m_serializer, msg.value()); emit coordinatesUpdated(coord); break;
最后,将其转换为显示给用户
ui->latitudeValue->setText(QString::number(coord.latitude(), 'f', 7)); ui->longitudeValue->setText(QString::number(coord.longitude(), 'f', 7)); ui->altitudeValue->setText(QString::number(coord.altitude(), 'f', 7));
注意:在运行示例之前,请确保您的操作系统允许在UDP端口65500
上绑定并发送数据。
© 2024 Qt公司有限公司。此处包含的文档贡献是各自所有者的版权。此处提供的文档是根据自由软件基金会发布的GNU自由文档许可协议版本1.3的条款提供的。Qt及其相关商标是芬兰的Qt公司及其在全球的子公司和关联公司的注册商标。所有其他商标均为其各自所有者的财产。