Files
TOI_2_student/src/thread_dataset.h
2026-03-19 16:06:28 +01:00

84 lines
2.9 KiB
C

#ifndef THREAD_DATASET_H
#define THREAD_DATASET_H
#include <string.h>
#include "openthread/dataset.h"
#include "openthread/ip6.h"
/*
* TODO pro studenty:
* - nastavte parametry site Thread podle README.md
*/
#define THREAD_NETWORK_NAME "TODO_NETWORK_NAME"
#define THREAD_CHANNEL 0
#define THREAD_PANID 0x0000
#define THREAD_MESH_LOCAL_PREFIX_STRING "fd00:0000:0000:0000"
#define THREAD_GATEWAY_STATIC_ADDR THREAD_MESH_LOCAL_PREFIX_STRING "::1"
#define THREAD_NODE_STATIC_ADDR THREAD_MESH_LOCAL_PREFIX_STRING "::10"
#define THREAD_GATEWAY_COAP_URL "coap://[" THREAD_GATEWAY_STATIC_ADDR "]:5683/sensor"
static inline void thread_dataset_get_active(otOperationalDataset *dataset)
{
/*
* TODO:
* - doplnte Network Key podle README.md
* - doplnte Extended PAN ID podle README.md
* - zkontrolujte Mesh-Local prefix podle README.md
*/
static const uint8_t network_key[OT_NETWORK_KEY_SIZE] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};
static const uint8_t ext_pan_id[OT_EXT_PAN_ID_SIZE] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};
static const uint8_t mesh_local_prefix[OT_MESH_LOCAL_PREFIX_SIZE] = {
0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};
memset(dataset, 0, sizeof(*dataset));
dataset->mActiveTimestamp.mSeconds = 1;
dataset->mActiveTimestamp.mTicks = 0;
dataset->mActiveTimestamp.mAuthoritative = true;
memcpy(dataset->mNetworkKey.m8, network_key, sizeof(network_key));
memcpy(dataset->mExtendedPanId.m8, ext_pan_id, sizeof(ext_pan_id));
memcpy(dataset->mMeshLocalPrefix.m8, mesh_local_prefix, sizeof(mesh_local_prefix));
memcpy(dataset->mNetworkName.m8, THREAD_NETWORK_NAME, sizeof(THREAD_NETWORK_NAME));
dataset->mPanId = THREAD_PANID;
dataset->mChannel = THREAD_CHANNEL;
dataset->mComponents.mIsActiveTimestampPresent = true;
dataset->mComponents.mIsNetworkKeyPresent = true;
dataset->mComponents.mIsNetworkNamePresent = true;
dataset->mComponents.mIsExtendedPanIdPresent = true;
dataset->mComponents.mIsMeshLocalPrefixPresent = true;
dataset->mComponents.mIsPanIdPresent = true;
dataset->mComponents.mIsChannelPresent = true;
}
static inline otError thread_add_static_unicast_address(otInstance *instance, const char *address)
{
otIp6Address parsed_address;
otIp6InterfaceIdentifier iid;
/* Studenti si zde mohou overit, jak se IPv6 adresa mapuje do IID. */
if (otIp6AddressFromString(address, &parsed_address) != OT_ERROR_NONE) {
return OT_ERROR_INVALID_ARGS;
}
memcpy(iid.mFields.m8, &parsed_address.mFields.m8[8], sizeof(iid.mFields.m8));
return otIp6SetMeshLocalIid(instance, &iid);
}
static inline void thread_dataset_get_tlvs(otOperationalDatasetTlvs *dataset_tlvs)
{
otOperationalDataset dataset;
thread_dataset_get_active(&dataset);
otDatasetConvertToTlvs(&dataset, dataset_tlvs);
}
#endif