QML android 采集手机传感器数据 并通过udp 发送

利用 qt 开发 安卓 app ,采集手机传感器数据 并通过udp 发送

#ifndef UDPLINK_H
#define UDPLINK_H

#include <QObject>
#include <QUdpSocket>
#include <QHostAddress>

class UdpLink : public QObject
{
    Q_OBJECT
public:
    explicit UdpLink(QObject *parent = nullptr);
    void setAddress(QString _ip,quint16 _port);
    void sendData(QByteArray ba);

signals:
private:
    QString ip;
    quint16 port;

    QUdpSocket socket;
};

#endif // UDPLINK_H
#include "udplink.h"

UdpLink::UdpLink(QObject *parent)
    : QObject{parent}
{

}

void UdpLink::setAddress(QString _ip, quint16 _port)
{
    ip=_ip;
    port = _port;
}

void UdpLink::sendData(QByteArray ba)
{
    socket.writeDatagram(ba, QHostAddress(ip), port);
}
#ifndef APP_H
#define APP_H

#include <QObject>
#include <udplink.h>
#include <atomic>

#include <QAccelerometer>
#include <QGyroscope>
#include <QRotationSensor>
#include <QLightSensor>

class App : public QObject
{
    Q_OBJECT
    Q_PROPERTY(bool isRuning READ getIsRuning WRITE setIsRuning NOTIFY isRuningChanged)
public:
    explicit App(QObject *parent = nullptr);

    Q_INVOKABLE void start(QString ip);
    Q_INVOKABLE void stop();


    bool getIsRuning() const;
    void setIsRuning(bool newIsRuning);

signals:
    void gyroValue(qreal x,qreal y,qreal z);
    void accelerValue(qreal x,qreal y,qreal z);
    void rotationValue(qreal x,qreal y,qreal z);
    void lightValue(qreal lux);
    void logInfo(QString str);

    void isRuningChanged();

private:
    UdpLink udplink;
    bool isRuning{false};

    //陀螺
    QGyroscope *gyroscope;
    QGyroscopeReading *gyroreader;

    //加速度计
    QAccelerometer *acceler;
    QAccelerometerReading *accelereader;

    //旋转
    QRotationSensor *rotationSensor;
    QRotationReading *rotationReading;

    //光线
    QLightSensor *lightSensor;
    QLightReading *lightReading;
};

#endif // APP_H
#include "app.h"
#include <QtConcurrent>
#include <chrono>
#include <thread>
#include <QJsonDocument>
#include <QJsonArray>
#include <QJsonObject>
#include <QJsonValue>

App::App(QObject *parent)
    : QObject{parent}
{

}

void App::start(QString ip)
{
    udplink.setAddress(ip,8023);

    qDebug()<<"start "<<ip;

    gyroscope = new QGyroscope(this);
    connect(gyroscope, &QGyroscope::readingChanged, this, [&](){
        gyroreader = gyroscope->reading();

        QJsonObject obj_root;
        QJsonArray arr;
        qreal gyroscopex = gyroreader->x();
        qreal gyroscopey = gyroreader->y();
        qreal gyroscopez = gyroreader->z();

        arr.append(QString::number(gyroscopex,'f',2));
        arr.append(QString::number(gyroscopey,'f',2));
        arr.append(QString::number(gyroscopez,'f',2));
        obj_root.insert("QGyroscope",arr);

        QJsonDocument jsonDocu(obj_root);
        QByteArray jsonData = jsonDocu.toJson();
        udplink.sendData(jsonData);

        emit gyroValue(gyroscopex,gyroscopey,gyroscopez);
    });

    acceler = new QAccelerometer(this);
    acceler->setAccelerationMode(QAccelerometer::Combined);
    connect(acceler, &QAccelerometer::readingChanged, this, [&](){
        accelereader = acceler->reading();

        QJsonObject obj_root;
        QJsonArray arr;
        qreal accelerx = accelereader->x();
        qreal accelery = accelereader->y();
        qreal accelerz = accelereader->z();

        arr.append(QString::number(accelerx,'f',2));
        arr.append(QString::number(accelery,'f',2));
        arr.append(QString::number(accelerz,'f',2));
        obj_root.insert("QAccelerometer",arr);

        QJsonDocument jsonDocu(obj_root);
        QByteArray jsonData = jsonDocu.toJson();
        udplink.sendData(jsonData);

        emit accelerValue(accelerx,accelery,accelerz);
    });

    rotationSensor = new QRotationSensor(this);
    connect(rotationSensor, &QRotationSensor::readingChanged, this, [&](){
        rotationReading = rotationSensor->reading();

        QJsonObject obj_root;
        QJsonArray arr;
        qreal rotationx = rotationReading->x();
        qreal rotationy = rotationReading->y();
        qreal rotationz = rotationReading->z();

        arr.append(QString::number(rotationx,'f',2));
        arr.append(QString::number(rotationy,'f',2));
        arr.append(QString::number(rotationz,'f',2));
        obj_root.insert("QRotationSensor",arr);

        QJsonDocument jsonDocu(obj_root);
        QByteArray jsonData = jsonDocu.toJson();
        udplink.sendData(jsonData);

        emit rotationValue(rotationx,rotationy,rotationz);
    });

    lightSensor = new QLightSensor(this);
    connect(lightSensor, &QLightSensor::readingChanged, this, [&](){
        lightReading = lightSensor->reading();

        QJsonObject obj_root;
        QJsonArray arr;
        qreal lux = lightReading->lux();

        arr.append(QString::number(lux,'f',2));
        obj_root.insert("QLightSensor",arr);

        QJsonDocument jsonDocu(obj_root);
        QByteArray jsonData = jsonDocu.toJson();
        udplink.sendData(jsonData);

        emit lightValue(lux);
    });

    if(gyroscope->start()&&acceler->start()&&rotationSensor->start()&&lightSensor->start()){
        setIsRuning(true);
        emit logInfo(QString::fromUtf8("启动成功"));
    }else{
        setIsRuning(false);
        emit logInfo(QString::fromUtf8("启动失败"));
    }
}

