概述
一、简介
现在有一个需求,不能联网的机器端想要与pc端的qt程序通信,所以在中间添加了一块转接板。
工作模式:机器端串口通信转接板,转接板wifi通信pc端(内网模式下)
那么在你出厂的时候,转接板肯定是不知道你工作环境的wifi账号和密码的,此时你可以:
1、机器端设置wifi的账号和密码以及pc的ip,不做介绍
2、转接板和pc端通过网线直连,pc端设置静态ip(与转接板出厂默认的处于同一网关),此时可以通过socket通信
pc端设置静态ip和恢复动态ip的链接点击此处
二、确定通信建立
2.1、转接板端:开机默认状态:
2.2、pc端:设置的静态ip,有线连接选择 以太网
2.3、查看是否设置成功
2.4、测试,pc端ping转接端ip pc端使用ping 192.168.1.136
2.5、此时在无网络情况下,通过网线直接pc端和转接板端已经可以ping通,接下来就是简单的客户端和服务端通信即可
三、代码实现
3.1、转接板端:用的是部分代码,主要是思路
/* 新建了一个线程专门等待有线接口 */
factoryConfig::factoryConfig(QObject *parent):QThread(parent)
{
/* fix host ip */
hostAddress = "192.168.1.135";
tcpSocket = NULL;
}
void factoryConfig::run()
{
QFile f("/sys/class/net/eth0/carrier");
while(1){
if(f.open(QIODevice::ReadOnly|QIODevice::Text)){
QByteArray ba = f.read(1);
/* wired connect success!!! */
if(!ba.isEmpty() && ba.toInt()){
if(tcpSocket == NULL){
tcpSocket = new QTcpSocket;
}
tcpSocket->connectToHost(hostAddress,8888);
sleep(3);
}
f.close();
}
tcpSocket->disconnectFromHost();
delete tcpSocket;
tcpSocket = NULL;
}
}
3.2、运行之前链接中所说的pc端设置静态ip和恢复动态ip软件,观看打印数据即可
3.3、剩下的就只是写和读了
4、UDP实现
/* 写的伪代码 */
QString msg = "helloworld";
udpSocket->writeDatagram(msg.toLatin1(),msg.length(),QHostAddress::Broadcast,port);
/* 读的伪代码 */
while(udpSocket->hasPendingDatagrams())
{
QByteArray datagram;
datagram.resize(udpSocket->pendingDatagramSize());
udpSocket->readDatagram(datagram.data(),datagram.size());
QString msg=datagram.data();
}
4.1、问题记录Unable to send a message
开发环境是电脑的Qt编程,linux下的arm板Qt编程
我发现,在我电脑端采用广播发送的时候,发送成功了,但是在arm板接收到信息回发时,一直发送失败,最后我也没找到原因
解决方案:只是在接收信息时,获取了发送的ip地址,然后回发的地址改成了确定ip,才通讯成功,
但是为什么电脑端的广播发送可以成功,arm板的广播发送失败,这个问题一直没有想明白
懂了懂了懂了
有线连接
需要的广播地址是有线网卡的广播地址,不然就会通讯失败,测试代码如下,
QList<QNetworkInterface> networkinterfaces = QNetworkInterface::allInterfaces();
foreach (QNetworkInterface interfaces, networkinterfaces) {
foreach (QNetworkAddressEntry entry, interfaces.addressEntries()){
QHostAddress broadcastAddress = entry.broadcast();
if (broadcastAddress != QHostAddress::Null
&& entry.ip() != QHostAddress::LocalHost
&& entry.ip().protocol() == QAbstractSocket::IPv4Protocol){
QJsonObject jsonObjectip,jsonObject;
jsonObjectip.insert("IP", (entry.ip()).toString());
jsonObject.insert("content", jsonObjectip);
jsonObject.insert("Title","notify_door_gateway");
QJsonDocument jsonDocument;
jsonDocument.setObject(jsonObject);
QByteArray dataArray = jsonDocument.toJson();
udpSocket->writeDatagram(dataArray,broadcastAddress, send_port);
}
}
}
追加:后面发现,在一开始对方默认ip不在同一网段的情况下连接不上,前面发现好使只是因为我之前在收到信息时,将ip改为同一网段回复后未清空配置而已
无线连接
需要处于同一网段,不然还是会通信失败
arm板和电脑端的udp有线通信
需要在接收到信息后,获取发送者的ip和端口,然后将本身ip设置为同网段下的ip,不然就会出现回发失败,代码如下
udpSocket->readDatagram(datagram.data(),datagram.size(),&host,&port);
最后
以上就是结实跳跳糖为你收集整理的Qt之开发板和电脑通过网线通信4、UDP实现的全部内容,希望文章能够帮你解决Qt之开发板和电脑通过网线通信4、UDP实现所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复