Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Wiki Markup
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ähetys 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; }
    dataToRTSocket->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}

{code}
void CAN_MessageWithUdp::ReadCAN_Message()
{
    quint64 f;
    qint32Qvect roskat;
    qDebug() << "data on CAN ";
    while (dataToCANSocket->hasPendingDatagrams()) {
         QByteArray datagram;
         datagram.resize(dataToRTSocket->pendingDatagramSize());
         dataToRTSocket->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}