当前位置: 首页 > news >正文

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_OBJECTQ_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.0Window {id:rootwidth: 640height: 480visible: truetitle: qsTr("数据采集")App{id:apponGyroValue: {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:topBaranchors.margins: 5anchors.top: parent.topanchors.left: parent.leftspacing: 5Rectangle{id:addressLayout.alignment: Qt.AlignHCenterheight: linkBtn.heightwidth: 200border.color: "black"border.width: 1TextInput{id:ipanchors.fill: parentverticalAlignment:Text.AlignVCenterhorizontalAlignment:Text.AlignHCentertext: "192.168.1"}}Button{id:linkBtnLayout.alignment: Qt.AlignHCentertext: !app.isRuning?"启动":"停止"onClicked: {if(!app.isRuning){app.start(ip.text)}else{app.stop()}}}}ColumnLayout{anchors.left:parent.leftanchors.right:parent.rightanchors.top:topBar.bottomanchors.bottom:parent.bottomanchors.margins: 5Label{id:gyroLabelwidth: 200height: 50text: "陀螺仪"}Label{id:accelerLabelwidth: 200height: 50text: "加速度计"}Label{id:rotationLabelwidth: 200height: 50text: "旋转"}Label{id:lightLabelwidth: 200height: 50text:"光线"}TextEdit{id:debugInofheight: 50}}}

相关文章:

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

利用 qt 开发 安卓 app &#xff0c;采集手机传感器数据 并通过udp 发送 #ifndef UDPLINK_H #define UDPLINK_H#include <QObject> #include <QUdpSocket> #include <QHostAddress>class UdpLink : public QObject {Q_OBJECT public:explicit UdpLink(QObjec…...

stableDiffusion安装

下载git 下载python-3.10.6版本 clone git至本地 使用git clone命令 git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui 更换pip源为为百度镜像 pip config --global set global.index-url https://mirror.baidu.com/pypi/simple 最后的镜像源链接 阿里云 h…...

QT基础教程(QPushButton及信号与槽)

文章目录 前言一、信号与槽二、QPushButton总结 前言 本篇文章来带大家学习QPushbutton和信号与槽&#xff0c;其中信号与槽是QT中的核心也是比较重要的一个知识点。 资料合集地微信公众号&#xff1a;优质程序猿一、信号与槽 信号与槽&#xff08;Signals and Slots&#x…...

Android 实战项目分享(一)用Android Studio绘制贝塞尔曲线的艺术之旅

一、项目概述 欢迎来到创意之源&#xff01;我们精心打造的绘图应用程序将带你进入一个充满艺术和技术的奇妙世界。通过使用Android Studio&#xff0c;我们实现了绘制贝塞尔曲线的功能&#xff0c;让你能够轻松创作出令人惊叹的艺术作品。不论你是热爱绘画的大学生还是渴望学习…...

Windows系统关机后自动重启的解决方法

打开控制面板&#xff0c;找到【电源选项】&#xff1b; 方式一&#xff0c;打开Windows终端&#xff08;管理员&#xff09;&#xff0c;输入“powercfg /h on”然后回车&#xff1b; 方式二&#xff0c;键盘按下开始键&#xff0c;搜索“控制面板”然后打开&#xff1b; 点击…...

微服务如何改变软件开发:实战经验与最佳实践分享

文章目录 什么是微服务&#xff1f;微服务实战经验1. 定义明确的服务边界2. 使用API网关3. 自动化部署和持续集成4. 监控和日志记录 微服务最佳实践1. 文档和通信2. 弹性设计3. 安全性4. 版本控制5. 监控和警报 微服务的未来 &#x1f389;欢迎来到架构设计专栏~微服务如何改变…...

安装深度(Deepin)系统

Deepin系统安装 Deepin是和Ubuntu一样&#xff0c;是一个基于Debian的Linux的发型版本。 Deepin相对于Ubuntu&#xff0c;Deepin更适合中国用户的使用习惯。 一 官网工具制作启动盘 制作启动盘、和安装系统&#xff0c;操作非常简单&#xff0c;nice&#xff01; 官网提供了…...

Leetcode: 645.错误的集合 题解【超详细】

题目 集合 s 包含从 1 到 n 的整数。不幸的是&#xff0c;因为数据错误&#xff0c;导致集合里面某一个数字复制了成了集合里面的另外一个数字的值&#xff0c;导致集合 丢失了一个数字 并且 有一个数字重复 。 给定一个数组 nums 代表了集合 S 发生错误后的结果。 请你找出重复…...

闲鱼自动化软件——筛选/发送系统 V22已经测试完毕

更新 因为闲鱼版本更新&#xff0c;以及闲鱼整个程序维护记录&#xff0c;又增加了一些优化和提升的代码&#xff0c;所以又一次在整体上更新了一版闲鱼的此款软件。 主要更新点&#xff1a; 1、添加显示自定义按钮&#xff0c;可以自动显示最新数据&#xff0c;也可以手动翻…...

数学建模__动态规划

动态规划就是&#xff0c;将任务每一步均记录下来&#xff0c;以便将来重复使用时能够直接调用 问题描述&#xff1a;给定n个物品&#xff0c;每个物品的重量是Wi,价值是Vi&#xff0c;但是背包最多能装下capacity重量的物品&#xff0c;问我们如何选择才能利益最大化。 这里涉…...

【IoT】生产制造:锅仔片上机做 SMT 加工吗?

目录 简介 锅仔片 简介 由于最近做产品用到了锅仔按键&#xff0c;由于单品用量过多&#xff0c;但是成品锅仔按键价格又太高&#xff0c;不适合量产。 这个时候就想到了锅仔片&#xff0c;问题又来了&#xff0c;锅仔片是否可以上机呢&#xff1f; 答案是肯定的。 锅仔片…...

Stable Diffusion代码简介

Stable Diffusion是一个开源的实时数据流处理引擎&#xff0c;用于处理流式数据。其web UI提供了一个可视化界面来展示数据流的处理过程。 以下是Stable Diffusion web UI的详细代码说明&#xff1a; 1. 界面设计 Stable Diffusion web UI使用React框架进行开发&#xff0c;…...

操作系统的运行机制

1.程序的运行原理&#xff1a; 1.CPU执行指令的过程 C语言代码在编译器上“翻译”&#xff0c;得到二进制的机器指令。一条高级语言的代码翻译过来可能会对应多条机器指令。对于CPU来说&#xff0c;机器指令才是"能看得懂"的语言。程序运行的过程其实就是CPU执行一…...

分布式事务解决方案之2PC

分布式事务解决方案之2PC 前面已经学习了分布式事务的基础理论&#xff0c;以理论为基础&#xff0c;针对不同的分布式场景业界常见的解决方案有2PC、 TCC、可靠消息最终一致性、最大努力通知这几种。 什么是2PC 2PC即两阶段提交协议&#xff0c;是将整个事务流程分为两个阶段…...

发现某设备 adb shell ps 没有输出完整信息

某错误示例 并不是都使用 -ef 参数查找都能够返回完整信息&#xff0c;某些版本设备不适用 -ef 也不会返回完整信息。 简单兼容 简单兼容不同版本 Android 设备查找进程列表&#xff0c;没有通过脚本判断 Android 版本&#xff0c;如有兴趣可以自己修改。 :loop adb shell…...

qt模拟鼠标事件

模拟鼠标事件 1、模拟鼠标按下事件2、模拟鼠标松开事件3、模拟鼠标点击事件4、模拟鼠标移动事件 1、模拟鼠标按下事件 QPoint p this->rect().center();QMouseEvent *pressEvent new QMouseEvent(QEvent::MouseButtonPress,p,Qt::LeftButton,Qt::LeftButton,Qt::NoModifie…...

Linux运维基础知识大全

一. Linux组成 1. 内核 内核&#xff1a;系统空间的代码和数据的集合称为内核&#xff08;Kernel&#xff09;&#xff1b;kernel是操作系统内部最核心的软件&#xff0c;和硬件打交道的 1.对cpu进行管理&#xff0c;进程调度到cpu里进行管理 2.对内存进行空间的分配&#xff0…...

西门子S7-1200F或1500F系列安全PLC的组态步骤和基础编程(一)

西门子S7-1200F或1500F系列安全PLC的组态步骤和基础编程(一) 第一部分:组态配置 具体步骤可参考以下内容: 如下图所示,新建一个项目后,添加一个安全型PLC,这里以1516F-3 PN/DP为例进行说明, 如下图所示,添加CPU完成后,可以看到左侧的项目树中比普通的PLC多了几个选项…...

负载均衡-ribbon源码解析

负载均衡-ribbon源码解析 1 LoadBalanced注解 /*** 基于ribbon调用服务及负载均衡* return*/ LoadBalanced Bean public RestTemplate restTemplate(){return new RestTemplate(); }Bean ConditionalOnMissingBean public RestTemplateCustomizer restTemplateCustomizer(fin…...

SideBar 侧边导航与内容区域交互重写【Ant Design Mobile】

需求&#xff1a;SideBar 侧边导航与内容区域交互 点击侧边栏某一项时&#xff0c;相对应内容区域滚动到视口顶部滚动视口区域&#xff0c;到某一项内容区域&#xff0c;侧边栏选中状态也会跟着变化 const SideBarAgain: React.FC<PopupProps> (props) > {// 父组件…...

被裁员后,我用这个 AI 助手每天只工作 2 小时|OpenClaw 实战

&#x1f62d; 被裁员后&#xff0c;我用这个 AI 助手每天只工作 2 小时“真正的自由&#xff0c;不是想做什么就做什么&#xff0c;而是不想做什么就可以不做什么”01 一个普通打工人的至暗时刻 上个月&#xff0c;公司裁员 30%。 我所在的部门&#xff0c;5 个人走了 3 个。 …...

BlueDot BME280库深度解析:嵌入式多传感器驱动实践

1. BlueDot BME280 库技术解析&#xff1a;面向嵌入式工程师的多传感器驱动实践指南BME280 是博世&#xff08;Bosch&#xff09;推出的高精度环境传感器&#xff0c;集成温度、相对湿度与气压三参数测量能力&#xff0c;广泛应用于气象站、IoT终端、无人机姿态补偿及室内环境监…...

数据可视化避坑指南:当产品经理要你做Echarts版丝带图时,这3个技术难点要注意

Echarts丝带图实战&#xff1a;破解企业级数据可视化的三个高阶难题 当医药企业的销售总监盯着大屏上跳动的数字&#xff0c;突然提出"能不能做成Power BI那种丝带图效果"时&#xff0c;开发团队的沉默往往不是因为技术难度&#xff0c;而是对未知领域的本能警惕。这…...

Mod5实战:从零构建大气辐射传输模拟与辐照度计算全流程

1. 从零开始&#xff1a;为什么需要大气辐射传输模拟&#xff1f; 第一次接触大气辐射传输模拟的朋友可能会问&#xff1a;这玩意儿到底有什么用&#xff1f;简单来说&#xff0c;就像给地球大气层做CT扫描。我在做光伏电站选址评估时&#xff0c;就深刻体会到它的价值——通过…...

OpenClaw 网关重启全攻略:实用指令与故障排除指南

手把手教你一键部署OpenClaw&#xff0c;连接微信、QQ、飞书、钉钉等&#xff0c;1分钟全搞定&#xff01; 一、几种最省事的重启法子&#xff08;快速上手&#xff09; 手把手教你一键部署OpenClaw&#xff0c;连接微信、QQ、飞书、钉钉等&#xff0c;1分钟全搞定&#xff0…...

U盘频繁提示“驱动器存在问题”?三步教你彻底修复并避免数据丢失

1. 为什么U盘会频繁提示“驱动器存在问题”&#xff1f; 每次插入U盘都弹出那个烦人的提示框&#xff0c;就像有个唠叨的管家在耳边不停提醒"您的U盘有问题啦&#xff01;"。这种情况我遇到过太多次了&#xff0c;特别是在使用时间较久的U盘上。其实这个提示背后隐藏…...

三、从零解析Franka ROS2控制器:以关节位置控制为例

1. Franka机械臂与ROS2控制器基础 如果你刚接触机器人控制&#xff0c;Franka机械臂搭配ROS2绝对是个不错的起点。Franka Emika机械臂以其高精度和易用性著称&#xff0c;而ROS2作为机器人操作系统的最新版本&#xff0c;提供了更强大的实时性和分布式能力。我第一次用Franka做…...

为什么Stable Diffusion选择VQ-GAN?深入解析LDM背后的图像压缩技术

为什么Stable Diffusion选择VQ-GAN&#xff1f;深入解析LDM背后的图像压缩技术 在生成式AI领域&#xff0c;Stable Diffusion凭借其出色的图像生成质量和开源特性迅速成为行业标杆。但很少有人注意到&#xff0c;这个强大模型的核心竞争力之一&#xff0c;其实隐藏在它的第一阶…...

【AI黑话日日新】什么是大语言模型驱动的代码生成技术?

摘要 生成式人工智能的快速普及,重塑了传统软件开发的全链路流程。大语言模型(LLM)凭借海量语料预训练与深度语义理解能力,成为智能代码生成的核心底座。这项技术打通了自然语言与编程语言的语义壁垒,能够实现代码续写、需求转源码、自动化测试、系统重构等多元化能力,帮…...

Redmine API实战指南:从数据同步到工作流自动化

Redmine API实战指南&#xff1a;从数据同步到工作流自动化 【免费下载链接】redmine Mirror of redmine code source - Official Subversion repository is at https://svn.redmine.org/redmine - contact: vividtone or maeda (at) farend (dot) jp 项目地址: https://gitc…...