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

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}