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

news2025/1/9 16:53:55

利用 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
        }
    }

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1002917.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Win10无法访问你可能没有权限使用网络资源怎么解决

当我们使用Win10电脑打开文件时&#xff0c;弹出提示无法访问你可能没有权限使用网络资源&#xff0c;这是怎么回事&#xff0c;遇到这种问题应该怎么解决呢&#xff0c;下面小编就给大家详细介绍一下Win10无法访问你可能没有权限使用网络资源的解决方法&#xff0c;有需要的小…

使用亚马逊云科技人工智能内容审核服务,打造安全的图像生成和扩散模型

生成式人工智能技术发展日新月异&#xff0c;现在已经能够根据文本输入生成文本和图像。Stable Diffusion 是一种文本转图像模型&#xff0c;可让您创建栩栩如生的图像应用。您可以通过 Amazon SageMaker JumpStart&#xff0c;使用 Stable Diffusion 模型轻松地从文本生成图像…

继续聊聊API接口

什么是API接口 API接口(Application Programming Interface Interface)是应用程序与开发人员或其他程序互相通信的方式。它允许开发者访问应用程序的数据和功能。 API接口,软件的“握手”与“交流”之道,软件世界的“好基友”。想让软件聊得来?想开发App却无从下手?API来相救…

一文讲清楚:SaaS系统是什么?优势在哪?盘点国内行业龙头SaaS系统!

SaaS系统究竟是什么&#xff1f;应该如何了解SaaS系统&#xff1f;在SaaS系统飞速发展的2023年&#xff0c;国内涌现出了一大批优秀的SaaS系统公司&#xff0c;都有哪些企业位列其中呢&#xff1f;SaaS系统有着什么样独特的竞争力&#xff0c;能够不断发展&#xff0c;成为目前…

无涯教程-JavaScript - NPER函数

描述 NPER函数基于定期,固定付款和固定利率返回投资的期数。 语法 NPER (rate,pmt,pv,[fv],[type])争论 Argument描述Required/OptionalRateThe interest rate per period.RequiredPmt 在每个期间付款。 在年金的使用期限内,它不能改变。 通常,pmt包含本金和利息,但不包含其…

快递物流博览会开幕,多家快递企业黑科技齐聚亮相

快递物流供应链|分拣系统|AGV机器人|新能源物流车|绿色包装|自动识别|冷链物流 2024年4月12-14日 | 杭州国际博览中心 同期展会&#xff1a;2024中国数字物流技术与应用展 2024国际电商物流包装产业展 2024新能源商用车、物流车展 指导单位&#xff1a;浙江省邮政管理局 中…

c++ 学习之类型,常量以及变量的重点知识

const 和 volatile 组合考点 const int ( * ) 等价于 int const ( * ) const int x 1 ; 说明 x 是常量&#xff0c;无法修改 如何区分指针常量和常量指针 指针常量 为 先有指针后有常量 故为 形式如 &#xff1a; int * const p & x ; 且const 修饰的是 p &#xff0c…

Falcon 180B 目前最强大的开源模型

Technology Innovation Institute最近发布了Falcon 180B大型语言模型(LLM)&#xff0c;它击败了Llama-2 70b&#xff0c;与谷歌Bard的基础模型PaLM-2 Large不相上下。 180B是是Falcon 40B模型一个最新版本。以下是该模型的快速概述: 180B参数模型&#xff0c;两个版本(base和…

基于Python+Django实现一个电商购物网站系统

随着互联网的高速发展&#xff0c;电子商务行业也正迎来了其黄金时代。如何搭建一个功能完备、体验良好的电商网站成了许多开发者的关心话题。今天&#xff0c;我将带大家使用Python语言和Django框架&#xff0c;快速打造一个电商购物系统。如果你有一定的Python基础&#xff0…

java Math类中的random方法和Random类中方法的区别

文章目录 Math类中的random()方法Random类 Math类中的random()方法 Math类中的random()方法没有参数&#xff0c;它会默认返回等于0.0、小于1.0的double类型随机数。对double()方法返回的数字稍加处理&#xff0c;即可实现任意范围随机数的功能 public class MathTest {publi…

