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-palvelin
...
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 |
---|
} #include <QUdpSocket> ... //tehdään osoitinmuuttuja socketia varten QUdpSocket *udpSocket; {code} |
Koodissa
...
liitetään
...
socket
...
porttiin
...
ja
...
lähetetään
...
dataa
Code Block |
---|
} //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 Block |
---|
} void CAN_MessageWithUdp::WriteCAN_Message(quint8 Id,quint64 message) { QVector<qint64> v; v<<(qint64)Id; v<<(qint64) message; QByteArray datagram; QDataStream out (&datagram,QIODevice::WriteOnly); foreach(qint64 f,v) { out << f; } dataCANSocket->writeDatagram(datagram.data(), datagram.size(), QHostAddress::Broadcast, 45402); } {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 Block |
---|
} udpSocket = new QUdpSocket(this); udpSocket->bind(45454, QUdpSocket::ShareAddress); connect(udpSocket, SIGNAL(readyRead()),this, SLOT(processPendingDatagrams())); {code} |
Ja
...
vielä
...
tehdään
...
tiedolle
...
vastaanottaja.
Code Block |
---|
} 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 Block |
---|
} void CAN_MessageWithUdp::ReadCAN_Message() { quint64 f; qint32Qvect roskat; qDebug() << "data on CAN "; while (dataToCANSocket->hasPendingDatagrams()) { QByteArray datagram; datagram.resize(dataToCANSocket->pendingDatagramSize()); dataToCANSocket->readDatagram(datagram.data(), datagram.size()); QDataStream in(datagram); in>>f; qDebug()<<"Id "<<(qint64)f; if(f==(qint64)1) { message.clear(); while (!in.atEnd()) { in >> f; message<<f; ] return; } else if(f==(qint64)2) { quint8Qvect command; while (!in.atEnd()){ in >> f; command.append(f); } return; } .... {code} |