• 5752阅读
  • 7回复

求助:数据通过3G能同步上传,但通过wifi却不行 [复制链接]

上一主题 下一主题
离线linchang123
 

只看楼主 正序阅读 楼主  发表于: 2014-02-20
window.open('http://www.qtcn.org/bbs/attachment/Mon_1402/18_145258_3786eae11825d0f.jpg?212');" style="max-width:700px;max-height:700px;" onload="if(is_ie6&&this.offsetWidth>700)this.width=700;" >



功能是实现数据的透传,例如将串口输入的数据通过WIFI或者3g上传到服务器202.116.65.245。
    从串口到3G的功能是正常的,但是从串口到wifi就不行,每次都在命令行看到有数据进来,但服务器上却没有数据更新,直到点击“断开连接”,则会看到服务器上面的数据有更新。
所以求各位大神指点迷津,是哪里出了问题
    另外,不管是串口到3G或者是串口到wifi,都存在一个奇怪的现象:
    假如有ABCDEFGHIJKL这么多组数据,我们点击“开始连接”,假设当传进来ABCD的时候我们点击“断开连接”,然后点击“开始连接”,则在命令行可以看到后面进来的数据是这样子:EEFFGG。如果这时候再点击“断开连接”,再“开始连接”,则接下来的数据会是HHHIIIJJJKKKLLL.以此类推,每次断开连接,再重新连接那么进来的数据重复,并且重复次数会递增。


相关的代码如下:

