Implement up to start network for nxp

pull/8/head
Simon Stürz 2020-10-13 11:56:53 +02:00
parent 974911db06
commit f900420470
5 changed files with 93 additions and 10 deletions

View File

@ -45,6 +45,13 @@ public:
LogLevelDebug = 0x07 LogLevelDebug = 0x07
}; };
Q_ENUM(LogLevel) Q_ENUM(LogLevel)
enum KeyType {
KeyTypeGlobalLinkKey = 0x00,
KeyTypeUniqueLinkKey = 0x01
};
Q_ENUM(KeyType)
}; };
#endif // NXP_H #endif // NXP_H

View File

@ -102,6 +102,37 @@ ZigbeeInterfaceNxpReply *ZigbeeBridgeControllerNxp::requestSetChannelMask(quint3
return createReply(Nxp::CommandSetChannelMask, m_sequenceNumber, "Request set channel mask", message, this); return createReply(Nxp::CommandSetChannelMask, m_sequenceNumber, "Request set channel mask", message, this);
} }
ZigbeeInterfaceNxpReply *ZigbeeBridgeControllerNxp::requestSetSecurityKey(Nxp::KeyType keyType, const ZigbeeNetworkKey &key)
{
QByteArray message;
bumpSequenceNumber();
QDataStream stream(&message, QIODevice::WriteOnly);
stream.setByteOrder(QDataStream::LittleEndian);
stream << static_cast<quint8>(Nxp::CommandSetSecurityKey);
stream << static_cast<quint8>(m_sequenceNumber);
stream << static_cast<quint16>(17); // Frame length
stream << static_cast<quint8>(keyType);
QByteArray keyData = key.toByteArray();
for (int i = 0; i < 16; i++) {
stream << static_cast<quint8>(keyData.at(i));
}
return createReply(Nxp::CommandSetSecurityKey, m_sequenceNumber, "Request set security key", message, this);
}
ZigbeeInterfaceNxpReply *ZigbeeBridgeControllerNxp::requestStartNetwork()
{
QByteArray message;
bumpSequenceNumber();
QDataStream stream(&message, QIODevice::WriteOnly);
stream.setByteOrder(QDataStream::LittleEndian);
stream << static_cast<quint8>(Nxp::CommandStartNetwork);
stream << static_cast<quint8>(m_sequenceNumber);
stream << static_cast<quint16>(0); // Frame length
return createReply(Nxp::CommandStartNetwork, m_sequenceNumber, "Request start network", message, this);
}
ZigbeeInterfaceNxpReply *ZigbeeBridgeControllerNxp::createReply(Nxp::Command command, quint8 sequenceNumber, const QString &requestName, const QByteArray &requestData, QObject *parent) ZigbeeInterfaceNxpReply *ZigbeeBridgeControllerNxp::createReply(Nxp::Command command, quint8 sequenceNumber, const QString &requestName, const QByteArray &requestData, QObject *parent)
{ {
// Create the reply // Create the reply

View File

@ -40,8 +40,14 @@ public:
ZigbeeInterfaceNxpReply *requestControllerState(); ZigbeeInterfaceNxpReply *requestControllerState();
ZigbeeInterfaceNxpReply *requestSoftResetController(); ZigbeeInterfaceNxpReply *requestSoftResetController();
ZigbeeInterfaceNxpReply *requestFactoryResetController(); ZigbeeInterfaceNxpReply *requestFactoryResetController();
// Configure network
ZigbeeInterfaceNxpReply *requestSetPanId(quint64 panId); ZigbeeInterfaceNxpReply *requestSetPanId(quint64 panId);
ZigbeeInterfaceNxpReply *requestSetChannelMask(quint32 channelMask); ZigbeeInterfaceNxpReply *requestSetChannelMask(quint32 channelMask);
ZigbeeInterfaceNxpReply *requestSetSecurityKey(Nxp::KeyType keyType, const ZigbeeNetworkKey &key);
ZigbeeInterfaceNxpReply *requestStartNetwork();
signals: signals:
void controllerStateChanged(ControllerState controllerState); void controllerStateChanged(ControllerState controllerState);

View File

@ -41,7 +41,8 @@ void ZigbeeNetworkNxp::onControllerAvailableChanged(bool available)
qCDebug(dcZigbeeNetwork()) << "Controller is" << (available ? "now available" : "not available any more"); qCDebug(dcZigbeeNetwork()) << "Controller is" << (available ? "now available" : "not available any more");
if (available) { if (available) {
reset(); //reset();
factoryResetNetwork();
} }
} }
@ -77,6 +78,8 @@ void ZigbeeNetworkNxp::onControllerStateChanged(ZigbeeBridgeControllerNxp::Contr
ZigbeeInterfaceNxpReply *reply = m_controller->requestVersion(); ZigbeeInterfaceNxpReply *reply = m_controller->requestVersion();
connect(reply, &ZigbeeInterfaceNxpReply::finished, this, [this, reply](){ connect(reply, &ZigbeeInterfaceNxpReply::finished, this, [this, reply](){
qCDebug(dcZigbeeNetwork()) << "Version reply finished" << reply->status(); qCDebug(dcZigbeeNetwork()) << "Version reply finished" << reply->status();
//FIXME: error handling
QByteArray payload = reply->responseData(); QByteArray payload = reply->responseData();
QDataStream stream(&payload, QIODevice::ReadOnly); QDataStream stream(&payload, QIODevice::ReadOnly);
stream.setByteOrder(QDataStream::LittleEndian); stream.setByteOrder(QDataStream::LittleEndian);
@ -91,12 +94,37 @@ void ZigbeeNetworkNxp::onControllerStateChanged(ZigbeeBridgeControllerNxp::Contr
ZigbeeInterfaceNxpReply *reply = m_controller->requestSetPanId(extendedPanId()); ZigbeeInterfaceNxpReply *reply = m_controller->requestSetPanId(extendedPanId());
connect(reply, &ZigbeeInterfaceNxpReply::finished, this, [this, reply](){ connect(reply, &ZigbeeInterfaceNxpReply::finished, this, [this, reply](){
qCDebug(dcZigbeeNetwork()) << "Set PAN ID reply finished" << reply->status(); qCDebug(dcZigbeeNetwork()) << "Set PAN ID reply finished" << reply->status();
//FIXME: error handling
qCDebug(dcZigbeeNetwork()) << "Set channel mask" << channelMask() << ZigbeeUtils::convertUint32ToHexString(channelMask().toUInt32()) << channelMask().toUInt32(); qCDebug(dcZigbeeNetwork()) << "Set channel mask" << channelMask() << ZigbeeUtils::convertUint32ToHexString(channelMask().toUInt32()) << channelMask().toUInt32();
ZigbeeInterfaceNxpReply *reply = m_controller->requestSetChannelMask(channelMask().toUInt32()); ZigbeeInterfaceNxpReply *reply = m_controller->requestSetChannelMask(channelMask().toUInt32());
connect(reply, &ZigbeeInterfaceNxpReply::finished, this, [reply](){ connect(reply, &ZigbeeInterfaceNxpReply::finished, this, [this, reply](){
qCDebug(dcZigbeeNetwork()) << "Set channel mask reply finished" << reply->status(); qCDebug(dcZigbeeNetwork()) << "Set channel mask reply finished" << reply->status();
//FIXME: error handling
qCDebug(dcZigbeeNetwork()) << "Set global link key" << securityConfiguration().globalTrustCenterLinkKey().toString();
ZigbeeInterfaceNxpReply *reply = m_controller->requestSetSecurityKey(Nxp::KeyTypeGlobalLinkKey, securityConfiguration().globalTrustCenterLinkKey());
connect(reply, &ZigbeeInterfaceNxpReply::finished, this, [this, reply](){
qCDebug(dcZigbeeNetwork()) << "Set global link key" << reply->status();
//FIXME: error handling
qCDebug(dcZigbeeNetwork()) << "Set network link key" << securityConfiguration().networkKey().toString();
ZigbeeInterfaceNxpReply *reply = m_controller->requestSetSecurityKey(Nxp::KeyTypeUniqueLinkKey, securityConfiguration().networkKey());
connect(reply, &ZigbeeInterfaceNxpReply::finished, this, [this, reply](){
qCDebug(dcZigbeeNetwork()) << "Set network link key" << reply->status();
//FIXME: error handling
qCDebug(dcZigbeeNetwork()) << "Start the network";
ZigbeeInterfaceNxpReply *reply = m_controller->requestStartNetwork();
connect(reply, &ZigbeeInterfaceNxpReply::finished, this, [this, reply](){
qCDebug(dcZigbeeNetwork()) << "Start network" << reply->status();
//FIXME: error handling
});
});
});
}); });
}); });
}); });

View File

@ -1,7 +1,8 @@
#include <QCoreApplication> #include <QCoreApplication>
#include <QCommandLineParser> #include <QCommandLineParser>
#include <QCommandLineOption> #include <QCommandLineOption>
#include <QLoggingCategory>
#include "zigbeenetworkkey.h"
#include "zigbeenetworkmanager.h" #include "zigbeenetworkmanager.h"
//static QHash<QString, bool> s_loggingFilters; //static QHash<QString, bool> s_loggingFilters;
@ -138,14 +139,21 @@ int main(int argc, char *argv[])
debugLevel = 1; debugLevel = 1;
} }
// s_loggingFilters.insert("Application", true); // s_loggingFilters.insert("Application", true);
// s_loggingFilters.insert("Zigbee", true); // s_loggingFilters.insert("Zigbee", true);
// s_loggingFilters.insert("ZigbeeController", (debugLevel > 1)); // s_loggingFilters.insert("ZigbeeController", (debugLevel > 1));
// s_loggingFilters.insert("ZigbeeInterface", (debugLevel > 2)); // s_loggingFilters.insert("ZigbeeInterface", (debugLevel > 2));
// s_loggingFilters.insert("ZigbeeInterfaceTraffic", (debugLevel > 3)); // s_loggingFilters.insert("ZigbeeInterfaceTraffic", (debugLevel > 3));
//QLoggingCategory::installFilter(loggingCategoryFilter); //QLoggingCategory::installFilter(loggingCategoryFilter);
QLoggingCategory::setFilterRules("*.debug=false\n"
"Zigbee.debug=true\n"
"ZigbeeController.debug=true\n"
"ZigbeeInterface.debug=false\n"
"ZigbeeInterfaceTraffic.debug=false\n"
);
// Check channel // Check channel
bool channelValueOk = false; bool channelValueOk = false;
int channel = parser.value(channelOption).toInt(&channelValueOk); int channel = parser.value(channelOption).toInt(&channelValueOk);
@ -172,9 +180,12 @@ int main(int argc, char *argv[])
ZigbeeChannelMask mask; ZigbeeChannelMask mask;
mask.setChannel(Zigbee::ZigbeeChannel13); mask.setChannel(Zigbee::ZigbeeChannel13);
network->setChannelMask(mask); network->setChannelMask(mask);
network->startNetwork();
//Core core(parser.value(serialOption), baudrate, channel); ZigbeeSecurityConfiguration securityConfiguration;
securityConfiguration.setNetworkKey(ZigbeeNetworkKey(QString("2a:59:f4:11:75:bb:64:48:55:c5:23:62:b0:33:ea:33")));
network->setSecurityConfiguration(securityConfiguration);
network->startNetwork();
return application.exec(); return application.exec();
} }