...
Projektitiedostoon täytyy lisätä määrittely network, jotta Qt ottaa mukaan verkkoasetukset
Code Block |
---|
QT += network
|
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: //tehdään osoitinmuuttuja socketia vartenexplicit UdpAsiakasToiminnot(QObject *parent = 0); QUdpSocket *udpSocket;udpLiitynta; public slots: void LueDataa(); void KirjoitaDataa(quint32 arvo); }; #endif // UDPASIAKASTOIMINNOT_H |
Koodissa liitetään socket porttiin ja lähetetään dataa
Code Block |
---|
//muodostimeen varaukset ja liitynnät //varataan udpSocket muuttujalle muistia#include "udpasiakastoiminnot.h" UdpAsiakasToiminnot::UdpAsiakasToiminnot(QObject *parent)QObject(parent) { udpSocket udpLiitynta= new QUdpSocket(this); // jos asiakas haluaisi myos //lukea, liitetäänniin socketmyos porttiinseuraavat // udpSocketudpLiitynta->bind(4545445401, QUdpSocket::ShareAddress); // connect(udpLiitynta,SIGNAL(readyRead()),this,SLOT(LueDataa())); } void UdpAsiakasToiminnot::LueDataa() { ...} void DialogUdpAsiakasToiminnot::on_sendMessage_clicked(KirjoitaDataa(quint32 arvo) { QString viesti=ui->lineEdit->text();//luetaan teksti lineEdit ikkunastaQVector<quint32> v; v<<(quint32)1;//viestin nimi v<<arvo; //QByteArray on tavuvektori QByteArray datagram;//esitellään muuttuja, joka sisältää tietoa 8:n bitin pätkissä datagram.append(viesti);//lisätään viesti muuttujaan 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ää //kirjoitetaan viesti sockettiin jokainen f out:n jatkoksi foreach(quint32 f,v) { out << f; } udpSocketudpLiitynta->writeDatagram(datagram.data(), datagram.size(), QHostAddress::Broadcast,45454) 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);
}
|
...
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;
//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()));
}
}
|
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;
}
....
|