mainwindow.cpp
  1. #include "mainwindow.h"
  2. #include "ui_mainwindow.h"
  3. MainWindow::MainWindow(QWidget *parent) :
  4.     QMainWindow(parent),
  5.     ui(new Ui::MainWindow)
  6. {
  7.     ui->setupUi(this);
  8.     init();// 初始化相关配置
  9.     serialToTcp = new SerialToTcp();
  10.     wifiToTcp = new WiFiToTcp();
  11.     ethernetToTcp = new EthernetToTcp();
  12.     gprsToTcp = new GprsToTcp();
  13. }
  14. //构造函数
  15. MainWindow::~MainWindow()
  16. {
  17.     delete ui;
  18.     delete inputButtonGroup;
  19.     delete outputButtonGroup;
  20. }
  21. // 初始化相关配置
  22. void MainWindow::init() {
  23.     // 将不同通信接口按钮加入到输入输出按钮组中
  24.     inputButtonGroup = new QButtonGroup;
  25.     //下面调用了QButtonGroup的void addButton ( QAbstractButton * button, int id )方法
  26.     inputButtonGroup->addButton(ui->serialInputRadioButton, 1);
  27.     inputButtonGroup->addButton(ui->wifiInputRadioButton, 2);
  28.     inputButtonGroup->addButton(ui->ethernetInputRadioButton, 3);
  29.     inputButtonGroup->addButton(ui->gprsInputRadioButton, 4);
  30.     outputButtonGroup = new QButtonGroup;
  31.     outputButtonGroup->addButton(ui->serialOutputRadioButton, 1);
  32.     outputButtonGroup->addButton(ui->wifiOutputRadioButton, 2);
  33.     outputButtonGroup->addButton(ui->ethernetOutputRadioButton, 3);
  34.     outputButtonGroup->addButton(ui->gprsOutputRadioButton, 4);
  35.     connect( inputButtonGroup, SIGNAL(buttonClicked (int)), this, SLOT(inputButtonJudge(int)) );
  36.     connect( outputButtonGroup, SIGNAL(buttonClicked (int)), this, SLOT(outputButtonJudge(int)) );
  37.     // 限制网络地址和端口格式
  38.     QRegExp portExp("[0-9]{1,5}");
  39.     //[0-9]表示从0到9,{1,5}表示出现1到5次???也就是输入一个数字不超过5位数???
  40.     QRegExpValidator *validator = new QRegExpValidator();
  41.     validator->setRegExp(portExp);
  42.     ui->portInputLineEdit->setValidator(validator);
  43.     ui->portOutputLineEdit->setValidator(validator);
  44.     QRegExp regExp("[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}");
  45.     //意思大概是输入格式为***.***.***.***的ip地址
  46.     QRegExpValidator *ipvalidator = new QRegExpValidator();//ip验证器
  47.     ipvalidator->setRegExp(regExp);
  48.     ui->addressInputLineEdit->setValidator(ipvalidator);
  49.     ui->addressOutputLineEdit->setValidator(ipvalidator);
  50. }
  51. // 程序退出操作
  52. void MainWindow::on_exitButton_clicked()
  53. {
  54.     int ret = QMessageBox::question(this, tr("退出信息"), tr("确定退出该程序?"), QMessageBox::Yes, QMessageBox::No);
  55.     if(ret == QMessageBox::Yes) {
  56.         close();
  57.     }
  58. }
  59. // 使串口输入配置或者网络配置可用
  60. void MainWindow::inputButtonJudge(int buttonId) {
  61.     if(buttonId == 1) {
  62.         ui->serialInputFrame->setEnabled(true);// 设置串口输入配置可用
  63.         ui->downloadFrame->setEnabled(false);// 设置网络配置不可用
  64.     } else {
  65.         ui->serialInputFrame->setEnabled(false);// 设置串口输入配置不可用
  66.         ui->downloadFrame->setEnabled(true);// 设置网络配置可用
  67.     }
  68. }
  69. // 使串口输出配置或者网络配置可用
  70. void MainWindow::outputButtonJudge(int buttonId) {
  71.     if(buttonId == 1) {
  72.         ui->serialOutputFrame->setEnabled(true);// 设置串口输出配置可用
  73.         ui->uploadFrame->setEnabled(false);// 设置网络配置不可用
  74.     } else {
  75.         ui->serialOutputFrame->setEnabled(false);// 设置串口输出配置不可用
  76.         ui->uploadFrame->setEnabled(true);// 设置网络配置可用
  77.     }
  78. }
  79. // 开始连接配置
  80. void MainWindow::on_connectButton_clicked()
  81. {
  82.     if(inputButtonGroup->checkedId() == -1) {
  83.         QMessageBox::information(this, tr("提示信息"), tr("请选择通信接口输入方式!"), QMessageBox::Ok);
  84.         return;
  85.     }
  86.     if(outputButtonGroup->checkedId() == -1) {
  87.         QMessageBox::information(this, tr("提示信息"), tr("请选择通信接口输出方式!"), QMessageBox::Ok);
  88.         return;
  89.     }
  90.     if(inputButtonGroup->checkedId() == outputButtonGroup->checkedId()) {
  91.         QMessageBox::information(this, tr("提示信息"), tr("请选择两种不同通信接口输入输出方式!"), QMessageBox::Ok);
  92.         return;
  93.     }
  94.     //上面调用了int QButtonGroup::checkedId () const方法,没有检查到button则返回-1,检查到button就返回相应的buttonId
  95.     ui->connectButton->setEnabled(false);
  96.     ui->disconnectButton->setEnabled(true);
  97.     ui->mainFrame->setEnabled(false);
  98.     QString server_ip = ui->addressInputLineEdit->text();
  99.     QString client_ip = ui->addressOutputLineEdit->text();
  100.     bool ok;
  101.     int server_port = ui->portInputLineEdit->text().toInt(&ok, 10);
  102.     int client_port = ui->portOutputLineEdit->text().toInt(&ok, 10);
  103.     if(inputButtonGroup->checkedId() == 1) {
  104.         qDebug()<<outputButtonGroup->checkedId();
  105.         serialToTcp->serialToTcp(client_ip,
  106.                                  client_port,
  107.                                  ui->speedInputComboBox->currentIndex(),
  108.                                  ui->databitInputComboBox->currentIndex(),
  109.                                  ui->parityInputcomboBox->currentIndex(),
  110.                                  ui->stopbitInputComboBox->currentIndex(),
  111.                                  outputButtonGroup->checkedId());
  112.     }
  113.     else if(inputButtonGroup->checkedId() == 2){
  114.         if(outputButtonGroup->checkedId() == 1) {
  115.             wifiToTcp->wifiToSerial(server_ip,
  116.                                     server_port,
  117.                                     ui->speedOutputComboBox->currentIndex(),
  118.                                     ui->databitOutputComboBox->currentIndex(),
  119.                                     ui->parityOutputComboBox->currentIndex(),
  120.                                     ui->stopbitOutputComboBox->currentIndex());
  121.         }
  122.         else {
  123.             wifiToTcp->wifiToTcp(server_ip,
  124.                                  server_port,
  125.                                  client_ip,
  126.                                  client_port,
  127.                                  outputButtonGroup->checkedId());
  128.         }
  129.     }
  130.      else if(inputButtonGroup->checkedId() == 3){
  131.          if(outputButtonGroup->checkedId() == 1) {
  132.              ethernetToTcp->ethernetToSerial(server_ip,
  133.                                      server_port,
  134.                                      ui->speedOutputComboBox->currentIndex(),
  135.                                      ui->databitOutputComboBox->currentIndex(),
  136.                                      ui->parityOutputComboBox->currentIndex(),
  137.                                      ui->stopbitOutputComboBox->currentIndex());
  138.          }
  139.         else {
  140.             ethernetToTcp->ethernetToTcp(server_ip, server_port, client_ip, client_port,
  141.                                          outputButtonGroup->checkedId());
  142.         }
  143.         }
  144.      else if(inputButtonGroup->checkedId() == 4){
  145.         if(outputButtonGroup->checkedId() == 1) {
  146.             gprsToTcp->gprsToSerial(server_ip, server_port,
  147.                                     ui->speedOutputComboBox->currentIndex(),
  148.                                     ui->databitOutputComboBox->currentIndex(),
  149.                                     ui->parityOutputComboBox->currentIndex(),
  150.                                     ui->stopbitOutputComboBox->currentIndex());
  151.         } else {
  152.             gprsToTcp->gprsToTcp(server_ip, server_port, client_ip, client_port,
  153.                                  outputButtonGroup->checkedId());
  154.         }
  155.         }
  156. }
  157.      // 关闭连接配置
  158. void MainWindow::on_disconnectButton_clicked()
  159. {
  160.     ui->connectButton->setEnabled(true);
  161.     ui->disconnectButton->setEnabled(false);
  162.     ui->mainFrame->setEnabled(true);
  163.     if(inputButtonGroup->checkedId() == 1) {
  164.         serialToTcp->closeSerialToTcp();
  165.     }
  166.     else if(inputButtonGroup->checkedId() == 2) {
  167.         wifiToTcp->stopTransfer();
  168.     }
  169.     else if(inputButtonGroup->checkedId() == 3){
  170.         ethernetToTcp->stopTransfer();      
  171.     }
  172.     else if(inputButtonGroup->checkedId() == 4){
  173.         gprsToTcp->stopTransfer();
  174.         }
  175. }

