Periaate
...
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 {code} |
Otsikkotiedostossa
...
tulee
...
esitellä
...
udpSocket
...
muuttuja
Code Block |
---|
#ifndef UDPASIAKASTOIMINNOT_H
#define UDPASIAKASTOIMINNOT_H
#include <QObject>
#include <QUdpSocket> //udp funktiot on täällä
#include <QDebug>
class UdpAsiakasToiminnot : public QObject
{
Q_OBJECT
public:
explicit UdpAsiakasToiminnot(QObject *parent = 0);
QUdpSocket *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 {code} #include <QUdpSocket> ... //tehdään osoitinmuuttuja socketia varten QUdpSocket *udpSocket; {code} Koodissa liitetään socket porttiin ja lähetetään dataa {code} //muodostimeen varaukset ja liitynnät //varataan udpSocket muuttujalle muistia udpSocket = new QUdpSocket(this); // liitetään socket 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); } {code} Lukuarvon lähetys udp-viestinä esimerkissä simuloidaan CAN viestin välitystä {code} 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 - kopioi vuorollaan jokainen v:n alkio f muuttujaan ja lisää // jokainen f out:n jatkoksi foreach(qint64quint32 f,v) { out << f; } dataToRTSocketudpLiitynta->writeDatagram(datagram.data(), datagram.size(), QHostAddress::Broadcast, 4540245401); } {code} h2. Udp-asiakas 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} udpSocket = 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.
Ja vielä tehdään tiedolle vastaanottaja.
Code Block |
---|
#ifndef UDPPALVELINTOIMINNOT_H
#define UDPPALVELINTOIMINNOT_H
#include <QObject>
#include <QUdpSocket> //udp funktiot on täällä
class UdpPalvelinToiminnot : public QObject
{
Q_OBJECT
public:
explicit UdpPalvelinToiminnot(QObject *parent = 0);
QUdpSocket *udpLiitynta;
signals:
void Tulokset(qint32);
public slots:
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); udpSocketudpLiitynta->bind(4545445401, QUdpSocket::ShareAddress); connect(udpSocketudpLiitynta, SIGNAL(readyRead()),this, SLOT(processPendingDatagramsLueDataa())); {code } Ja vielä tehdään tiedolle vastaanottaja. {code} void Dialog::processPendingDatagrams() { //esitellään muuttuja tavujonolle void UdpPalvelinToiminnot::LueDataa() { qint32 f; qDebug() << "udpLiitynta"; while (udpLiitynta->hasPendingDatagrams()) { QByteArray datagram; //otetaan dataa vastaan niin kaun kuin on tulossa datagram.resize(udpLiitynta->pendingDatagramSize()); while (udpSocket->hasPendingDatagramsudpLiitynta->readDatagram(datagram.data(), datagram.size()) { ; QDataStream in(datagram); //sovitetaan muuttuja tulevaan dataanin>>f; datagram.resize(udpSocket->pendingDatagramSize());if(f==(qint32) 1 ) { //luetaan data muuttujaanin>>f; udpSocket->readDatagram(datagram.data(), datagram.size()); qDebug()<<"tulokset "<<f; //esitetään muuttuja näytölläemit Tulokset(f); ui->label->setText(tr("Received: \"%1\"") .arg(datagram.data())); return; } } {code } |