Newer
Older
#include "bluetoothtestserver.h"
#include <QBluetoothServer>
#include <QBluetoothSocket>
#include "krabipacket.h"
#include <functional>
BluetoothTestServer::BluetoothTestServer(QObject *parent): QObject(parent)
{
m_server = new QBluetoothServer(QBluetoothServiceInfo::RfcommProtocol, this);
connect(m_server, &QBluetoothServer::newConnection, this, &BluetoothTestServer::clientConnected);
QBluetoothServiceInfo info = m_server->listen(QBluetoothUuid(QString("B62C4E8D-62CC-404b-BBBF-BF3E3BBB1374")));
if(!info.isValid())
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
{
qDebug() << "Cannot setup server";
}
else
qDebug() << "Server started";
}
void BluetoothTestServer::clientConnected()
{
QBluetoothSocket *socket = m_server->nextPendingConnection();
if (!socket)
return;
connect(socket, &QBluetoothSocket::readyRead, std::bind(&BluetoothTestServer::receiveData, this, socket));
connect(socket, &QBluetoothSocket::disconnected, std::bind(&BluetoothTestServer::clientDisconnected, this, socket));
m_clients.append(socket);
qDebug() << "Client connected: " << socket->peerName();
}
void BluetoothTestServer::receiveData(QBluetoothSocket* client)
{
qDebug() << "Data received!";
m_buffer.append(client->readAll());
processData(m_buffer);
}
int BluetoothTestServer::processData(QByteArray& data)
{
if(data.size() < 2)
return 0;
int packetsProcessed = 0;
for(int i = 0; i < data.size() -1; ++i)
{
if(! (data.at(i) == 0x0D && data.at(i+1) == 0x0A))
continue;
if (i < KRABIPACKET_MAXSIZE)
{
KrabiPacket packet(data.left(i));
if (packet.isValid())
{
qDebug() << "Received valid packet";
qDebug() << "Type: " << packet.id();
}
else
qDebug() << "Discarding packet (invalid checksum)";
++packetsProcessed;
}
data = data.right(data.size() - (i + 2));
i = 0;
}
return packetsProcessed;
}
void BluetoothTestServer::clientDisconnected(QBluetoothSocket* client)
{
qDebug() << "Client disconnected";
m_clients.removeAll(client);
}