295 lines
10 KiB
C++
295 lines
10 KiB
C++
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
|
*
|
|
* Copyright 2013 - 2020, nymea GmbH
|
|
* Contact: contact@nymea.io
|
|
*
|
|
* This file is part of nymea-zigbee.
|
|
* 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 <https://www.gnu.org/licenses/>.
|
|
*
|
|
* 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 ZIGBEEDEVICEPROFILE_H
|
|
#define ZIGBEEDEVICEPROFILE_H
|
|
|
|
#include <QDebug>
|
|
#include <QObject>
|
|
|
|
#include "zigbee.h"
|
|
|
|
class ZigbeeDeviceProfile
|
|
{
|
|
Q_GADGET
|
|
|
|
public:
|
|
enum Status {
|
|
StatusSuccess = 0x00,
|
|
StatusInvalidRequestType = 0x80,
|
|
StatusDeviceNotFound = 0x81,
|
|
StatusInvalidEndpoint = 0x82,
|
|
StatusNotActive = 0x83,
|
|
StatusNotSupported = 0x84,
|
|
StatusTimeout = 0x85,
|
|
StatusNoMatch = 0x86,
|
|
StatusNoEntry = 0x88,
|
|
StatusNoDescriptor = 0x89,
|
|
StatusInsufficientSpace = 0x8a,
|
|
StatusNotPermitted = 0x8b,
|
|
StatusTableFull = 0x8c,
|
|
StatusNotAuthorized = 0x8d,
|
|
StatusDeviceBindingTableFull = 0x8e
|
|
};
|
|
Q_ENUM(Status)
|
|
|
|
enum ZdoCommand {
|
|
/* Requests */
|
|
/*Device and service discovery */
|
|
NetworkAddressRequest = 0x0000,
|
|
IeeeAddressRequest = 0x0001,
|
|
NodeDescriptorRequest = 0x0002,
|
|
PowerDescriptorRequest = 0x0003,
|
|
SimpleDescriptorRequest = 0x0004,
|
|
ActiveEndpointsRequest = 0x0005,
|
|
MatchDescriptorsRequest = 0x0006,
|
|
ComplexDescriptorRequest = 0x0010,
|
|
UserDescriptorRequest = 0x0011,
|
|
DiscoveryCacheRequest = 0x0012,
|
|
DeviceAnnounce = 0x0013,
|
|
UserDescriptorSet = 0x0014,
|
|
SystemServerDiscoveryRequest = 0x0015,
|
|
DiscoveryStoreRequest = 0x0016,
|
|
NodeDescriptorStoreRequest = 0x0017,
|
|
PowerDescriptorStoreRequest = 0x0018,
|
|
ActiveEndpointStoreRequest = 0x0019,
|
|
SimpleDescriptorStoreRequest = 0x001A,
|
|
RemoveNodeCacheRequest = 0x001B,
|
|
FindNodeCacheRequest = 0x001C,
|
|
ExtendedSimpleDescriptorRequest = 0x001D,
|
|
ExtendedActiveEndpointRequest = 0x001E,
|
|
ParentAnnounceRequest = 0x001F,
|
|
|
|
/* Binding */
|
|
EndDeviceBindRequest = 0x0020,
|
|
BindRequest = 0x0021,
|
|
UnbindRequest = 0x0022,
|
|
BindRegisterRequest = 0x0023,
|
|
ReplaceDeviceRequest = 0x0024,
|
|
StoreBackupBindEntryRequest = 0x0025,
|
|
RemoveBackupBindEntryRequest = 0x0026,
|
|
BackupBindTableRequest = 0x0027,
|
|
RecoverBindTableRequest = 0x0028,
|
|
BackupSourceBindRequest = 0x0029,
|
|
RecoverSourceBindRequest = 0x002A,
|
|
|
|
/* Network management */
|
|
MgmtNetworkDiscoveryRequest = 0x0030,
|
|
MgmtLqiRequest = 0x0031,
|
|
MgmtRoutingTableRequest = 0x0032,
|
|
MgmtBindRequest = 0x0033,
|
|
MgmtLeaveRequest = 0x0034,
|
|
MgmtDirectJoinRequest = 0x0035,
|
|
MgmtPermitJoinRequest = 0x0036,
|
|
MgmtCacheRequest = 0x0037,
|
|
MgmtNetworkUpdateRequest = 0x0038,
|
|
|
|
/* Responses */
|
|
/*Device and service discovery */
|
|
NetworkAddressResponse = 0x8000,
|
|
IeeeAddressResponse = 0x8001,
|
|
NodeDescriptorResponse = 0x8002,
|
|
PowerDescriptorResponse = 0x8003,
|
|
SimpleDescriptorResponse = 0x8004,
|
|
ActiveEndpointsResponse = 0x8005,
|
|
MatchDescriptorsResponse = 0x8006,
|
|
ComplexDescriptorResponse = 0x8010,
|
|
UserDescriptorResponse = 0x8011,
|
|
DiscoveryCacheResponse = 0x8012,
|
|
UserDescriptorSetResponse = 0x8014,
|
|
SystemServerDiscoveryResponse = 0x8015,
|
|
DiscoveryStoreResponse = 0x8016,
|
|
NodeDescriptorStoreResponse = 0x8017,
|
|
PowerDescriptorStoreResponse = 0x8018,
|
|
ActiveEndpointStoreResponse = 0x8019,
|
|
SimpleDescriptorStoreResponse = 0x801A,
|
|
RemoveNodeCacheResponse = 0x801B,
|
|
FindNodeCacheResponse = 0x801C,
|
|
ExtendedSimpleDescriptorResponse = 0x801D,
|
|
ExtendedActiveEndpointResponse = 0x801E,
|
|
ParentAnnounceRespone = 0x801F,
|
|
|
|
/* Binding */
|
|
EndDeviceBindResponse = 0x8020,
|
|
BindResponse = 0x8021,
|
|
UnbindResponse = 0x8022,
|
|
BindRegisterResponse = 0x8023,
|
|
ReplaceDeviceResponse = 0x8024,
|
|
StoreBackupBindEntryResponse = 0x8025,
|
|
RemoveBackupBindEntryResponse = 0x8026,
|
|
BackupBindTableResponse = 0x8027,
|
|
RecoverBindTableResponse = 0x8028,
|
|
BackupSourceBindResponse = 0x8029,
|
|
RecoverSourceBindResponse = 0x802A,
|
|
|
|
/* Network management */
|
|
MgmtNetworkDiscoveryResponse = 0x8030,
|
|
MgmtLqiResponse = 0x8031,
|
|
MgmtRoutingTableResponse = 0x8032,
|
|
MgmtBindResponse = 0x8033,
|
|
MgmtLeaveResponse = 0x8034,
|
|
MgmtDirectJoinResponse = 0x8035,
|
|
MgmtPermitJoinResponse = 0x8036,
|
|
MgmtCacheResponse = 0x8037,
|
|
MgmtNetworkUpdateResponse = 0x8038
|
|
};
|
|
Q_ENUM(ZdoCommand)
|
|
|
|
// For sending
|
|
typedef struct Frame {
|
|
quint8 transactionSequenceNumber = 0;
|
|
QByteArray payload;
|
|
} Frame;
|
|
|
|
// Receiving
|
|
typedef struct Adpu {
|
|
quint8 transactionSequenceNumber = 0;
|
|
ZigbeeDeviceProfile::Status status = ZigbeeDeviceProfile::StatusSuccess;
|
|
quint16 addressOfInterest = 0;
|
|
QByteArray payload;
|
|
} Adpu;
|
|
|
|
static ZigbeeDeviceProfile::Adpu parseAdpu(const QByteArray &adpu);
|
|
|
|
// Node information
|
|
enum NodeType {
|
|
NodeTypeCoordinator = 0,
|
|
NodeTypeRouter = 1,
|
|
NodeTypeEndDevice = 2
|
|
};
|
|
Q_ENUM(NodeType)
|
|
|
|
enum FrequencyBand {
|
|
FrequencyBand868Mhz,
|
|
FrequencyBand902Mhz,
|
|
FrequencyBand2400Mhz
|
|
};
|
|
Q_ENUM(FrequencyBand)
|
|
|
|
enum DeviceType {
|
|
DeviceTypeFullFunction,
|
|
DeviceTypeReducedFunction
|
|
};
|
|
Q_ENUM(DeviceType)
|
|
|
|
enum Relationship {
|
|
Parent,
|
|
Child,
|
|
Sibling
|
|
};
|
|
Q_ENUM(Relationship)
|
|
|
|
enum PowerMode {
|
|
PowerModeAlwaysOn,
|
|
PowerModeOnPeriodically,
|
|
PowerModeOnWhenStimulated
|
|
};
|
|
Q_ENUM(PowerMode)
|
|
|
|
enum PowerSource {
|
|
PowerSourcePermanentMainSupply,
|
|
PowerSourceRecharchableBattery,
|
|
PowerSourceDisposableBattery
|
|
};
|
|
Q_ENUM(PowerSource)
|
|
|
|
enum PowerLevel {
|
|
PowerLevelCriticalLow,
|
|
PowerLevelLow,
|
|
PowerLevelOk,
|
|
PowerLevelFull
|
|
};
|
|
Q_ENUM(PowerLevel)
|
|
|
|
typedef struct MacCapabilities {
|
|
quint8 flag = 0x00; // For saving
|
|
bool alternatePanCoordinator = false;
|
|
DeviceType deviceType = DeviceTypeReducedFunction;
|
|
bool powerSourceFlagMainPower = false;
|
|
bool receiverOnWhenIdle = false;
|
|
bool securityCapability = false;
|
|
bool allocateAddress = false;
|
|
} MacCapabilities;
|
|
|
|
typedef struct DescriptorCapabilities {
|
|
quint8 descriptorCapabilitiesFlag = 0x00; // For saving
|
|
bool extendedActiveEndpointListAvailable = false;
|
|
bool extendedSimpleDescriptorListAvailable = false;
|
|
} DescriptorCapabilities;
|
|
|
|
typedef struct ServerMask {
|
|
quint16 serverMaskFlag = 0x0000; // For saving
|
|
bool primaryTrustCenter = false;
|
|
bool backupTrustCenter = false;
|
|
bool primaryBindingCache = false;
|
|
bool backupBindingCache = false;
|
|
bool primaryDiscoveryCache = false;
|
|
bool backupDiscoveryCache = false;
|
|
bool networkManager = false;
|
|
quint8 stackComplianceVersion = 0;
|
|
} ServerMask;
|
|
|
|
typedef struct NodeDescriptor {
|
|
QByteArray descriptorRawData; // For saving
|
|
NodeType nodeType = NodeTypeEndDevice;
|
|
bool complexDescriptorAvailable = false;
|
|
bool userDescriptorAvailable = false;
|
|
FrequencyBand frequencyBand = FrequencyBand2400Mhz;
|
|
MacCapabilities macCapabilities;
|
|
quint16 manufacturerCode = 0;
|
|
quint8 maximumBufferSize = 0;
|
|
quint16 maximumRxSize = 0;
|
|
ServerMask serverMask;
|
|
quint16 maximumTxSize = 0;
|
|
DescriptorCapabilities descriptorCapabilities;
|
|
} NodeDescriptor;
|
|
|
|
typedef struct PowerDescriptor {
|
|
quint16 powerDescriptoFlag = 0x0000;
|
|
PowerMode powerMode = PowerModeAlwaysOn;
|
|
QList<PowerSource> availablePowerSources;
|
|
PowerSource powerSource = PowerSourcePermanentMainSupply;
|
|
PowerLevel powerLevel = PowerLevelFull;
|
|
} PowerDescriptor;
|
|
|
|
static NodeDescriptor parseNodeDescriptor(const QByteArray &payload);
|
|
static MacCapabilities parseMacCapabilities(quint8 macCapabilitiesFlag);
|
|
static ServerMask parseServerMask(quint16 serverMaskFlag);
|
|
static DescriptorCapabilities parseDescriptorCapabilities(quint8 descriptorCapabilitiesFlag);
|
|
|
|
static PowerDescriptor parsePowerDescriptor(quint16 powerDescriptorFlag);
|
|
};
|
|
|
|
QDebug operator<<(QDebug debug, const ZigbeeDeviceProfile::Adpu &deviceAdpu);
|
|
QDebug operator<<(QDebug debug, const ZigbeeDeviceProfile::NodeDescriptor &nodeDescriptor);
|
|
QDebug operator<<(QDebug debug, const ZigbeeDeviceProfile::MacCapabilities &macCapabilities);
|
|
QDebug operator<<(QDebug debug, const ZigbeeDeviceProfile::ServerMask &serverMask);
|
|
QDebug operator<<(QDebug debug, const ZigbeeDeviceProfile::DescriptorCapabilities &descriptorCapabilities);
|
|
QDebug operator<<(QDebug debug, const ZigbeeDeviceProfile::PowerDescriptor &powerDescriptor);
|
|
|
|
#endif // ZIGBEEDEVICEPROFILE_H
|