...
udp-protokolla on yksinkertaisin tiedonsiirtoprotokolla Ethernetin yli. Se ei vaadi kuittauksia, eikä siten varmista tiedon perille menoa, mutta varmistus voidaan toteuttaa muilla menetelmillä.
Udp-
...
asiakas
Projektitiedostoon täytyy lisätä määrittely network, jotta Qt ottaa mukaan verkkoasetukset
Code Block |
---|
QT += network
|
Otsikkotiedostossa tulee esitellä udpSocket muuttuja
Code Block |
---|
#ifndef UDPASIAKASTOIMINNOT_H #include#define <QUdpSocket> ... //tehdään osoitinmuuttuja socketia varten QUdpSocket *udpSocket; |
Koodissa liitetään socket porttiin ja lähetetään dataa
Code Block |
---|
//muodostimeen varaukset ja liitynnät //varataan udpSocket muuttujalle muistiaUDPASIAKASTOIMINNOT_H #include <QObject> #include <QUdpSocket> //udp funktiot on täällä #include <QDebug> class UdpAsiakasToiminnot : public QObject { Q_OBJECT public: explicit UdpAsiakasToiminnot(QObject *parent = 0); udpSocket = new QUdpSocket(thisQUdpSocket *udpLiitynta; public slots: void LueDataa(); void KirjoitaDataa(quint32 arvo); }; #endif // UDPASIAKASTOIMINNOT_H |
Koodissa liitetään
...
socket porttiin ja lähetetään dataa
Code Block |
---|
#include "udpasiakastoiminnot.h" UdpAsiakasToiminnot::UdpAsiakasToiminnot(QObject *parent)QObject(parent porttiin udpSocket->bind(45454, QUdpSocket::ShareAddress); ... void Dialog::on_sendMessage_clicked() { QString viesti=ui->lineEdit->text();//luetaan teksti lineEdit ikkunasta QByteArray datagram;//esitellään muuttuja, joka sisältää tietoa 8:n bitin pätkissä datagram.append(viesti);//lisätään viesti muuttujaan //kirjoitetaan viesti sockettiin udpSocket->writeDatagram(datagram.data(), datagram.size(),QHostAddress::Broadcast,45454); } |
Seuraavan on esimerkki lukuarvon lähetyksestä udp-viestinä, esimerkissä simuloidaan CAN viestin välitystä
Code Block |
---|
void CAN_MessageWithUdp::WriteCAN_Message(quint8 Id,quint64 messageudpLiitynta=new QUdpSocket(this); // jos asiakas haluaisi myos lukea, niin myos seuraavat // udpLiitynta->bind(45401,QUdpSocket::ShareAddress); // connect(udpLiitynta,SIGNAL(readyRead()),this,SLOT(LueDataa())); } void UdpAsiakasToiminnot::LueDataa() { } void UdpAsiakasToiminnot::KirjoitaDataa(quint32 arvo) { QVector<qint64>QVector<quint32> v; v<<(qint64)Idquint32)1;//viestin nimi v<<arvo; //QByteArray on tavuvektori QByteArray datagram; v<<qDebug(qint64) message<<"kirjoitetaan dataa "<< v; QByteArray datagram; //QDataStream tyyppinä voi lähettää perättäistä tietoa io-laittelle QDataStream out (&datagram,QIODevice::WriteOnly); //foreach(qint64 - kopioi vuorollaan jokainen v:n alkio f muuttujaan ja lisää // jokainen f out:n jatkoksi foreach(quint32 f,v) { out << f; } dataCANSocketudpLiitynta->writeDatagram(datagram.data(), datagram.size(), QHostAddress::Broadcast, 45402) 45401); qDebug()<<"data kirjoitettiin"; } |
Udp-
...
palvelin
Projekti- ja otsikkotiedotoihin tehdään samat lisäykset kuin palvelimessa.
Esimerkiksi muodostimessa tehdään taas liitäntä ja liitetään udpSocketin "valmis signaali" tiedon vastaanottajaan.
Code Block |
---|
udpSocket = new QUdpSocket(this);
udpSocket->bind(45454, QUdpSocket::ShareAddress);
connect(udpSocket, SIGNAL(readyRead()),this, SLOT(processPendingDatagrams()));
|
Ja vielä tehdään tiedolle vastaanottaja.
Code Block |
---|
#ifndef UDPPALVELINTOIMINNOT_H void Dialog::processPendingDatagrams() { //esitellään muuttuja tavujonolle QByteArray datagram;#define UDPPALVELINTOIMINNOT_H #include <QObject> #include <QUdpSocket> //udp funktiot on täällä class UdpPalvelinToiminnot : public QObject { //otetaan dataa vastaan niin kaun kuin on tulossa while (udpSocket->hasPendingDatagrams()) {Q_OBJECT public: explicit UdpPalvelinToiminnot(QObject *parent = 0); QUdpSocket *udpLiitynta; signals: //sovitetaan muuttuja tulevaan dataanvoid Tulokset(qint32); public slots: datagram.resize(udpSocket->pendingDatagramSize()); //luetaan data muuttujaan udpSocket->readDatagram(datagram.data(), datagram.size()void LueDataa(); }; #endif // UDPPALVELINTOIMINNOT_H |
Seuraavassa koodissa on esitetty numeerisen datan luku udp-väylältä
Code Block |
---|
#include "udppalvelintoiminnot.h" //#include <QReadLocker> //QReadWriteLock lukulukko; UdpPalvelinToiminnot::UdpPalvelinToiminnot(QObject *parent) : QObject(parent) { udpLiitynta=new QUdpSocket(this); //esitetään muuttuja näytölläudpLiitynta->bind(45401,QUdpSocket::ShareAddress); ui->label->setText(tr("Received: \"%1\"") .arg(datagram.dataconnect(udpLiitynta,SIGNAL(readyRead()),this,SLOT(LueDataa())); } } |
Seuraavassa koodissa on esitetty numeerisen datan luku udp-väylältä
Code Block |
---|
void CAN_MessageWithUdp::ReadCAN_Message} void UdpPalvelinToiminnot::LueDataa() { quint64qint32 f; qint32Qvect roskat; qDebug() << "data on CAN udpLiitynta"; while (dataToCANSocketudpLiitynta->hasPendingDatagrams()) { QByteArray datagram; datagram.resize(dataToCANSocketudpLiitynta->pendingDatagramSize()); dataToCANSocketudpLiitynta->readDatagram(datagram.data(), datagram.size()); QDataStream in(datagram); in>>f; qDebug()<<"Id "<<(qint64)f; if(f==(qint64qint32) 1 ) { message.clear()in>>f; while (!in.atEnd()) { in >> fqDebug()<<"tulokset "<<f; message<<f; ] return; } else if(f==(qint64)2) { quint8Qvect commandemit Tulokset(f); while (!in.atEnd()){ in >> freturn; command.append(f); } } return; } .... |