Merge PR #533: Add support for CoIoT
This commit is contained in:
commit
a0186a0fb6
@ -93,7 +93,7 @@ Coap::Coap(QObject *parent, const quint16 &port) :
|
||||
{
|
||||
m_socket = new QUdpSocket(this);
|
||||
|
||||
if (!m_socket->bind(QHostAddress::Any, port, QAbstractSocket::ShareAddress))
|
||||
if (!m_socket->bind(QHostAddress::AnyIPv4, port, QAbstractSocket::ShareAddress))
|
||||
qCWarning(dcCoap) << "Could not bind to port" << port << m_socket->errorString();
|
||||
|
||||
connect(m_socket, SIGNAL(readyRead()), this, SLOT(onReadyRead()));
|
||||
@ -103,117 +103,44 @@ Coap::Coap(QObject *parent, const quint16 &port) :
|
||||
* Returns a \l{CoapReply} to match the response with the request. */
|
||||
CoapReply *Coap::ping(const CoapRequest &request)
|
||||
{
|
||||
CoapReply *reply = new CoapReply(request, this);
|
||||
reply->setRequestMethod(CoapPdu::Empty);
|
||||
|
||||
connect(reply, &CoapReply::timeout, this, &Coap::onReplyTimeout);
|
||||
connect(reply, &CoapReply::finished, this, &Coap::onReplyFinished);
|
||||
|
||||
if (request.url().scheme() != "coap") {
|
||||
reply->setError(CoapReply::InvalidUrlSchemeError);
|
||||
reply->m_isFinished = true;
|
||||
return reply;
|
||||
}
|
||||
|
||||
// check if there is a request running
|
||||
if (m_reply == 0) {
|
||||
m_reply = reply;
|
||||
lookupHost();
|
||||
} else {
|
||||
m_replyQueue.enqueue(reply);
|
||||
}
|
||||
|
||||
return reply;
|
||||
return customRequest(CoapPdu::Empty, request);
|
||||
}
|
||||
|
||||
/*! Performs a GET request to the CoAP server specified in the given \a request.
|
||||
* Returns a \l{CoapReply} to match the response with the request. */
|
||||
CoapReply *Coap::get(const CoapRequest &request)
|
||||
{
|
||||
CoapReply *reply = new CoapReply(request, this);
|
||||
reply->setRequestMethod(CoapPdu::Get);
|
||||
|
||||
connect(reply, &CoapReply::timeout, this, &Coap::onReplyTimeout);
|
||||
connect(reply, &CoapReply::finished, this, &Coap::onReplyFinished);
|
||||
|
||||
if (request.url().scheme() != "coap") {
|
||||
reply->setError(CoapReply::InvalidUrlSchemeError);
|
||||
reply->m_isFinished = true;
|
||||
return reply;
|
||||
}
|
||||
|
||||
// check if there is a request running
|
||||
if (m_reply == 0) {
|
||||
m_reply = reply;
|
||||
lookupHost();
|
||||
} else {
|
||||
m_replyQueue.enqueue(reply);
|
||||
}
|
||||
return reply;
|
||||
return customRequest(CoapPdu::Get, request);
|
||||
}
|
||||
|
||||
/*! Performs a PUT request to the CoAP server specified in the given \a request and \a data.
|
||||
* Returns a \l{CoapReply} to match the response with the request. */
|
||||
CoapReply *Coap::put(const CoapRequest &request, const QByteArray &data)
|
||||
{
|
||||
CoapReply *reply = new CoapReply(request, this);
|
||||
reply->setRequestMethod(CoapPdu::Put);
|
||||
reply->setRequestPayload(data);
|
||||
|
||||
connect(reply, &CoapReply::timeout, this, &Coap::onReplyTimeout);
|
||||
connect(reply, &CoapReply::finished, this, &Coap::onReplyFinished);
|
||||
|
||||
if (request.url().scheme() != "coap") {
|
||||
reply->setError(CoapReply::InvalidUrlSchemeError);
|
||||
reply->m_isFinished = true;
|
||||
return reply;
|
||||
}
|
||||
|
||||
// check if there is a request running
|
||||
if (m_reply == 0) {
|
||||
m_reply = reply;
|
||||
lookupHost();
|
||||
} else {
|
||||
m_replyQueue.enqueue(reply);
|
||||
}
|
||||
|
||||
return reply;
|
||||
return customRequest(CoapPdu::Put, request, data);
|
||||
}
|
||||
|
||||
/*! Performs a POST request to the CoAP server specified in the given \a request and \a data.
|
||||
* Returns a \l{CoapReply} to match the response with the request. */
|
||||
CoapReply *Coap::post(const CoapRequest &request, const QByteArray &data)
|
||||
{
|
||||
CoapReply *reply = new CoapReply(request, this);
|
||||
reply->setRequestMethod(CoapPdu::Post);
|
||||
reply->setRequestPayload(data);
|
||||
|
||||
connect(reply, &CoapReply::timeout, this, &Coap::onReplyTimeout);
|
||||
connect(reply, &CoapReply::finished, this, &Coap::onReplyFinished);
|
||||
|
||||
if (request.url().scheme() != "coap") {
|
||||
reply->setError(CoapReply::InvalidUrlSchemeError);
|
||||
reply->m_isFinished = true;
|
||||
return reply;
|
||||
}
|
||||
|
||||
// check if there is a request running
|
||||
if (m_reply == 0) {
|
||||
m_reply = reply;
|
||||
lookupHost();
|
||||
} else {
|
||||
m_replyQueue.enqueue(reply);
|
||||
}
|
||||
|
||||
return reply;
|
||||
return customRequest(CoapPdu::Post, request, data);
|
||||
}
|
||||
|
||||
/*! Performs a DELETE request to the CoAP server specified in the given \a request.
|
||||
* Returns a \l{CoapReply} to match the response with the request. */
|
||||
CoapReply *Coap::deleteResource(const CoapRequest &request)
|
||||
{
|
||||
return customRequest(CoapPdu::Delete, request);
|
||||
}
|
||||
|
||||
CoapReply *Coap::customRequest(CoapPdu::ReqRspCode requestCode, const CoapRequest &request, const QByteArray &data)
|
||||
{
|
||||
CoapReply *reply = new CoapReply(request, this);
|
||||
reply->setRequestMethod(CoapPdu::Delete);
|
||||
reply->setRequestMethod(requestCode);
|
||||
if (!data.isEmpty()) {
|
||||
reply->setRequestPayload(data);
|
||||
}
|
||||
|
||||
connect(reply, &CoapReply::timeout, this, &Coap::onReplyTimeout);
|
||||
connect(reply, &CoapReply::finished, this, &Coap::onReplyFinished);
|
||||
@ -296,6 +223,23 @@ CoapReply *Coap::disableNotifications(const CoapRequest &request)
|
||||
return reply;
|
||||
}
|
||||
|
||||
bool Coap::joinMulticastGroup(const QHostAddress &address)
|
||||
{
|
||||
bool ok = m_socket->joinMulticastGroup(address);
|
||||
if (ok) {
|
||||
qCDebug(dcCoap()) << "Joined CoAP multucast group on:" << address;
|
||||
} else {
|
||||
qCWarning(dcCoap()) << "Error joining CoAP multicast group on:" << address;
|
||||
}
|
||||
return ok;
|
||||
}
|
||||
|
||||
bool Coap::leaveMulticastGroup(const QHostAddress &address)
|
||||
{
|
||||
return m_socket->leaveMulticastGroup(address);
|
||||
}
|
||||
|
||||
|
||||
void Coap::lookupHost()
|
||||
{
|
||||
int lookupId = QHostInfo::lookupHost(m_reply->request().url().host(), this, SLOT(hostLookupFinished(QHostInfo)));
|
||||
@ -306,7 +250,7 @@ void Coap::sendRequest(CoapReply *reply, const bool &lookedUp)
|
||||
{
|
||||
CoapPdu pdu;
|
||||
pdu.setMessageType(reply->request().messageType());
|
||||
pdu.setStatusCode(reply->requestMethod());
|
||||
pdu.setReqRspCode(reply->requestMethod());
|
||||
pdu.createMessageId();
|
||||
pdu.createToken();
|
||||
|
||||
@ -431,18 +375,15 @@ void Coap::processResponse(const CoapPdu &pdu, const QHostAddress &address, cons
|
||||
return;
|
||||
}
|
||||
|
||||
qCDebug(dcCoap) << "Got message without request or registered observe resource." << endl << "<---" << pdu;
|
||||
CoapPdu responsePdu;
|
||||
responsePdu.setMessageType(CoapPdu::Reset);
|
||||
responsePdu.setMessageId(pdu.messageId());
|
||||
responsePdu.setToken(pdu.token());
|
||||
sendCoapPdu(address, port, responsePdu);
|
||||
// If this is neither a response to a request of a notification from an observed resource, it's a multicast message
|
||||
qCDebug(dcCoap) << "<---" << QString("%1:%2").arg(address.toString()).arg(QString::number(port)) << pdu;
|
||||
emit multicastMessageReceived(address, pdu);
|
||||
}
|
||||
|
||||
void Coap::processIdBasedResponse(CoapReply *reply, const CoapPdu &pdu)
|
||||
{
|
||||
// check if this is an empty ACK response (which indicates a separated response)
|
||||
if (pdu.statusCode() == CoapPdu::Empty && pdu.messageType() == CoapPdu::Acknowledgement) {
|
||||
if (pdu.reqRspCode() == CoapPdu::Empty && pdu.messageType() == CoapPdu::Acknowledgement) {
|
||||
reply->m_timer->stop();
|
||||
qCDebug(dcCoap) << "Got empty ACK. Data will be sent separated.";
|
||||
return;
|
||||
@ -461,7 +402,7 @@ void Coap::processIdBasedResponse(CoapReply *reply, const CoapPdu &pdu)
|
||||
}
|
||||
|
||||
// Piggybacked response
|
||||
reply->setStatusCode(pdu.statusCode());
|
||||
reply->setReqRspCode(pdu.reqRspCode());
|
||||
reply->setContentType(pdu.contentType());
|
||||
reply->appendPayloadData(pdu.payload());
|
||||
reply->setFinished();
|
||||
@ -472,11 +413,11 @@ void Coap::processTokenBasedResponse(CoapReply *reply, const CoapPdu &pdu)
|
||||
// Separate Response
|
||||
CoapPdu responsePdu;
|
||||
responsePdu.setMessageType(CoapPdu::Acknowledgement);
|
||||
responsePdu.setStatusCode(CoapPdu::Empty);
|
||||
responsePdu.setReqRspCode(CoapPdu::Empty);
|
||||
responsePdu.setMessageId(pdu.messageId());
|
||||
sendCoapPdu(reply->hostAddress(), reply->port(), responsePdu);
|
||||
|
||||
reply->setStatusCode(pdu.statusCode());
|
||||
reply->setReqRspCode(pdu.reqRspCode());
|
||||
reply->setContentType(pdu.contentType());
|
||||
reply->appendPayloadData(pdu.payload());
|
||||
reply->setFinished();
|
||||
@ -497,7 +438,7 @@ void Coap::processNotification(const CoapPdu &pdu, const QHostAddress &address,
|
||||
// respond with ACK
|
||||
CoapPdu responsePdu;
|
||||
responsePdu.setMessageType(CoapPdu::Acknowledgement);
|
||||
responsePdu.setStatusCode(CoapPdu::Empty);
|
||||
responsePdu.setReqRspCode(CoapPdu::Empty);
|
||||
responsePdu.setMessageId(pdu.messageId());
|
||||
responsePdu.setToken(pdu.token());
|
||||
|
||||
@ -530,7 +471,7 @@ void Coap::processNotification(const CoapPdu &pdu, const QHostAddress &address,
|
||||
|
||||
CoapPdu pdu;
|
||||
pdu.setMessageType(m_observerReply->request().messageType());
|
||||
pdu.setStatusCode(m_observerReply->requestMethod());
|
||||
pdu.setReqRspCode(m_observerReply->requestMethod());
|
||||
pdu.createMessageId();
|
||||
pdu.createToken();
|
||||
|
||||
@ -568,7 +509,7 @@ void Coap::processNotification(const CoapPdu &pdu, const QHostAddress &address,
|
||||
// respond with ACK
|
||||
CoapPdu responsePdu;
|
||||
responsePdu.setMessageType(CoapPdu::Acknowledgement);
|
||||
responsePdu.setStatusCode(CoapPdu::Empty);
|
||||
responsePdu.setReqRspCode(CoapPdu::Empty);
|
||||
responsePdu.setMessageId(pdu.messageId());
|
||||
responsePdu.setToken(pdu.token());
|
||||
|
||||
@ -596,7 +537,7 @@ void Coap::processBlock1Response(CoapReply *reply, const CoapPdu &pdu)
|
||||
|
||||
// check if this was the last block
|
||||
if (newBlockData.isEmpty()) {
|
||||
reply->setStatusCode(pdu.statusCode());
|
||||
reply->setReqRspCode(pdu.reqRspCode());
|
||||
reply->setContentType(pdu.contentType());
|
||||
reply->setFinished();
|
||||
return;
|
||||
@ -609,7 +550,7 @@ void Coap::processBlock1Response(CoapReply *reply, const CoapPdu &pdu)
|
||||
CoapPdu nextBlockRequest;
|
||||
nextBlockRequest.setContentType(reply->request().contentType());
|
||||
nextBlockRequest.setMessageType(reply->request().messageType());
|
||||
nextBlockRequest.setStatusCode(reply->requestMethod());
|
||||
nextBlockRequest.setReqRspCode(reply->requestMethod());
|
||||
nextBlockRequest.setMessageId(pdu.messageId() + 1);
|
||||
nextBlockRequest.setToken(pdu.token());
|
||||
|
||||
@ -655,7 +596,7 @@ void Coap::processBlock2Response(CoapReply *reply, const CoapPdu &pdu)
|
||||
|
||||
// check if this was the last block
|
||||
if (!pdu.block().moreFlag()) {
|
||||
reply->setStatusCode(pdu.statusCode());
|
||||
reply->setReqRspCode(pdu.reqRspCode());
|
||||
reply->setContentType(pdu.contentType());
|
||||
reply->setFinished();
|
||||
return;
|
||||
@ -664,7 +605,7 @@ void Coap::processBlock2Response(CoapReply *reply, const CoapPdu &pdu)
|
||||
CoapPdu nextBlockRequest;
|
||||
nextBlockRequest.setContentType(reply->request().contentType());
|
||||
nextBlockRequest.setMessageType(reply->request().messageType());
|
||||
nextBlockRequest.setStatusCode(reply->requestMethod());
|
||||
nextBlockRequest.setReqRspCode(reply->requestMethod());
|
||||
nextBlockRequest.setMessageId(pdu.messageId() + 1);
|
||||
nextBlockRequest.setToken(pdu.token());
|
||||
|
||||
@ -716,7 +657,7 @@ void Coap::processBlock2Notification(CoapReply *reply, const CoapPdu &pdu)
|
||||
// respond with ACK
|
||||
CoapPdu responsePdu;
|
||||
responsePdu.setMessageType(CoapPdu::Acknowledgement);
|
||||
responsePdu.setStatusCode(CoapPdu::Empty);
|
||||
responsePdu.setReqRspCode(CoapPdu::Empty);
|
||||
responsePdu.setMessageId(pdu.messageId());
|
||||
responsePdu.setToken(pdu.token());
|
||||
|
||||
@ -737,7 +678,7 @@ void Coap::processBlock2Notification(CoapReply *reply, const CoapPdu &pdu)
|
||||
CoapPdu nextBlockRequest;
|
||||
nextBlockRequest.setContentType(reply->request().contentType());
|
||||
nextBlockRequest.setMessageType(reply->request().messageType());
|
||||
nextBlockRequest.setStatusCode(reply->requestMethod());
|
||||
nextBlockRequest.setReqRspCode(reply->requestMethod());
|
||||
nextBlockRequest.setMessageId(pdu.messageId() + 1);
|
||||
nextBlockRequest.setToken(pdu.token());
|
||||
|
||||
@ -806,7 +747,7 @@ void Coap::onReadyRead()
|
||||
while (m_socket->hasPendingDatagrams()) {
|
||||
QByteArray datagram(m_socket->pendingDatagramSize(), 0);
|
||||
m_socket->readDatagram(datagram.data(), datagram.size(), &hostAddress, &port);
|
||||
qCDebug(dcCoap()) << "Datagram received from:" << hostAddress << ":" << datagram;
|
||||
qCDebug(dcCoap()) << "Datagram received from:" << hostAddress << ":" << datagram.toHex();
|
||||
CoapPdu pdu(datagram);
|
||||
processResponse(pdu, hostAddress, port);
|
||||
}
|
||||
|
||||
@ -65,11 +65,14 @@ public:
|
||||
CoapReply *put(const CoapRequest &request, const QByteArray &data = QByteArray());
|
||||
CoapReply *post(const CoapRequest &request, const QByteArray &data = QByteArray());
|
||||
CoapReply *deleteResource(const CoapRequest &request);
|
||||
CoapReply *customRequest(CoapPdu::ReqRspCode requestCode, const CoapRequest &request, const QByteArray &data = QByteArray());
|
||||
|
||||
// Notifications for observable resources
|
||||
CoapReply *enableResourceNotifications(const CoapRequest &request);
|
||||
CoapReply *disableNotifications(const CoapRequest &request);
|
||||
|
||||
bool joinMulticastGroup(const QHostAddress &address = QHostAddress("224.0.1.187"));
|
||||
bool leaveMulticastGroup(const QHostAddress &address = QHostAddress("224.0.1.187"));
|
||||
|
||||
private:
|
||||
QUdpSocket *m_socket;
|
||||
@ -105,6 +108,7 @@ private:
|
||||
signals:
|
||||
void replyFinished(CoapReply *reply);
|
||||
void notificationReceived(const CoapObserveResource &resource, const int ¬ificationNumber, const QByteArray &payload);
|
||||
void multicastMessageReceived(const QHostAddress &source, const CoapPdu &pdu);
|
||||
|
||||
private slots:
|
||||
void hostLookupFinished(const QHostInfo &hostInfo);
|
||||
|
||||
@ -173,7 +173,7 @@ CoapPdu::CoapPdu(QObject *parent) :
|
||||
QObject(parent),
|
||||
m_version(1),
|
||||
m_messageType(Confirmable),
|
||||
m_statusCode(Empty),
|
||||
m_reqRspCode(Empty),
|
||||
m_messageId(0),
|
||||
m_contentType(TextPlain),
|
||||
m_payload(QByteArray()),
|
||||
@ -187,7 +187,7 @@ CoapPdu::CoapPdu(const QByteArray &data, QObject *parent) :
|
||||
QObject(parent),
|
||||
m_version(1),
|
||||
m_messageType(Confirmable),
|
||||
m_statusCode(Empty),
|
||||
m_reqRspCode(Empty),
|
||||
m_messageId(0),
|
||||
m_contentType(TextPlain),
|
||||
m_payload(QByteArray()),
|
||||
@ -197,20 +197,20 @@ CoapPdu::CoapPdu(const QByteArray &data, QObject *parent) :
|
||||
unpack(data);
|
||||
}
|
||||
|
||||
/*! Returns the human readable status code for the given \a statusCode. */
|
||||
QString CoapPdu::getStatusCodeString(const CoapPdu::StatusCode &statusCode)
|
||||
/*! Returns the human readable string for the given \a reqRspCode. */
|
||||
QString CoapPdu::getReqRspCodeString(CoapPdu::ReqRspCode reqRspCode)
|
||||
{
|
||||
QString statusCodeString;
|
||||
const QMetaObject &metaObject = CoapPdu::staticMetaObject;
|
||||
QMetaEnum statusCodeEnum = metaObject.enumerator(metaObject.indexOfEnumerator("StatusCode"));
|
||||
int classNumber = (statusCode & 0xE0) >> 5;
|
||||
int detailNumber = statusCode & 0x1F;
|
||||
QMetaEnum statusCodeEnum = metaObject.enumerator(metaObject.indexOfEnumerator("ReqRspCode"));
|
||||
int classNumber = (reqRspCode & 0xE0) >> 5;
|
||||
int detailNumber = reqRspCode & 0x1F;
|
||||
statusCodeString.append(QString::number(classNumber) + ".");
|
||||
if (detailNumber < 10)
|
||||
statusCodeString.append("0");
|
||||
|
||||
statusCodeString.append(QString::number(detailNumber) + " ");
|
||||
statusCodeString.append(statusCodeEnum.valueToKey(statusCode));
|
||||
statusCodeString.append(statusCodeEnum.valueToKey(reqRspCode));
|
||||
return statusCodeString;
|
||||
}
|
||||
|
||||
@ -221,7 +221,7 @@ quint8 CoapPdu::version() const
|
||||
}
|
||||
|
||||
/*! Sets the version of this \l{CoapPdu} to the given \a version. */
|
||||
void CoapPdu::setVersion(const quint8 &version)
|
||||
void CoapPdu::setVersion(quint8 version)
|
||||
{
|
||||
m_version = version;
|
||||
}
|
||||
@ -233,21 +233,21 @@ CoapPdu::MessageType CoapPdu::messageType() const
|
||||
}
|
||||
|
||||
/*! Sets the \l{CoapPdu::MessageType} of this \l{CoapPdu} to the given \a messageType. */
|
||||
void CoapPdu::setMessageType(const CoapPdu::MessageType &messageType)
|
||||
void CoapPdu::setMessageType(CoapPdu::MessageType messageType)
|
||||
{
|
||||
m_messageType = messageType;
|
||||
}
|
||||
|
||||
/*! Returns the \l{CoapPdu::StatusCode} of this \l{CoapPdu}. */
|
||||
CoapPdu::StatusCode CoapPdu::statusCode() const
|
||||
/*! Returns the \l{CoapPdu::ReqRspCode} of this \l{CoapPdu}. */
|
||||
CoapPdu::ReqRspCode CoapPdu::reqRspCode() const
|
||||
{
|
||||
return m_statusCode;
|
||||
return m_reqRspCode;
|
||||
}
|
||||
|
||||
/*! Sets the \l{CoapPdu::StatusCode} of this \l{CoapPdu} to the given \a statusCode. */
|
||||
void CoapPdu::setStatusCode(const CoapPdu::StatusCode &statusCode)
|
||||
/*! Sets the \l{CoapPdu::ReqRspCode} of this \l{CoapPdu} to the given \a reqRspCode. */
|
||||
void CoapPdu::setReqRspCode(CoapPdu::ReqRspCode reqRspCode)
|
||||
{
|
||||
m_statusCode = statusCode;
|
||||
m_reqRspCode = reqRspCode;
|
||||
}
|
||||
|
||||
/*! Returns the messageId of this \l{CoapPdu}. */
|
||||
@ -267,7 +267,7 @@ void CoapPdu::createMessageId()
|
||||
}
|
||||
|
||||
/*! Sets the messageId of this \l{CoapPdu} to the given \a messageId. */
|
||||
void CoapPdu::setMessageId(const quint16 &messageId)
|
||||
void CoapPdu::setMessageId(quint16 messageId)
|
||||
{
|
||||
m_messageId = messageId;
|
||||
}
|
||||
@ -282,7 +282,7 @@ CoapPdu::ContentType CoapPdu::contentType() const
|
||||
|
||||
\sa CoapPdu::ContentType
|
||||
*/
|
||||
void CoapPdu::setContentType(const CoapPdu::ContentType &contentType)
|
||||
void CoapPdu::setContentType(ContentType contentType)
|
||||
{
|
||||
m_contentType = contentType;
|
||||
}
|
||||
@ -336,7 +336,7 @@ QList<CoapOption> CoapPdu::options() const
|
||||
|
||||
\sa CoapOption
|
||||
*/
|
||||
void CoapPdu::addOption(const CoapOption::Option &option, const QByteArray &data)
|
||||
void CoapPdu::addOption(CoapOption::Option option, const QByteArray &data)
|
||||
{
|
||||
// set pdu data from the option
|
||||
switch (option) {
|
||||
@ -384,7 +384,7 @@ CoapPduBlock CoapPdu::block() const
|
||||
}
|
||||
|
||||
/*! Returns true if this \l{CoapPdu} has the given \a option. */
|
||||
bool CoapPdu::hasOption(const CoapOption::Option &option) const
|
||||
bool CoapPdu::hasOption(CoapOption::Option option) const
|
||||
{
|
||||
foreach (const CoapOption &o, m_options) {
|
||||
if (o.option() == option)
|
||||
@ -393,12 +393,22 @@ bool CoapPdu::hasOption(const CoapOption::Option &option) const
|
||||
return false;
|
||||
}
|
||||
|
||||
CoapOption CoapPdu::option(CoapOption::Option option) const
|
||||
{
|
||||
foreach (const CoapOption &o, m_options) {
|
||||
if (o.option() == option) {
|
||||
return o;
|
||||
}
|
||||
}
|
||||
return CoapOption();
|
||||
}
|
||||
|
||||
/*! Resets this \l{CoapPdu} to the default values. */
|
||||
void CoapPdu::clear()
|
||||
{
|
||||
m_version = 1;
|
||||
m_messageType = Confirmable;
|
||||
m_statusCode = Empty;
|
||||
m_reqRspCode = Empty;
|
||||
m_messageId = 0;
|
||||
m_contentType = TextPlain;
|
||||
m_token.clear();
|
||||
@ -426,7 +436,7 @@ QByteArray CoapPdu::pack() const
|
||||
rawHeader[0] = m_version << 6;
|
||||
rawHeader[0] |= (quint8)m_messageType << 4;
|
||||
rawHeader[0] |= (quint8)m_token.size();
|
||||
rawHeader[1] = (quint8)m_statusCode;
|
||||
rawHeader[1] = (quint8)m_reqRspCode;
|
||||
rawHeader[2] = (quint8)(m_messageId >> 8);
|
||||
rawHeader[3] = (quint8)(m_messageId & 0xff);
|
||||
pduData = QByteArray::fromRawData((char *)rawHeader, 4);
|
||||
@ -532,8 +542,8 @@ void CoapPdu::unpack(const QByteArray &data)
|
||||
|
||||
quint8 reqRspCode;
|
||||
stream >> reqRspCode;
|
||||
setStatusCode(static_cast<StatusCode>(reqRspCode));
|
||||
// qCDebug(dcCoap()) << "Req/Rsp code:" << statusCode();
|
||||
setReqRspCode(static_cast<ReqRspCode>(reqRspCode));
|
||||
// qCDebug(dcCoap()) << "Req/Rsp code:" << reqRspCode();
|
||||
|
||||
quint16 messageId;
|
||||
stream >> messageId;
|
||||
@ -611,7 +621,7 @@ QDebug operator<<(QDebug debug, const CoapPdu &coapPdu)
|
||||
const QMetaObject &metaObject = CoapPdu::staticMetaObject;
|
||||
QMetaEnum messageTypeEnum = metaObject.enumerator(metaObject.indexOfEnumerator("MessageType"));
|
||||
debug.nospace() << "CoapPdu(" << messageTypeEnum.valueToKey(coapPdu.messageType()) << ")" << endl;
|
||||
debug.nospace() << " Code: " << CoapPdu::getStatusCodeString(coapPdu.statusCode()) << endl;
|
||||
debug.nospace() << " Code: " << CoapPdu::getReqRspCodeString(coapPdu.reqRspCode()) << endl;
|
||||
debug.nospace() << " Ver: " << coapPdu.version() << endl;
|
||||
debug.nospace() << " Token: " << coapPdu.token().length() << " " << "0x"+ coapPdu.token().toHex() << endl;
|
||||
debug.nospace() << " Message ID: " << coapPdu.messageId() << endl;
|
||||
|
||||
@ -72,7 +72,7 @@ public:
|
||||
|
||||
// Methods: https://tools.ietf.org/html/rfc7252#section-5.8
|
||||
// Respond codes: https://tools.ietf.org/html/rfc7252#section-12.1.2
|
||||
enum StatusCode {
|
||||
enum ReqRspCode {
|
||||
Empty = 0x00, // Empty message (ping)
|
||||
Get = 0x01, // Method GET
|
||||
Post = 0x02, // Method POST
|
||||
@ -102,7 +102,7 @@ public:
|
||||
GatewayTimeout = 0xa4, // 5.04
|
||||
ProxyingNotSupported = 0xa5 // 5.05
|
||||
};
|
||||
Q_ENUM(StatusCode)
|
||||
Q_ENUM(ReqRspCode)
|
||||
|
||||
// https://tools.ietf.org/html/rfc7252#section-12.3
|
||||
enum ContentType {
|
||||
@ -128,24 +128,24 @@ public:
|
||||
CoapPdu(QObject *parent = 0);
|
||||
CoapPdu(const QByteArray &data, QObject *parent = 0);
|
||||
|
||||
static QString getStatusCodeString(const StatusCode &statusCode);
|
||||
static QString getReqRspCodeString(CoapPdu::ReqRspCode reqRspCode);
|
||||
|
||||
// header fields
|
||||
quint8 version() const;
|
||||
void setVersion(const quint8 &version);
|
||||
void setVersion(quint8 version);
|
||||
|
||||
MessageType messageType() const;
|
||||
void setMessageType(const MessageType &messageType);
|
||||
void setMessageType(MessageType messageType);
|
||||
|
||||
StatusCode statusCode() const;
|
||||
void setStatusCode(const StatusCode &statusCode);
|
||||
ReqRspCode reqRspCode() const;
|
||||
void setReqRspCode(ReqRspCode reqRspCode);
|
||||
|
||||
quint16 messageId() const;
|
||||
void createMessageId();
|
||||
void setMessageId(const quint16 &messageId);
|
||||
void setMessageId(quint16 messageId);
|
||||
|
||||
ContentType contentType() const;
|
||||
void setContentType(const ContentType &contentType);
|
||||
void setContentType(ContentType contentType);
|
||||
|
||||
QByteArray token() const;
|
||||
void createToken();
|
||||
@ -156,11 +156,12 @@ public:
|
||||
void setPayload(const QByteArray &payload);
|
||||
|
||||
QList<CoapOption> options() const;
|
||||
void addOption(const CoapOption::Option &option, const QByteArray &data);
|
||||
void addOption(CoapOption::Option option, const QByteArray &data);
|
||||
|
||||
CoapPduBlock block() const;
|
||||
|
||||
bool hasOption(const CoapOption::Option &option) const;
|
||||
bool hasOption(CoapOption::Option option) const;
|
||||
CoapOption option(CoapOption::Option option) const;
|
||||
|
||||
void clear();
|
||||
bool isValid() const;
|
||||
@ -170,7 +171,7 @@ public:
|
||||
private:
|
||||
quint8 m_version;
|
||||
MessageType m_messageType;
|
||||
StatusCode m_statusCode;
|
||||
ReqRspCode m_reqRspCode;
|
||||
quint16 m_messageId;
|
||||
ContentType m_contentType;
|
||||
QByteArray m_token;
|
||||
|
||||
@ -184,10 +184,10 @@ CoapPdu::MessageType CoapReply::messageType() const
|
||||
return m_messageType;
|
||||
}
|
||||
|
||||
/*! Returns the \l{CoapPdu::StatusCode} of this \l{CoapReply}. */
|
||||
CoapPdu::StatusCode CoapReply::statusCode() const
|
||||
/*! Returns the \l{CoapPdu::ReqRspCode} of this \l{CoapReply}. */
|
||||
CoapPdu::ReqRspCode CoapReply::reqRspCode() const
|
||||
{
|
||||
return m_statusCode;
|
||||
return m_reqRspCode;
|
||||
}
|
||||
|
||||
CoapReply::CoapReply(const CoapRequest &request, QObject *parent) :
|
||||
@ -198,7 +198,7 @@ CoapReply::CoapReply(const CoapRequest &request, QObject *parent) :
|
||||
m_retransmissions(1),
|
||||
m_contentType(CoapPdu::TextPlain),
|
||||
m_messageType(CoapPdu::Acknowledgement),
|
||||
m_statusCode(CoapPdu::Empty),
|
||||
m_reqRspCode(CoapPdu::Empty),
|
||||
m_lockedUp(false)
|
||||
{
|
||||
m_timer = new QTimer(this);
|
||||
@ -275,19 +275,19 @@ void CoapReply::resend()
|
||||
}
|
||||
}
|
||||
|
||||
void CoapReply::setContentType(const CoapPdu::ContentType contentType)
|
||||
void CoapReply::setContentType(CoapPdu::ContentType contentType)
|
||||
{
|
||||
m_contentType = contentType;
|
||||
}
|
||||
|
||||
void CoapReply::setMessageType(const CoapPdu::MessageType &messageType)
|
||||
void CoapReply::setMessageType(CoapPdu::MessageType messageType)
|
||||
{
|
||||
m_messageType = messageType;
|
||||
}
|
||||
|
||||
void CoapReply::setStatusCode(const CoapPdu::StatusCode &statusCode)
|
||||
void CoapReply::setReqRspCode(CoapPdu::ReqRspCode reqRspCode)
|
||||
{
|
||||
m_statusCode = statusCode;
|
||||
m_reqRspCode = reqRspCode;
|
||||
}
|
||||
|
||||
void CoapReply::setHostAddress(const QHostAddress &address)
|
||||
@ -300,7 +300,7 @@ QHostAddress CoapReply::hostAddress() const
|
||||
return m_hostAddress;
|
||||
}
|
||||
|
||||
void CoapReply::setPort(const int &port)
|
||||
void CoapReply::setPort(int port)
|
||||
{
|
||||
m_port = port;
|
||||
}
|
||||
@ -320,12 +320,12 @@ QByteArray CoapReply::requestPayload() const
|
||||
return m_requestPayload;
|
||||
}
|
||||
|
||||
void CoapReply::setRequestMethod(const CoapPdu::StatusCode &method)
|
||||
void CoapReply::setRequestMethod(CoapPdu::ReqRspCode method)
|
||||
{
|
||||
m_requestMethod = method;
|
||||
}
|
||||
|
||||
CoapPdu::StatusCode CoapReply::requestMethod() const
|
||||
CoapPdu::ReqRspCode CoapReply::requestMethod() const
|
||||
{
|
||||
return m_requestMethod;
|
||||
}
|
||||
@ -352,7 +352,7 @@ QDebug operator<<(QDebug debug, CoapReply *reply)
|
||||
QMetaEnum messageTypeEnum = metaObject.enumerator(metaObject.indexOfEnumerator("MessageType"));
|
||||
QMetaEnum contentTypeEnum = metaObject.enumerator(metaObject.indexOfEnumerator("ContentType"));
|
||||
debug.nospace() << "CoapReply(" << messageTypeEnum.valueToKey(reply->messageType()) << ")" << endl;
|
||||
debug.nospace() << " Status code: " << CoapPdu::getStatusCodeString(reply->statusCode()) << endl;
|
||||
debug.nospace() << " Status code: " << CoapPdu::getReqRspCodeString(reply->reqRspCode()) << endl;
|
||||
debug.nospace() << " Content type: " << contentTypeEnum.valueToKey(reply->contentType()) << endl;
|
||||
debug.nospace() << " Payload size: " << reply->payload().size() << endl;
|
||||
|
||||
|
||||
@ -66,7 +66,7 @@ public:
|
||||
|
||||
CoapPdu::ContentType contentType() const;
|
||||
CoapPdu::MessageType messageType() const;
|
||||
CoapPdu::StatusCode statusCode() const;
|
||||
CoapPdu::ReqRspCode reqRspCode() const;
|
||||
|
||||
private:
|
||||
CoapReply(const CoapRequest &request, QObject *parent = 0);
|
||||
@ -78,9 +78,9 @@ private:
|
||||
|
||||
void resend();
|
||||
|
||||
void setContentType(const CoapPdu::ContentType contentType = CoapPdu::TextPlain);
|
||||
void setMessageType(const CoapPdu::MessageType &messageType);
|
||||
void setStatusCode(const CoapPdu::StatusCode &statusCode);
|
||||
void setContentType(CoapPdu::ContentType contentType = CoapPdu::TextPlain);
|
||||
void setMessageType(CoapPdu::MessageType messageType);
|
||||
void setReqRspCode(CoapPdu::ReqRspCode reqRspCode);
|
||||
|
||||
QTimer *m_timer;
|
||||
CoapRequest m_request;
|
||||
@ -93,20 +93,20 @@ private:
|
||||
|
||||
CoapPdu::ContentType m_contentType;
|
||||
CoapPdu::MessageType m_messageType;
|
||||
CoapPdu::StatusCode m_statusCode;
|
||||
CoapPdu::ReqRspCode m_reqRspCode;
|
||||
|
||||
// data for the request
|
||||
void setHostAddress(const QHostAddress &address);
|
||||
QHostAddress hostAddress() const;
|
||||
|
||||
void setPort(const int &port);
|
||||
void setPort(int port);
|
||||
int port() const;
|
||||
|
||||
void setRequestPayload(const QByteArray &requestPayload);
|
||||
QByteArray requestPayload() const;
|
||||
|
||||
void setRequestMethod(const CoapPdu::StatusCode &method);
|
||||
CoapPdu::StatusCode requestMethod() const;
|
||||
void setRequestMethod(CoapPdu::ReqRspCode method);
|
||||
CoapPdu::ReqRspCode requestMethod() const;
|
||||
|
||||
void setRequestData(const QByteArray &requestData);
|
||||
QByteArray requestData() const;
|
||||
@ -125,7 +125,7 @@ private:
|
||||
|
||||
QHostAddress m_hostAddress;
|
||||
int m_port;
|
||||
CoapPdu::StatusCode m_requestMethod;
|
||||
CoapPdu::ReqRspCode m_requestMethod;
|
||||
QByteArray m_requestPayload;
|
||||
QByteArray m_requestData;
|
||||
bool m_lockedUp;
|
||||
|
||||
@ -44,7 +44,7 @@ CoapRequest::CoapRequest(const QUrl &url) :
|
||||
m_url(url),
|
||||
m_contentType(CoapPdu::TextPlain),
|
||||
m_messageType(CoapPdu::Confirmable),
|
||||
m_statusCode(CoapPdu::Empty)
|
||||
m_reqRspCode(CoapPdu::Empty)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
@ -57,7 +57,7 @@ private:
|
||||
QUrl m_url;
|
||||
CoapPdu::ContentType m_contentType;
|
||||
CoapPdu::MessageType m_messageType;
|
||||
CoapPdu::StatusCode m_statusCode;
|
||||
CoapPdu::ReqRspCode m_reqRspCode;
|
||||
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user