工作中关于QT在Windows下QProcess类的与adb使用总结《记录经验》

来源:互联网 发布:九度网络 编辑:程序博客网 时间:2024/06/05 04:24

    新的项目来了,意味着我离驱动工程师越走越远,好想哭!新项目我主要负责写上位机代码。然而为了开发速度上位机代码都快精简没了抓狂,本次项目使用安卓系统。为了与pc交互,老大给了方案使用adb 实现交互,期初也不是很懂,后来研究了下简单说下(以我目前的水平估计说不明白,以后明白了再补充吧。)android系统底层运行着一个服务(adbd),用于管理在PC端的adb的连接方式,这个服务在启动时会根据手机的配置监听USB连接或网络连接其中之一。我们用了这2种方式,一种在同一网络下使用网络连接,一种是USB连接,其实我最费解的就是,说是用USB连接,实际通信协议是网络(TCP/IP协议)其实还是网络连接,但是得连接USB线。(很费解)  项目在安卓机里做了动态WEB服务器。通过adb连接,访问WEB服务器(PAW server)做数据访问。我就是写个将ADB所有的人为操作隐藏起来,说白了就是为了客户体验提高点。

主要使用命令:

adb devices //获得连接到PC的设备。
adb forward tcp:6100 tcp:7100 
// PC上所有6100端口通信数据将被重定向到手机端7100端口server上。

然后通过 http://127.0.0.1:7100  访问WEB服务器

好吧下面开始正题苦恼我一天的东西 ,QT如何截获adb命令的返回值。

2点做好足以截获。

1.正确的路径。(windows和linux有差别)

说起来简单就是这个正确的路径就费了我好多时间。首先Windows系统下,adb安装(一个.exe可执行程序和2的.dll动态库),如果不使用环境变量的方式,就是复制到指定的目录下,这个目录其实有有2个,一个是32位系统的C:\Windows\System32 ,一个是64为系统的C:\Windows\SysWOW64

(补充项目结束 最后直接在软件当前的根目录下运行ADB 即可,之前想多了!

qprocess 类有个设置运行路径的方法setworkpath)

2.正确的读取方法。

QProcess类提供了很多读取方法,主要说说下面2个(从帮助文档抄的方法)。

QByteArray QProcess::readAllStandardError()Regardless of the current read channel, this function returns all data available from the standard error of the process as a QByteArray.QByteArray QProcess::readAllStandardOutput()Regardless of the current read channel, this function returns all data available from the standard output of the process as a QByteArray.
不难看出一个是标准输出,一个标准错误。

那么就上一个简单的代码功能实现:

    QProcess adbProcess;    QString strCmd ="C:\\Windows\\SysWOW64\\";    strCmd +="adb";    adbProcess.start( strCmd);    if(!adbProcess.waitForFinished(-1))    {      return;    }    else    {        QString output =QString::fromLocal8Bit(adbProcess.readAllStandardOutput());        QStringList OUT = output.split("\n");        qDebug()<<OUT;           }

在DOS命令行下输入: adb

输出如图:


正常理解应该是标准输出对吧,使用

QByteArray QProcess::readAllStandardOutput()

然而错了根本读不到数据这儿就是我卡住的地方,使用继承来得readAll()方法依然什么也读取不到,但是当使用读取标准错误的方法的时候确得到了正确的数据。

QByteArray QProcess::readAllStandardError()


如此猜测adb  中的adb命令的底层输出实现竟然是标准错误。

害的我浪费如此多的时间。才找到问题的所在。


总结:本次是第一次在Windows下做开发,有很多不理解的地方,一个看似简单的界面封装,开发时间却花费3天的时间,记录功能代码的实现,也是增加经验的一种方式,节约开发时间。

4 0
原创粉丝点击