serialconfig.cpp
  1. #include "serialconfig.h"
  2. SerialConfig::SerialConfig(QObject *parent) :
  3.     QObject(parent)
  4. {
  5.     timer = new QTimer(this);
  6.     comm = new Posix_QextSerialPort("/dev/ttySAC0", QextSerialBase::Polling);// 打开串口设备
  7.     connect(timer, SIGNAL(timeout()), this, SLOT(readReady()));
  8. }
  9. // 初始化串口配置
  10. void SerialConfig::init(int baud, int databits, int parity, int stopBits)
  11. {
  12.     comm->open(QIODevice::ReadWrite);
  13.     switch(baud) {
  14.     case 0:
  15.         comm->setBaudRate(BAUD115200);
  16.         break;
  17.     case 1:
  18.         comm->setBaudRate(BAUD57600);
  19.         break;
  20.     case 2:
  21.         comm->setBaudRate(BAUD38400);
  22.         break;
  23.     case 3:
  24.         comm->setBaudRate(BAUD19200);
  25.         break;
  26.     case 4:
  27.         comm->setBaudRate(BAUD14400);
  28.         break;
  29.     case 5:
  30.         comm->setBaudRate(BAUD9600);
  31.         break;
  32.     case 6:
  33.         comm->setBaudRate(BAUD4800);
  34.         break;
  35.     }
  36.     switch (parity) {
  37.     case 0:
  38.         comm->setParity(PAR_NONE);
  39.         break;
  40.     case 1:
  41.         comm->setParity(PAR_ODD);
  42.         break;
  43.     case 2:
  44.         comm->setParity(PAR_EVEN);
  45.         break;
  46.     }
  47.     switch (databits) {
  48.     case 0:
  49.         comm->setDataBits(DATA_8);
  50.         break;
  51.     case 1:
  52.         comm->setDataBits(DATA_7);
  53.         break;
  54.     case 2:
  55.         comm->setDataBits(DATA_6);
  56.         break;
  57.     case 3:
  58.         comm->setDataBits(DATA_5);
  59.         break;
  60.     }
  61.     switch (stopBits) {
  62.     case 0:
  63.         comm->setStopBits(STOP_1);
  64.         break;
  65.     case 1:
  66.         comm->setStopBits(STOP_2);
  67.         break;
  68.     }
  69.     comm->setFlowControl(FLOW_XONXOFF);
  70.     comm->setTimeout(10);
  71. }
  72. // 读取串口数据
  73. void SerialConfig::readData(int baud, int databits, int parity, int stopBits)
  74. {
  75.     init(baud, databits, parity, stopBits);
  76.     timer->start(100);
  77. }
  78. // 通过串口发送数据
  79. void SerialConfig::sendData(QByteArray buff)
  80. {
  81.     if(buff.length() > 0) {
  82.         int sendBytes = comm->write(buff, buff.length());
  83.         emit updataSendDataBytes(sendBytes);
  84.     }
  85. }
  86. // 关闭串口
  87. void SerialConfig::closeComm()
  88. {
  89.     timer->stop();
  90.     comm->close();
  91. }
  92. // 当串口接收到数据时,调用该方法
  93. void SerialConfig::readReady()
  94. {
  95.     while(comm->bytesAvailable() > 0) {
  96.         QByteArray receivedData = comm->readAll();
  97.         emit updataReceivedData(receivedData);
  98.     }
  99. }