小白备战大厂算法笔试(六)——堆

文章目录 堆常用操作堆的实现存储与表示访问堆顶元素元素入堆元素出堆 常见应用建堆操作自上而下构建自下而上构建 TOP-K问题遍历选择排序堆 堆 堆是一种满足特定条件的完全二叉树&#xff0c;主要可分为下图所示的两种类型。 大顶堆&#xff1a;任意节点的值 ≥ 其子节点的值…

什么牌子的led台灯质量好?Led台灯品牌质量排行榜

台灯如何选择&#xff0c;随着人们生活水平的提高及科技的不断进步&#xff0c;台灯的品质也得到了极大的提高&#xff0c;在生活中很多时候都需要使用台灯&#xff0c;但是市面上的台灯那么多&#xff0c;台灯如何选择。推荐五款质量高的护眼台灯。 一、书客护眼台灯L1 书客…

Spring学习笔记——4

Spring学习笔记——4 一、基于AOP的声明式事务控制1.1、Spring事务编程概述1.2、搭建测试环境1.3、基于XML声明式事务控制1.4、基于注解声明式事务控制 二、Spring整合web环境2.1、JavaWeb三大组件作用及其特点2.2、Spring整合web环境的思路及实现2.3、Spring的Web开发组件spri…

基础术语和模式的学习记录

1 范围 本文件界定了政府和社会资本合作(PPP) 的基础术语&#xff0c;给出了政府和社会资本合作(PPP) 的 模 式 分类和代码。 本文件适用于政府和社会资本合作(PPP) 的所有活动。 2 规范性引用文件 本文件没有规范性引用文件。 3 基础术语 3.1 PPP 主体 3.1.1 政府和社…

Tensorflow 01(介绍)

一、Tensorflow 深度学习框架TensorFlow一经发布&#xff0c;就受到了广泛的关注&#xff0c;并在计算机视觉、音频处理、推荐系统和自然语言处理等场景下都被大面积推广使用&#xff0c;现在已发布2.3.0版本&#xff0c;接下来我们深入浅出的介绍Tensorflow的相关应用。 Tens…

Redis模块一:缓存简介

目录 缓存的定义 应用 生活案例 程序中的缓存 缓存优点 缓存的定义 缓存是⼀个高速数据交换的存储器&#xff0c;使用它可以快速的访问和操作数据。 应用 1.CPU缓存&#xff1a;CPU缓存是位于CPU和内存之间的临时存储器&#xff0c;它的容量通常远小于内存&#xff0…

Minio入门系列【1】Windows/Linux/K8S单机部署Minio

1 Minio简介 MinIO 是一个基于Apache License v2.0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口&#xff0c;非常适合于存储大容量非结构化的数据&#xff0c;例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等&#xff0c;而一个对象文件可以是任意大小&…

配置服务器实现无缝连接

在进行网络爬虫时&#xff0c;经常会面临目标网站的IP封锁、反爬虫策略等问题。为了解决这些问题&#xff0c;配置代理服务器是一种常见的方法。本文将向您介绍如何配置代理服务器与爬虫实现无缝连接&#xff0c;助您顺利进行数据采集。 一、了解代理服务器的作用 代理服务器…

数字经济时代,企业的核心竞争力究竟是什么?

数字经济时代&#xff0c;企业的核心竞争力是由技术、数据、创新等因素综合驱动的。主要包含以下部分&#xff1a; 1.数字化转型&#xff1a;企业成功进行数字化转型的能力至关重要。这涉及将数字技术集成到业务的所有领域&#xff0c;从根本上改变其运营方式以及为客户提供价…

买彩票能中大奖?用Java盘点常见的概率悖论 | 京东云技术团队

引言 《双色球头奖概率与被雷劈中的概率哪个高&#xff1f;》 《3人轮流射击&#xff0c;枪法最差的反而更容易活下来&#xff1f;》 让我们用Java来探索ta们&#xff01; 悖论1&#xff1a;著名的三门问题 规则描述&#xff1a;你正在参加一个游戏节目&#xff0c;你被要…