Merge pull request #6025 from karsev/thread_api_adds

Mesh-api setters for eui64 and pskd
pull/6028/merge
Martin Kojtal 2018-02-08 15:22:02 +00:00 committed by GitHub
commit 65e751bafb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 70 additions and 21 deletions

View File

@ -82,7 +82,7 @@ protected:
int8_t _network_interface_id; int8_t _network_interface_id;
/** Registered device ID */ /** Registered device ID */
int8_t _device_id; int8_t _device_id;
uint8_t eui64[8]; uint8_t _eui64[8];
char ip_addr_str[40]; char ip_addr_str[40];
char mac_addr_str[24]; char mac_addr_str[24];
Semaphore connect_semaphore; Semaphore connect_semaphore;

View File

@ -34,6 +34,25 @@ public:
ThreadInterface(NanostackRfPhy *phy) : MeshInterfaceNanostack(phy) { } ThreadInterface(NanostackRfPhy *phy) : MeshInterfaceNanostack(phy) { }
nsapi_error_t initialize(NanostackRfPhy *phy); nsapi_error_t initialize(NanostackRfPhy *phy);
/**
* \brief Sets the eui64 for the device configuration.
* By default this value is read from the radio driver.
* The value must be set before calling the connect function.
* */
void device_eui64_set(const uint8_t *eui64);
/**
* \brief sets the PSKd for the device configuration.
* The default value is overwritten, which is defined in the mbed_lib.json file in the mesh-api
* The value must be set before calling the connect function.
* \return MESH_ERROR_NONE on success.
* \return MESH_ERROR_PARAM in case of illegal parameters.
* \return MESH_ERROR_MEMORY in case of memory error.
* */
mesh_error_t device_pskd_set(const char *pskd);
virtual int connect(); virtual int connect();
virtual int disconnect(); virtual int disconnect();
private: private:

View File

@ -19,7 +19,7 @@
#include "mesh_system.h" #include "mesh_system.h"
MeshInterfaceNanostack::MeshInterfaceNanostack() MeshInterfaceNanostack::MeshInterfaceNanostack()
: phy(NULL), _network_interface_id(-1), _device_id(-1), eui64(), : phy(NULL), _network_interface_id(-1), _device_id(-1), _eui64(),
ip_addr_str(), mac_addr_str(), connect_semaphore(0) ip_addr_str(), mac_addr_str(), connect_semaphore(0)
{ {
// Nothing to do // Nothing to do
@ -62,8 +62,13 @@ nsapi_error_t MeshInterfaceNanostack::register_phy()
return -1; return -1;
} }
// Read mac address after registering the device. // Read mac address after registering the device.
phy->get_mac_address(eui64); const uint8_t empty_eui64[8] = {0,0,0,0,0,0,0,0};
sprintf(mac_addr_str, "%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x", eui64[0], eui64[1], eui64[2], eui64[3], eui64[4], eui64[5], eui64[6], eui64[7]); // if not set by application then read from rf driver
if(!memcmp(_eui64, empty_eui64,8)) {
phy->get_mac_address(_eui64);
}
sprintf(mac_addr_str, "%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x", _eui64[0], _eui64[1], _eui64[2], _eui64[3], _eui64[4], _eui64[5], _eui64[6], _eui64[7]);
nanostack_unlock(); nanostack_unlock();

View File

