save
This commit is contained in:
parent
933c73dc04
commit
8030843ed3
Binary file not shown.
Binary file not shown.
BIN
docs/docs-05-3474-21-0csg-zigbee-specification.pdf
Normal file
BIN
docs/docs-05-3474-21-0csg-zigbee-specification.pdf
Normal file
Binary file not shown.
20
main.cpp
20
main.cpp
@ -2,7 +2,9 @@
|
||||
|
||||
using namespace std;
|
||||
|
||||
extern ZigateBackend zigateBkd;
|
||||
int debugLevel = DEBUG | INFO | WARNING | ERROR;
|
||||
//ResponseList responseList;
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
@ -10,13 +12,15 @@ int main(int argc, char *argv[])
|
||||
QCoreApplication::setOrganizationName("zigbeemanager");
|
||||
QCoreApplication::setApplicationName("zigbeemanager");
|
||||
|
||||
ZigateBackend zigateBkd;
|
||||
// zigbeemgr();
|
||||
|
||||
//QObject::connect(&zigateBkd, SIGNAL(readyRead()), &zigateBkd, SLOT(getData()));
|
||||
// QObject::connect(&zigateBkd, SIGNAL(bytesWritten()), &zigateBkd, SLOT(confirmWrite()));
|
||||
|
||||
zigateBkd.sendCmd("0049","FFFC1E");
|
||||
|
||||
initBackends();
|
||||
cout << "sending command 0x0010" << endl;
|
||||
zigateBkd.sendCmd("0010", "");
|
||||
zigateBkd.getResponse();
|
||||
//return a.exec();
|
||||
}
|
||||
|
||||
bool initBackends()
|
||||
{
|
||||
zigateBkd.initBackend();
|
||||
return false;
|
||||
}
|
||||
|
2
main.h
2
main.h
@ -18,4 +18,6 @@
|
||||
#include "library.h"
|
||||
#include "zigateBackend.h"
|
||||
|
||||
bool initBackends();
|
||||
|
||||
#endif // MAIN_H
|
||||
|
29
responseClasses.h
Normal file
29
responseClasses.h
Normal file
@ -0,0 +1,29 @@
|
||||
#ifndef RESPONSECLASSES_H
|
||||
#define RESPONSECLASSES_H
|
||||
#include <QByteArray>
|
||||
#include <QString>
|
||||
#include <QVariant>
|
||||
#include <QMap>
|
||||
#include <QList>
|
||||
|
||||
class ResponseProperties
|
||||
{
|
||||
public:
|
||||
QByteArray code;
|
||||
QByteArray datas;
|
||||
QString description;
|
||||
QMap <uint, QList<QVariant>> properties;
|
||||
QMap <uint, QMap<uint,QString>> propertyDetail;
|
||||
QFunctionPointer manager;
|
||||
};
|
||||
|
||||
class Response
|
||||
{
|
||||
public:
|
||||
QByteArray code;
|
||||
QByteArray datas;
|
||||
QString description;
|
||||
QFunctionPointer manager;
|
||||
};
|
||||
|
||||
#endif // RESPONSECLASSES_H
|
@ -39,9 +39,12 @@ void ZigbeeMgr::getData()
|
||||
cout << "getData()" << endl;
|
||||
if (this->waitForReadyRead(20000))
|
||||
{
|
||||
cout << "reading datas" << endl;
|
||||
this->dataRead = this->readAll();
|
||||
cout << this->dataRead.toHex().toStdString() << endl;
|
||||
while (!atEnd())
|
||||
{
|
||||
cout << "reading datas" << endl;
|
||||
this->dataRead += this->readAll();
|
||||
cout << this->dataRead.toHex().toStdString() << endl;
|
||||
}
|
||||
}else
|
||||
{
|
||||
cout << "Reading datas has timed out" << endl;
|
||||
@ -50,7 +53,7 @@ void ZigbeeMgr::getData()
|
||||
|
||||
void ZigbeeMgr::write(QByteArray msg)
|
||||
{
|
||||
cout << "write" << endl;
|
||||
cout << "writing to serial" << endl;
|
||||
dataWriteSize = msg.count();
|
||||
cout << "size = " << dataWriteSize << endl;
|
||||
this->writeData(msg, msg.count()+1);
|
||||
|
@ -1,12 +1,15 @@
|
||||
#include "main.h"
|
||||
#include "responseClasses.h"
|
||||
#include <unistd.h>
|
||||
|
||||
using namespace std;
|
||||
|
||||
ZigateBackend zigateBkd;
|
||||
|
||||
ZigateBackend::ZigateBackend()
|
||||
{
|
||||
bool result;
|
||||
cmdList["heartbeatEnable"].append({"0008", "0001", "0210"});
|
||||
// cmdList["heartbeatEnable"].append({"0008", "0001", "0210"});
|
||||
|
||||
this->deviceName = "ZIGATE";
|
||||
while (1)
|
||||
@ -23,8 +26,9 @@ ZigateBackend::ZigateBackend()
|
||||
}
|
||||
}
|
||||
this->init();
|
||||
this->resultCodes.insert(0x8000, "Status");
|
||||
//resultCodes.insert();
|
||||
// this->resultCodes.insert(0x8000, "Status");
|
||||
// resultCodes.insert();
|
||||
|
||||
}
|
||||
|
||||
ZigateBackend::~ZigateBackend()
|
||||
@ -58,7 +62,6 @@ QByteArray ZigateBackend::transcode(QByteArray datas)
|
||||
QByteArray msg = "";
|
||||
int i;
|
||||
QByteArray byte;
|
||||
|
||||
if (datas.count()%2 != 0)
|
||||
{
|
||||
return "-1";
|
||||
@ -78,12 +81,42 @@ QByteArray ZigateBackend::transcode(QByteArray datas)
|
||||
return msg;
|
||||
}
|
||||
|
||||
QByteArray ZigateBackend::unTranscode(QByteArray datas)
|
||||
{
|
||||
QByteArray result;
|
||||
int i;
|
||||
char tmp;
|
||||
|
||||
if (datas.isEmpty())
|
||||
{
|
||||
return "-1";
|
||||
}
|
||||
|
||||
for (i=1;i<=datas.count()-2;i++)
|
||||
{
|
||||
tmp = datas.at(i);
|
||||
if (tmp == 0x02)
|
||||
{
|
||||
i++;
|
||||
result.append(datas[i] ^ 16);
|
||||
}else
|
||||
{
|
||||
if (tmp != 0 and tmp != 1)
|
||||
{
|
||||
result += tmp;
|
||||
}
|
||||
}
|
||||
}
|
||||
cout << result.toHex(' ').toStdString() << endl;
|
||||
return result;
|
||||
}
|
||||
|
||||
void ZigateBackend::sendCmd(QByteArray cmd, QByteArray datas)
|
||||
{
|
||||
QByteArray msg;
|
||||
QByteArray len;
|
||||
|
||||
len = QByteArray::number(datas.count()/2+1, 16).insert(0,"000").right(4);
|
||||
len = QByteArray::number(datas.count()/2, 16).insert(0,"000").right(4);
|
||||
msg = QByteArray::fromHex("01");
|
||||
msg += QByteArray::fromHex(transcode(cmd));
|
||||
msg += QByteArray::fromHex(transcode(len));
|
||||
@ -92,211 +125,81 @@ void ZigateBackend::sendCmd(QByteArray cmd, QByteArray datas)
|
||||
msg += QByteArray::fromHex(checksum(cmd, len, datas));
|
||||
msg += QByteArray::fromHex(transcode(datas));
|
||||
}else{
|
||||
msg += QByteArray::fromHex(checksum(cmd, len, "0"));
|
||||
msg += QByteArray::fromHex(checksum(cmd, len, ""));
|
||||
}
|
||||
msg += QByteArray::fromHex("03");
|
||||
cout << msg.toHex().toStdString() << endl;
|
||||
this->write(msg);
|
||||
if (!this->waitForBytesWritten(10000))
|
||||
{
|
||||
cout << "error : no acknoledge of bytes written" << endl;
|
||||
}
|
||||
//this->interpretResult(this->dataRead);
|
||||
}
|
||||
|
||||
void ZigateBackend::getResponse()
|
||||
{
|
||||
this->getData();
|
||||
this->interpretResult(this->dataRead);
|
||||
}
|
||||
|
||||
uint ZigateBackend::interpretResult(QByteArray datas)
|
||||
|
||||
int ZigateBackend::interpretResult(QByteArray payload)
|
||||
{
|
||||
uint tab = 0;
|
||||
int length = strlen(datas);
|
||||
uint crctmp;
|
||||
uint i;
|
||||
int payloadLength;
|
||||
|
||||
int length = 0;
|
||||
quint8 crctmp = 0;
|
||||
uint i = 0;
|
||||
int datasResultLength = 0;
|
||||
ResponseProperties * responseObject = nullptr;
|
||||
QByteArray type;
|
||||
QByteArray ln;
|
||||
QByteArray crc;
|
||||
QByteArray payload;
|
||||
uint ln;
|
||||
quint8 crc;
|
||||
QByteArray datasResult;
|
||||
QByteArray quality;
|
||||
QByteArray payloadD;
|
||||
|
||||
if (length >= 12)
|
||||
payloadD = unTranscode(payload);
|
||||
length = payloadD.count();
|
||||
|
||||
while(length > 5)
|
||||
{
|
||||
crctmp = 0;
|
||||
//type de message
|
||||
type = datas.mid(0, 4); //[0].$datas[1].$datas[2].$datas[3];
|
||||
crctmp ^= datas.mid(0, 2).toUInt(); //[0].$datas[1]) ^ hexdec($datas[2].$datas[3]);
|
||||
//taille message
|
||||
ln = datas.mid(4, 4); // [4].$datas[5].$datas[6].$datas[7];
|
||||
crctmp ^= datas.mid(4, 2).toUInt() ^ datas.mid(6, 2).toUInt();
|
||||
type = payloadD.mid(0, 2);
|
||||
crctmp = crctmp ^ payloadD.at(0) ^ payloadD.at(1);
|
||||
ln = payloadD.mid(2, 2).toHex().toUInt(nullptr, 16);
|
||||
crctmp = crctmp ^ payloadD.at(2) ^ payloadD.at(3);
|
||||
//acquisition du CRC
|
||||
crc = datas.mid(8, 2); //].$datas[9];
|
||||
//payload
|
||||
payload = "";
|
||||
for(i=0;i<ln.toUInt();i++)
|
||||
crc = payloadD.at(4);
|
||||
//datasResult
|
||||
datasResult = "";
|
||||
for(i=0;i<ln;i++)
|
||||
{
|
||||
payload += datas.mid(10+(i*2), 2); //.$datas[10+(($i*2)+1)];
|
||||
crctmp ^= datas.mid(10+(i*2), 2).toUInt(); //.$datas[10+(($i*2)+1)]);
|
||||
datasResult += payloadD.at(5+i);
|
||||
crctmp ^= payloadD.at(5+i);
|
||||
}
|
||||
quality = datas.mid(10+(i*2)-2, 2); //.$datas[10+($i*2)-1];
|
||||
quality = payloadD.right(1);
|
||||
|
||||
payloadLength = payload.count() - 2;
|
||||
datasResultLength = datasResult.count();
|
||||
|
||||
//verification du CRC
|
||||
if (crc.toUInt() == crctmp)
|
||||
if (crc == crctmp)
|
||||
{
|
||||
//Traitement PAYLOAD
|
||||
/*switch (type)
|
||||
//responseObject = responseListIndex[type.toHex()];
|
||||
if (responseObject != nullptr)
|
||||
{
|
||||
|
||||
case "8000" :
|
||||
|
||||
echo " (Status)"."\n";
|
||||
echo " Length: ".substr($payload,0,4)."\n";
|
||||
echo " Status: ".substr($payload,4,2)."\n";
|
||||
switch (substr($payload,4,2))
|
||||
{
|
||||
case "00":
|
||||
{
|
||||
echo " (Success)"."\n";
|
||||
}
|
||||
break;
|
||||
|
||||
case "01":
|
||||
{
|
||||
echo " (Incorrect Parameters)"."\n";
|
||||
}
|
||||
break;
|
||||
|
||||
case "02":
|
||||
{
|
||||
echo " (Unhandled Command)"."\n";
|
||||
}
|
||||
break;
|
||||
|
||||
case "03":
|
||||
{
|
||||
echo " (Command Failed)"."\n";
|
||||
}
|
||||
break;
|
||||
|
||||
case "04":
|
||||
{
|
||||
echo " (Busy)"."\n";
|
||||
}
|
||||
break;
|
||||
|
||||
case "05":
|
||||
{
|
||||
echo " (Stack Already Started)"."\n";
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
{
|
||||
echo " (ZigBee Error Code)"."\n";
|
||||
}
|
||||
break;
|
||||
}
|
||||
echo "SQN: : ".substr($payload,6,2)."\n";
|
||||
|
||||
if (hexdec(substr($payload,0,4)) > 2)
|
||||
{
|
||||
echo " Message: ";
|
||||
echo hex2str(substr($payload,8,strlen($payload)-2))."\n";
|
||||
}
|
||||
break;
|
||||
case "8001" :
|
||||
echo " (Log)";
|
||||
echo "\n";
|
||||
echo " Level: 0x".substr($payload,0,2);
|
||||
echo "\n";
|
||||
echo " Message: ";
|
||||
echo hex2str(substr($payload,2,strlen($payload)-2))."\n";
|
||||
break;
|
||||
case "8010" :
|
||||
echo "(Version)\n";
|
||||
echo "Application : ".hexdec(substr($payload,0,4))."\n";
|
||||
echo "SDK : ".hexdec(substr($payload,4,4))."\n";
|
||||
break;
|
||||
case "8102" :
|
||||
echo "[".date("Y-m-d H:i:s")."]\n";
|
||||
echo "(Attribute Report)\n";
|
||||
echo "Src Addr : ".substr($payload,2,4)."\n";
|
||||
echo "Cluster ID : ".substr($payload,8,4)."\n";
|
||||
echo "Attr ID : ".substr($payload,12,4)."\n";
|
||||
echo "Attr Type : ".substr($payload,16,4)."\n";
|
||||
echo "Attr Size : ".substr($payload,20,4)."\n";
|
||||
echo "Quality : ".$quality."\n";
|
||||
if ((substr($payload,8,4)=="0000") && (substr($payload,12,4)=="0001"))
|
||||
{
|
||||
echo "DATAS: ".substr($payload,24,(strlen($payload)-24))."\n\n";
|
||||
}elseif ((substr($payload,8,4)=="0000") && (substr($payload,12,4)=="0005"))
|
||||
{
|
||||
echo "DATAS: ".hex2str(substr($payload,24,(substr($payload,20,4))*2))."\n\n";
|
||||
}else{
|
||||
echo "DATAS: ".substr($payload,24,(substr($payload,20,4))*2)."\n\n";
|
||||
}
|
||||
break;
|
||||
case "004d" :
|
||||
echo "(Device announce)\n";
|
||||
echo "Src Addr : ".substr($payload,0,4)."\n";
|
||||
echo "IEEE : ".substr($payload,4,8)."\n";
|
||||
echo "MAC capa : ".substr($payload,12,2)."\n";
|
||||
echo "Quality : ".$quality;
|
||||
break;
|
||||
case "8702" :
|
||||
echo "(APS Data Confirm Fail)\n";
|
||||
echo "Status : ".substr($payload,0,2)."\n";
|
||||
echo "Source Endpoint : ".substr($payload,2,2)."\n";
|
||||
echo "Destination Endpoint : ".substr($payload,4,2)."\n";
|
||||
echo "Destination Mode : ".substr($payload,6,2)."\n";
|
||||
echo "Destination Address : ".substr($payload,8,4)."\n";
|
||||
echo "SQN: : ".substr($payload,12,2)."\n";
|
||||
break;
|
||||
case "8101" :
|
||||
echo "(Default Response)\n";
|
||||
echo "SQN : ".substr($payload,0,2)."\n";
|
||||
echo "EndPoint : ".substr($payload,2,2)."\n";
|
||||
displayClusterId(substr($payload,4,4));
|
||||
echo "Command : ".substr($payload,8,2)."\n";
|
||||
echo "Status : ".substr($payload,10,2)."\n";
|
||||
break;
|
||||
case "8045" :
|
||||
echo "(Active Endpoints Response)\n";
|
||||
echo "SQN : ".substr($payload,0,2)."\n";
|
||||
echo "Status : ".substr($payload,2,2)."\n";
|
||||
echo "Short Address : ".substr($payload,4,4)."\n";
|
||||
echo "Endpoint Count : ".substr($payload,8,2)."\n";
|
||||
echo "Endpoint List :" ."\n";
|
||||
for ($i = 0; $i < (intval(substr($payload,8,2)) *2); $i+=2)
|
||||
{
|
||||
echo "Endpoint : ".substr($payload,(8+$i),2)."\n";
|
||||
}
|
||||
break;
|
||||
case "8043" :
|
||||
echo "(Simple Descriptor Response)\n";
|
||||
echo "SQN : ".substr($payload,0,2)."\n";
|
||||
echo "Status : ".substr($payload,2,2)."\n";
|
||||
echo "Short Address : ".substr($payload,4,4)."\n";
|
||||
echo "Length : ".substr($payload,8,2)."\n";
|
||||
if (intval(substr($payload,8,2))>0)
|
||||
{
|
||||
echo "Endpoint : ".substr($payload,10,2)."\n";
|
||||
//PAS FINI
|
||||
}
|
||||
break;
|
||||
default:
|
||||
|
||||
break;
|
||||
}*/
|
||||
responseObject->datas = datasResult;
|
||||
responseObject->manager();
|
||||
}else
|
||||
{
|
||||
cout << "unknown command" << endl;
|
||||
}
|
||||
}else
|
||||
{
|
||||
tab=-2;
|
||||
}
|
||||
}else
|
||||
{
|
||||
tab=-1;
|
||||
payloadD.remove(0,i+6);
|
||||
length = payloadD.count();
|
||||
}
|
||||
|
||||
return tab;
|
||||
}
|
||||
|
617
zigateBackend.h
617
zigateBackend.h
@ -1,10 +1,43 @@
|
||||
#ifndef ZIGATEBACKEND_H
|
||||
#define ZIGATEBACKEND_H
|
||||
|
||||
#include "main.h"
|
||||
#include "serial.inc.h"
|
||||
#include <QMap>
|
||||
#include <QHash>
|
||||
#include <QSerialPort>
|
||||
//#include <QArray>
|
||||
#include "responseClasses.h"
|
||||
|
||||
void deviceAnnounceManager();
|
||||
void commandReturnStatusManager();
|
||||
void logMessageManager();
|
||||
void dataIndicationManager();
|
||||
void clustersListManager();
|
||||
void attributesListManager();
|
||||
void commandsListManager();
|
||||
void statusManager();
|
||||
void status2Manager();
|
||||
void versionListManager();
|
||||
void permitJoinManager();
|
||||
void networkJoinedFormedManager();
|
||||
void bindResponseManager();
|
||||
void unbindResponseManager();
|
||||
void networkAddressManager();
|
||||
void iEEEAddressManager();
|
||||
void nodeDescriptorManager();
|
||||
void simpleDescriptorManager();
|
||||
void powerDescriptorManager();
|
||||
void activeEndpointManager();
|
||||
void matchDescriptorManager();
|
||||
void userDescriptorNotifyManager();
|
||||
void userDescriptorManager();
|
||||
void complexDescriptorManager();
|
||||
void managementLeaveManager();
|
||||
void leaveIndicationManager();
|
||||
void managementNetworkUpdateManager();
|
||||
void systemServerDiscoveryManager();
|
||||
void managementLQIManager();
|
||||
void attributeDiscoveryManager();
|
||||
|
||||
class ZigbeeMgr;
|
||||
|
||||
@ -17,11 +50,14 @@ class ZigateBackend : public ZigbeeMgr
|
||||
ZigateBackend();
|
||||
~ZigateBackend();
|
||||
|
||||
bool initBackend();
|
||||
QByteArray checksum(QByteArray msgType, QByteArray length, QByteArray datas);
|
||||
QByteArray transcode(QByteArray datas);
|
||||
QByteArray unTranscode(QByteArray datas);
|
||||
void sendCmd(QByteArray cmd, QByteArray datas);
|
||||
uint interpretResult(QByteArray datas);
|
||||
|
||||
int interpretResult(QByteArray datas);
|
||||
void getResponse();
|
||||
bool resetCoordinator();
|
||||
|
||||
QMap <int, QString> resultCodes;
|
||||
QMap <QString, QList <QByteArray>> cmdList =
|
||||
@ -117,455 +153,75 @@ class ZigateBackend : public ZigbeeMgr
|
||||
{"rawApsDataRequest", {"0530", "000D", ""}}
|
||||
};
|
||||
|
||||
const QMap <QByteArray, QMap <QString, QByteArray>> responseList //outerMap responseList
|
||||
QHash <QString, ResponseProperties *> responseListIndex;
|
||||
|
||||
QList <QString> responseListCode
|
||||
{
|
||||
{
|
||||
"004D",
|
||||
{
|
||||
{"Description", "Device announce"},
|
||||
{"Short address", "00"}, // uint16_t
|
||||
{"IEEE address", "0000"}, // uint64_t
|
||||
{"MAC capability", "0"} // uint8_t
|
||||
}
|
||||
/*****************************************************************************
|
||||
* MAC capability
|
||||
* Bit 0 - Alternate PAN Coordinator
|
||||
* Bit 1 - Device Type
|
||||
* Bit 2 - Power source
|
||||
* Bit 3 - Receiver On when Idle
|
||||
* Bit 4,5 - Reserved
|
||||
* Bit 6 - Security capability
|
||||
* Bit 7 - Allocate Address
|
||||
******************************************************************************/
|
||||
|
||||
},
|
||||
{
|
||||
"8000",
|
||||
{
|
||||
{"Description", "Status"},
|
||||
{"Status", "0"}, // <uint8_t>
|
||||
{"Sequence number", "0"}, // <uint8_t>
|
||||
{"Packet Type", "00"}, // <uint16_t>
|
||||
{"Optional additional error information", ""} // <string>
|
||||
}
|
||||
/*****************************************************************************
|
||||
* Status :
|
||||
* 0 = Success
|
||||
* 1 = Incorrect parameters
|
||||
* 2 = Unhandled command
|
||||
* 3 = Command failed
|
||||
* 4 = Busy (Node is carrying out a lengthy operation and is currently unable to handle the incoming command)
|
||||
* 5 = Stack already started (no new configuration accepted)
|
||||
* 128 – 244 = Failed (ZigBee event codes)
|
||||
* Packet Type: The value of the initiating command request.
|
||||
******************************************************************************/
|
||||
},
|
||||
{
|
||||
"8001",
|
||||
{
|
||||
{"Description", "Log message"},
|
||||
{"Log level", "0"}, // uint8_t
|
||||
{"Log message", ""} // string
|
||||
}
|
||||
/*****************************************************************************
|
||||
* Log Level :
|
||||
* Use the Linux / Unix log levels
|
||||
* 0 = Emergency
|
||||
* 1 = Alert
|
||||
* 2 = Critical
|
||||
* 3 = Error
|
||||
* 4 = Warning
|
||||
* 5 = Notice
|
||||
* 6 = Information
|
||||
* 7 = Debug
|
||||
******************************************************************************/
|
||||
},
|
||||
{
|
||||
"8002",
|
||||
{
|
||||
{"Description", "Data indication"},
|
||||
{"status", "0"}, // uint8_t
|
||||
{"Profile ID", "00"}, // uint16_t
|
||||
{"Cluster ID", "00"}, // uint16_t
|
||||
{"Source endpoint", "0"}, // uint8_t
|
||||
{"Destination endpoint", "0"}, // uint8_t
|
||||
{"Source address mode", "0"}, // uint8_t
|
||||
{"Source address", "0"}, // uint16_t or uint64_t
|
||||
{"Destination address mode", "0"}, // uint8_t
|
||||
{"Destination address", "0"}, // uint16_t or uint64_t
|
||||
{"Payload size", "0"}, // uint8_t>
|
||||
{"Payload", ""} // data each element is uint8_t
|
||||
}
|
||||
},
|
||||
{
|
||||
"8003",
|
||||
{
|
||||
{"Description", "Liste des clusters de l'objet"},
|
||||
{"Source endpoint", "0"}, // uint8_t
|
||||
{"Profile ID", "0"}, // uint16_t
|
||||
{"Cluster list", ""}, // data each entry is uint16_t>
|
||||
{"Source endpoint", "0"}, // uint8_t
|
||||
{"Profile ID", "00"}, // uint16_t>
|
||||
{"Cluster ID", "00"}, // uint16_t
|
||||
{"Attribute list", ""} // data each entry is uint16_t>
|
||||
}
|
||||
},
|
||||
{
|
||||
"8004",
|
||||
{
|
||||
{"Description", "Liste des attributs de l'objet"},
|
||||
{"Source endpoint", "0"}, // uint8_t
|
||||
{"Profile ID", "00"}, // uint16_t
|
||||
{"Cluster ID", "00"}, // uint16_t
|
||||
{"Attribute list", ""} // data each entry is uint16_t>
|
||||
}
|
||||
},
|
||||
{
|
||||
"8005",
|
||||
{
|
||||
{"Description", "Liste des commandes de l'objet"},
|
||||
{"Source endpoint", "0"}, // uint8_t
|
||||
{"Profile ID", "0"}, // uint16_t
|
||||
{"Cluster ID", "00"}, // uint16_t
|
||||
{"Command ID list", ""} // data each entry is uint8_t>
|
||||
}
|
||||
},
|
||||
{
|
||||
"8006",
|
||||
{
|
||||
{"Description", "Status"},
|
||||
{"Status", ""}
|
||||
}
|
||||
/*****************************************************************************
|
||||
* 0 - STARTUP
|
||||
* 2 - NFN_START
|
||||
* 6 - RUNNING
|
||||
* The node is provisioned from previous restart.
|
||||
******************************************************************************/
|
||||
},
|
||||
{
|
||||
"8007",
|
||||
{
|
||||
{"Description", "Status"},
|
||||
{"Status", "0"}
|
||||
}
|
||||
/*****************************************************************************
|
||||
* 0 - STARTUP
|
||||
* 2 - NFN_START
|
||||
* 6 - RUNNING
|
||||
* The node is not yet provisioned.
|
||||
******************************************************************************/
|
||||
},
|
||||
{
|
||||
"8010",
|
||||
{
|
||||
{"Description", "Version list"},
|
||||
{"Major version number", "00"}, // uint16_t
|
||||
{"Installer version number", "00"} // uint16_t
|
||||
}
|
||||
},
|
||||
{
|
||||
"8014",
|
||||
{
|
||||
{"Description", "Permit join status response"},
|
||||
{"Status", "0"} // bool_t
|
||||
}
|
||||
/*****************************************************************************
|
||||
* 0 - Off
|
||||
* 1 - On
|
||||
******************************************************************************/
|
||||
},
|
||||
{
|
||||
"8024",
|
||||
{
|
||||
{"Description", "Network joined/formed"},
|
||||
{"Status", "0"}, // uint8_t
|
||||
{"Short address", "00"}, // uint16_t
|
||||
{"Extended address", "00"}, // uint64_t
|
||||
{"Channel", "0"} // uint8_t
|
||||
}
|
||||
/*****************************************************************************
|
||||
* Status:
|
||||
* 0 = Joined existing network
|
||||
* 1 = Formed new network
|
||||
* 128 – 244 = Failed (ZigBee event codes)
|
||||
******************************************************************************/
|
||||
},
|
||||
{
|
||||
"8030",
|
||||
{
|
||||
{"Description", "Bind response"},
|
||||
{"Sequence number", "0"}, // uint8_t
|
||||
{"Status", "0"} // uint8_t
|
||||
}
|
||||
},
|
||||
{
|
||||
"8031",
|
||||
{
|
||||
{"Description", "Unbind response"},
|
||||
{"Sequence number", "0"}, // uint8_t
|
||||
{"Status", "0"} // uint8_t
|
||||
}
|
||||
},
|
||||
{
|
||||
"8040",
|
||||
{
|
||||
{"Description", "Network Address response"},
|
||||
{"Sequence number", "0"}, // uin8_t
|
||||
{"Status", "0"}, // uint8_t
|
||||
{"IEEE address", "0"}, // uint64_t
|
||||
{"Short address", "00"}, // uint16_t
|
||||
{"Number of associated devices", "0"}, // uint8_t
|
||||
{"Start index", "0"}, // uint8_t
|
||||
{"Device list", ""} // data each entry is uint16_t>
|
||||
}
|
||||
},
|
||||
{
|
||||
"8041",
|
||||
{
|
||||
{"Description", "IEEE Address response"},
|
||||
{"Sequence number", "0"}, // uin8_t
|
||||
{"Status", "0"}, // uint8_t
|
||||
{"IEEE address", "0000"}, // uint64_t
|
||||
{"Short address", "00"}, // uint16_t
|
||||
{"Number of associated devices", "0"}, // uint8_t
|
||||
{"Start index", "0"}, // uint8_t
|
||||
{"Device list", ""} // data each entry is uint16_t
|
||||
}
|
||||
},
|
||||
{
|
||||
"8042",
|
||||
{
|
||||
{"Description", "Node Descriptor response"},
|
||||
{"Sequence number", "0"}, // uint8_t
|
||||
{"Status", "0"}, // uint8_t
|
||||
{"Network address", "0"}, // uint16_t
|
||||
{"Manufacturer code", "00"}, // uint16_t
|
||||
{"Max Rx Size", "00"}, // uint16_t
|
||||
{"Max Tx Size", "00"}, // uint16_t
|
||||
{"Server mask", "00"}, // uint16_t
|
||||
{"Descriptor capability", "0"}, // uint8_t
|
||||
{"Mac flags", "0"}, // uint8_t
|
||||
{"Max buffer size", "0"}, // uint8_t
|
||||
{"Bit fields", "00"} // uint16_t
|
||||
}
|
||||
/*****************************************************************************
|
||||
* Bitfields:
|
||||
* Logical type (bits 0-2
|
||||
* 0 - Coordinator
|
||||
* 1 - Router
|
||||
* 2 - End Device)
|
||||
* Complex descriptor available (bit 3)
|
||||
* User descriptor available (bit 4)
|
||||
* Reserved (bit 5-7)
|
||||
* APS flags (bit 8-10 – currently 0)
|
||||
* Frequency band(11-15 set to 3 (2.4Ghz))
|
||||
* Server mask bits:
|
||||
* 0 - Primary trust center
|
||||
* 1 - Back up trust center
|
||||
* 2 - Primary binding cache
|
||||
* 3 - Backup binding cache
|
||||
* 4 - Primary discovery cache
|
||||
* 5 - Backup discovery cache
|
||||
* 6 - Network manager
|
||||
* 7 to15 - Reserved
|
||||
* MAC capability
|
||||
* Bit 0 - Alternate PAN Coordinator
|
||||
* Bit 1 - Device Type
|
||||
* Bit 2 - Power source
|
||||
* Bit 3 - Receiver On when Idle
|
||||
* Bit 4-5 - Reserved
|
||||
* Bit 6 - Security capability
|
||||
* Bit 7 - Allocate Address
|
||||
* Descriptor capability:
|
||||
* 0 - extended Active endpoint list available
|
||||
* 1 - Extended simple descriptor list available
|
||||
* 2 to 7 - Reserved
|
||||
******************************************************************************/
|
||||
},
|
||||
{
|
||||
"8043",
|
||||
{
|
||||
{"Description", "Simple Descriptor response"},
|
||||
{"Sequence number", "0"}, // uint8_t
|
||||
{"Status", "0"}, // uint8_t
|
||||
{"NwkAddress", "00"}, // uint16_t
|
||||
{"Length", "0"}, // uint8_t
|
||||
{"Endpoint", "0"}, // uint8_t
|
||||
{"Profile", "00"}, // uint16_t
|
||||
{"Device id", "00"}, // uint16_t
|
||||
{"Bit fields", "0"}, // uint8_t
|
||||
{"InClusterCount", "0"}, // uint8_t
|
||||
{"In cluster list", ""}, // data each entry is uint16_t>
|
||||
{"Out Cluster Count", ""}, // uint8_t
|
||||
{"Out cluster list", ""} // data each entry is uint16_t
|
||||
}
|
||||
/*****************************************************************************
|
||||
* Bit fields:
|
||||
* Device version: 4 bits (bits 0-4)
|
||||
* Reserved: 4 bits (bits4-7)
|
||||
******************************************************************************/
|
||||
},
|
||||
{
|
||||
"8044",
|
||||
{
|
||||
{"Description", "Power Descriptor response"},
|
||||
{"Sequence number", "0"}, // uin8_t
|
||||
{"Status", "0"}, // uint8_t
|
||||
{"bit field", "0"} // uint16_t
|
||||
}
|
||||
/*****************************************************************************
|
||||
* Bit fields
|
||||
* 0 to 3: current power mode
|
||||
* 4 to 7: available power source
|
||||
* 8 to 11: current power source
|
||||
* 12 to 15: current power source level
|
||||
******************************************************************************/
|
||||
},
|
||||
{
|
||||
"8045",
|
||||
{
|
||||
{"Description", "Active Endpoint response"},
|
||||
{"Sequence number", "0"}, // uint8_t
|
||||
{"Status", "0"}, // uint8_t
|
||||
{"Address", "00"}, // uint16_t
|
||||
{"Endpoint count", "0"}, // uint8_t
|
||||
{"Active endpoint list", ""} // each data element of the type uint8_t
|
||||
}
|
||||
},
|
||||
{
|
||||
"8046",
|
||||
{
|
||||
{"Description", "Match Descriptor response"},
|
||||
{"Sequence number", "0"}, // uint8_t
|
||||
{"Status", "0"}, // uint8_t
|
||||
{"Network address", "00"}, // uint16_t
|
||||
{"Length of list", "0"}, // uint8_t
|
||||
{"Match list", ""} // data each entry is uint8_t
|
||||
}
|
||||
},
|
||||
{
|
||||
"802B",
|
||||
{
|
||||
{"Description", "User Descriptor Notify"},
|
||||
{"Sequence number", "0"}, // uin8_t
|
||||
{"Status", "0"}, // uint8_t
|
||||
{"Network address of interest", "00"} // uint16_t
|
||||
}
|
||||
},
|
||||
{
|
||||
"802C",
|
||||
{
|
||||
{"Description", "User Descriptor Response"},
|
||||
{"Sequence number", "0"}, // uin8_t
|
||||
{"Status", "0"}, // uint8_t
|
||||
{"Network address of interest", "00"}, // uint16_6
|
||||
{"Length", "0"}, // uint8_t
|
||||
{"Data", ""} // uint8_t stream
|
||||
}
|
||||
},
|
||||
{
|
||||
"8034",
|
||||
{
|
||||
{"Description", "Complex Descriptor response"},
|
||||
{"Sequence number", "0"}, // uin8_t
|
||||
{"status", "0"}, // uint8_t
|
||||
{"Network address of interest", "0"}, // uint16_t
|
||||
{"Length", "0"}, // uint8_t
|
||||
{"xml tag", "0"}, // uint8_t
|
||||
{"field count", "0"}, // uint8_t
|
||||
{"field values", ""} // uint8_t stream
|
||||
}
|
||||
},
|
||||
{
|
||||
"8047",
|
||||
{
|
||||
{"Description", "Management Leave response"},
|
||||
{"Sequence number", "0"}, // uin8_t
|
||||
{"Status", "0"} // uint8_t
|
||||
}
|
||||
},
|
||||
{
|
||||
"8048",
|
||||
{
|
||||
{"Description", "Leave indication"},
|
||||
{"Extended address", "0000"}, // uint64_t
|
||||
{"Rejoin status", "0"} // uint8_t
|
||||
}
|
||||
},
|
||||
{
|
||||
"804A",
|
||||
{
|
||||
{"Description", "Management Network Update response"},
|
||||
{"Sequence number", "0"}, // uint8_t
|
||||
{"Status", "0"}, // uint8_t
|
||||
{"Total transmission", "00"}, // uint16_t
|
||||
{"Transmission failures", "00"}, // uint16_t
|
||||
{"Scanned channels", "0000"}, // uint32_t
|
||||
{"Scanned channel list count", "0"}, // uint8_t
|
||||
{"Channel list", "0"} // list each element is uint8_t
|
||||
}
|
||||
},
|
||||
{
|
||||
"804B",
|
||||
{
|
||||
{"Description", "System Server Discovery response"},
|
||||
{"Sequence number", "0"}, // uint8_t
|
||||
{"status", "0"}, // uint8_t
|
||||
{"Server mask", "00"} // uint16_t
|
||||
}
|
||||
/********************************
|
||||
* Bitmask according to spec". *
|
||||
********************************/
|
||||
},
|
||||
{
|
||||
"804E",
|
||||
{
|
||||
{"Description", "Management LQI response"},
|
||||
{"Sequence number", "0"}, // uint8_t
|
||||
{"status", "0"}, // uint8_t
|
||||
{"Neighbour Table Entries ", "0"}, // uint8_t
|
||||
{"Neighbour Table List Count ", "0"}, // uint8_t
|
||||
{"Start Index ", "0"}, // uint8_t
|
||||
{"List of Entries elements described below", ""}
|
||||
}
|
||||
/*****************************************************************************
|
||||
* Note: If Neighbour Table list count is 0, there are no elements in the list.
|
||||
* NWK Address : uint16_t
|
||||
* Extended PAN ID : uint64_t
|
||||
* IEEE Address : uint64_t
|
||||
* Depth : uint_t
|
||||
* Link Quality : uint8_t
|
||||
* Bit map of attributes Described below: uint8_t
|
||||
* bit 0-1 Device Type
|
||||
* (0-Coordinator 1-Router 2-End Device)
|
||||
* bit 2-3 Permit Join status
|
||||
* (1- On 0-Off)
|
||||
* bit 4-5 Relationship
|
||||
* (0-Parent 1-Child 2-Sibling)
|
||||
* bit 6-7 Rx On When Idle status
|
||||
* (1-On 0-Off)
|
||||
******************************************************************************/
|
||||
},
|
||||
{
|
||||
"8140",
|
||||
{
|
||||
{"Description", "Attribute Discovery response"},
|
||||
{"Complete", "0"}, // uint8_t
|
||||
{"Attribute type", "0"}, // uint8_t
|
||||
{"Attribute id", "00"} // uint16_t
|
||||
}
|
||||
/*****************************************************************************
|
||||
* Complete:
|
||||
* 0 – more attributes to follow
|
||||
* 1 – this was the last attribute
|
||||
******************************************************************************/
|
||||
}
|
||||
|
||||
"004D",
|
||||
"8000",
|
||||
"8001",
|
||||
"8002",
|
||||
"8003",
|
||||
"8004",
|
||||
"8005",
|
||||
"8006",
|
||||
"8007",
|
||||
"8010",
|
||||
"8014",
|
||||
"8024",
|
||||
"8030",
|
||||
"8031",
|
||||
"8040",
|
||||
"8041",
|
||||
"8042",
|
||||
"8043",
|
||||
"8044",
|
||||
"8045",
|
||||
"8046",
|
||||
"802B",
|
||||
"802C",
|
||||
"8047",
|
||||
"8048",
|
||||
"804A",
|
||||
"804B",
|
||||
"804E",
|
||||
"8140",
|
||||
"8008",
|
||||
"8009",
|
||||
"8011",
|
||||
"8012",
|
||||
"8015",
|
||||
"8017",
|
||||
"8028",
|
||||
"8035",
|
||||
"8049",
|
||||
"8052",
|
||||
"8060",
|
||||
"8061",
|
||||
"8062",
|
||||
"8063",
|
||||
"8085",
|
||||
"8095",
|
||||
"80A0",
|
||||
"80A1",
|
||||
"80A2",
|
||||
"80A3",
|
||||
"80A4",
|
||||
"80A6",
|
||||
"80A7",
|
||||
"8100",
|
||||
"8101",
|
||||
"8102",
|
||||
"8110",
|
||||
"8120",
|
||||
"8122",
|
||||
"8531",
|
||||
"8701",
|
||||
"8702",
|
||||
"9999"
|
||||
};
|
||||
|
||||
//ZigbeeMgr serial;
|
||||
|
||||
//ZigbeeMgr serial;
|
||||
QMap <QByteArray, QString> clusters
|
||||
{
|
||||
{"0000", " (General: Basic)"},
|
||||
@ -599,4 +255,67 @@ class ZigateBackend : public ZigbeeMgr
|
||||
{"1234", " Xiaomi private"}
|
||||
};
|
||||
};
|
||||
|
||||
#define DEVICE_ANNOUNCE "004D"
|
||||
#define STATUS_RETURNED "8000"
|
||||
#define LOG_MESSAGE "8001"
|
||||
#define DATA_INDICATION "8002"
|
||||
#define CLUSTERS_LIST "8003"
|
||||
#define ATTRIBUTES_LIST "8004"
|
||||
#define COMMANDS_LIST "8005"
|
||||
#define STATUS "8006"
|
||||
#define STATUS2 "8007"
|
||||
#define VERSION_LIST "8010"
|
||||
#define PERMIT_JOIN "8014"
|
||||
#define NETWORK_JOINED_FORMED "8024"
|
||||
#define BIND_RESPONSE "8030"
|
||||
#define UNBIND_RESPONSE "8031"
|
||||
#define NETWORK_ADDRESS "8040"
|
||||
#define IEEE_ADDRESS "8041"
|
||||
#define NODE_DESCRIPTOR "8042"
|
||||
#define SIMPLE_DESCRIPTOR "8043"
|
||||
#define POWER_DESCRIPTOR "8044"
|
||||
#define ACTIVE_ENDPOINT "8045"
|
||||
#define MATCH_DESCRIPTOR "8046"
|
||||
#define USER_DESCRIPTOR_NOTIFY "802B"
|
||||
#define USER_DESCRIPTOR "802C"
|
||||
#define MANAGEMENT_LEAVE "8047"
|
||||
#define LEAVE_INDICATION "8048"
|
||||
#define MANAGEMENT_NETWORK_UPDATE "804A"
|
||||
#define SYSTEM_SERVER_DISCOVERY "804B"
|
||||
#define MANAGEMENT_LQI "804E"
|
||||
#define ATTRIBUTE_DISCOVERY "8140"
|
||||
#define HEARTBEAT "8008"
|
||||
#define NETWORK_STATE "8009"
|
||||
#define ACK_DATA "8011"
|
||||
#define DATA_CONFIRM "8012"
|
||||
#define DEVICES_LIST "8015"
|
||||
#define TIME_SERVER "8017"
|
||||
#define AUTHENTICATE_RESPONSE "8028"
|
||||
#define PDM_EVENT "8035"
|
||||
#define PERMIT_JOINING "8049"
|
||||
#define PDM_CHILD_TABLE_SIZE "8052"
|
||||
#define ADD_GROUP "8060"
|
||||
#define VIEW_GROUP "8061"
|
||||
#define GROUP_MEMBERSHIP "8062"
|
||||
#define REMOVE_GROUP "8063"
|
||||
#define LEVEL_UPDATE "8085"
|
||||
#define ON_OFF "8095"
|
||||
#define VIEW_SCENE "80A0"
|
||||
#define ADD_SCENE "80A1"
|
||||
#define REMOVE_SCENE "80A2"
|
||||
#define REMOVE_ALL_SCENE "80A3"
|
||||
#define STORE_SCENE "80A4"
|
||||
#define SCENE_MEMBERSHIP "80A6"
|
||||
#define SCENES_UPDATE "80A7"
|
||||
#define READ_INDIVIDUAL_ATTRIBUTE "8100"
|
||||
#define DEFAULT_RESPONSE "8101"
|
||||
#define REPORT_INDIVIDUAL_ATTRIBUTE "8102"
|
||||
#define WRITE_ATTRIBUTE "8110"
|
||||
#define CONFIGURE_REPORTING "8120"
|
||||
#define READ_REPORT_CONFIG "8122"
|
||||
#define COMPLEX_DESCRIPTOR "8531"
|
||||
#define ROUTER_DISCOVERY "8701"
|
||||
#define APS_DATA_CONFIRM_FAIL "8702"
|
||||
#define EXTENDED_ERROR "9999"
|
||||
#endif // ZIGATEBACKEND_H
|
||||
|
1014
zigateInit.cpp
Normal file
1014
zigateInit.cpp
Normal file
File diff suppressed because it is too large
Load Diff
17
zigatecmd.cpp
Normal file
17
zigatecmd.cpp
Normal file
@ -0,0 +1,17 @@
|
||||
#include "main.h"
|
||||
|
||||
using namespace std;
|
||||
|
||||
bool ZigateBackend::resetCoordinator()
|
||||
{
|
||||
bool returnCode;
|
||||
|
||||
cout << "Sending reset to coordinator" << endl;
|
||||
sendCmd("0011", "");
|
||||
getResponse();
|
||||
getResponse();
|
||||
getResponse();
|
||||
cout << "***************************************************" << endl;
|
||||
sleep(10);
|
||||
return returnCode;
|
||||
}
|
@ -14,7 +14,9 @@ SOURCES += \
|
||||
library.cpp \
|
||||
main.cpp \
|
||||
serial.inc.cpp \
|
||||
zigateBackend.cpp
|
||||
zigateBackend.cpp \
|
||||
zigateInit.cpp \
|
||||
zigatecmd.cpp
|
||||
|
||||
# Default rules for deployment.
|
||||
qnx: target.path = /tmp/$${TARGET}/bin
|
||||
@ -24,6 +26,7 @@ else: unix:!android: target.path = /usr/bin
|
||||
HEADERS += \
|
||||
library.h \
|
||||
main.h \
|
||||
responseClasses.h \
|
||||
serial.inc.h \
|
||||
version.h \
|
||||
zigateBackend.h
|
||||
|
@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE QtCreatorProject>
|
||||
<!-- Written by QtCreator 9.0.1, 2023-04-13T00:23:41. -->
|
||||
<!-- Written by QtCreator 9.0.1, 2023-04-19T22:36:16. -->
|
||||
<qtcreator>
|
||||
<data>
|
||||
<variable>EnvironmentId</variable>
|
||||
|
Reference in New Issue
Block a user