MeshX 0.3
This repository provides an implementation for Bluetooth Low Energy (BLE) Mesh network nodes. The project allows you to create BLE mesh nodes that can communicate with each other, enabling the development of smart home solutions or other IoT-based applications.
Loading...
Searching...
No Matches
meshx_prov_srv.c
Go to the documentation of this file.
1
12
13#include "string.h"
14#include "meshx_nvs.h"
15#include "meshx_os_timer.h"
16#include "meshx_control_task.h"
17#include "meshx_prov_srv.h"
18
19#if CONFIG_ENABLE_PROVISIONING
20
27#define CONTROL_TASK_PROV_EVT_MASK CONTROL_TASK_MSG_EVT_IDENTIFY_START \
28 | CONTROL_TASK_MSG_EVT_PROVISION_STOP \
29 | CONTROL_TASK_MSG_EVT_IDENTIFY_STOP \
30 | CONTROL_TASK_MSG_EVT_NODE_RESET
31
32#define MESHX_PROV_SRV_CLIENT_EVENT_BMAP CONTROL_TASK_MSG_EVT_SYSTEM_FRESH_BOOT
33#define MESHX_PROV_SRV_SERVER_EVENT_BMAP CONTROL_TASK_MSG_EVT_EN_NODE_PROV
34
42{
43#if CONFIG_MESHX_DEFAULT_LOG_LEVEL < MESHX_LOG_INFO
44 const char *evt_str;
45#endif
48
49#if CONFIG_MESHX_DEFAULT_LOG_LEVEL < MESHX_LOG_INFO
57 [MESHX_NODE_PROV_RESET_EVT] = {"MESHX_NODE_PROV_RESET_EVT", CONTROL_TASK_MSG_EVT_NODE_RESET},
58 [MESHX_NODE_PROV_COMPLETE_EVT] = {"MESHX_NODE_PROV_COMPLETE_EVT", CONTROL_TASK_MSG_EVT_PROVISION_STOP},
59 [MESHX_NODE_PROV_LINK_OPEN_EVT] = {"MESHX_NODE_PROV_LINK_OPEN_EVT", CONTROL_TASK_MSG_EVT_IDENTIFY_START},
60 [MESHX_NODE_PROV_LINK_CLOSE_EVT] = {"MESHX_NODE_PROV_LINK_CLOSE_EVT", CONTROL_TASK_MSG_EVT_IDENTIFY_STOP},
61 [MESHX_NODE_PROV_ENABLE_COMP_EVT] = {"MESHX_NODE_PROV_ENABLE_COMP_EVT", CONTROL_TASK_MSG_EVT_EN_NODE_PROV},
62 [MESHX_PROXY_SERVER_CONNECTED_EVT] = {"MESHX_PROXY_SERVER_CONNECTED_EVT", CONTROL_TASK_MSG_EVT_PROXY_CONNECT},
63 [MESHX_PROXY_SERVER_DISCONNECTED_EVT] = {"MESHX_PROXY_SERVER_DISCONNECTED_EVT", CONTROL_TASK_MSG_EVT_PROXY_DISCONN},
64};
65
66#else
82#endif
83
85
96 dev_struct_t *pdev,
99{
100 if (!pdev || !params)
101 {
102 return MESHX_INVALID_ARG;
103 }
106 {
107 return MESHX_INVALID_ARG;
108 }
109
111 {
112 MESHX_LOGD(MODULE_ID_MODEL_SERVER, "Provisioning event mapped: %s",
115 }
116 else
117 {
118 MESHX_LOGD(MODULE_ID_MODEL_SERVER, "Unhandled event: %d", params->prov_evt);
119 }
121 {
122 MESHX_LOGI(MODULE_ID_MODEL_SERVER, "net_idx: 0x%04x, addr: 0x%04x", params->param.node_prov_complete.net_idx, params->param.node_prov_complete.addr);
123 MESHX_LOGI(MODULE_ID_MODEL_SERVER, "flags: 0x%02x, iv_index: 0x%08" PRIx32, params->param.node_prov_complete.flags, params->param.node_prov_complete.iv_index);
124 }
126 {
127 return MESHX_INVALID_ARG;
128 }
129
130 /* Publish the event */
133 prov_evt,
134 &params->param,
135 sizeof(meshx_prov_cb_param_t));
136 return MESHX_SUCCESS;
137}
138
149{
150 if(!pdev)
151 {
152 MESHX_LOGE(MODULE_ID_COMMON, "Invalid device structure");
153 return;
154 }
155
156 for(uint16_t i = 1; i < pdev->element_idx; i++)
157 {
159 if(err != MESHX_SUCCESS)
160 {
161 MESHX_LOGE(MODULE_ID_COMMON, "Failed to erase element context (%d): (%d)", i, err);
162 }
163 }
164 /* Reset the MCU */
166}
167
182{
183 const meshx_prov_cb_param_t *param = (meshx_prov_cb_param_t*) params;
184
185 switch (evt)
186 {
191 break;
193 MESHX_LOGI(MODULE_ID_COMMON, "Identify Start");
194 break;
196 MESHX_LOGW(MODULE_ID_COMMON, "Node Reset Event");
198 break;
199 default:
200 break;
201 }
202 return MESHX_SUCCESS;
203}
204
222
231{
232 MESHX_LOGI(MODULE_ID_COMMON, "Fresh Boot Timer Expired");
233
237 NULL,
238 0
239 );
240 if(err)
241 {
242 MESHX_LOGE(MODULE_ID_COMMON, "Failed to publish fresh boot event: (%d)", err);
243 }
244}
245
254static meshx_err_t meshx_init_freshboot_timer(dev_struct_t *p_dev, uint16_t timeout_ms)
255{
257 {
258 MESHX_LOGI(MODULE_ID_COMMON, "Device not provisioned, not starting boot timer");
259 return MESHX_SUCCESS;
260 }
261 meshx_err_t err = meshx_os_timer_create("boot_timer",
262 timeout_ms,
263 false,
266 );
267 if(err != MESHX_SUCCESS)
268 {
269 MESHX_LOGE(MODULE_ID_COMMON, "Failed to create boot timer: (%d)", err);
270 }
271
273 if(err != MESHX_SUCCESS)
274 {
275 MESHX_LOGE(MODULE_ID_COMMON, "Failed to start boot timer: (%d)", err);
276 }
277
278 return err;
279}
280
299
314{
315 if (!prov_cfg || memcmp(prov_cfg->uuid, MESHX_UUID_EMPTY, sizeof(meshx_uuid_addr_t)) == 0)
316 {
317 MESHX_LOGE(MODULE_ID_MODEL_SERVER, "Invalid server configuration");
318 return MESHX_INVALID_ARG;
319 }
320
322 if (err != MESHX_SUCCESS)
323 {
324 MESHX_LOGE(MODULE_ID_MODEL_SERVER, "Failed to register provisioning callback");
325 return err;
326 }
327
329 if (err != MESHX_SUCCESS)
330 {
331 MESHX_LOGE(MODULE_ID_MODEL_SERVER, "Failed to register provisioning callback");
332 return err;
333 }
334
335 err = meshx_init_freshboot_timer(p_dev, prov_cfg->freshboot_timeout_ms);
336 if (err != MESHX_SUCCESS)
337 {
338 MESHX_LOGE(MODULE_ID_MODEL_SERVER, "Failed to initialize boot timer");
339 return err;
340 }
341
342 return meshx_plat_init_prov(prov_cfg->uuid);
343}
344
365
386
416
417#endif /* CONFIG_ENABLE_PROVISIONING */
void meshx_platform_reset(void)
Resets the MeshX platform. This function performs a system reset, restarting the platform.
struct meshx_prov_params meshx_prov_params_t
Structure to hold provisioning parameters.
@ MESHX_NODE_PROV_COMPLETE_EVT
@ MESHX_PROV_EVT_MAX
@ MESHX_PROXY_SERVER_CONNECTED_EVT
@ MESHX_NODE_PROV_RESET_EVT
@ MESHX_PROXY_SERVER_DISCONNECTED_EVT
@ MESHX_NODE_PROV_LINK_OPEN_EVT
@ MESHX_NODE_PROV_LINK_CLOSE_EVT
@ MESHX_NODE_PROV_ENABLE_COMP_EVT
#define MESHX_UUID_EMPTY
#define MESHX_ADDR_UNASSIGNED
uint8_t meshx_uuid_addr_t[MESHX_UUID_ADDR_LEN]
meshx_err_t meshx_plat_init_prov(const uint8_t *uuid)
Initialize provisioning parameters.
control_task_msg_evt_provision_t prov_evt_t
struct meshx_ble_mesh_prov_srv_param meshx_prov_srv_param_t
control_task_msg_handle_t prov_srv_cb_t
struct dev_struct dev_struct_t
Structure representing the device composition and elements.
#define MESHX_NVS_STORE
Header file for the control task in the BLE mesh node application.
CONTROL_TASK_MSG_EVT_SYSTEM_FRESH_BOOT
CONTROL_TASK_MSG_EVT_IDENTIFY_START
CONTROL_TASK_MSG_EVT_PROVISION_STOP
uint32_t control_task_msg_evt_t
Type definition for control task message event.
CONTROL_TASK_MSG_EVT_PROXY_CONNECT
@ CONTROL_TASK_MSG_CODE_FRM_BLE
@ CONTROL_TASK_MSG_CODE_PROVISION
CONTROL_TASK_MSG_EVT_IDENTIFY_STOP
CONTROL_TASK_MSG_EVT_NODE_RESET
CONTROL_TASK_MSG_EVT_EN_NODE_PROV
meshx_err_t control_task_msg_publish(control_task_msg_code_t msg_code, control_task_msg_evt_t msg_evt, const void *msg_evt_params, size_t sizeof_msg_evt_params)
Publish a control task message.
CONTROL_TASK_MSG_EVT_PROVISION_ALL
enum __packed control_task_msg_evt_provision control_task_msg_evt_provision_t
Enumeration for control task provisioning events.
CONTROL_TASK_MSG_EVT_PROXY_DISCONN
meshx_err_t control_task_msg_subscribe(control_task_msg_code_t msg_code, control_task_msg_evt_t evt_bmap, control_task_msg_handle_t callback)
Subscribe to a control task message.
meshx_err_t
MeshX Error Codes.
Definition meshx_err.h:39
@ MESHX_SUCCESS
Definition meshx_err.h:40
@ MESHX_INVALID_ARG
Definition meshx_err.h:42
#define MESHX_LOGW(module_id, format,...)
Definition meshx_log.h:87
#define MESHX_LOGI(module_id, format,...)
Definition meshx_log.h:100
#define MESHX_LOGE(module_id, format,...)
Definition meshx_log.h:73
#define MESHX_LOGD(module_id, format,...)
Definition meshx_log.h:113
Header file for MeshX Non-Volatile Storage (NVS) operations.
meshx_err_t meshx_nvs_element_ctx_remove(uint16_t element_id)
Remove the context of a specific element from NVS.
Definition meshx_nvs.c:462
meshx_err_t meshx_nvs_set(char const *key, void const *blob, uint16_t blob_size, bool arm_timer)
Set a value in the NVS.
Definition meshx_nvs.c:366
#define MESHX_NVS_AUTO_COMMIT
Definition meshx_nvs.h:25
Header file for OS timer utilities.
meshx_err_t meshx_os_timer_start(const meshx_os_timer_t *timer_handle)
Start a timer.
struct meshx_os_timer meshx_os_timer_t
Alias for the meshx_os_timer structure.
meshx_err_t meshx_os_timer_create(const char *name, uint32_t period, bool reload, meshx_os_timer_cb_t cb, meshx_os_timer_t **timer_handle)
Create a timer.
#define MESHX_PROV_SRV_CLIENT_EVENT_BMAP
static meshx_os_timer_t * g_boot_timer
#define MESHX_PROV_SRV_SERVER_EVENT_BMAP
meshx_err_t meshx_prov_srv_reg_el_client_cb(prov_srv_cb_t cb)
Register a callback function for provisioning events.
meshx_err_t meshx_prov_srv_reg_el_server_cb(prov_srv_cb_t cb)
Register a callback function for provisioning events.
static meshx_err_t meshx_init_freshboot_timer(dev_struct_t *p_dev, uint16_t timeout_ms)
Initializes the fresh boot timer.
static meshx_err_t meshx_prov_srv_control_task_handler(dev_struct_t *pdev, control_task_msg_evt_t evt, meshx_prov_srv_param_t *params)
Control task handler for the provisioning server.
meshx_err_t meshx_init_prov(dev_struct_t *p_dev, const meshx_prov_params_t *prov_cfg)
Initialize provisioning parameters.
#define CONTROL_TASK_PROV_EVT_MASK
Mask for control task provisioning events.
static void meshx_handle_node_reset(dev_struct_t *pdev)
Handle node reset event.
static meshx_err_t meshx_prov_control_task_handler(dev_struct_t *pdev, control_task_msg_evt_t evt, void *params)
Handles provisioning control task events.
meshx_err_t meshx_prov_srv_notify_plat_event(meshx_prov_srv_param_t *param)
Notify the model event to the application.
static meshx_err_t meshx_prov_srv_meshx_reg_cb(void)
Register the BLE Mesh provisioning callback for MeshX Layer Internal.
static void meshx_init_freshboot_timer_trigger_cb(const meshx_os_timer_t *p_timer)
Callback function for the boot timer.
static meshx_err_t meshx_prov_srv_reg_from_ble_cb(void)
Register the BLE Mesh provisioning callback.
struct prov_cb_evt_ctrl_task_evt_table prov_cb_evt_ctrl_task_evt_table_t
Structure to map provisioning callback events to control task events.
Header file for provisioning related definitions and functions.
@ MODULE_ID_COMMON
Definition module_id.h:32
@ MODULE_ID_MODEL_SERVER
Definition module_id.h:30
meshx_app_store_t meshx_store
size_t element_idx
uint16_t net_key_id
uint16_t node_addr
Structure to map provisioning callback events to control task events.
control_task_msg_evt_provision_t ctrl_task_evt
BLE Mesh Node/Provisioner callback parameters union.
struct meshx_prov_cb_param_t::meshx_provision_complete_evt_param node_prov_complete