void App::stop()
{
    gyroscope->stop();
    acceler->stop();
    rotationSensor->stop();
    lightSensor->stop();
    setIsRuning(false);
}

bool App::getIsRuning() const
{
    return isRuning;
}

void App::setIsRuning(bool newIsRuning)
{
    if (isRuning == newIsRuning)
        return;
    isRuning = newIsRuning;
    emit isRuningChanged();
}


import QtQuick 2.15
import QtQuick.Window 2.15
import QtQuick.Controls 2.15
import QtQuick.Layouts 1.15
import App 1.0

Window {
    id:root
    width: 640
    height: 480
    visible: true
    title: qsTr("数据采集")

    App{
        id:app
        onGyroValue: {
            var str = '陀螺仪:'+x.toFixed(2)+' '+y.toFixed(2)+' '+z.toFixed(2)
            gyroLabel.text = str
        }
        onAccelerValue: {
            var str = '加速度计:'+x.toFixed(2)+' '+y.toFixed(2)+' '+z.toFixed(2)
            accelerLabel.text = str
        }

        onRotationValue: {
            var str = '旋转:'+x.toFixed(2)+' '+y.toFixed(2)+' '+z.toFixed(2)
            rotationLabel.text = str
        }

        onLightValue: {
            var str = '光线:'+lux.toFixed(2)
            lightLabel.text=str
        }
        onLogInfo: {
            debugInof.text=str
        }
    }
    RowLayout{
        id:topBar
        anchors.margins: 5
        anchors.top: parent.top
        anchors.left: parent.left
        spacing: 5

        Rectangle{
            id:address
            Layout.alignment: Qt.AlignHCenter
            height: linkBtn.height
            width: 200
            border.color: "black"
            border.width: 1
            TextInput{
                id:ip
                anchors.fill: parent
                verticalAlignment:Text.AlignVCenter
                horizontalAlignment:Text.AlignHCenter
                text: "192.168.1"
            }
        }

        Button{
            id:linkBtn
            Layout.alignment: Qt.AlignHCenter
            text: !app.isRuning?"启动":"停止"
            onClicked: {
                if(!app.isRuning){
                    app.start(ip.text)
                }else{
                    app.stop()
                }
            }
        }

    }

    ColumnLayout{
        anchors.left:parent.left
        anchors.right:parent.right
        anchors.top:topBar.bottom
        anchors.bottom:parent.bottom
        anchors.margins: 5
        Label{
            id:gyroLabel
            width: 200
            height: 50
            text: "陀螺仪"
        }
        Label{
            id:accelerLabel
             width: 200
             height: 50
             text: "加速度计"
        }
        Label{
            id:rotationLabel
             width: 200
             height: 50
             text: "旋转"
        }
        Label{
            id:lightLabel
             width: 200
             height: 50
             text:"光线"
        }
        TextEdit{
            id:debugInof
            height: 50
        }
    }

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
qml是一种用于构建用户界面的声明性语言,在后端将数据发送qml前端可以通过以下步骤完成: 1. 定义后端数据对象:在qml中,可以通过定义一个后端数据对象来存储后端发送给前端的数据。可以通过使用JavaScript或C++来创建该对象,并将需要发送数据保存在对象的属性中。 2. 设置数据绑定:在qml中,可以使用数据绑定机制将后端数据对象中的属性和qml前端界面中的元素相绑定。通过这种方式,当后端数据对象的属性值发生变化时,对应的qml界面元素也会自动更新。 3. 发送数据qml前端:一旦数据在后端准备好并存储在后端数据对象中,可以通过调用qml前端的接口函数,将后端数据对象传递给qml前端。这样,qml前端就可以访问和展示后端发送数据了。 4. 处理数据更新:当后端数据对象的属性值发生变化时,qml前端通过与后端绑定的数据绑定机制会自动获得最新的数据。根据业务需求,qml前端可以根据接收到的后端数据进行特定的操作,例如显示数据、更新界面等。 需要注意的是,在进行数据传输时,可以使用前端和后端之间的信号与槽机制来进行数据的传递和处理。这样,当后端数据发生变化时,可以发出信号,qml前端可以接收到该信号并相应地更新界面。同时,qml前端也可以向后端发送信号,传递用户行为等信息。 总之,使用qml后端发送数据给前端的过程主要涉及定义后端数据对象、设置数据绑定、发送数据qml前端和处理数据更新等步骤。通过良好的设计和交互,可以实现后端与qml前端之间的数据交互和界面展示。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

土拨鼠不是老鼠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值