h2. Periaate
udp-protokolla on yksinkertaisin tiedonsiirtoprotokolla Ethernetin yli. Se ei vaadi kuittauksia, eikä siten varmista tiedon perille menoa, mutta varmistus voidaan toteuttaa muilla menetelmillä.
h2. Udp-palvelin
Projektitiedostoon täytyy lisätä määrittely network, jotta Qt ottaa mukaan verkkoasetukset
{code}
QT += network
{code}
Otsikkotiedostossa tulee esitellä udpSocket muuttuja
{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ähetysSeuraavan on esimerkki lukuarvon lähetyksestä udp-viestinä, esimerkissä simuloidaan CAN viestin välitystä
{code}
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; }
dataToRTSocketdataCANSocket->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}
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 ";
while (dataToCANSocket->hasPendingDatagrams()) {
QByteArray datagram;
datagram.resize(dataToRTSocketdataToCANSocket->pendingDatagramSize());
dataToRTSocketdataToCANSocket->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} |