本帖最后由 1061368165@qq.com 于 2017-9-20 21:48 编辑
关于qt、wiringPi 和pca9685的原理可以看我上一个帖子,这里不在赘述:
基于qt+wiringPi pca9685开发系列——简单的qt控制界面
下面分享的是关于qt和qt的远程连接方案。
学过linux编程的同学都知道,tcp socket连接分为这几步:
server:
(1)创建套接字(socket)
(2)将套接字绑定到一个本地地址和端口上(bind)
(3)将套接字设为监听模式,准备接收客户端请求(listen)
(4)等待客户请求到来;当请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept)
(5)用返回的套接字和客户端进行通信(send/recv)
(6)循环或关闭套接字。(close)
client:
(1)创建套接字(socket)
(2)向服务器发出连接请求(connect)
(3)和服务器端进行通信(send/recv)
(4)关闭套接字(close)
对于server:
对于qt在创建,listen初始化的时候同时完成了bind的操作:
tcpServer->listen(QHostAddress::Any,6000);
accept动作也被槽函数、信号代替:
connect(tcpServer,SIGNAL(newConnection()),this,SLOT(sendmsg()));
newConnect()就是有设备接入时产生的信号,这时候调用sendmsg()函数。
在sendmsg()函数里面,我们建立QTcpSocket成员,通过nextPendingConnection读取返回的QTcpSocket。
QTcpSocket *clientConnection=tcpServer->nextPendingConnection();
为保证客户端没有在此期间断开连接,可以设置当断开连接的时候调用的槽函数:
connect(clientConnection, SIGNAL(disconnect()), clientConnem_tcpSocketction, SLOT(deleteLater()));
向客户端传输数据只需要像读写文件那样write就行了,读取可以通过readAll()读取QString变量:
clientConnection->write("block");
QString str=tcpSocket->readAll();
最后断开客户端连接:
(这里我已经无力吐槽,之所以这么久没用更主要是来来去去说我有非法字符,最后用排除法找出这么一段???黑人问号,这句代码怎么了,为什么非法?)
可以调用像上一篇文章那样的iic_pca.h里面的初始化函数和通讯函数:
pca9685_init
pca9685_setmk
对于client:
创建QTcpSocket 对象之后,可以通过connectToHost连接到目标服务器:
tcpSocket->connectToHost("192.168.155.2", 6000);
connect连接:
connect(tcpSocket,SIGNAL(readyRead()),this,SLOT(readmsg()));
读取数据槽函数:
tcpSocket->write(tr(""));
pro文件:
加上下面两句:
QT += network
LIBS += -lwiringPi
QT
+=
network是为了获取操作网络的权限,否则程序是流畅运行,但客户端就是无法连接上。LIBS
+=
-lwiringPi连接到wiringPi库
ps:代码的源文件找不到了,似乎随着上次树莓派的文件系统损坏一块丢失了,以后补上。
本帖最后由 1061368165@qq.com 于 2017-9-20 21:48 编辑
关于qt、wiringPi 和pca9685的原理可以看我上一个帖子,这里不在赘述:
基于qt+wiringPi pca9685开发系列——简单的qt控制界面
下面分享的是关于qt和qt的远程连接方案。
学过linux编程的同学都知道,tcp socket连接分为这几步:
server:
(1)创建套接字(socket)
(2)将套接字绑定到一个本地地址和端口上(bind)
(3)将套接字设为监听模式,准备接收客户端请求(listen)
(4)等待客户请求到来;当请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept)
(5)用返回的套接字和客户端进行通信(send/recv)
(6)循环或关闭套接字。(close)
client:
(1)创建套接字(socket)
(2)向服务器发出连接请求(connect)
(3)和服务器端进行通信(send/recv)
(4)关闭套接字(close)
对于server:
对于qt在创建,listen初始化的时候同时完成了bind的操作:
tcpServer->listen(QHostAddress::Any,6000);
accept动作也被槽函数、信号代替:
connect(tcpServer,SIGNAL(newConnection()),this,SLOT(sendmsg()));
newConnect()就是有设备接入时产生的信号,这时候调用sendmsg()函数。
在sendmsg()函数里面,我们建立QTcpSocket成员,通过nextPendingConnection读取返回的QTcpSocket。
QTcpSocket *clientConnection=tcpServer->nextPendingConnection();
为保证客户端没有在此期间断开连接,可以设置当断开连接的时候调用的槽函数:
connect(clientConnection, SIGNAL(disconnect()), clientConnem_tcpSocketction, SLOT(deleteLater()));
向客户端传输数据只需要像读写文件那样write就行了,读取可以通过readAll()读取QString变量:
clientConnection->write("block");
QString str=tcpSocket->readAll();
最后断开客户端连接:
(这里我已经无力吐槽,之所以这么久没用更主要是来来去去说我有非法字符,最后用排除法找出这么一段???黑人问号,这句代码怎么了,为什么非法?)
可以调用像上一篇文章那样的iic_pca.h里面的初始化函数和通讯函数:
pca9685_init
pca9685_setmk
对于client:
创建QTcpSocket 对象之后,可以通过connectToHost连接到目标服务器:
tcpSocket->connectToHost("192.168.155.2", 6000);
connect连接:
connect(tcpSocket,SIGNAL(readyRead()),this,SLOT(readmsg()));
读取数据槽函数:
tcpSocket->write(tr(""));
pro文件:
加上下面两句:
QT += network
LIBS += -lwiringPi
QT
+=
network是为了获取操作网络的权限,否则程序是流畅运行,但客户端就是无法连接上。LIBS
+=
-lwiringPi连接到wiringPi库
ps:代码的源文件找不到了,似乎随着上次树莓派的文件系统损坏一块丢失了,以后补上。