/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright 2013 - 2020, nymea GmbH * Contact: contact@nymea.io * * This file is part of nymea. * This project including source code and documentation is protected by * copyright law, and remains the property of nymea GmbH. All rights, including * reproduction, publication, editing and translation, are reserved. The use of * this project is subject to the terms of a license agreement to be concluded * with nymea GmbH in accordance with the terms of use of nymea GmbH, available * under https://nymea.io/license * * GNU Lesser General Public License Usage * Alternatively, this project may be redistributed and/or modified under the * terms of the GNU Lesser General Public License as published by the Free * Software Foundation; version 3. This project is distributed in the hope that * it will be useful, but WITHOUT ANY WARRANTY; without even the implied * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this project. If not, see . * * For any further details and any questions please contact us under * contact@nymea.io or see our FAQ/Licensing Information on * https://nymea.io/license/faq * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ #ifndef COAP_H #define COAP_H #include #include #include #include #include #include #include #include "libnymea.h" #include "coaprequest.h" #include "coapreply.h" #include "coapobserveresource.h" /* Information about CoAP * * The Constrained Application Protocol (CoAP) : https://tools.ietf.org/html/rfc7252 * Blockwise transfers in CoAP : https://tools.ietf.org/html/draft-ietf-core-block-18 * Constrained RESTful Environments (CoRE) Link Format : http://tools.ietf.org/html/rfc6690 * Observing Resources in CoAP : https://tools.ietf.org/html/rfc7641 * */ class LIBNYMEA_EXPORT Coap : public QObject { Q_OBJECT public: Coap(QObject *parent = nullptr, const quint16 &port = 5683); CoapReply *ping(const CoapRequest &request); CoapReply *get(const CoapRequest &request); CoapReply *put(const CoapRequest &request, const QByteArray &data = QByteArray()); CoapReply *post(const CoapRequest &request, const QByteArray &data = QByteArray()); CoapReply *deleteResource(const CoapRequest &request); // Notifications for observable resources CoapReply *enableResourceNotifications(const CoapRequest &request); CoapReply *disableNotifications(const CoapRequest &request); private: QUdpSocket *m_socket; QPointer m_reply; QQueue m_replyQueue; QHash m_runningHostLookups; QHash m_observeResources; // token | resource // Blockwise notifications QPointer m_observerReply; QHash m_observeReplyResource; // observe reply | resource QHash m_observeBlockwise; // observe reply | observe nr. void lookupHost(); void sendRequest(CoapReply *reply, const bool &lookedUp = false); void sendData(const QHostAddress &hostAddress, const quint16 &port, const QByteArray &data); void sendCoapPdu(const QHostAddress &address, const quint16 &port, const CoapPdu &pdu); void processResponse(const CoapPdu &pdu, const QHostAddress &address, const quint16 &port); void processIdBasedResponse(CoapReply *reply, const CoapPdu &pdu); void processTokenBasedResponse(CoapReply *reply, const CoapPdu &pdu); void processNotification(const CoapPdu &pdu, const QHostAddress &address, const quint16 &port); void processBlock1Response(CoapReply *reply, const CoapPdu &pdu); void processBlock2Response(CoapReply *reply, const CoapPdu &pdu); void processBlock2Notification(CoapReply *reply, const CoapPdu &pdu); signals: void replyFinished(CoapReply *reply); void notificationReceived(const CoapObserveResource &resource, const int ¬ificationNumber, const QByteArray &payload); private slots: void hostLookupFinished(const QHostInfo &hostInfo); void onReadyRead(); void onReplyTimeout(); void onReplyFinished(); }; #endif // COAP_H