1 2# ESP BLE Mesh Node demo 3 4## 1. Introduction 5 6ESP BLE Mesh is built on top of Zephyr BLE Mesh stack. ESP BLE Mesh nodes support: 7 8* Network provisioning 9* Node control, including the use of PB\_GATT and PB\_ADV bearers 10* Encryption 11* Node features of Proxy, Relay, Low power and Friend 12 13This demo has only one element, in which the following two models are implemented: 14 15- **Configuration Server model**: The role of this model is mainly to configure Provisioner device’s AppKey and set up its relay function, TTL size, subscription, etc. 16- **Generic OnOff Server model**: This model implements the most basic function of turning the lights on and off. 17 18## 2. Code Analysis 19 20### 2.1 Folder Structure 21 22The folder `ble_mesh_node` contains the following files and subfolders: 23 24``` 25$ tree examples/bluetooth/esp_ble_mesh/ble_mesh/ble_mesh_node 26├── Makefile /* Compiling parameters for the demo */ 27├── README.md /* Quick start guide */ 28├── build 29├── main /* Stores the `.c` and `.h` application code files for this demo */ 30├── sdkconfig /* Current parameters of `idf.py menuconfig` */ 31├── sdkconfig.defaults /* Default parameters of `idf.py menuconfig` */ 32├── sdkconfig.old /* Previously saved parameters of `idf.py menuconfig` */ 33└── tutorial /* More in-depth information about the demo */ 34``` 35 36The contents of the `main` subfolder are as follows: 37 38``` 39main 40├── Kconfig.projbuild 41├── ble_mesh_demo_main.c /* main application codes, more info below */ 42├── board.c /* Codes for implementation 43├── board.h of the RGB LED driver */ 44└── component.mk 45``` 46 47- `ble_mesh_demo_main.c`: contains the following main application codes, which are needed to implement the BLE Mesh demo 48 - Initialize Bluetooth Controller stack and Host stack (bluedroid) 49 - Initialize BLE Mesh stack 50 - Register the callback function of BLE Mesh provision and BLE Mesh model 51 - Implement and initialize BLE Mesh element 52 - Implement and initialize BLE Mesh Configuration Server model and Generic OnOff Server model 53 - Function as BLE Mesh Configuration Server Model Get Opcode and BLE Mesh Configuration Server Model Set Opcode 54 - Declare and define the RGB LED structure. 55 56### 2.2 Code Analysis of BLE Mesh Node demo 57 58For better understanding of the demo implementation, this section provides a detailed analysis of the codes in the file `ble_mesh_demo_main.c`. 59 60#### 2.2.1 Initializing and Enabling BLE Mesh 61 62When ESP32 system initialization is completed, `app_main` is called. The code block below demonstrates the implementation of the functions in `app_main`. 63 64```c 65void app_main(void) 66{ 67 int err; 68 69 ESP_LOGI(TAG, "Initializing..."); 70 71 board_init(); 72 73 err = bluetooth_init(); 74 75 if (err) { 76 ESP_LOGE(TAG, "esp32_bluetooth_init failed (err %d)", err); 77 return; 78 } 79 80 /* Initializes the Bluetooth Mesh Subsystem */ 81 err = ble_mesh_init(); 82 if (err) { 83 ESP_LOGE(TAG, "Bluetooth mesh init failed (err %d)", err); 84 } 85} 86``` 87 88In particular, the code includes: 89 90- `err = bluetooth_init()`: initialization related to the Bluetooth protocol stack (including Controller and Host) 91- `err = ble_mesh_init()`: initialization related to BLE Mesh 92 93Further, the code for initialization of the BLE Mesh protocol stack is introduced, together with the description of the required actions to initialize BLE Mesh. 94 95```c 96static esp_err_t ble_mesh_init(void) 97{ 98 int err = 0; 99 100 memcpy(dev_uuid + 2, esp_bt_dev_get_address(), BLE_MESH_ADDR_LEN); 101 102 // See comment 1 103 esp_ble_mesh_register_prov_callback(esp_ble_mesh_prov_cb); 104 esp_ble_mesh_register_custom_model_callback(esp_ble_mesh_model_cb); 105 106 err = esp_ble_mesh_init(&provision, &composition); 107 if (err) { 108 ESP_LOGE(TAG, "Initializing mesh failed (err %d)", err); 109 return err; 110 } 111 112 esp_ble_mesh_node_prov_enable(ESP_BLE_MESH_PROV_ADV | ESP_BLE_MESH_PROV_GATT); 113 114 ESP_LOGI(TAG, "BLE Mesh Node initialized"); 115 116 board_led_operation(LED_G, LED_ON); 117 118 return err; 119} 120``` 121 122The code includes the following: 123 124- `esp_ble_mesh_register_prov_callback(esp_ble_mesh_prov_cb)`: registers the provisioning callback function in the BLE Mesh stack. This callback function gets executed during the BLE Mesh network configuration process. It allows the BLE Mesh stack to generate events and notify the application layer about important network configuration processes. This callback function mainly implements the following events: 125 - `ESP_BLE_MESH_PROVISION_REG_EVT`: Generated when the BLE Mesh initialization process is completed after calling the API function `esp_ble_mesh_init`. It returns the initialization status of the BLE Mesh application. 126 - `ESP_BLE_MESH_NODE_PROV_LINK_OPEN_EVT`: Generated when a Provisioner and an unprovisioned device establish a link. 127 - `ESP_BLE_MESH_NODE_PROV_LINK_CLOSE_EVT`: Generated to notify the application layer that a link has been broken after BLE Mesh bottom-layer protocol sends or receives the message `The Link Broken`. 128 - `ESP_BLE_MESH_NODE_PROV_OUTPUT_NUMBER_EVT`: Received by the application layer if during the configuration process `output_actions` is set as `ESP_BLE_MESH_DISPLAY_NUMBER`, and the target peer `input_actions` is set as `ESP_BLE_MESH_ENTER_NUMBER`. 129 - `ESP_BLE_MESH_NODE_PROV_OUTPUT_STRING_EVT`: Received by the application layer if during the configuration process `output_actions` is set as `ESP_BLE_MESH_DISPLAY_STRING`, and the target peer `input_actions` is set as `ESP_BLE_MESH_ENTER_STRING`. 130 - `ESP_BLE_MESH_NODE_PROV_INPUT_EVT`: Received by the application layer if during the configuration process `input_actions` is set as anything but `ESP_BLE_MESH_NO_INPUT`. 131 - `ESP_BLE_MESH_NODE_PROV_COMPLETE_EVT`: Received by the application layer when the provisioning is completed. 132 - `ESP_BLE_MESH_NODE_PROV_RESET_EVT`: Received by the application layer when the network reset is completed. 133 134- `esp_ble_mesh_register_custom_model_callback(esp_ble_mesh_model_cb)`: registers the model operation callback function. This callback function is used when the target peer operates the model state of the source peer after BLE Mesh has completed network configuration. This callback function mainly implements the following events: 135 - `ESP_BLE_MESH_MODEL_OPERATION_EVT`: Can be triggered by the two scenarios below: 136 - Server model receives `Get Status` or `Set Status` from Client model. 137 - Client model receives `Status state` from Server model. 138 - `ESP_BLE_MESH_MODEL_SEND_COMP_EVT`: Generated after the Server model sends `Status state` by calling the API function `esp_ble_mesh_server_model_send_msg`. 139 - `ESP_BLE_MESH_MODEL_PUBLISH_COMP_EVT`: Generated after the application has completed calling the API `esp_ble_mesh_model_publish_msg` to publish messages 140 - `ESP_BLE_MESH_CLIENT_MODEL_SEND_TIMEOUT_EVT`: Generated when the Client model calls the API function `esp_ble_mesh_client_model_send_msg`, but fails to receive ACK from the target peer due to timeout 141 - `ESP_BLE_MESH_MODEL_PUBLISH_UPDATE_EVT`: Generated after the application sets up the publish function to regularly send messages to the target peer. 142 143- `esp_ble_mesh_node_prov_enable(ESP_BLE_MESH_PROV_ADV | ESP_BLE_MESH_PROV_GATT)`: enables the Advertising and Scan functions when the BLE Mesh initialization is completed. It makes the devices visible to Provisioners for network provisioning. 144- `board_led_operation(LED_G, LED_ON)`: initializes the RGB LED. 145 146At this point, initialization and enabling of BLE Mesh as a node port is completed, which means a Provisioner can identify devices for network provisioning and data transmission. 147 148#### 2.2.2 Implementation of BLE Mesh Element Structure 149 150The section above shows how to initialize BLE Mesh as a node port. You may still have the following questions: 151 152- What else needs to be done before initialization? 153- How to add an element and a model to ESP BLE Mesh stack? 154- How to choose a different encryption approach? 155- How to declare the features of Proxy, Relay, Low Power and Friend? 156 157This section provides the answers to these questions. 158 159First of all, before calling the API `esp_ble_mesh_init` to initialize BLE Mesh, an element and a model need to be declared and defined. 160 161The code block below shows the declaration of an element structure. 162 163```c 164 165/*!< Abstraction that describes a BLE Mesh Element. 166 This structure is associated with bt_mesh_elem in mesh_access.h */ 167typedef struct { 168 /* Element Address, it is assigned during provisioning. */ 169 uint16_t element_addr; 170 171 /* Location Descriptor (GATT Bluetooth Namespace Descriptors) */ 172 const uint16_t location; 173 174 /* Model count */ 175 const uint8_t sig_model_count; 176 const uint8_t vnd_model_count; 177 178 /* Models */ 179 esp_ble_mesh_model_t *sig_models; 180 esp_ble_mesh_model_t *vnd_models; 181} esp_ble_mesh_elem_t; 182``` 183 184The next code block shows the definition of an element structure, which only requires to call the macro `ESP_BLE_MESH_ELEMENT`. 185 186```c 187static esp_ble_mesh_elem_t elements[] = { 188 ESP_BLE_MESH_ELEMENT(0, root_models, ESP_BLE_MESH_MODEL_NONE), 189}; 190``` 191Another code block provides the codes needed to implement the macro `ESP_BLE_MESH_ELEMENT`. 192 193```c 194#define ESP_BLE_MESH_ELEMENT(_loc, _mods, _vnd_mods) \ 195{ \ 196 .location = (_loc), \ 197 .sig_model_count = ARRAY_SIZE(_mods), \ 198 .sig_models = (_mods), \ 199 .vnd_model_count = ARRAY_SIZE(_vnd_mods), \ 200 .vnd_models = (_vnd_mods), \ 201} 202 203``` 204 205The variables of the element structure are as follows: 206 207- `addr`: stores the element primary address, used by Mesh Stack during the configuration process. It can be ignored for the higher level applications. 208- `loc`: location descriptor defined by SIG. For this demo, set its value to `0`. 209- `model_count`: number of SIG models supported in this element. 210- `vnd_model_count`: number of the Vendor model supported in this element. 211- `models`: pointer to the SIG Models that have already been defined. 212- `vnd_models`: pointer to the Vendor Model that has already been defined. 213 214<table><tr><td bgcolor=orange> Note: the SIG Model count and the Vendor Model count work separately. For example, if two SIG Models and one Vendor model are supported in an element, the variables would be model_count = 2, vnd_model_count = 1. </td></tr></table> 215 216 217If a defined element does not support the Vendor model, the third parameter (the last one) of the macro `ESP_BLE_MESH_ELEMENT` should be set to `ESP_BLE_MESH_MODEL_NODE`. Likewise, if the SIG Model is not supported, the second parameter should be set to `ESP_BLE_MESH_MODEL_NODE`. </td></tr></table> 218 219#### 2.2.3 Implementation of BLE Mesh Model Structure 220 221The preceding section has introduced the specific ways to implement and define an element by passing specific model pointers to it. This section explains how to implement and define a Model structure, which is shown in the code blocks below. 222 223```c 224/** Abstraction that describes a Mesh Model instance. 225 * This structure is associated with bt_mesh_model in mesh_access.h 226 */ 227struct esp_ble_mesh_model { 228 /* Model ID */ 229 union { 230 const uint16_t model_id; 231 struct { 232 uint16_t company_id; 233 uint16_t model_id; 234 } vnd; 235 }; 236 237 /* The Element to which this Model belongs */ 238 esp_ble_mesh_elem_t *element; 239 240 /* Model Publication */ 241 esp_ble_mesh_model_pub_t *const pub; 242 243 /* AppKey List */ 244 uint16_t keys[CONFIG_BLE_MESH_MODEL_KEY_COUNT]; 245 246 /* Subscription List (group or virtual addresses) */ 247 uint16_t groups[CONFIG_BLE_MESH_MODEL_GROUP_COUNT]; 248 249 /* Model operation context */ 250 esp_ble_mesh_model_op_t *op; 251 252 /* Model-specific user data */ 253 void *user_data; 254}; 255``` 256 257The block above shows a specific implementation of the model structure. Although this structure has many variables, only the following four ones are used for applications: 258 259- `id` and `vnd`: union variables, defining the SIG Model and the Vendor Model respectively. 260- `op`: structure with a set of variables for the Model Operation, declaring the opcode that corresponds to Get, Set, or Status State, as well as the minimum value lengths that are supported in this module. 261- `pub`: structure that needs to be defined if the Model structure supports the Publish function. 262- `user_data`: optional variable for storing the application layer data. 263 264The other structures and variables (keys, group, element) get their values through the BLE Mesh stack during the initialization or configuration stages. You are not required to initialize them. 265 266The next code block presents the definition of the model structure, and the `root_models[]` array. This array is used for indicating the number of the existing model structures. A model is implemented by using a macro. 267 268```c 269 270static esp_ble_mesh_model_t root_models[] = { 271 ESP_BLE_MESH_MODEL_CFG_SRV(&config_server), 272 ESP_BLE_MESH_SIG_MODEL(ESP_BLE_MESH_MODEL_ID_GEN_ONOFF_SRV, onoff_op, 273 &onoff_pub, &led_state[0]), 274}; 275``` 276 277Different models require different macros. The existing types of models and their respective macros needed for implementation are given in the table below. 278 279| | Model Name | Macro Required for its Definition | 280| --------------- | ---- | ----------------------------- | 281| **SIG Models Implemented in ESP32 BLE Mesh Stack** | Configuration Server Model | `ESP_BLE_MESH_MODEL_CFG_SRV` | 282| | Configuration Client Model | `ESP_BLE_MESH_MODEL_CFG_CLI` | 283| | Generic OnOff Client Model | `ESP_BLE_MESH_MODEL_GEN_ONOFF_CLI` | 284| | Generic Level Client Model | `ESP_BLE_MESH_MODEL_GEN_LEVEL_CLI` | 285| | Generic Default Transition Time Client Model | `ESP_BLE_MESH_MODEL_GEN_DEF_TRANS_TIME_CLI` | 286| | Generic Power OnOff Client Model | `ESP_BLE_MESH_MODEL_GEN_POWER_ONOFF_CLI` | 287| | Generic Power Level Client Model | `ESP_BLE_MESH_MODEL_GEN_POWER_LEVEL_CLI` | 288| | Generic Battery Client Model | `ESP_BLE_MESH_MODEL_GEN_BATTERY_CLI` | 289| | Generic Location Client Model | `ESP_BLE_MESH_MODEL_GEN_LOCATION_CLI` | 290| | Generic Property Client Model | `ESP_BLE_MESH_MODEL_GEN_PROPERTY_CLI` | 291| | Light Lightness Client Model | `ESP_BLE_MESH_MODEL_LIGHT_LIGHTNESS_CLI` | 292| | Light CTL Client Model | `ESP_BLE_MESH_MODEL_LIGHT_CTL_CLI` | 293| | Light HSL Client Model | `ESP_BLE_MESH_MODEL_LIGHT_HSL_CLI` | 294| | Sensor Client Model | `ESP_BLE_MESH_MODEL_SENSOR_CLI` | 295| | Scene Client Model | `ESP_BLE_MESH_MODEL_SCENE_CLI` | 296| **SIG Models Not Implemented in ESP32 BLE Mesh Stack** | - | `ESP_BLE_MESH_SIG_MODEL` | 297| **Vendor Models** | - | `ESP_BLE_MESH_VENDOR_MODEL` | 298 299Another important structure in a model is `esp_ble_mesh_model_op_t *op` pointers. These structures point to the operation structure that defines the Model state. Generally, there are two types of models in BLE Mesh: 300 301- Server Model: 302 - Consists of one or multiple states that can exist across different elements 303 - Defines the messages sent/received by the model, along with the element's behavior. 304 - Example:On/Off switch --- Indicates the On/Off status. 305- Client Model: 306 - Defines the messages used by the client to request, change or use the relevant state of the server. 307 - Example:On/Off switch --- Indicates the On or Off message sent by the Client. 308 309Operation structure defines the state value supported by a model. A specific operation structure is given below. 310 311The following code block shows the declaration of the Model operation structure. 312 313```c 314/*!< Model operation context. 315 This structure is associated with bt_mesh_model_op in mesh_access.h */ 316typedef struct { 317 const uint32_t opcode; /* Opcode encoded with the ESP_BLE_MESH_MODEL_OP_* macro */ 318 const size_t min_len; /* Minimum required message length */ 319 esp_ble_mesh_cb_t param_cb; /* The callback is only used for the BLE Mesh stack, not for the app layer. */ 320} esp_ble_mesh_model_op_t; 321``` 322 323There are three variables in the declaration of the operation structure: 324 325- `opcode`: opcode corresponding to a state. As specified in BLE Mesh, the SIG Model opcode should be 1~2 bytes, and the Vendor Model opcode should be 3 bytes. 326- `min_len`: min length of the messages received by the state. For example, OnOff Get state is 0 bytes, and OnOff Set State is 2 bytes. 327- `param_cb`: used for the BLE Mesh protocol only. Applications need to set its value to `0`. 328 329The block below shows the operation structure array defined by the OnOff Server in this demo. 330 331```c 332static esp_ble_mesh_model_op_t onoff_op[] = { 333 { ESP_BLE_MESH_MODEL_OP_GEN_ONOFF_GET, 0, 0}, 334 { ESP_BLE_MESH_MODEL_OP_GEN_ONOFF_SET, 2, 0}, 335 { ESP_BLE_MESH_MODEL_OP_GEN_ONOFF_SET_UNACK, 2, 0}, 336 /* Each model operation struct array must use this terminator 337 * as the end tag of the operation uint. */ 338 ESP_BLE_MESH_MODEL_OP_END, 339}; 340``` 341 342It presents the opcodes, corresponding to the three states, defined in this demo: OnOff Get, OnOff Set, and OnOff Set Unack. 343 344<table><tr><td bgcolor=orange> Note: for the Server Model, the corresponding request state of the Client Model needs to be written in the operation definition. For example, if the Generic OnOff Server Model is to be implemented in this demo, the following three states requested by the Generic OnOff Client Model need to be written in the operation definition: OnOff Get, OnOff Set, and OnOff Set Unack. Likewise, for the Client Model, the corresponding State of the messages received by the Server needs to be written in the operation definition. </td></tr></table> 345 346#### 2.2.4. Encryption and Authentication of BLE Mesh 347 348In the project developing process, different security levels are required. BLE Mesh offers various kinds of encryption and authentication features which can be split into two categories - Input and Output. 349 350The classification of the Input features is given in the table below. 351 352| Feature Name | Action Supported | 353| ------------ | ------------------ | 354| `ESP_BLE_MESH_NO_INPUT` | Input is not supported by device's IO | 355| `ESP_BLE_MESH_PUSH` | PUSH | 356| `ESP_BLE_MESH_TWIST` | TWIST | 357| `ESP_BLE_MESH_ENTER_NUMBER` | ENTER NUMBER | 358| `ESP_BLE_MESH_ENTER_STRING` | ENTER STRING | 359 360The classification of the Output features is given in the table below. 361 362| Feature Name | Action Supported | 363| ------------ | ------------------ | 364| `ESP_BLE_MESH_NO_OUTPUT ` | Output is not supported by device's IO | 365| `ESP_BLE_MESH_BLINK ` | BLINK | 366| `ESP_BLE_MESH_BEEP ` | BEEP | 367| `ESP_BLE_MESH_VIBRATE ` | VIBRATE | 368| `ESP_BLE_MESH_DISPLAY_NUMBER ` | DISPLAY NUMBER | 369| `ESP_BLE_MESH_DISPLAY_STRING ` | DISPLAY STRING | 370 371The above Input and Output categories in the declaration of the structure `esp_ble_mesh_prov_t` can be defined by the following four variables: 372 373- `output_size` 374- `output_actions` 375- `input_actions` 376- `input_size` 377 378These variables should be set to `0` for this demo, as it uses the most basic authentication features. 379 380## 3. Configuration of BLE Mesh Menuconfig 381 382To be functional across different applications, the BLE Mesh menuconfig is specifically designed to offer a variety of configuration options, which can be helpful in tailoring your own configuration. 383 384The list of configuration options in BLE Mesh menuconfig is stored in `Component config` ---> `[]Bluetooth Mesh support` and can be accessed with the command `idf.py menuconfig`. This configuration option list is shown below. 385 386``` 387—— Bluetooth Mesh support 388[*] Support for BLE Mesh Node 389[ ] Support for BLE Mesh Provisioner 390[*] Provisioning support using the advertising bearer (PB-ADV) 391[*] net buffer pool usage 392[*] Provisioning support using GATT (PB-GATT) 393[*] GATT Proxy Service 394(60) Node Identity advertising timeout 395(1) Maximum number of filter entries per Proxy Client 396[*] Perform self-tests 397[*] Test the IV Update Procedure 398(1) Maximum number of mesh subnets per network 399(1) Maximum number of application keys per network 400(1) Maximum number of application keys per model 401(1) Maximum number of group address subscriptions per model 402(1) Maximum number of Label UUIDs used for virtual Addresses 403(10) Maximum capacity of the replay protection list 404(10) Network message cache size 405(20) Number of advertising buffers 406(6) Maximum number of simultaneous outgoing segmented messages 407(1) Maximum number of simultaneous incoming segmented messages 408(384) Maximum incoming Upper Transport Access PDU length 409[*] Relay support 410[ ] Support for Low Power features 411[ ] Support for acting as a Friend Node 412[*] Support for Configuration Client Model 413[*] Support for Health Client Model 414[ ] Support for Generic OnOff Client Model 415[ ] Support for Generic Level Client Model 416[ ] Support for Generic Default Transition Time Client Model 417[ ] Support for Generic Power OnOff Client Model 418[ ] Support for Generic Power Level Client Model 419[ ] Support for Generic Battery Client Model 420[ ] Support for Generic Location Client Model 421[ ] Support for Generic Property Client Model 422[ ] Support for Sensor Client Model 423[ ] Support for Scene Client Model 424[ ] Support for Light Lightness Client Model 425[ ] Support for Light CTL Client Model 426[ ] Support for Light HSL Client Model 427[ ] Enable Bluetooth Mesh shell 428``` 429 430The detailed information about the roles and functions of these options is presented below. 431 432- **Support for BLE Mesh Node**: Indicates if the role of a node is supported. There are two roles in BLE Mesh: a Provisioner and a node. In this demo only a node is supported. 433- **Support for BLE Mesh Provisioner**: Indicates if the role of a Provisioner is supported. 434- **Provisioning support using the advertising bearer (PB-ADV)**: Indicates if the bearer PB-ADV is supported for network provisioning. In BLE Mesh,the bearers PB-ADV and PB-GATT are supported for network provisioning. This demo supports both of them. 435- **net buffer pool usage**: When enabled, BLE Mesh monitors the usage of the Adv buffer. 436- **Provisioning support using GATT (PB-GATT)**: Indicates if the PB-GATT bearer is supported for network provisioning. 437- **GATT Proxy Service**: Indicates if the GATT proxy service is supported. 438 - **Node Identity advertising timeout**: Indicates the time (in seconds) after which advertising stops. This value gets assigned by BLE Mesh protocol stack when using the GATT proxy service. 439- **Maximum number of filter entries per Proxy Client**: Used to configure the maximum number of filtered addresses. To reduce the number of Network PDUs exchanges between a Proxy Client and a Proxy Server, a proxy filter can be used. The output filter of the network interface instantiated by the Proxy Server can be configured by the Proxy Client. This allows the Proxy Client to explicitly request to receive only mesh messages with certain destination addresses. For example, a Proxy Client that is subscribed to a group address may want to only receive packets addressed to the unicast address of one of its elements and to that group address. Thus, the Proxy Client has full control over the packets it receives using the Proxy protocol. 440- **Perform self-tests**: 441- **Test the IV Update Procedure**: 442- **Maximum number of mesh subnets per network**: Indicates the maximum number of the subnets supported in a BLE Mesh network. 443- **Maximum number of application keys per network**: Indicates the maximum number of AppKeys supported in a BLE Mesh network. 444- **Maximum number of application keys per model**: Indicates the maximum number of AppKeys bound in each Model. 445- **Maximum number of group address subscriptions per model**: Indicates the maximum number of group address subscriptions supported in each model in BLE Mesh. 446- **Maximum number of Label UUIDs used for Virtual Addresses**: Indicates the maximum number of Label UUIDs supported in BLE Mesh. 447- **Maximum capacity of the replay protection list**: Indicates what the name suggests. 448- **Network message cache size**: Configures the size of the cache, which is used to store the forwarded messages to avoid multiple forwarding in BLE Mesh. 449- **Number of advertising buffers**: Indicates what the name suggests. 450- **Maximum number of simultaneous outgoing segmented messages**: Indicates what the name suggests. 451- **Maximum number of simultaneous incoming segmented messages**: Indicates what the name suggests. 452- **Maximum incoming Upper Transport Access PDU length**: Indicates that the access layer can receive the maximum length of a complete packet. 453- **Relay support**: Indicates if the Relay feature is supported. 454- **Support for Low Power features**: Indicates if the Low Power features are supported. 455- **Support for acting as a Friend Node**: Indicates if the Friend feature is supported. 456- **Support for Configuration Client Model**: Indicates if the Configuration Client model is supported. 457- **Support for Health Client Model**: Indicates if the given model is supported. 458- **Support for Generic OnOff Client Model**: Indicates if the given model is supported. 459- **Support for Generic Level Client Model**: Indicates if the given model is supported. 460- **Support for Generic Default Transition Time Client Model**: Indicates if the given model is supported. 461- **Support for Generic Power Onoff Client Model**: Indicates if the given model is supported. 462- **Support for Generic Power Level Client Model**: Indicates if the given model is supported. 463- **Support for Generic Battery Client Model**: Indicates if the given model is supported. 464- **Support for Generic Location Client Model**: Indicates if the given model is supported. 465- **Support for Generic Property Client Model**: Indicates if the given model is supported. 466- **Support for Sensor Client Model**: Indicates if the given model is supported. 467- **Support for Scene Client Model**: Indicates if the given model is supported. 468- **Support for Light Lightness Client Model**: Indicates if the given model is supported. 469- **Support for Light CTL Client Model**: Indicates if the given model is supported. 470- **Support for Light HSL Client Model**: Indicates if the given model is supported. 471- **Enable Bluetooth Mesh shell**: 472