Seid gegrüßt Freunde,

heute ist mir für das Thema kein passender Name auf deutsch eingefallen. Wir wollen die App Bluetooth Mesh by Silicon Labs (Unreleased) nutzen, um einen Privisioning Vorgang durchzuführen und ein NRF51-DK Board, auf dem das Mesh Beispielprogramm von Zephyr läuft, in ein Mesh Netzwerk einbinden.

Ich gehe davon aus, dass wir unser Nordic Board am Rechner angeschlossen haben und die Debugausgaben über UART sehen können.

Initializing...
[bt] [INF] hci_vs_init: HW Platform: Nordic Semiconductor (0x0002)
[bt] [INF] hci_vs_init: HW Variant: nRF51x (0x0002)
[bt] [INF] hci_vs_init: Firmware: Standard Bluetooth controller (0x00) Version 1.9 Build 99
[bt] [INF] show_dev_info: Identity: c0:68:94:2e:82:2e (random)
[bt] [INF] show_dev_info: HCI: version 5.0 (0x09) revision 0x0000, manufacturer 0xffff
[bt] [INF] show_dev_info: LMP: version 5.0 (0x09) subver 0xffff
Bluetooth initialized
[bt] [INF] bt_mesh_prov_init: Device UUID: 00000000-0000-0000-0000-00000000dddd
Mesh initialized

Zunächst laden wir die App aus dem Playstore, installieren und öffnen diese.
Unter dem Punkt PROVISION drücken wir oben rechts auf SCAN. Nun sollte der Zephyr Knoten in der Liste auftauchen.
SL-A-NodeFound
Mit einem Klick auf das vernetzte Sechseck kann eine Verbindung zwischen Handy und dem Zephyr Knoten aufgebaut werden. Es erscheint ein neues Menü, in dem ein Name für das Gerät eingegeben werden soll. Zudem wird hier ausgewählt, in welches Mesh Netzwerk das Gerät eingebracht werden soll.

Ohne Änderung des Beispielprogrammes wird der Provision-Vorgang fehlschlagen.

[bt] [ERR] prov_start: Invalid authentication method: 0x02; action: 0x00; size: 0x04

Das Bluetooth Mesh Beispielprogramm verwendet eine Out-of-Band (OOB) Authentifizierung, um den Public Key sicher auszutauschen. In diesem Fall wird eine zufällige Zahl generiert und über UART ausgegeben. Die Silicon Labs App unterstützt die Form der Authentifizierung nicht.

Aus diesem Grund wird die Out-of-Band Authentifizierung deaktiviert, in dem wir den Quellcode wie folgt verändern:

/* static const struct bt_mesh_prov prov = {
	.uuid = dev_uuid,
	.output_size = 4,
	.output_actions = BT_MESH_DISPLAY_NUMBER,
	.output_number = output_number,
	.complete = prov_complete,
}; */
static const struct bt_mesh_prov prov = {
	.uuid = dev_uuid,
	.output_size = 0,
	//.output_actions = BT_MESH_DISPLAY_NUMBER,
	//.output_number = output_number,
	.complete = prov_complete,
};

Sobald wir den Quellcode neu kompilieren und auf das Gerät flashen, sollte der Provisioning Vorgang erfolgreicher sein.

[bt] [INF] bt_mesh_provision: Primary Element: 0x0001
[bt] [DBG] bt_mesh_provision: (0x200019b4) net_idx 0x0000 flags 0x00 iv_index 0x0000
[bt] [DBG] bt_mesh_net_create: (0x200019b4) idx 0 flags 0x00 iv_index 0
[bt] [DBG] bt_mesh_net_create: (0x200019b4) NetKey c945a6a8a9fa41fca158c003151e3738
[bt] [DBG] bt_mesh_net_keys_create: (0x200019b4) NID 0x73 EncKey 078049951faad2a0ce807e44bd5e52e7
[bt] [DBG] bt_mesh_net_keys_create: (0x200019b4) PrivacyKey cd5ef53fc37a9f2069c0f0d62e6283d0
[bt] [DBG] bt_mesh_net_keys_create: (0x200019b4) NetID 6a4ff6fdf90c216c
[bt] [DBG] bt_mesh_net_keys_create: (0x200019b4) IdentityKey 47b07f3d62e957c51f31ad4aef722e29
[bt] [DBG] bt_mesh_net_keys_create: (0x200019b4) BeaconKey 62d650c62fc47e54da54eb0bb116b31f
[bt] [DBG] bt_mesh_net_beacon_update: (0x200019b4) NetIndex 0 Using current key
[bt] [DBG] bt_mesh_net_beacon_update: (0x200019b4) flags 0x00, IVI 0x00000000

Der folgende "Fehler" wird angezeigt, da das Beispielprojekt für das Board NRF51-DK im Normalfall nur eine aktive Bluetooth Verbindung eingestellt ist.
Dies kann über CONFIG_BT_MAX_CONN angepasst werden (vgl. [BLE Mesh] Error: Failed to advertise using Node ID).

[bt] [ERR] node_id_adv: Failed to advertise using Node ID (err -5)

Über ein langes Drücken auf den Namen des gewünschten Moduls, gelangt man zu den weiteren Einstellungen. Hier kann die weitere Funktionalität des Moduls innerhalb des Mesh Netzwerks konfiguriert werden. Soll das Modul als Relay fungieren und/oder als Proxy, um eine höhere Reichweite zu erreichen und/oder Geräte über GATT in das Netzwerk einzubinden.
SL-A-Config

Anmerkung: Momentan werden die NetKeys und die AppKeys nicht persistent im Flash des Boards gespeichert. Daher muss bei jedem Modul der Provisioning-Vorgang neu wiederholt werden, sobald dieses neugestartet wird.
Außerdem hatte ich häufiger das Problem, dass ich keine Verbindung zum NRF51 aufbauen konnte. In der App stand zunächst connecting und anschließen "Error 133 retrying". Nach Schließen der App und einem neuen Start des Scan-Vorgangs, konnte meist eine erfolgreiche Verbindung hergestellt werden.

Im nächsten Beitrag wird der Provisioning-Vorgang mit meshctl behandelt.

Viele Grüße
Arthur