#ifndef THREAD_DATASET_H #define THREAD_DATASET_H #include #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