quint64 ReadDataSize=socket->read(dataPacket,(LenthPacket+1)*10);
//ModulExchange .h#ifndef MODULEEXCHANGE_H#define MODULEEXCHANGE_H#include <QObject>#include <QTcpServer>#include <QTcpSocket>#include <QStringList>#include "common_gs.h"class ModuleExchange : public QObject{ Q_OBJECTpublic: explicit ModuleExchange(QObject *parent = 0); int portInput; _PAR_SORD parFromSord; // структура для записи текущих параметров QByteArray head; // Заголовок пакета 0xe0,0xe3,0xe5,0xe7 // установка порта на прослушивание void setPort(int port); // отправка данных void PacketSend(QByteArray); bool _connected; signals: // есть соединение по определенному порту void connected(); // нет соединения по конкретному порту void disconnected(); public slots: // включение или отключение прослушки отпределенного порта на сервере. void setEnableInput(bool _enable); // новое соединение void slot_new_connection(); // пришел сигнал разрыва соединения void slot_disconnected(); //слот чтения пакета void slot_readyRead();protected: QTcpServer *server; QTcpSocket * socket; virtual void parsePacket(QByteArray _packet); };}
Modulexchange.cpp#include "moduleexchange.h"const QString packetSeparator="|";const QString endSeparator="*";ModuleExchange::ModuleExchange(QObject *parent) : QObject(parent){ server= new QTcpServer(this); connect(server, SIGNAL(newConnection()),SLOT(slot_new_connection())); portInput=0; _connected=false; head.resize(4); head[0]=0xe0; head[1]=0xe3; head[2]=0xe5; head[3]=0xe7;}void ModuleExchange::slot_new_connection(){ socket=server->nextPendingConnection(); connect(socket,SIGNAL(disconnected()),this, SLOT(slot_disconnected())); connect(socket,SIGNAL(readyRead()),this, SLOT(slot_readyRead())); _connected=true;}void ModuleExchange::slot_disconnected(){ socket->deleteLater();}void ModuleExchange::setPort(int port){ portInput=port;}void ModuleExchange::setEnableInput(bool _enable){ if(portInput==0) return; if(_enable) { server->listen(QHostAddress::Any,portInput); } else { server->close(); }}void ModuleExchange::slot_readyRead(){ if(!socket) return; quint64 NextBlockSize=0; QByteArray Packet; NextBlockSize=socket->bytesAvailable(); if(NextBlockSize<1) return; char dataP[NextBlockSize]; Packet.clear(); quint64 LenthPacket=0; socket->peek(dataP,NextBlockSize); Packet.setRawData(dataP,NextBlockSize); // номер в строке конца пакета("*") // для всех протоколов обмена кроме протокола с прибором 16 if((LenthPacket=Packet.indexOf(endSeparator))>0 && LenthPacket<=NextBlockSize) { // есть конец пакета char dataPacket[LenthPacket]; quint64 ReadDataSize=socket->read(dataPacket,(LenthPacket+1)); Packet.setRawData(dataPacket,LenthPacket); parsePacket(Packet); if(ReadDataSize<NextBlockSize) { slot_readyRead();// принято больше данных чем должно быть в одном пакете } } // наличие заголовка пакета при обмене с 16 прибором else if(Packet.contains(head)) { //ДОДЕЛАТЬ НЕ ВЕРНО ЕСЛИ ПАКЕТ ПРИХОДИТ ЗА 2 РАЗА, ТО У ВТОРОГО НЕТ ЗАГОЛОВКА char dataPacket[LenthPacket]; quint64 ReadDataSize=socket->read(dataPacket,NextBlockSize); Packet.setRawData(dataPacket,NextBlockSize); parsePacket(Packet); if(ReadDataSize<NextBlockSize) { slot_readyRead();// не все данные считаны из канала } } else { slot_readyRead(); // в пакете нет символа конца пакета и заголовка, //т.е. меньше данных чем должно быть //или данные не соответствуют протоколам }}void ModuleExchange::parsePacket(QByteArray _packet){;}void ModuleExchange::PacketSend(QByteArray _packet){ if(!_connected) return; if(socket->state()!=QAbstractSocket::ConnectedState) return; int sz=socket->write(_packet,_packet.size()); if(sz!=_packet.size()) { qDebug()<<"not all information writes to protocol"; }}
.h#ifndef STRUCTURAEXCHANGE2D8D_H#define STRUCTURAEXCHANGE2D8D_H#include <QObject>#include <QSettings>#include "moduleexchange.h"class StructuraExchange2D8D : public ModuleExchange{ Q_OBJECTpublic: explicit StructuraExchange2D8D(QObject *parent = 0); QSettings *seting; void SendData_2d_8d(QByteArray _pack); signals: void Radiation_on(QByteArray);// включено излучение на отправку АТГС данных в сордеpublic slots:protected: void parsePacket(QByteArray _packet); };#endif // STRUCTURAEXCHANGE_H
.cpp#include "structuraexchange_2D8D.h"//#include "/Structure/Structure.h"#define packetSeparator "|"StructuraExchange2D8D::StructuraExchange2D8D(QObject *parent) : ModuleExchange(parent){ seting= new QSettings( tr("net.ini"), QSettings::IniFormat, this ); seting->beginGroup("NET_PORT"); int PORT=seting->value("_PORT_2D_8D", QString("")).toInt(); qDebug()<<"PORT_client_2D8D"<<PORT; seting->endGroup(); setPort(PORT); setEnableInput(true);}void StructuraExchange2D8D::parsePacket(QByteArray _packet){ QByteArray arrData; arrData.resize(0); qDebug()<<"_packet from 28D"<<_packet; if(_packet.size()>=1) { QString str; str=QString::fromAscii(_packet); str=_packet.mid(0,2); if(str=="@C") { _packet=_packet.right(3); _packet=_packet.left(2); switch(_packet.toShort()) { case 0: parFromSord.Mos=0;break; case 1: parFromSord.Mos=2;break; case 4: parFromSord.Mos=3;break; default: break; } SendData_2d_8d("@Y*"); } if(str=="@U") { SendData_2d_8d("@Y*"); } if(str=="@I") { emit SendData_2d_8d("@I"); } if(str=="@A") { SendData_2d_8d("@A8F*"); } if(str=="#M" ) { _packet=arrData.right(2); _packet=arrData.left(1); switch(_packet.toShort()) { case 1: parFromSord.Nap=2; break; // НИЗ case 3: parFromSord.Nap=3; break; // верх default: break; }; SendData_2d_8d("#Y*"); } if(str=="#D" || str=="#U" ) { SendData_2d_8d("#Y*"); } if(str=="#R") { SendData_2d_8d("#Y*"); emit Radiation_on(_packet.mid(2,1)); } }}void StructuraExchange2D8D::SendData_2d_8d(QByteArray _pack){ PacketSend(_pack); qDebug()<<"Packet_sent_2D_8D"<<_pack;}
void work_2d_8d::send_2d_8d( QString command ){ static int shp=0; QByteArray out; QDataStream data_out( &out, QIODevice::WriteOnly ); data_out.setVersion( QDataStream::Qt_4_2 ); QByteArray command_asci; command=command.toUpper(); command_asci=command.toAscii(); data_out.writeRawData((char*)command_asci.data(), command_asci.size()); int sz=0; out.resize(out.size()*100); sz=m_pTcpSocket->write( out ); qDebug()<<"command28D_OUT"<<out<<"sz"<<sz; m_pTcpSocket->flush(); QString str_deb; str_deb.sprintf( "%3d send: ", shp%1000 ); QString str; for (int i=0; i<sz; i++ ) { str.sprintf("%x ", (char)out[i] ); str_deb+=str; } emit type_data_signal( nPort, command+" "+str_deb ); shp++;}