serialtotcp.cpp
  1. #include "serialtotcp.h"
  2. SerialToTcp::SerialToTcp(QObject *parent) :
  3.     QObject(parent)
  4. {
  5.     serialConfig = new SerialConfig();
  6.     serverAddress = new QHostAddress();
  7.     tcpSocket = new QTcpSocket(this);
  8.     networkManager = new QNetworkAccessManager(this);
  9. }
  10. void SerialToTcp::serialToTcp(QString server_ip, int server_port, int baud, int databits, int parity, int stopbits, int type) {
  11.     this->server_ip = server_ip;
  12.     this->server_port = server_port;
  13.     this->type = type;
  14.     if(type == 3) {
  15.         // 串口到以太网数据传输
  16.         system("route add default dev eth0");// 将以太网接口作为默认网关接口
  17.     } else if(type == 2) {
  18.         // 串口到WiFi数据传输
  19.         system("route add default dev wlan0");// 将wifi接口作为默认网关接口
  20.     } else if(type == 4) {
  21.         // 串口到3G数据传输
  22.         system("route add default dev ppp0");// 将3G接口作为默认网关接口
  23.     }
  24.     connect(serialConfig, SIGNAL(updataReceivedData(QByteArray)), this, SLOT(slotDataFromSerial(QByteArray)));
  25.     serialConfig->readData(baud, databits, parity, stopbits);
  26. }
  27. // 通过串口获取数据后,将数据通过其他接口发送数据
  28. void SerialToTcp::slotDataFromSerial(QByteArray msg)
  29. {
  30.     this->msg = msg;
  31.     qDebug()<<msg;
  32.     if(server_port == 80) {
  33.         QString url = "http://" + server_ip;
  34.         url += "/sysu/zigbeeconnect";
  35.         QNetworkRequest request;
  36.         request.setUrl(url);
  37.         request.setHeader(QNetworkRequest::ContentTypeHeader, "text/html");// 设置请求内容为文本内容
  38.         request.setHeader(QNetworkRequest::ContentLengthHeader, msg.length());
  39.         networkManager->post(request, msg);
  40.     } else {
  41.         // 使用其他端口时使用socket发送数据
  42.         serverAddress->setAddress(server_ip);
  43.         connect(tcpSocket, SIGNAL(connected()), this, SLOT(slotConnectedByServer()));
  44.         tcpSocket->connectToHost(*serverAddress, server_port);
  45.     }
  46. }
  47. // 使用socket发送数据
  48. void SerialToTcp::slotConnectedByServer()
  49. {
  50.     tcpSocket->write(msg);
  51. }
  52. // 关闭相关资源
  53. void SerialToTcp::closeSerialToTcp() {
  54.     serialConfig->closeComm();
  55.     if(type == 2) {
  56.         system("route del default dev wlan0");// 删除默认以太网网关接口
  57.     } else if(type == 3) {
  58.         system("route del default dev eth0");// 删除默认wifi网关接口
  59.     } else if(type == 4) {
  60.         system("route del default dev ppp0");// 删除默认3G网关接口
  61.     }
  62. }


