Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Migration of unmigrated content due to installation of a new plugin

...

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
#include "udpasiakastoiminnot.h"

UdpAsiakasToiminnot::UdpAsiakasToiminnot(QObject *parent)QObject(parent)
{
    udpLiitynta=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<quint32> v;
    v<<(quint32)1;//viestin nimi
    v<<arvo;
    //QByteArray on tavuvektori
    QByteArray datagram;
    qDebug() <<"kirjoitetaan dataa "<< v;
    //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(quint32 f,v) { out << f; }
    udpLiitynta->writeDatagram(datagram.data(), datagram.size(),                      QHostAddress::Broadcast, 45401);
    qDebug()<<"data kirjoitettiin";
}

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);
}

...

 

 

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.

Code Block
udpSocket = new QUdpSocket(this);
    udpSocket->bind(45454, QUdpSocket::ShareAddress);
    connect(udpSocket, SIGNAL(readyRead()),this, SLOT(processPendingDatagrams()));

 

Ja vielä tehdään tiedolle vastaanottaja.

Code Block
void Dialog::processPendingDatagrams()
{
    //esitellään muuttuja tavujonolle
    QByteArray datagram;#ifndef UDPPALVELINTOIMINNOT_H
#define UDPPALVELINTOIMINNOT_H
#include <QObject>
#include <QUdpSocket> //udp funktiot on täällä

class UdpPalvelinToiminnot : public QObject
{
    //otetaan dataa vastaan niin kaun kuin on tulossa
    while (udpSocket->hasPendingDatagrams()) {Q_OBJECT
public:
    explicit UdpPalvelinToiminnot(QObject *parent = 0);
    QUdpSocket *udpLiitynta;
signals:
   //sovitetaan muuttuja tulevaan dataanvoid Tulokset(qint32);
public slots:
        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.datavoid 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()));
    }
}

Seuraavassa koodissa on esitetty numeerisen datan luku udp-väylältä

Code Block
void CAN_MessageWithUdp::ReadCAN_Message void UdpPalvelinToiminnot::LueDataa()
 {
    quint64qint32 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;
         }
....