.. _bluetooth_mesh_provisioning: Provisioning ############ Provisioning is the process of adding devices to a mesh network. It requires two devices operating in the following roles: * The *provisioner* represents the network owner, and is responsible for adding new nodes to the mesh network. * The *provisionee* is the device that gets added to the network through the Provisioning process. Before the provisioning process starts, the provisionee is an *unprovisioned device*. The Provisioning module in the Zephyr Bluetooth Mesh stack supports both the Advertising and GATT Provisioning bearers for the provisionee role, as well as the Advertising Provisioning bearer for the provisioner role. The Provisioning process ************************ All Bluetooth Mesh nodes must be provisioned before they can participate in a Bluetooth Mesh network. The Provisioning API provides all the functionality necessary for a device to become a provisioned mesh node. Beaconing ========= To start the provisioning process, the unprovisioned device must first start broadcasting the Unprovisioned Beacon. This makes it visible to nearby provisioners, which can initiate the provisioning. To indicate that the device needs to be provisioned, call :c:func:`bt_mesh_prov_enable`. The device starts broadcasting the Unprovisioned Beacon with the device UUID and the ``OOB information`` field, as specified in the ``prov`` parameter passed to :c:func:`bt_mesh_init`. Additionally, a Uniform Resource Identifier (URI) may be specified, which can point the provisioner to the location of some Out Of Band information, such as the device's public key or an authentication value database. The URI is advertised in a separate beacon, with a URI hash included in the unprovisioned beacon, to tie the two together. Uniform Resource Identifier --------------------------- The Uniform Resource Identifier shall follow the format specified in the Bluetooth Core Specification Supplement. The URI must start with a URI scheme, encoded as a single utf-8 data point, or the special ``none`` scheme, encoded as ``0x01``. The available schemes are listed on the `Bluetooth website `_. Examples of encoded URIs: .. list-table:: URI encoding examples * - URI - Encoded * - ``http://example.com`` - ``\x16//example.com`` * - ``https://www.zephyrproject.org/`` - ``\x17//www.zephyrproject.org/`` * - ``just a string`` - ``\x01just a string`` Provisioning invitation ======================= The provisioner initiates the Provisioning process by sending a Provisioning invitation. The invitations prompts the provisionee to call attention to itself using the Health Server :ref:`bluetooth_mesh_models_health_srv_attention`, if available. The Unprovisioned device automatically responds to the invite by presenting a list of its capabilities, including the supported Out of Band Authentication methods. Authentication ============== After the initial exchange, the provisioner selects an Out of Band (OOB) Authentication method. This allows the user to confirm that the device the provisioner connected to is actually the device they intended, and not a malicious third party. The Provisioning API supports the following authentication methods for the provisionee: * **Static OOB:** An authentication value is assigned to the device in production, which the provisioner can query in some application specific way. * **Input OOB:** The user inputs the authentication value. The available input actions are listed in :c:enum:`bt_mesh_input_action_t`. * **Output OOB:** Show the user the authentication value. The available output actions are listed in :c:enum:`bt_mesh_output_action_t`. The application must provide callbacks for the supported authentication methods in :c:struct:`bt_mesh_prov`, as well as enabling the supported actions in :c:member:`bt_mesh_prov.output_actions` and :c:member:`bt_mesh_prov.input_actions`. When an Output OOB action is selected, the authentication value should be presented to the user when the output callback is called, and remain until the :c:member:`bt_mesh_prov.input_complete` or :c:member:`bt_mesh_prov.complete` callback is called. If the action is ``blink``, ``beep`` or ``vibrate``, the sequence should be repeated after a delay of three seconds or more. When an Input OOB action is selected, the user should be prompted when the application receives the :c:member:`bt_mesh_prov.input` callback. The user response should be fed back to the Provisioning API through :c:func:`bt_mesh_input_string` or :c:func:`bt_mesh_input_number`. If no user response is recorded within 60 seconds, the Provisioning process is aborted. Data transfer ============= After the device has been successfully authenticated, the provisioner transfers the Provisioning data: * Unicast address * A network key * IV index * Network flags * Key refresh * IV update Additionally, a device key is generated for the node. All this data is stored by the mesh stack, and the provisioning :c:member:`bt_mesh_prov.complete` callback gets called. API reference ************* .. doxygengroup:: bt_mesh_prov :project: Zephyr :members: