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