Sensores

El ejemplo de Sensores muestra como dos aplicaciones pueden comunicarse enviando mensajes protobuf usando sockets UDP.

El ejemplo Sensores consta de los siguientes componentes:

  • protobuf_sensors librería que se genera desde el esquema protobuf usando la llamada qt_add_protobuf.
  • protobuf_sensor_emulator aplicación que emula el comportamiento simple del sensor.
  • protobuf_sensors_client aplicación que muestra los datos del sensor desde el socket UDP.

La aplicación cliente se enlaza en el puerto UDP 65500 de localhost y espera los datos de la aplicación emuladora.

Use la aplicación emuladora para cambiar los valores de los datos del sensor y envíe los datos al puerto UDP del cliente.

Captura de pantalla que muestra una aplicación de consola del emulador para enviar coordenadas, temperatura meteorológica y un mensaje de advertencia.

Las aplicaciones utilizan los mensajes generados de la biblioteca protobuf_sensors para comunicarse. La biblioteca se genera a partir del esquema protobuf descrito en los archivos .proto.

qt_add_protobuf(protobuf_sensors
    PROTO_FILES
        sensors.proto
        tlv.proto
)

El primer archivo describe el mensaje Tipo-Longitud-Valor, que envuelve los datos del sensor:

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

El segundo archivo .proto contiene una descripción de los mensajes del sensor:

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

Los mensajes se serializan utilizando QProtobufSerializer que se instancian en el cliente:

class SensorClient : public QObject
{
    Q_OBJECT
...
private:
    QUdpSocket m_client;
    QProtobufSerializer m_serializer;
};

Y en el emulador:

class SensorEmulator : public QObject
{
    Q_OBJECT
...
    QUdpSocket m_socket;
    QProtobufSerializer m_serializer;
};

Después de pulsar el botón Send en la aplicación emulador, los datos de los campos QLineEdit se convierten de formato cadena al formato específico del campo del mensaje, por ejemplo, doble para los campos del mensaje Coordenadas:

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

A continuación, el mensaje con todos los campos se serializa y se envuelve con el mensaje Tipo-Longitud-Valor:

    Q_ASSERT(serializer != nullptr);
    tlv::TlvMessage msg;
    msg.setType(type);
    msg.setValue(data);
    return msg.serialize(serializer);

El cliente aplica las operaciones inversas a los datagramas recibidos. En primer lugar, el mensaje Type-Length-Value se deserializa a partir de los datos del datagrama:

       const auto datagram = m_client.receiveDatagram(); qt::examples::sensors::tlv::TlvMessage msg; msg.deserialize(&m_serializer, datagram.data()); if (m_serializer.lastError() != QAbstractProtobufSerializer::Error::None) {            qWarning().nospace() << "Unable to deserialize datagram ("
                       << qToUnderlying(m_serializer.lastError())<< ")"<< m_serializer.lastErrorString(); continue; }

A continuación, el mensaje Tipo-Longitud-Valor se deserializa en el mensaje del sensor:

            qt::examples::sensors::Coordinates coord;
            coord.deserialize(&m_serializer, msg.value());
            emit coordinatesUpdated(coord);
            break;

Finalmente, se convierte y se muestra al usuario:

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

Nota: Antes de ejecutar el ejemplo, asegúrese de que su sistema operativo permite el enlace en el puerto UDP 65500 y el envío de los datos a través de UDP.

Proyecto de ejemplo @ code.qt.io

© 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.