@ -20,7 +20,6 @@ int ThreadInterface::connect()
nanostack_unlock(); nanostack_unlock();
return NSAPI_ERROR_DEVICE_ERROR; return NSAPI_ERROR_DEVICE_ERROR;
} }
// After the RF is up, we can seed the random from it. // After the RF is up, we can seed the random from it.
randLIB_seed_random(); randLIB_seed_random();
@ -64,12 +63,9 @@ int ThreadInterface::disconnect()
mesh_error_t ThreadInterface::init() mesh_error_t ThreadInterface::init()
{ {
if (eui64 == NULL) {
return MESH_ERROR_PARAM;
}
thread_tasklet_init(); thread_tasklet_init();
__mesh_handler_set_callback(this); __mesh_handler_set_callback(this);
thread_tasklet_device_config_set(eui64, NULL); thread_tasklet_device_eui64_set(_eui64);
_network_interface_id = thread_tasklet_network_init(_device_id); _network_interface_id = thread_tasklet_network_init(_device_id);
if (_network_interface_id == -2) { if (_network_interface_id == -2) {
@ -111,6 +107,15 @@ mesh_error_t ThreadInterface::mesh_connect()
} }
} }
void ThreadInterface::device_eui64_set(const uint8_t *eui64)
{
memcpy(_eui64, eui64, 8);
}
mesh_error_t ThreadInterface::device_pskd_set(const char *pskd)
{
return (mesh_error_t)thread_tasklet_device_pskd_set(pskd);
}
mesh_error_t ThreadInterface::mesh_disconnect() mesh_error_t ThreadInterface::mesh_disconnect()
{ {

View File

@ -68,11 +68,17 @@ void thread_tasklet_init(void);
int8_t thread_tasklet_network_init(int8_t device_id); int8_t thread_tasklet_network_init(int8_t device_id);
/* /*
* \brief Set device configuration for thread network * \brief Sets eui64 for the device configuration
* \param eui64 mac address of the registered rf device * \param eui64 eui64 to be set
* \param pskd private shared key * \param pskd private shared key
*/ */
void thread_tasklet_device_config_set(uint8_t *eui64, char *pskd); void thread_tasklet_device_eui64_set(const uint8_t *eui64);
/*
* \brief Sets PSKd for the device configuration
* \param pskd private shared key to be set
*/
uint8_t thread_tasklet_device_pskd_set(const char *pskd);
/* /*
* \brief Disconnect network interface. * \brief Disconnect network interface.

View File

@ -278,13 +278,10 @@ void thread_tasklet_configure_and_connect_to_network(void)
// PSKd // PSKd
const char PSKd[] = MBED_CONF_MBED_MESH_API_THREAD_PSKD; const char PSKd[] = MBED_CONF_MBED_MESH_API_THREAD_PSKD;
MBED_ASSERT(sizeof(PSKd) > 5 && sizeof(PSKd) < 33); if(device_configuration.PSKd_len==0) {
int ret = thread_tasklet_device_pskd_set(PSKd);
char *dyn_buf = ns_dyn_mem_alloc(sizeof(PSKd)); MBED_ASSERT(!ret);
strcpy(dyn_buf, PSKd); }
ns_dyn_mem_free(device_configuration.PSKd_ptr);
device_configuration.PSKd_ptr = (uint8_t*)dyn_buf;
device_configuration.PSKd_len = sizeof(PSKd) - 1;
if (true == MBED_CONF_MBED_MESH_API_THREAD_USE_STATIC_LINK_CONFIG) { if (true == MBED_CONF_MBED_MESH_API_THREAD_USE_STATIC_LINK_CONFIG) {
read_link_configuration(); read_link_configuration();
@ -436,12 +433,29 @@ int8_t thread_tasklet_network_init(int8_t device_id)
return arm_nwk_interface_lowpan_init(api, INTERFACE_NAME); return arm_nwk_interface_lowpan_init(api, INTERFACE_NAME);
} }
void thread_tasklet_device_config_set(uint8_t *eui64, char *pskd) void thread_tasklet_device_eui64_set(const uint8_t *eui64)
{ {
(void) pskd; // this parameter is delivered via mbed configuration
memcpy(device_configuration.eui64, eui64, 8); memcpy(device_configuration.eui64, eui64, 8);
} }
uint8_t thread_tasklet_device_pskd_set(const char *pskd)
{
int len = strlen(pskd);
if(len < 6 || len > 32) {
return MESH_ERROR_PARAM;
}
char *dyn_buf = ns_dyn_mem_alloc(strlen(pskd)+1);
if (!dyn_buf) {
return MESH_ERROR_MEMORY;
}
strcpy(dyn_buf, pskd);
ns_dyn_mem_free(device_configuration.PSKd_ptr);
device_configuration.PSKd_ptr = (uint8_t*)dyn_buf;
device_configuration.PSKd_len = strlen(pskd);
return 0;
}
int8_t thread_tasklet_data_poll_rate_set(uint32_t timeout) int8_t thread_tasklet_data_poll_rate_set(uint32_t timeout)
{ {
int8_t status = -1; int8_t status = -1;