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} Seuraavan on esimerkki lukuarvon lähetyksestä 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(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, 4540245401); } 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); udpLiitynta->bind(45401,QUdpSocket::ShareAddress); connect(udpLiitynta,SIGNAL(readyRead()),this,SLOT(LueDataa())); } void UdpPalvelinToiminnot::LueDataa() { qint32 {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 = new QUdpSocket(this); udpSocket->bind(45454, QUdpSocket::ShareAddress); connect(udpSocket, SIGNAL(readyRead()),this, SLOT(processPendingDatagrams())); {code} Ja vielä tehdään tiedolle vastaanottaja. {code} void Dialog::processPendingDatagrams() { //esitellään muuttuja tavujonolle QByteArray datagram; //otetaan dataa vastaan niin kaun kuin on tulossa while (udpSocket->hasPendingDatagrams()) { //sovitetaan muuttuja tulevaan dataan datagram.resize(udpSocket->pendingDatagramSize()); //luetaan data muuttujaan udpSocket->readDatagram(datagram.data(), datagram.size()); //esitetään muuttuja näytöllä ui->label->setText(tr("Received: \"%1\"") .arg(datagram.data())); } } {code} Seuraavassa koodissa on esitetty numeerisen datan luku udp-väylältä {code} void CAN_MessageWithUdp::ReadCAN_Message() { quint64 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; } .... {code} |