离线linchang123

只看该作者 7楼 发表于: 2014-02-25
回 zhanglyl 的帖子
zhanglyl:添加如下:
connect(networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(networkReply(QNetworkReply*)));
大概像这样:
void SerialToTcp::networkReply(QNetworkReply *reply)
....... (2014-02-21 16:15) 

你好,我添加了你的代码之后,serverResponse返回一个空的QbyteArray。帮助文档里说回一个空的QbyteArray要么是当前没有可读的数据,要么是发生错误
离线linchang123

只看该作者 6楼 发表于: 2014-02-25
回 linchang123 的帖子
linchang123:    
您好,connect(networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(networkReply(QNetworkReply*)));这个函数要放在哪里?构造函数里?貌似我添加了之后报错了。我是把它添加到构造函数里的,如下所示
[图片]
.. (2014-02-24 11:09) 

解决了
离线linchang123

只看该作者 5楼 发表于: 2014-02-24
回 zhanglyl 的帖子
zhanglyl:
添加如下:
connect(networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(networkReply(QNetworkReply*)));
大概像这样:
void SerialToTcp::networkReply(QNetworkReply *reply)
.......


    
您好,connect(networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(networkReply(QNetworkReply*)));这个函数要放在哪里?构造函数里?貌似我添加了之后报错了。我是把它添加到构造函数里的,如下所示



而且也在头文件里添加了槽函数的声明,如下所示:




但是编译之后显示报错:



请问是什么原因呢?
离线linchang123

只看该作者 4楼 发表于: 2014-02-21
回 zhanglyl 的帖子
zhanglyl:添加如下:
connect(networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(networkReply(QNetworkReply*)));
大概像这样:
void SerialToTcp::networkReply(QNetworkReply *reply)
....... (2014-02-21 16:15) 

好的,谢谢
离线zhanglyl

只看该作者 3楼 发表于: 2014-02-21
添加如下:
connect(networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(networkReply(QNetworkReply*)));

大概像这样:
void SerialToTcp::networkReply(QNetworkReply *reply)
{
    QString serverResponse = reply->readAll();
    qDebug() << serverResponse;
}
跟踪、看看服务器给你返回的信息。
离线linchang123

只看该作者 2楼 发表于: 2014-02-21
回 zhanglyl 的帖子
zhanglyl:ip地址的 正则式 (mainwindow.cpp51行)过于粗糙,999.888.777.666就不是合法的ip了,参考如下:
QRegExp regExp("((2[0-4]\\d|25[0-5]|[01]?\\d\\d?)\\.){3}(2[0-4]\\d|25[0-5]|[01]?\\d\\d?)"); (2014-02-21 10:33) 

好的,谢谢
离线zhanglyl

只看该作者 1楼 发表于: 2014-02-21
ip地址的 正则式 (mainwindow.cpp51行)过于粗糙,999.888.777.666就不是合法的ip了,参考如下:
QRegExp regExp("((2[0-4]\\d|25[0-5]|[01]?\\d\\d?)\\.){3}(2[0-4]\\d|25[0-5]|[01]?\\d\\d?)");
快速回复
限100 字节
 
上一个 下一个