AliOS Things SIG BLE mesh Setup Guides
Hardware preparation
One block of Raspberry PI3
Two blocks of ESP32 Devkitc
Two NRF51822 development boards
Software environment setup
Currently, Bluez operated in Raspberry PI 3 has been used as provisioner. If you want to operate meshctl, compilation option of Raspberry PI is needed to be modified. Some characteristics concerning safety should be selected to ensure the operation of meshctl.
Raspberry PI kernel
Compile Raspberry PI kernel in linux:
Download Raspberry PI source code:
git clone https://github.com/raspberrypi/linux.git
Set the path of cross compiler tool chain.
`luwang@ubuntu:~/raspberry-pi/linux$ export CCPREFIX=/home/luwang/raspberry-pi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/arm-linux-gnueabihf-
luwang@ubuntu:~/raspberry-pi/linux$ ${CCPREFIX}gcc -v
Using built-in specs.
COLLECT_GCC=/home/luwang/raspberry-pi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/arm-linux-gnueabihf-gcc
COLLECT_LTO_WRAPPER=/home/luwang/raspberry-pi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/../libexec/gcc/arm-linux-gnueabihf/4.8.3/lto-wrapper
Target: arm-linux-gnueabihf
Configured with: /cbuild/slaves/oorts/crosstool-ng/builds/arm-linux-gnueabihf-raspbian-linux/.build/src/gcc-linaro-4.8-2014.01/configure --build=i686-build_pc-linux-gnu --host=i686-build_pc-linux-gnu --target=arm-linux-gnueabihf --prefix=/cbuild/slaves/oorts/crosstool-ng/builds/arm-linux-gnueabihf-raspbian-linux/install --with-sysroot=/cbuild/slaves/oorts/crosstool-ng/builds/arm-linux-gnueabihf-raspbian-linux/install/arm-linux-gnueabihf/libc --enable-languages=c,c++,fortran --disable-multilib --enable-multiarch --with-arch=armv6 --with-tune=arm1176jz-s --with-fpu=vfp --with-float=hard --with-pkgversion='crosstool-NG linaro-1.13.1-4.8-2014.01 - Linaro GCC 2013.11' --with-bugurl=https://bugs.launchpad.net/gcc-linaro --enable-__cxa_atexit --enable-libmudflap --enable-libgomp --enable-libssp --with-gmp=/cbuild/slaves/oorts/crosstool-ng/builds/arm-linux-gnueabihf-raspbian-linux/.build/arm-linux-gnueabihf/build/static --with-mpfr=/cbuild/slaves/oorts/crosstool-ng/builds/arm-linux-gnueabihf-raspbian-linux/.build/arm-linux-gnueabihf/build/static --with-mpc=/cbuild/slaves/oorts/crosstool-ng/builds/arm-linux-gnueabihf-raspbian-linux/.build/arm-linux-gnueabihf/build/static --with-isl=/cbuild/slaves/oorts/crosstool-ng/builds/arm-linux-gnueabihf-raspbian-linux/.build/arm-linux-gnueabihf/build/static --with-cloog=/cbuild/slaves/oorts/crosstool-ng/builds/arm-linux-gnueabihf-raspbian-linux/.build/arm-linux-gnueabihf/build/static --with-libelf=/cbuild/slaves/oorts/crosstool-ng/builds/arm-linux-gnueabihf-raspbian-linux/.build/arm-linux-gnueabihf/build/static --enable-threads=posix --disable-libstdcxx-pch --enable-linker-build-id --enable-plugin --enable-gold --with-local-prefix=/cbuild/slaves/oorts/crosstool-ng/builds/arm-linux-gnueabihf-raspbian-linux/install/arm-linux-gnueabihf/libc --enable-c99 --enable-long-long --with-float=hard
Thread model: posix
gcc version 4.8.3 20140106 (prerelease) (crosstool-NG linaro-1.13.1-4.8-2014.01 - Linaro GCC 2013.11)
luwang@ubuntu:~/raspberry-pi/linux$`
Here we get the .config file compiled by kernel from Raspberry PI. The mirror image installed on Raspberry PI is 2017-11-29-raspbian-stretch.img.
Input the following command on Raspberry PI to generate kernel configuration file
sudo modprobe configs
Copy the configuration file generated in linux and unzip it.
scp pi@raspberrypi:/proc/config.gz PATH_TO_RASPBERRY_PI/linux gunzip -c config.gz > .config
Modify the following configuration options in configuration file.
`CONFIG_CRYPTO_CMAC=y
CONFIG_CRYPTO_USER_API=y
CONFIG_CRYPTO_USER_API_HASH=y
CONFIG_CRYPTO_USER_API_SKCIPHER=y`
Generate the kernel
`cd PATH_TO_RASPBERRY_PI/linux
ARCH=arm CROSS_COMPILE=${CCPREFIX} make`
Generate kernel modules
ARCH=arm CROSS_COMPILE=${CCPREFIX} INSTALL_MOD_PATH=../modules make modules_install
Get the following log information
` INSTALL sound/soc/codecs/snd-soc-tas5713.ko
INSTALL sound/soc/codecs/snd-soc-tpa6130a2.ko
INSTALL sound/soc/codecs/snd-soc-wm-adsp.ko
INSTALL sound/soc/codecs/snd-soc-wm5102.ko
INSTALL sound/soc/codecs/snd-soc-wm8731.ko
INSTALL sound/soc/codecs/snd-soc-wm8741.ko
INSTALL sound/soc/codecs/snd-soc-wm8804-i2c.ko
INSTALL sound/soc/codecs/snd-soc-wm8804.ko
INSTALL sound/soc/generic/snd-soc-simple-card-utils.ko
INSTALL sound/soc/generic/snd-soc-simple-card.ko
INSTALL sound/soc/snd-soc-core.ko
INSTALL sound/usb/6fire/snd-usb-6fire.ko
INSTALL sound/usb/caiaq/snd-usb-caiaq.ko
INSTALL sound/usb/misc/snd-ua101.ko
INSTALL sound/usb/snd-usb-audio.ko
INSTALL sound/usb/snd-usbmidi-lib.ko
INSTALL .modules/lib/firmware/emi26/loader.fw
INSTALL .modules/lib/firmware/emi26/firmware.fw
INSTALL .modules/lib/firmware/emi26/bitstream.fw
INSTALL .modules/lib/firmware/emi62/loader.fw
INSTALL .modules/lib/firmware/emi62/bitstream.fw
INSTALL .modules/lib/firmware/emi62/spdif.fw
INSTALL .modules/lib/firmware/emi62/midi.fw
INSTALL .modules/lib/firmware/kaweth/new_code.bin
INSTALL .modules/lib/firmware/kaweth/trigger_code.bin
INSTALL .modules/lib/firmware/kaweth/new_code_fix.bin
INSTALL .modules/lib/firmware/kaweth/trigger_code_fix.bin
INSTALL .modules/lib/firmware/ti_3410.fw
INSTALL .modules/lib/firmware/ti_5052.fw
INSTALL .modules/lib/firmware/mts_cdma.fw
INSTALL .modules/lib/firmware/mts_gsm.fw
INSTALL .modules/lib/firmware/mts_edge.fw
INSTALL .modules/lib/firmware/edgeport/boot.fw
INSTALL .modules/lib/firmware/edgeport/boot2.fw
INSTALL .modules/lib/firmware/edgeport/down.fw
INSTALL .modules/lib/firmware/edgeport/down2.fw
INSTALL .modules/lib/firmware/edgeport/down3.bin
INSTALL .modules/lib/firmware/whiteheat_loader.fw
INSTALL .modules/lib/firmware/whiteheat.fw
INSTALL .modules/lib/firmware/keyspan_pda/keyspan_pda.fw
INSTALL .modules/lib/firmware/keyspan_pda/xircom_pgs.fw
INSTALL .modules/lib/firmware/cpia2/stv0672_vp4.bin
INSTALL .modules/lib/firmware/yam/1200.bin
INSTALL .modules/lib/firmware/yam/9600.bin
DEPMOD 4.9.77-v7+
luwang@ubuntu:~/raspberry-pi/linux$ `
The upper half of log is omitted because of the length of the space. Remember that the version is 4.9.77-v7+.
In Linux machine, copy the generated kernel from Linux to Raspberry PI.
cd PATH_TO_RASPBERRY_PI/linux/arch/arm/boot/zImage pi@RASPBARRY:/tmp/kernel_new.img
In Linux machine, copy the generated modules from Linux to Raspberry PI.
`cd PATH_TO_RASPBERRY_PI/modules
tar czf modules.tgz *
scp modules.tgz pi@RASPBERRY:/tmp`
Move the copied kernel and modules to boot and lib.
`sudo cp /tmp/kernel_new.img /boot
sudo tar zxf /tmp/modules.tgz
sudo cp -rf /tmp/lib/firmware /lib/firmware
sudo cp -rf /tmp/lib/modules /lib/modules`
Start the configuration file config.tx in Raspberry PI. Add the following content at the last of the file, and order it to start in the newly generated kernel_new.img.
kernel=kernel_new.img
Restart Raspberry PI
sudo shutdown -r now
Make sure the kernel information has been updated to the newly generated one.
uname -r 4.9.77-v7+
Install the needed dependency.
`sudo apt-get update
sudo apt-get install -y libusb-dev libdbus-1-dev libglib2.0-dev libudev-dev libical-dev libreadline-dev autotools-dev automake libtool`
json-c
Download json-c source code.
git clone https://github.com/json-c/json-c.git
Compile and install.
`cd PATH_TO_JSON_C
sh autogen.sh
./configure
make
sudo make install`
Bluez
Download bluez-5.48.tar.gz from the following link, and unzip it.
`https://git.kernel.org/pub/scm/bluetooth/bluez.git
tar xvf bluez-5.48.tar.gz`
Modify the logic with which mesh GATT processes data segments. diff as follows:
`luwang@ubuntu:~/bluez$ git diff mesh/gatt.c
diff --git a/mesh/gatt.c b/mesh/gatt.c
index 9116a9d..8d564a9 100644
--- a/mesh/gatt.c
+++ b/mesh/gatt.c
@@ -393,7 +393,10 @@ static bool pipe_read(struct io *io, bool prov, void *user_data)
break;
res = buf;
- mesh_gatt_sar(&res, len);
+ len = mesh_gatt_sar(&res, len);
+ if (len == 0) {
+ break;
+ }
if (prov)
prov_data_ready(node, res, len);`
Compile and install.
`cd PATH_TO_BLUEZ
./bootstrap
./configure --enable-mesh --enable-debug
make
sudo make install`
Bluetooth controller
What Bluetooth controller uses is zephyr's bluetooth/hci_uart application, V1.10-branch。
Modify the baud rate to 115200.
`luwang@ubuntu:~/zephyr/samples/bluetooth/hci_uart$ git diff nrf5.conf
diff --git a/samples/bluetooth/hci_uart/nrf5.conf b/samples/bluetooth/hci_uart/nrf5.conf
index 4a507be..9aea95f 100644
--- a/samples/bluetooth/hci_uart/nrf5.conf
+++ b/samples/bluetooth/hci_uart/nrf5.conf
@@ -4,7 +4,7 @@ CONFIG_UART_CONSOLE=n
CONFIG_GPIO=y
CONFIG_SERIAL=y
CONFIG_UART_INTERRUPT_DRIVEN=y
-CONFIG_UART_NRF5_BAUD_RATE=1000000
+CONFIG_UART_NRF5_BAUD_RATE=115200
CONFIG_UART_NRF5_FLOW_CONTROL=y
CONFIG_MAIN_STACK_SIZE=512
CONFIG_SYSTEM_WORKQUEUE_STACK_SIZE=51`
Applications in server side and client side
Download AliOS-Things source code.
git clone git@github.com:alibaba/AliOS-Things.git
Compile to generate the applications in server side.
`cd PATH_TO_AOS
aos make bluetooth.blemesh_srv@esp32devkitc hci_h4=1`
Compile to generate the applications in client side.
cd PATH_TO_AOS aos make bluetooth.blemesh_cli@esp32devkitc hci_h4=1
Burn the generated mirror image to ESP32 through esptool.
Setup of temperature monitoring network
The temperature monitoring network consists of three roles, provisioner, server and client. Server is the publisher of temperature information, and client is the subscriber to temperature information.
Provisioning and Configuring Server node
In Raspberry PI, run the meshctl command line.
`pi@raspberrypi:~/bluez-5.48/mesh $ ./meshctl .
Local config directory not provided.
netkeys = 1
appkeys = 2
provisioners = 1
On/Off client model: new binding 0001
[NEW] Controller B8:27:EB:B2:E7:4A raspberrypi [default]
[NEW] Device EC:60:BA:B5:36:D0 AOS Device
Service added /org/bluez/hci0/dev_EC_60_BA_B5_36_D0/service000a
Char added /org/bluez/hci0/dev_EC_60_BA_B5_36_D0/service000a/char000d:
Char added /org/bluez/hci0/dev_EC_60_BA_B5_36_D0/service000a/char000b:
Service added /org/bluez/hci0/dev_EC_60_BA_B5_36_D0/service0006`
Give power to server node, and select the search mode for unprovisioned devices to find out new unprovisioned ones.
`[meshctl]# discover-unprovisioned on
SetDiscoveryFilter success
Discovery started
Adapter property changed
[CHG] Controller B8:27:EB:B2:E7:4A Discovering: yes
Mesh Provisioning Service (00001827-0000-1000-8000-00805f9b34fb)
Device UUID: dddd0000000000000000000000000000
OOB: 0000`
Authenticate the device.
`[meshctl]# provision dddd
Trying to connect Device EC:60:BA:B5:36:D0 AOS Device
Adapter property changed
[CHG] Controller B8:27:EB:B2:E7:4A Discovering: no
Connection successful
Services resolved yes
Found matching char: path /org/bluez/hci0/dev_EC_60_BA_B5_36_D0/service000a/char000b, uuid 00002adb-0000-1000-8000-00805f9b34fb
Found matching char: path /org/bluez/hci0/dev_EC_60_BA_B5_36_D0/service000a/char000d, uuid 00002adc-0000-1000-8000-00805f9b34fb
Start notification on /org/bluez/hci0/dev_EC_60_BA_B5_36_D0/service000a/char000d
Characteristic property changed /org/bluez/hci0/dev_EC_60_BA_B5_36_D0/service000a/char000d
AcquireNotify success: fd 7 MTU 65
Notify for Mesh Provisioning Out Data started
Open-Node: 0x1758dc8
Open-Prov: 0x1757598
Open-Prov: proxy 0x175a1c8
Initiated provisioning
Characteristic property changed /org/bluez/hci0/dev_EC_60_BA_B5_36_D0/service000a/char000b
AcquireWrite success: fd 8 MTU 65
GATT-TX: 03 00 10
GATT-RX: 03 01 01 00 01 00 00 04 00 08 00 00 00
Got provisioning data (12 bytes)
01 01 00 01 00 00 04 00 08 00 00 00
GATT-TX: 03 02 00 00 02 03 04
GATT-TX: 03 03 09 da d3 a0 1e 4f 15 34 3c 1f 88 e2 1f 93
GATT-TX: f6 38 9b 8a 2d 3a a0 49 7a 0b 01 c6 5c 61 d9 cc
GATT-TX: 49 be 26 78 5c 5c de c1 05 86 6f 5a 88 0d 93 b8
GATT-TX: 60 e2 77 67 3d 72 f4 46 b4 5f d3 b1 87 53 cd 96
GATT-TX: fc ce
GATT-RX: 43 03 d2 68 da 6f fe cc f8 97 0e 99 84 e6 eb 93
GATT-RX: 15 15 aa 1d 15 5b 2a f2 e7 1f 4d c1 93 51 14 29
GATT-RX: 7e b7 75 0c 8d 5a 51 c8 14 29 8d 3a 73 de fa 95
GATT-RX: 09 42 7e 7f 0a be e2 ed e5 ff 27 43 26 f7
GATT-RX: c3 ab 8b ef 6f
Got provisioning data (65 bytes)
03 d2 68 da 6f fe cc f8 97 0e 99 84 e6 eb 93 15
15 aa 1d 15 5b 2a f2 e7 1f 4d c1 93 51 14 29 7e
b7 75 0c 8d 5a 51 c8 14 29 8d 3a 73 de fa 95 09
42 7e 7f 0a be e2 ed e5 ff 27 43 26 f7 ab 8b ef
6f
Request decimal key (0 - 9999)
[AOS 1m[mesh] Enter Numeric key: `
See the output of server command line OOB.
`Initializing...
Bluetooth initialized
Server
Mesh initialized
attention_on()
OOB Number: 9023
attention_off()`
Type 9023 on Raspberry PI, process the following provision, and then print a long string of log.
`[AOS 1m[mesh] Enter Numeric key: 9023
GATT-TX: 03 05 fe 7f b1 04 84 f6 e9 0d 9e c7 62 19 6d 1f
GATT-TX: 03 64
GATT-RX: 03 05 ca f5 8e 55 ff 1d 92 86 26 fa 8e 22 8c 33
GATT-RX: 69 80
Got provisioning data (17 bytes)
05 ca f5 8e 55 ff 1d 92 86 26 fa 8e 22 8c 33 69
80
GATT-TX: 03 06 d6 63 cd 7c e6 3b b5 9b 2b a3 f5 3e e6 7c
GATT-TX: 15 f1
GATT-RX: 03 06 7a 94 aa 7a 3b f3 1c 33 92 cf 8a 3c 86 ec
GATT-RX: 9d 0c
Got provisioning data (17 bytes)
06 7a 94 aa 7a 3b f3 1c 33 92 cf 8a 3c 86 ec 9d
0c
Confirmation Validated
S-Key 5e ee f5 44 72 cc 88 c7 3a 9a 56 db 11 4a d5 44
S-Nonce 82 b4 a8 f2 7b 9b 76 c7 72 8b 3f e2 07
DevKey f8 a9 4d 78 25 b8 47 3d 0d 3d 20 50 91 45 db 20
Data 18 ee d9 c2 a5 6a dd 85 04 9f fc 3c 59 ad 0e 12
Data 00 00 00 00 00 00 05 01 00
DataEncrypted + mic b7 8a f4 17 c3 e8 05 66 84 4d d6 5e 22 69 73 1c
DataEncrypted + mic 90 10 91 8c 5f f7 30 55 bf d1 1c 29 e9 d6 3e 78
DataEncrypted + mic f1
GATT-TX: 03 07 b7 8a f4 17 c3 e8 05 66 84 4d d6 5e 22 69
GATT-TX: 73 1c 90 10 91 8c 5f f7 30 55 bf d1 1c 29 e9 d6
GATT-TX: 3e 78 f1
GATT-RX: 03 08
Got provisioning data (1 bytes)
08
Provision success. Assigned Primary Unicast 0100
Attempting to disconnect from EC:60:BA:B5:36:D0
Characteristic property changed /org/bluez/hci0/dev_EC_60_BA_B5_36_D0/service000a/char000d
Write closed
Service added /org/bluez/hci0/dev_EC_60_BA_B5_36_D0/service000a
Char added /org/bluez/hci0/dev_EC_60_BA_B5_36_D0/service000a/char000b:
Char added /org/bluez/hci0/dev_EC_60_BA_B5_36_D0/service000a/char000d:
Services resolved no
SetDiscoveryFilter success
Discovery started
Adapter property changed
[CHG] Controller B8:27:EB:B2:E7:4A Discovering: yes
Mesh Proxy Service (00001828-0000-1000-8000-00805f9b34fb)
Identity for node 0100
Trying to connect to mesh
Adapter property changed
[CHG] Controller B8:27:EB:B2:E7:4A Discovering: no
Connection successful
Services resolved yes
Found matching char: path /org/bluez/hci0/dev_EC_60_BA_B5_36_D0/service000a/char000b, uuid 00002add-0000-1000-8000-00805f9b34fb
Found matching char: path /org/bluez/hci0/dev_EC_60_BA_B5_36_D0/service000a/char000d, uuid 00002ade-0000-1000-8000-00805f9b34fb
Start notification on /org/bluez/hci0/dev_EC_60_BA_B5_36_D0/service000a/char000d
Characteristic property changed /org/bluez/hci0/dev_EC_60_BA_B5_36_D0/service000a/char000d
AcquireNotify success: fd 7 MTU 65
Notify for Mesh Proxy Out Data started
Trying to open mesh session
GATT-RX: 01 01 00 d4 76 79 43 3f db 10 4a 00 00 00 05 f4
GATT-RX: 0a 41 fa b0 af 32 0b
iv_upd_state = IV_UPD_NORMAL
Mesh session is open
Characteristic property changed /org/bluez/hci0/dev_EC_60_BA_B5_36_D0/service000a/char000b
AcquireWrite success: fd 8 MTU 65
GATT-TX: 02 f4 9e 64 99 fe 13 cd c8 9b 0e 1c e5 61 82 cc
GATT-TX: ab f5 83 70
GATT-TX: 00 f4 b3 a6 53 65 b2 a0 cd 7a 74 9e 95 1d b7 13
GATT-TX: 06 e6 48 68 d5 5c
GATT-RX: 02 f4 e7 02 fe d4 84 81 a3 32 e7 6e 4b 1b 74 4a
GATT-RX: 13 95 f5 61 7f eb
Proxy Whitelist filter length: 0
GATT-RX: 00 f4 60 4f af f8 ba 30 1f a6 70 d9 cb 5f 12 dd
GATT-RX: 8b 0b 71 6b 68 ad 00 90 07 cf ec e0 28 fe
GATT-RX: 00 f4 2a e4 87 bb f8 21 34 0d 45 4c c3 de 5b e3
GATT-RX: 21 bb 57 9a 34 94 5a de 4d e8 ca c8 91 cd
GATT-RX: 00 f4 b7 a0 67 ff da 92 a3 32 4c c2 c2 4e a5 5c
GATT-RX: 7f 12 c7 5f 02 bc 0b 23 9f 13
Composition data for node 0100 {
"cid":"0002",
"pid":"0000",
"vid":"0000",
"crpl":"0005",
"features":{
"relay":false,
"proxy":true,
"friend":false,
"lpn":false
},
"elements":[
{
"elementIndex":0,
"location":"0000",
"models":[
"0000",
"0001",
"0002",
"1100"
]
}
]
}
GATT-TX: 00 f4 2b d6 e6 46 66 5b 65 31 1d 78 08 28 5d 16
GATT-TX: aa e2 97 b6 18 84 1f 29 7f `
The above log can be divided as two stages. The first is to use provisioning connection to carry out provision, and the second is to establish mesh proxy connection, which will be used to transmit network configuration information.
When the log is completely printed, the server side will print the information that provision has completed.
`Provisioning completed!
Net ID: 0
Unicast addr: 0x0100`
Next is to transmit network configuration information based on the mesh proxy connection you just set up.
First, enter the menu.
`[AOS Devic-Node-0100]# menu config
Menu config:
Available commands:
-------------------
target <unicast> Set target node to configure
composition-get [page_num] Get Composition Data
netkey-add <net_idx> Add network key
netkey-del <net_idx> Delete network key
appkey-add <app_idx> Add application key
appkey-del <app_idx> Delete application key
bind <ele_idx> <app_idx> <mod_id> [cid] Bind app key to a model
ttl-set <ttl> Set default TTL
ttl-get Get default TTL
pub-set <ele_addr> <pub_addr> <app_idx> <per (step|res)> <re-xmt (cnt|per)> <mod id> [cid]
Set publication
pub-get <ele_addr> <model> Get publication
proxy-set <proxy> Set proxy state
proxy-get Get proxy state
ident-set <net_idx> <state> Set node identity state
ident-get <net_idx> Get node identity state
relay-set <relay> <rexmt count> <rexmt steps> Set relay
relay-get Get relay
hb-pub-set <pub_addr> <count> <period> <features> <net_idx> Set heartbeati publish
sub-add <ele_addr> <sub_addr> <model id> Subscription add
sub-get <ele_addr> <model id> Subscription get
app-get <ele_addr> <model id> Get App Keys
back Return to main menu
version Display version
quit Quit program
exit Quit program
help Display help about this program`
Select configuring node, where you can see that the node ucast addr is 0x0100.
[AOS Devic-Node-0100]# target 0100
Configuring node 0100
[config: Target = 0100]# target 0100[config: Target = 0100]#
Configure app key.
`[config: Target = 0100]# target 0100[config: Target = 0100]# appkey-add 1
GATT-TX: 00 f4 e5 ca a3 ba 03 7b db 7f a6 aa 7c 02 25 75
GATT-TX: 6b 2a cf d4 93 0a 02 c3 8d 22 7d 30 ee 21
GATT-TX: 00 f4 41 5a 17 27 bf 6f 70 59 1e 4e 60 2d be 4f
GATT-TX: 1e f9 0d 88 e1 d6 c1 50 f3 51 cc 6d 43 d8
GATT-RX: 00 f4 04 00 5a d6 cc af 78 b3 eb 70 e5 78 e9 1b
GATT-RX: 87 fc 43 8c b0 ad 90 a2 7a
GATT-RX: 00 f4 56 a5 24 11 02 10 62 67 45 42 77 77 3a 7a
GATT-RX: ec 3e 8f 2f 26 56 4f d3 ba
Node 0100 AppKey Status Success
NetKey 000, AppKey 001`
将server节点的element 0的sensor server model (0x1100)绑定到app key index =1的app key上
`[config: Target = 0100]# bind 0 1 1100
GATT-TX: 00 f4 cb 2a f4 45 0f 4d 25 b0 47 d8 15 72 ba 89
GATT-TX: 61 fc ec 15 7e fe 8c dc 30 e6 04
GATT-RX: 00 f4 af 08 09 a9 12 03 dd fa df 1a 5f e4 7e c1
GATT-RX: 4f c8 58 84 82 77 8c 62 d1 cb 59 f9
Node 0100 Model App Status Success
Element 0100 AppIdx 001
ModelId 1100`
Add the subscription address information 0xc000 of sensor server model 0x1100.
`[config: Target = 0100]# sub-add 0100 c000 1100
GATT-TX: 00 f4 fe fa 07 e1 60 7a 1a ac d1 26 3a 45 8e f7
GATT-TX: 5e 8e ff 79 9d aa 90 10 ab b8 ef
GATT-RX: 00 f4 a8 c7 92 53 ee 9e 15 c7 fb 47 3e e8 07 fb
GATT-RX: c4 ea 8a f7 2d 71 3a 33 da 12 e9 0f
Subscription changed for node 0100 status: Success
Element Addr: 0100
Subscr Addr: c000
Model ID: 1100`
Set the app key release information of sensor server model (0x1100). The release address is 0xc000.
`[config: Target = 0100]# pub-set 0100 c000 1 0 0 1100
GATT-TX: 00 f4 d1 a1 54 ee 1b 9f 18 4e 3c 44 ab 57 f9 82
GATT-TX: 73 41 9e 9c ab 3d 5c dd ad 27 c3 18 b7 22
GATT-TX: 00 f4 d0 95 d8 43 e4 87 12 96 14 bf 52 55 5a 8a
GATT-TX: ad 00 b0 4c b4 46
GATT-RX: 00 f4 34 4f 18 3f cf 94 bd 90 49 6a 6d 0e 83 78
GATT-RX: 0c b8 7c 14 00 7e 3f b6 fa
GATT-RX: 00 f4 66 8c 52 14 1b f9 b8 e2 d9 27 17 0d b0 87
GATT-RX: 28 1a 12 65 e6 7f 36 b9 92 c2 c0 79 e8 2d
GATT-RX: 00 f4 60 7b 6a a5 b6 9b d4 a2 f0 80 5b e6 9e 0b
GATT-RX: 70 0c c9 34 a3 65 11 7f
Set publication for node 0100 status: Success
Publication address: 0xc000
Period: 0 ms
Retransmit count: 0
Retransmit Interval Steps: 0
GATT-TX: 00 f4 d2 0f fb e4 49 24 a0 6c 7d 34 a8 bd dc ca
GATT-TX: c6 a8 9f 17 d0 eb 5b 46 31
[config: Target = 0100]# `
Provisioning and configuring Client node
Run meshctl command line in Raspberry PI.
`pi@raspberrypi:~/bluez-5.48/mesh $ ./meshctl .
Local config directory not provided.
netkeys = 1
appkeys = 2
provisioners = 1
provisioned nodes = 1
On/Off client model: new binding 0001
[NEW] Controller B8:27:EB:B2:E7:4A raspberrypi [default]
[NEW] Device D6:FB:47:4F:7E:A9 AOS Device
Service added /org/bluez/hci0/dev_EC_60_BA_B5_36_D0/service000a
Char added /org/bluez/hci0/dev_EC_60_BA_B5_36_D0/service000a/char000d:
Char added /org/bluez/hci0/dev_EC_60_BA_B5_36_D0/service000a/char000b:
Service added /org/bluez/hci0/dev_EC_60_BA_B5_36_D0/service0006`
Give power to client node, and select the search mode for unprovisioned devices to find out new unprovisioned ones.
`[meshctl]# discover-unprovisioned on
SetDiscoveryFilter success
Discovery started
Adapter property changed
[CHG] Controller B8:27:EB:B2:E7:4A Discovering: yes
Mesh Provisioning Service (00001827-0000-1000-8000-00805f9b34fb)
Device UUID: dddd0000000000000000000000000000
OOB: 0000`
Authenticate the device.
`[meshctl]# provision dddd
Trying to connect Device D6:FB:47:4F:7E:A9 AOS Device
Adapter property changed
[CHG] Controller B8:27:EB:B2:E7:4A Discovering: no
Connection successful
Service added /org/bluez/hci0/dev_D6_FB_47_4F_7E_A9/service0006
Service added /org/bluez/hci0/dev_D6_FB_47_4F_7E_A9/service000a
Char added /org/bluez/hci0/dev_D6_FB_47_4F_7E_A9/service000a/char000b:
Char added /org/bluez/hci0/dev_D6_FB_47_4F_7E_A9/service000a/char000d:
Services resolved yes
Found matching char: path /org/bluez/hci0/dev_D6_FB_47_4F_7E_A9/service000a/char000b, uuid 00002adb-0000-1000-8000-00805f9b34fb
Found matching char: path /org/bluez/hci0/dev_D6_FB_47_4F_7E_A9/service000a/char000d, uuid 00002adc-0000-1000-8000-00805f9b34fb
Start notification on /org/bluez/hci0/dev_D6_FB_47_4F_7E_A9/service000a/char000d
Characteristic property changed /org/bluez/hci0/dev_D6_FB_47_4F_7E_A9/service000a/char000d
AcquireNotify success: fd 7 MTU 65
Notify for Mesh Provisioning Out Data started
Open-Node: 0xe51ab0
Open-Prov: 0xe59bf0
Open-Prov: proxy 0xe4c200
Initiated provisioning
Characteristic property changed /org/bluez/hci0/dev_D6_FB_47_4F_7E_A9/service000a/char000b
AcquireWrite success: fd 8 MTU 65
GATT-TX: 03 00 10
GATT-RX: 03 01 01 00 01 00 00 04 00 08 00 00 00
Got provisioning data (12 bytes)
01 01 00 01 00 00 04 00 08 00 00 00
GATT-TX: 03 02 00 00 02 03 04
GATT-TX: 03 03 86 03 e8 b6 50 d7 4d 33 e3 fd aa c0 fa 46
GATT-TX: d5 1c a8 58 91 c1 4d de 96 30 26 8c a0 3c c3 5b
GATT-TX: c6 87 f4 e9 b9 08 a7 e7 2d 67 ae 3a 7c f7 1c 42
GATT-TX: 6a da 6d 41 ba 77 17 69 25 a1 75 46 e5 eb 31 ee
GATT-TX: 07 5d
GATT-RX: 43 03 26 00 86 9a 35 54 40 b8 be 53 a0 88 e1 55
GATT-RX: 19 33 ee f4 4d 03 35 12 59 6d a5 63 de a2 0a dc
GATT-RX: 24 e4 a7 8a 8d 42 27 76 d8 2c a9 87 69 27 68 61
GATT-RX: 2b 56 f8 97 3c a9 bf de b6 64 00 f5 77 91
GATT-RX: c3 73 3f 94 62
Got provisioning data (65 bytes)
03 26 00 86 9a 35 54 40 b8 be 53 a0 88 e1 55 19
33 ee f4 4d 03 35 12 59 6d a5 63 de a2 0a dc 24
e4 a7 8a 8d 42 27 76 d8 2c a9 87 69 27 68 61 2b
56 f8 97 3c a9 bf de b6 64 00 f5 77 91 73 3f 94
62
Request decimal key (0 - 9999)
[AOS 1m[mesh] Enter Numeric key:`
See the output of server command line OOB.
`Initializing...
Bluetooth initialized
Mesh initialized
OOB Number: 4159`
Type 4159 on Raspberry PI, process the following provision, and then print a long string of log.
`[AOS 1m[mesh] Enter Numeric key: 4159
GATT-TX: 03 05 20 2e 58 e4 b8 06 93 0d a2 b5 2f 7b eb 16
GATT-TX: 99 07
GATT-RX: 03 05 fd ee fd f5 3d 54 71 42 91 92 64 a4 69 46
GATT-RX: f7 bc
Got provisioning data (17 bytes)
05 fd ee fd f5 3d 54 71 42 91 92 64 a4 69 46 f7
bc
GATT-TX: 03 06 e6 4e 15 4c 75 e4 2d 76 d3 0b 13 64 91 f0
GATT-TX: ac e4
GATT-RX: 03 06 54 65 35 17 f6 cb 77 bc ae af 19 8e 7c 92
GATT-RX: 71 f3
Got provisioning data (17 bytes)
06 54 65 35 17 f6 cb 77 bc ae af 19 8e 7c 92 71
f3
Confirmation Validated
S-Key b4 dc cb 8f 1d 62 4e c4 95 f5 74 6d ff bc 42 d9
S-Nonce 54 c1 e5 68 cf a6 ec c0 47 3b 8f f4 25
DevKey 0c c5 26 e9 12 e3 d2 89 39 20 3a af 27 a4 f9 d2
Data 18 ee d9 c2 a5 6a dd 85 04 9f fc 3c 59 ad 0e 12
Data 00 00 00 00 00 00 05 01 01
DataEncrypted + mic 80 bb ca b9 3f ca ff 49 5d 22 3c d3 5a 70 45 61
DataEncrypted + mic ae a4 a7 7b b6 15 b6 ed df 7c 47 8f 84 8d d4 dc
DataEncrypted + mic db
GATT-TX: 03 07 80 bb ca b9 3f ca ff 49 5d 22 3c d3 5a 70
GATT-TX: 45 61 ae a4 a7 7b b6 15 b6 ed df 7c 47 8f 84 8d
GATT-TX: d4 dc db
GATT-RX: 03 08
Got provisioning data (1 bytes)
08
Provision success. Assigned Primary Unicast 0101
Attempting to disconnect from D6:FB:47:4F:7E:A9
Characteristic property changed /org/bluez/hci0/dev_D6_FB_47_4F_7E_A9/service000a/char000d
Write closed
Service added /org/bluez/hci0/dev_D6_FB_47_4F_7E_A9/service000a
Char added /org/bluez/hci0/dev_D6_FB_47_4F_7E_A9/service000a/char000b:
Char added /org/bluez/hci0/dev_D6_FB_47_4F_7E_A9/service000a/char000d:
Services resolved no
SetDiscoveryFilter success
Discovery started
Adapter property changed
[CHG] Controller B8:27:EB:B2:E7:4A Discovering: yes
Mesh Proxy Service (00001828-0000-1000-8000-00805f9b34fb)
Identity for node 0101
Trying to connect to mesh
Adapter property changed
[CHG] Controller B8:27:EB:B2:E7:4A Discovering: no
Connection successful
Services resolved yes
Found matching char: path /org/bluez/hci0/dev_D6_FB_47_4F_7E_A9/service000a/char000b, uuid 00002add-0000-1000-8000-00805f9b34fb
Found matching char: path /org/bluez/hci0/dev_D6_FB_47_4F_7E_A9/service000a/char000d, uuid 00002ade-0000-1000-8000-00805f9b34fb
Start notification on /org/bluez/hci0/dev_D6_FB_47_4F_7E_A9/service000a/char000d
Characteristic property changed /org/bluez/hci0/dev_D6_FB_47_4F_7E_A9/service000a/char000d
AcquireNotify success: fd 7 MTU 65
Notify for Mesh Proxy Out Data started
Trying to open mesh session
GATT-RX: 01 01 00 d4 76 79 43 3f db 10 4a 00 00 00 05 f4
GATT-RX: 0a 41 fa b0 af 32 0b
iv_upd_state = IV_UPD_NORMAL
Mesh session is open
Characteristic property changed /org/bluez/hci0/dev_D6_FB_47_4F_7E_A9/service000a/char000b
AcquireWrite success: fd 8 MTU 65
GATT-TX: 02 f4 8c 6d ef 98 ac 2e 79 c8 e0 2c 83 2b 4a b4
GATT-TX: c9 1f e3 a9
GATT-TX: 00 f4 95 a2 60 a7 67 ec a4 40 e9 18 1a 69 a4 00
GATT-TX: c1 54 c7 3d a9 d7
GATT-RX: 02 f4 35 d1 c4 66 28 17 1b 6d ed 86 f9 26 19 ca
GATT-RX: d5 6f 3c 9e 7b cd
Proxy Whitelist filter length: 0
GATT-RX: 00 f4 98 0a 63 16 58 d9 d6 34 75 81 6d 7e a3 5f
GATT-RX: 83 2f 1c 58 17 ad 23 17 7d 7b 50 ee 4e 61
GATT-RX: 00 f4 cf 10 98 83 f6 b7 13 22 45 a0 6b 53 1b 51
GATT-RX: c8 35 4b a7 f4 0e f4 f3 d4 c2 0c 25 12 ec
GATT-RX: 00 f4 a3 1e 00 1c 07 b8 e8 a6 9f 29 aa 84 7e eb
GATT-RX: ee 7a 7c 6b 13 63 37 ce
Composition data for node 0101 {
"cid":"0002",
"pid":"0000",
"vid":"0000",
"crpl":"0005",
"features":{
"relay":false,
"proxy":true,
"friend":false,
"lpn":false
},
"elements":[
{
"elementIndex":0,
"location":"0000",
"models":[
"0000",
"0001",
"1102"
]
}
]
}
GATT-TX: 00 f4 71 66 e6 89 61 44 19 6b c1 75 a4 a9 b8 f2
GATT-TX: ed 9b b9 ee 99 b5 96 bc 05 `
The above log can be divided as two stages. The first is to use provisioning connection to carry out provision, and the second is to establish mesh proxy connection, which will be used to transmit network configuration information.
When the log is completely printed, the server side will print the information that provision has completed.
`Provisioning completed!
Net ID: 0
Unicast addr: 0x0101`
Next is to transmit network configuration information based on the mesh proxy connection you just set up.
First, enter the menu.
`[AOS Device-Node-0101]# menu config
Menu config:
Available commands:
-------------------
target <unicast> Set target node to configure
composition-get [page_num] Get Composition Data
netkey-add <net_idx> Add network key
netkey-del <net_idx> Delete network key
appkey-add <app_idx> Add application key
appkey-del <app_idx> Delete application key
bind <ele_idx> <app_idx> <mod_id> [cid] Bind app key to a model
ttl-set <ttl> Set default TTL
ttl-get Get default TTL
pub-set <ele_addr> <pub_addr> <app_idx> <per (step|res)> <re-xmt (cnt|per)> <mod id> [cid]
Set publication
pub-get <ele_addr> <model> Get publication
proxy-set <proxy> Set proxy state
proxy-get Get proxy state
ident-set <net_idx> <state> Set node identity state
ident-get <net_idx> Get node identity state
relay-set <relay> <rexmt count> <rexmt steps> Set relay
relay-get Get relay
hb-pub-set <pub_addr> <count> <period> <features> <net_idx> Set heartbeati publish
sub-add <ele_addr> <sub_addr> <model id> Subscription add
sub-get <ele_addr> <model id> Subscription get
app-get <ele_addr> <model id> Get App Keys
back Return to main menu
version Display version
quit Quit program
exit Quit program
help Display help about this program`
Select configuring node, where you can see that the node ucast addr is 0x0101.
`[AOS Device-Node-0101]# target 0101
Configuring node 0101
[config: Target = 0101]# target 0101[config: Target = 0101]#`
Configure app key.
`[config: Target = 0101]# target 0101[config: Target = 0101]# appkey-add 1
GATT-TX: 00 f4 2b 37 95 64 e7 fe ba 41 b3 c8 d9 0c f4 0c
GATT-TX: 76 36 a4 f0 f9 c4 f8 93 73 8a 3d 7d 7e c1
GATT-TX: 00 f4 43 6e 87 5d 09 0b 4b 05 a0 1b c0 48 da a1
GATT-TX: bf d6 9b 21 91 68 d8 b0 b4 27 57 90 61 06
GATT-RX: 00 f4 7f d6 9d 40 6d bc 10 5f 41 67 68 56 9c d8
GATT-RX: b9 77 dc 71 b5 10 ec b1 85
GATT-RX: 00 f4 81 91 ee 63 66 b4 5a 42 6f 70 f6 d2 12 93
GATT-RX: 2d 9f 21 2d fa a3 89 2f 4b
Node 0101 AppKey Status Success
NetKey 000, AppKey 001`
Bind the sensor client model (0x1102) of the client node to the app key (index =1).
`[config: Target = 0101]# bind 0 1 1102
GATT-TX: 00 f4 97 c8 22 ee 6f 11 c3 c6 7c 5c 4f 88 e4 3d
GATT-TX: 36 9e 19 c7 3f a8 f3 d3 d4 7d 90
GATT-RX: 00 f4 e9 e9 33 90 5a f3 cb 88 c1 3e 44 af f6 61
GATT-RX: d0 ef 47 35 35 c3 03 8a c9 43 01 7d
Node 0101 Model App Status Success
Element 0101 AppIdx 001
ModelId 1102`
Add the subscription address information 0xc000 of sensor server model 0x1102.
`[config: Target = 0101]# sub-add 0101 c000 1102
GATT-TX: 00 f4 c5 5e 47 70 42 84 3b 28 14 26 60 83 01 69
GATT-TX: 7c 25 c3 c2 d9 1d d3 fb c0 e5 65
GATT-RX: 00 f4 6f 71 02 d9 ec 00 cf c1 96 f0 3a 7f ea a9
GATT-RX: b1 fb 6d 70 31 62 d8 d0 4b 5d 81 a6
Subscription changed for node 0101 status: Success
Element Addr: 0101
Subscr Addr: c000
Model ID: 1102`
Set the app key release information of sensor server model (0x1100). The release address is 0xc000.
`[config: Target = 0101]# pub-set 0101 c000 1 0 0 1102
GATT-TX: 00 f4 5a 22 c5 d2 d0 76 94 a9 7f 70 6e 64 c1 f3
GATT-TX: be 58 43 fc f1 61 f0 ac dc ce 4d 0b 9c f1
GATT-TX: 00 f4 1a 8a af 58 92 d2 d5 38 b2 0f 62 56 34 96
GATT-TX: 5f 08 9e 5a c6 54
GATT-RX: 00 f4 eb 12 ea 4f 6f 1f f8 e6 f2 92 c4 d7 82 a0
GATT-RX: ad 9e c9 92 9e 91 d4 a6 3c
GATT-RX: 00 f4 2a 11 82 c6 86 27 0a 4a 88 bf a6 02 74 56
GATT-RX: d5 2d 28 72 24 cd ae 91 fa dc 72 35 d7 be
GATT-RX: 00 f4 a7 08 14 6c 95 bd 62 07 67 1b c6 c8 95 b8
GATT-RX: f2 a9 3b 03 d2 82 d1 97
Set publication for node 0101 status: Success
Publication address: 0xc000
Period: 0 ms
Retransmit count: 0
Retransmit Interval Steps: 0
GATT-TX: 00 f4 f0 60 6a 70 db 3b e2 60 a6 c8 50 d9 03 36
GATT-TX: d5 a1 47 c9 2f 25 49 5e 47`
When all the above configuration is completed, you can see the sent request for temperature and reply log at client node.
`Sensor status Get request sent with OpCode 0x00008231
Got the sensor status
Sensor ID: 0x2a1f
Temperature value: 27`
You can see the received request and reply log at server side.
`Sensor Status Get request received
Sensor status sent with OpCode 0x00000052`
=====================================
中文
硬件准备
Raspberry PI3一块
乐鑫ESP32 Devkitc两块
微雪NRF51822开发板两块
软件环境搭建
目前,我们使用运行在Raspberry PI 3上的Bluez作为provisioner。要在Raspberry PI3上运行Bluez meshctl作为provisioner,需要对Raspberry PI的编译选项进行调整,使能一些安全相关特性,才能够正常运行meshctl。在linux上交叉编译Raspberry PI kernel。
Raspberry PI kernel
目前,我们使用运行在Raspberry PI 3上的Bluez作为provisioner。要在Raspberry PI3上运行Bluez meshctl作为provisioner,需要对Raspberry PI的编译选项进行调整,使能一些安全相关特性,才能够正常运行meshctl。在linux上交叉编译Raspberry PI kernel。
下载Raspberry PI系统源代码
git clone https://github.com/raspberrypi/linux.git
设置交叉编译工具链路径。
`luwang@ubuntu:~/raspberry-pi/linux$ export CCPREFIX=/home/luwang/raspberry-pi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/arm-linux-gnueabihf-
luwang@ubuntu:~/raspberry-pi/linux$ ${CCPREFIX}gcc -v
Using built-in specs.
COLLECT_GCC=/home/luwang/raspberry-pi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/arm-linux-gnueabihf-gcc
COLLECT_LTO_WRAPPER=/home/luwang/raspberry-pi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/../libexec/gcc/arm-linux-gnueabihf/4.8.3/lto-wrapper
Target: arm-linux-gnueabihf
Configured with: /cbuild/slaves/oorts/crosstool-ng/builds/arm-linux-gnueabihf-raspbian-linux/.build/src/gcc-linaro-4.8-2014.01/configure --build=i686-build_pc-linux-gnu --host=i686-build_pc-linux-gnu --target=arm-linux-gnueabihf --prefix=/cbuild/slaves/oorts/crosstool-ng/builds/arm-linux-gnueabihf-raspbian-linux/install --with-sysroot=/cbuild/slaves/oorts/crosstool-ng/builds/arm-linux-gnueabihf-raspbian-linux/install/arm-linux-gnueabihf/libc --enable-languages=c,c++,fortran --disable-multilib --enable-multiarch --with-arch=armv6 --with-tune=arm1176jz-s --with-fpu=vfp --with-float=hard --with-pkgversion='crosstool-NG linaro-1.13.1-4.8-2014.01 - Linaro GCC 2013.11' --with-bugurl=https://bugs.launchpad.net/gcc-linaro --enable-__cxa_atexit --enable-libmudflap --enable-libgomp --enable-libssp --with-gmp=/cbuild/slaves/oorts/crosstool-ng/builds/arm-linux-gnueabihf-raspbian-linux/.build/arm-linux-gnueabihf/build/static --with-mpfr=/cbuild/slaves/oorts/crosstool-ng/builds/arm-linux-gnueabihf-raspbian-linux/.build/arm-linux-gnueabihf/build/static --with-mpc=/cbuild/slaves/oorts/crosstool-ng/builds/arm-linux-gnueabihf-raspbian-linux/.build/arm-linux-gnueabihf/build/static --with-isl=/cbuild/slaves/oorts/crosstool-ng/builds/arm-linux-gnueabihf-raspbian-linux/.build/arm-linux-gnueabihf/build/static --with-cloog=/cbuild/slaves/oorts/crosstool-ng/builds/arm-linux-gnueabihf-raspbian-linux/.build/arm-linux-gnueabihf/build/static --with-libelf=/cbuild/slaves/oorts/crosstool-ng/builds/arm-linux-gnueabihf-raspbian-linux/.build/arm-linux-gnueabihf/build/static --enable-threads=posix --disable-libstdcxx-pch --enable-linker-build-id --enable-plugin --enable-gold --with-local-prefix=/cbuild/slaves/oorts/crosstool-ng/builds/arm-linux-gnueabihf-raspbian-linux/install/arm-linux-gnueabihf/libc --enable-c99 --enable-long-long --with-float=hard
Thread model: posix
gcc version 4.8.3 20140106 (prerelease) (crosstool-NG linaro-1.13.1-4.8-2014.01 - Linaro GCC 2013.11)
luwang@ubuntu:~/raspberry-pi/linux$`
获取kernel编译文件.config。这里从现有的Raspberry PI上获取内核编译的.config。Raspberry PI上安装的镜像是2017-11-29-raspbian-stretch.img。
在Raspberry PI上输入以下命令,生成内核配置文件
sudo modprobe configs
在linux机器上拷贝生成的Raspberry PI kernel配置文件,并解压。
scp pi@raspberrypi:/proc/config.gz PATH_TO_RASPBERRY_PI/linux gunzip -c config.gz > .config
修改配置文件以下配置选项
`CONFIG_CRYPTO_CMAC=y
CONFIG_CRYPTO_USER_API=y
CONFIG_CRYPTO_USER_API_HASH=y
CONFIG_CRYPTO_USER_API_SKCIPHER=y`
编译生成内核
`cd PATH_TO_RASPBERRY_PI/linux
ARCH=arm CROSS_COMPILE=${CCPREFIX} make`
生成内核modules
ARCH=arm CROSS_COMPILE=${CCPREFIX} INSTALL_MOD_PATH=../modules make modules_install
得到以下log信息
` INSTALL sound/soc/codecs/snd-soc-tas5713.ko
INSTALL sound/soc/codecs/snd-soc-tpa6130a2.ko
INSTALL sound/soc/codecs/snd-soc-wm-adsp.ko
INSTALL sound/soc/codecs/snd-soc-wm5102.ko
INSTALL sound/soc/codecs/snd-soc-wm8731.ko
INSTALL sound/soc/codecs/snd-soc-wm8741.ko
INSTALL sound/soc/codecs/snd-soc-wm8804-i2c.ko
INSTALL sound/soc/codecs/snd-soc-wm8804.ko
INSTALL sound/soc/generic/snd-soc-simple-card-utils.ko
INSTALL sound/soc/generic/snd-soc-simple-card.ko
INSTALL sound/soc/snd-soc-core.ko
INSTALL sound/usb/6fire/snd-usb-6fire.ko
INSTALL sound/usb/caiaq/snd-usb-caiaq.ko
INSTALL sound/usb/misc/snd-ua101.ko
INSTALL sound/usb/snd-usb-audio.ko
INSTALL sound/usb/snd-usbmidi-lib.ko
INSTALL .modules/lib/firmware/emi26/loader.fw
INSTALL .modules/lib/firmware/emi26/firmware.fw
INSTALL .modules/lib/firmware/emi26/bitstream.fw
INSTALL .modules/lib/firmware/emi62/loader.fw
INSTALL .modules/lib/firmware/emi62/bitstream.fw
INSTALL .modules/lib/firmware/emi62/spdif.fw
INSTALL .modules/lib/firmware/emi62/midi.fw
INSTALL .modules/lib/firmware/kaweth/new_code.bin
INSTALL .modules/lib/firmware/kaweth/trigger_code.bin
INSTALL .modules/lib/firmware/kaweth/new_code_fix.bin
INSTALL .modules/lib/firmware/kaweth/trigger_code_fix.bin
INSTALL .modules/lib/firmware/ti_3410.fw
INSTALL .modules/lib/firmware/ti_5052.fw
INSTALL .modules/lib/firmware/mts_cdma.fw
INSTALL .modules/lib/firmware/mts_gsm.fw
INSTALL .modules/lib/firmware/mts_edge.fw
INSTALL .modules/lib/firmware/edgeport/boot.fw
INSTALL .modules/lib/firmware/edgeport/boot2.fw
INSTALL .modules/lib/firmware/edgeport/down.fw
INSTALL .modules/lib/firmware/edgeport/down2.fw
INSTALL .modules/lib/firmware/edgeport/down3.bin
INSTALL .modules/lib/firmware/whiteheat_loader.fw
INSTALL .modules/lib/firmware/whiteheat.fw
INSTALL .modules/lib/firmware/keyspan_pda/keyspan_pda.fw
INSTALL .modules/lib/firmware/keyspan_pda/xircom_pgs.fw
INSTALL .modules/lib/firmware/cpia2/stv0672_vp4.bin
INSTALL .modules/lib/firmware/yam/1200.bin
INSTALL .modules/lib/firmware/yam/9600.bin
DEPMOD 4.9.77-v7+
luwang@ubuntu:~/raspberry-pi/linux$ `
上半部log由于篇幅原因省略。这里记住版本信息是4.9.77-v7+。
在linux机器上,从linux拷贝生成的kernel到Raspberry PI
cd PATH_TO_RASPBERRY_PI/linux/arch/arm/boot/zImage pi@RASPBARRY:/tmp/kernel_new.img
在linux机器上,从linux拷贝生成的modules到Raspberry PI
`cd PATH_TO_RASPBERRY_PI/modules
tar czf modules.tgz *
scp modules.tgz pi@RASPBERRY:/tmp`
将拷贝到Raspberry PI上的kernel和modules移动到boot和lib下面
`sudo cp /tmp/kernel_new.img /boot
sudo tar zxf /tmp/modules.tgz
sudo cp -rf /tmp/lib/firmware /lib/firmware
sudo cp -rf /tmp/lib/modules /lib/modules`
在Raspberry PI启动配置文件config.tx,文件最后面加入下面内容,指定从刚生成的kernel_new.img中启动。
kernel=kernel_new.img
重启Raspberry PI
sudo shutdown -r now
确认内核信息已经更新为新生成的kernel
uname -r 4.9.77-v7+
安装后续所需依赖
`sudo apt-get update
sudo apt-get install -y libusb-dev libdbus-1-dev libglib2.0-dev libudev-dev libical-dev libreadline-dev autotools-dev automake libtool`
json-c
下载json-c源代码
git clone https://github.com/json-c/json-c.git
编译并安装
`cd PATH_TO_JSON_C
sh autogen.sh
./configure
make
sudo make install`
Bluez
从以下链接下载bluez-5.48.tar.gz,并解压到本地目录
`https://git.kernel.org/pub/scm/bluetooth/bluez.git
tar xvf bluez-5.48.tar.gz`
修改mesh gatt在处理数据分段时的逻辑,diff如下
`luwang@ubuntu:~/bluez$ git diff mesh/gatt.c
diff --git a/mesh/gatt.c b/mesh/gatt.c
index 9116a9d..8d564a9 100644
--- a/mesh/gatt.c
+++ b/mesh/gatt.c
@@ -393,7 +393,10 @@ static bool pipe_read(struct io *io, bool prov, void *user_data)
break;
res = buf;
- mesh_gatt_sar(&res, len);
+ len = mesh_gatt_sar(&res, len);
+ if (len == 0) {
+ break;
+ }
if (prov)
prov_data_ready(node, res, len);`
编译安装
`cd PATH_TO_BLUEZ
./bootstrap
./configure --enable-mesh --enable-debug
make
sudo make install`
Bluetooth controller
Bluetooth controller使用的是zephyr的bluetooth/hci_uart应用,使用的分支branch是v1.10-branch。
修改串口波特率为115200.
`luwang@ubuntu:~/zephyr/samples/bluetooth/hci_uart$ git diff nrf5.conf
diff --git a/samples/bluetooth/hci_uart/nrf5.conf b/samples/bluetooth/hci_uart/nrf5.conf
index 4a507be..9aea95f 100644
--- a/samples/bluetooth/hci_uart/nrf5.conf
+++ b/samples/bluetooth/hci_uart/nrf5.conf
@@ -4,7 +4,7 @@ CONFIG_UART_CONSOLE=n
CONFIG_GPIO=y
CONFIG_SERIAL=y
CONFIG_UART_INTERRUPT_DRIVEN=y
-CONFIG_UART_NRF5_BAUD_RATE=1000000
+CONFIG_UART_NRF5_BAUD_RATE=115200
CONFIG_UART_NRF5_FLOW_CONTROL=y
CONFIG_MAIN_STACK_SIZE=512
CONFIG_SYSTEM_WORKQUEUE_STACK_SIZE=51`
Server端和Client端应用程序
下载AliOS-Things源代码
git clone git@github.com:alibaba/AliOS-Things.git
编译生成Server端应用
`cd PATH_TO_AOS
aos make bluetooth.blemesh_srv@esp32devkitc hci_h4=1`
编译生成Client端应用
cd PATH_TO_AOS aos make bluetooth.blemesh_cli@esp32devkitc hci_h4=1
将生成的镜像利用esptool烧录到ESP32.
温度监测网络的搭建
温度监测网络包括三种角色,provisioner,server和client。Server是温度信息的发布者,client是温度信息的订阅者。
Provisioning和配置Server节点
在Raspberry PI上,运行并进入meshctl命令行
`pi@raspberrypi:~/bluez-5.48/mesh $ ./meshctl .
Local config directory not provided.
netkeys = 1
appkeys = 2
provisioners = 1
On/Off client model: new binding 0001
[NEW] Controller B8:27:EB:B2:E7:4A raspberrypi [default]
[NEW] Device EC:60:BA:B5:36:D0 AOS Device
Service added /org/bluez/hci0/dev_EC_60_BA_B5_36_D0/service000a
Char added /org/bluez/hci0/dev_EC_60_BA_B5_36_D0/service000a/char000d:
Char added /org/bluez/hci0/dev_EC_60_BA_B5_36_D0/service000a/char000b:
Service added /org/bluez/hci0/dev_EC_60_BA_B5_36_D0/service0006`
server节点上电,并开启发现unprovisioned 设备模式,发现新unprovisioned设备
`[meshctl]# discover-unprovisioned on
SetDiscoveryFilter success
Discovery started
Adapter property changed
[CHG] Controller B8:27:EB:B2:E7:4A Discovering: yes
Mesh Provisioning Service (00001827-0000-1000-8000-00805f9b34fb)
Device UUID: dddd0000000000000000000000000000
OOB: 0000`
认证该设备
`[meshctl]# provision dddd
Trying to connect Device EC:60:BA:B5:36:D0 AOS Device
Adapter property changed
[CHG] Controller B8:27:EB:B2:E7:4A Discovering: no
Connection successful
Services resolved yes
Found matching char: path /org/bluez/hci0/dev_EC_60_BA_B5_36_D0/service000a/char000b, uuid 00002adb-0000-1000-8000-00805f9b34fb
Found matching char: path /org/bluez/hci0/dev_EC_60_BA_B5_36_D0/service000a/char000d, uuid 00002adc-0000-1000-8000-00805f9b34fb
Start notification on /org/bluez/hci0/dev_EC_60_BA_B5_36_D0/service000a/char000d
Characteristic property changed /org/bluez/hci0/dev_EC_60_BA_B5_36_D0/service000a/char000d
AcquireNotify success: fd 7 MTU 65
Notify for Mesh Provisioning Out Data started
Open-Node: 0x1758dc8
Open-Prov: 0x1757598
Open-Prov: proxy 0x175a1c8
Initiated provisioning
Characteristic property changed /org/bluez/hci0/dev_EC_60_BA_B5_36_D0/service000a/char000b
AcquireWrite success: fd 8 MTU 65
GATT-TX: 03 00 10
GATT-RX: 03 01 01 00 01 00 00 04 00 08 00 00 00
Got provisioning data (12 bytes)
01 01 00 01 00 00 04 00 08 00 00 00
GATT-TX: 03 02 00 00 02 03 04
GATT-TX: 03 03 09 da d3 a0 1e 4f 15 34 3c 1f 88 e2 1f 93
GATT-TX: f6 38 9b 8a 2d 3a a0 49 7a 0b 01 c6 5c 61 d9 cc
GATT-TX: 49 be 26 78 5c 5c de c1 05 86 6f 5a 88 0d 93 b8
GATT-TX: 60 e2 77 67 3d 72 f4 46 b4 5f d3 b1 87 53 cd 96
GATT-TX: fc ce
GATT-RX: 43 03 d2 68 da 6f fe cc f8 97 0e 99 84 e6 eb 93
GATT-RX: 15 15 aa 1d 15 5b 2a f2 e7 1f 4d c1 93 51 14 29
GATT-RX: 7e b7 75 0c 8d 5a 51 c8 14 29 8d 3a 73 de fa 95
GATT-RX: 09 42 7e 7f 0a be e2 ed e5 ff 27 43 26 f7
GATT-RX: c3 ab 8b ef 6f
Got provisioning data (65 bytes)
03 d2 68 da 6f fe cc f8 97 0e 99 84 e6 eb 93 15
15 aa 1d 15 5b 2a f2 e7 1f 4d c1 93 51 14 29 7e
b7 75 0c 8d 5a 51 c8 14 29 8d 3a 73 de fa 95 09
42 7e 7f 0a be e2 ed e5 ff 27 43 26 f7 ab 8b ef
6f
Request decimal key (0 - 9999)
[AOS 1m[mesh] Enter Numeric key: `
查看server命令行OOB输出
`Initializing...
Bluetooth initialized
Server
Mesh initialized
attention_on()
OOB Number: 9023
attention_off()`
在Raspberry PI上键入9023,进行后续provision,后续会打印一长串log
`[AOS 1m[mesh] Enter Numeric key: 9023
GATT-TX: 03 05 fe 7f b1 04 84 f6 e9 0d 9e c7 62 19 6d 1f
GATT-TX: 03 64
GATT-RX: 03 05 ca f5 8e 55 ff 1d 92 86 26 fa 8e 22 8c 33
GATT-RX: 69 80
Got provisioning data (17 bytes)
05 ca f5 8e 55 ff 1d 92 86 26 fa 8e 22 8c 33 69
80
GATT-TX: 03 06 d6 63 cd 7c e6 3b b5 9b 2b a3 f5 3e e6 7c
GATT-TX: 15 f1
GATT-RX: 03 06 7a 94 aa 7a 3b f3 1c 33 92 cf 8a 3c 86 ec
GATT-RX: 9d 0c
Got provisioning data (17 bytes)
06 7a 94 aa 7a 3b f3 1c 33 92 cf 8a 3c 86 ec 9d
0c
Confirmation Validated
S-Key 5e ee f5 44 72 cc 88 c7 3a 9a 56 db 11 4a d5 44
S-Nonce 82 b4 a8 f2 7b 9b 76 c7 72 8b 3f e2 07
DevKey f8 a9 4d 78 25 b8 47 3d 0d 3d 20 50 91 45 db 20
Data 18 ee d9 c2 a5 6a dd 85 04 9f fc 3c 59 ad 0e 12
Data 00 00 00 00 00 00 05 01 00
DataEncrypted + mic b7 8a f4 17 c3 e8 05 66 84 4d d6 5e 22 69 73 1c
DataEncrypted + mic 90 10 91 8c 5f f7 30 55 bf d1 1c 29 e9 d6 3e 78
DataEncrypted + mic f1
GATT-TX: 03 07 b7 8a f4 17 c3 e8 05 66 84 4d d6 5e 22 69
GATT-TX: 73 1c 90 10 91 8c 5f f7 30 55 bf d1 1c 29 e9 d6
GATT-TX: 3e 78 f1
GATT-RX: 03 08
Got provisioning data (1 bytes)
08
Provision success. Assigned Primary Unicast 0100
Attempting to disconnect from EC:60:BA:B5:36:D0
Characteristic property changed /org/bluez/hci0/dev_EC_60_BA_B5_36_D0/service000a/char000d
Write closed
Service added /org/bluez/hci0/dev_EC_60_BA_B5_36_D0/service000a
Char added /org/bluez/hci0/dev_EC_60_BA_B5_36_D0/service000a/char000b:
Char added /org/bluez/hci0/dev_EC_60_BA_B5_36_D0/service000a/char000d:
Services resolved no
SetDiscoveryFilter success
Discovery started
Adapter property changed
[CHG] Controller B8:27:EB:B2:E7:4A Discovering: yes
Mesh Proxy Service (00001828-0000-1000-8000-00805f9b34fb)
Identity for node 0100
Trying to connect to mesh
Adapter property changed
[CHG] Controller B8:27:EB:B2:E7:4A Discovering: no
Connection successful
Services resolved yes
Found matching char: path /org/bluez/hci0/dev_EC_60_BA_B5_36_D0/service000a/char000b, uuid 00002add-0000-1000-8000-00805f9b34fb
Found matching char: path /org/bluez/hci0/dev_EC_60_BA_B5_36_D0/service000a/char000d, uuid 00002ade-0000-1000-8000-00805f9b34fb
Start notification on /org/bluez/hci0/dev_EC_60_BA_B5_36_D0/service000a/char000d
Characteristic property changed /org/bluez/hci0/dev_EC_60_BA_B5_36_D0/service000a/char000d
AcquireNotify success: fd 7 MTU 65
Notify for Mesh Proxy Out Data started
Trying to open mesh session
GATT-RX: 01 01 00 d4 76 79 43 3f db 10 4a 00 00 00 05 f4
GATT-RX: 0a 41 fa b0 af 32 0b
iv_upd_state = IV_UPD_NORMAL
Mesh session is open
Characteristic property changed /org/bluez/hci0/dev_EC_60_BA_B5_36_D0/service000a/char000b
AcquireWrite success: fd 8 MTU 65
GATT-TX: 02 f4 9e 64 99 fe 13 cd c8 9b 0e 1c e5 61 82 cc
GATT-TX: ab f5 83 70
GATT-TX: 00 f4 b3 a6 53 65 b2 a0 cd 7a 74 9e 95 1d b7 13
GATT-TX: 06 e6 48 68 d5 5c
GATT-RX: 02 f4 e7 02 fe d4 84 81 a3 32 e7 6e 4b 1b 74 4a
GATT-RX: 13 95 f5 61 7f eb
Proxy Whitelist filter length: 0
GATT-RX: 00 f4 60 4f af f8 ba 30 1f a6 70 d9 cb 5f 12 dd
GATT-RX: 8b 0b 71 6b 68 ad 00 90 07 cf ec e0 28 fe
GATT-RX: 00 f4 2a e4 87 bb f8 21 34 0d 45 4c c3 de 5b e3
GATT-RX: 21 bb 57 9a 34 94 5a de 4d e8 ca c8 91 cd
GATT-RX: 00 f4 b7 a0 67 ff da 92 a3 32 4c c2 c2 4e a5 5c
GATT-RX: 7f 12 c7 5f 02 bc 0b 23 9f 13
Composition data for node 0100 {
"cid":"0002",
"pid":"0000",
"vid":"0000",
"crpl":"0005",
"features":{
"relay":false,
"proxy":true,
"friend":false,
"lpn":false
},
"elements":[
{
"elementIndex":0,
"location":"0000",
"models":[
"0000",
"0001",
"0002",
"1100"
]
}
]
}
GATT-TX: 00 f4 2b d6 e6 46 66 5b 65 31 1d 78 08 28 5d 16
GATT-TX: aa e2 97 b6 18 84 1f 29 7f `
上述log分为两个阶段,第一个阶段是利用provisioning connection进行provision,第二个阶段是建立mesh proxy connection,后续需要在这个connection上传输网络配置信息。
当上述log完整打印后,server端会打印provision成功完成的信息
`Provisioning completed!
Net ID: 0
Unicast addr: 0x0100`
接下来,是在刚才建立的mesh proxy connection上传递网络配置信息
首先是进入菜单
`[AOS Devic-Node-0100]# menu config
Menu config:
Available commands:
-------------------
target <unicast> Set target node to configure
composition-get [page_num] Get Composition Data
netkey-add <net_idx> Add network key
netkey-del <net_idx> Delete network key
appkey-add <app_idx> Add application key
appkey-del <app_idx> Delete application key
bind <ele_idx> <app_idx> <mod_id> [cid] Bind app key to a model
ttl-set <ttl> Set default TTL
ttl-get Get default TTL
pub-set <ele_addr> <pub_addr> <app_idx> <per (step|res)> <re-xmt (cnt|per)> <mod id> [cid]
Set publication
pub-get <ele_addr> <model> Get publication
proxy-set <proxy> Set proxy state
proxy-get Get proxy state
ident-set <net_idx> <state> Set node identity state
ident-get <net_idx> Get node identity state
relay-set <relay> <rexmt count> <rexmt steps> Set relay
relay-get Get relay
hb-pub-set <pub_addr> <count> <period> <features> <net_idx> Set heartbeati publish
sub-add <ele_addr> <sub_addr> <model id> Subscription add
sub-get <ele_addr> <model id> Subscription get
app-get <ele_addr> <model id> Get App Keys
back Return to main menu
version Display version
quit Quit program
exit Quit program
help Display help about this program`
选择配置节点,这里可以看到节点ucast addr是0x0100
[AOS Devic-Node-0100]# target 0100
Configuring node 0100
[config: Target = 0100]# target 0100[config: Target = 0100]#
配置app key
`[config: Target = 0100]# target 0100[config: Target = 0100]# appkey-add 1
GATT-TX: 00 f4 e5 ca a3 ba 03 7b db 7f a6 aa 7c 02 25 75
GATT-TX: 6b 2a cf d4 93 0a 02 c3 8d 22 7d 30 ee 21
GATT-TX: 00 f4 41 5a 17 27 bf 6f 70 59 1e 4e 60 2d be 4f
GATT-TX: 1e f9 0d 88 e1 d6 c1 50 f3 51 cc 6d 43 d8
GATT-RX: 00 f4 04 00 5a d6 cc af 78 b3 eb 70 e5 78 e9 1b
GATT-RX: 87 fc 43 8c b0 ad 90 a2 7a
GATT-RX: 00 f4 56 a5 24 11 02 10 62 67 45 42 77 77 3a 7a
GATT-RX: ec 3e 8f 2f 26 56 4f d3 ba
Node 0100 AppKey Status Success
NetKey 000, AppKey 001`
将server节点的element 0的sensor server model (0x1100)绑定到app key index =1的app key上
`[config: Target = 0100]# bind 0 1 1100
GATT-TX: 00 f4 cb 2a f4 45 0f 4d 25 b0 47 d8 15 72 ba 89
GATT-TX: 61 fc ec 15 7e fe 8c dc 30 e6 04
GATT-RX: 00 f4 af 08 09 a9 12 03 dd fa df 1a 5f e4 7e c1
GATT-RX: 4f c8 58 84 82 77 8c 62 d1 cb 59 f9
Node 0100 Model App Status Success
Element 0100 AppIdx 001
ModelId 1100`
增加sensor server model (0x1100)订阅发布地址0xc000的信息
`[config: Target = 0100]# sub-add 0100 c000 1100
GATT-TX: 00 f4 fe fa 07 e1 60 7a 1a ac d1 26 3a 45 8e f7
GATT-TX: 5e 8e ff 79 9d aa 90 10 ab b8 ef
GATT-RX: 00 f4 a8 c7 92 53 ee 9e 15 c7 fb 47 3e e8 07 fb
GATT-RX: c4 ea 8a f7 2d 71 3a 33 da 12 e9 0f
Subscription changed for node 0100 status: Success
Element Addr: 0100
Subscr Addr: c000
Model ID: 1100`
设置sensor server model (0x1100)使用app key index = 1的app key发布信息,发布地址是0xc000,
`[config: Target = 0100]# pub-set 0100 c000 1 0 0 1100
GATT-TX: 00 f4 d1 a1 54 ee 1b 9f 18 4e 3c 44 ab 57 f9 82
GATT-TX: 73 41 9e 9c ab 3d 5c dd ad 27 c3 18 b7 22
GATT-TX: 00 f4 d0 95 d8 43 e4 87 12 96 14 bf 52 55 5a 8a
GATT-TX: ad 00 b0 4c b4 46
GATT-RX: 00 f4 34 4f 18 3f cf 94 bd 90 49 6a 6d 0e 83 78
GATT-RX: 0c b8 7c 14 00 7e 3f b6 fa
GATT-RX: 00 f4 66 8c 52 14 1b f9 b8 e2 d9 27 17 0d b0 87
GATT-RX: 28 1a 12 65 e6 7f 36 b9 92 c2 c0 79 e8 2d
GATT-RX: 00 f4 60 7b 6a a5 b6 9b d4 a2 f0 80 5b e6 9e 0b
GATT-RX: 70 0c c9 34 a3 65 11 7f
Set publication for node 0100 status: Success
Publication address: 0xc000
Period: 0 ms
Retransmit count: 0
Retransmit Interval Steps: 0
GATT-TX: 00 f4 d2 0f fb e4 49 24 a0 6c 7d 34 a8 bd dc ca
GATT-TX: c6 a8 9f 17 d0 eb 5b 46 31
[config: Target = 0100]# `
Provisioning和配置Client节点
在Raspberry PI上,运行并进入meshctl命令行
`pi@raspberrypi:~/bluez-5.48/mesh $ ./meshctl .
Local config directory not provided.
netkeys = 1
appkeys = 2
provisioners = 1
provisioned nodes = 1
On/Off client model: new binding 0001
[NEW] Controller B8:27:EB:B2:E7:4A raspberrypi [default]
[NEW] Device D6:FB:47:4F:7E:A9 AOS Device
Service added /org/bluez/hci0/dev_EC_60_BA_B5_36_D0/service000a
Char added /org/bluez/hci0/dev_EC_60_BA_B5_36_D0/service000a/char000d:
Char added /org/bluez/hci0/dev_EC_60_BA_B5_36_D0/service000a/char000b:
Service added /org/bluez/hci0/dev_EC_60_BA_B5_36_D0/service0006`
client节点上电,并开启发现unprovisioned 设备模式,发现新unprovisioned设备
`[meshctl]# discover-unprovisioned on
SetDiscoveryFilter success
Discovery started
Adapter property changed
[CHG] Controller B8:27:EB:B2:E7:4A Discovering: yes
Mesh Provisioning Service (00001827-0000-1000-8000-00805f9b34fb)
Device UUID: dddd0000000000000000000000000000
OOB: 0000`
认证该设备
`[meshctl]# provision dddd
Trying to connect Device D6:FB:47:4F:7E:A9 AOS Device
Adapter property changed
[CHG] Controller B8:27:EB:B2:E7:4A Discovering: no
Connection successful
Service added /org/bluez/hci0/dev_D6_FB_47_4F_7E_A9/service0006
Service added /org/bluez/hci0/dev_D6_FB_47_4F_7E_A9/service000a
Char added /org/bluez/hci0/dev_D6_FB_47_4F_7E_A9/service000a/char000b:
Char added /org/bluez/hci0/dev_D6_FB_47_4F_7E_A9/service000a/char000d:
Services resolved yes
Found matching char: path /org/bluez/hci0/dev_D6_FB_47_4F_7E_A9/service000a/char000b, uuid 00002adb-0000-1000-8000-00805f9b34fb
Found matching char: path /org/bluez/hci0/dev_D6_FB_47_4F_7E_A9/service000a/char000d, uuid 00002adc-0000-1000-8000-00805f9b34fb
Start notification on /org/bluez/hci0/dev_D6_FB_47_4F_7E_A9/service000a/char000d
Characteristic property changed /org/bluez/hci0/dev_D6_FB_47_4F_7E_A9/service000a/char000d
AcquireNotify success: fd 7 MTU 65
Notify for Mesh Provisioning Out Data started
Open-Node: 0xe51ab0
Open-Prov: 0xe59bf0
Open-Prov: proxy 0xe4c200
Initiated provisioning
Characteristic property changed /org/bluez/hci0/dev_D6_FB_47_4F_7E_A9/service000a/char000b
AcquireWrite success: fd 8 MTU 65
GATT-TX: 03 00 10
GATT-RX: 03 01 01 00 01 00 00 04 00 08 00 00 00
Got provisioning data (12 bytes)
01 01 00 01 00 00 04 00 08 00 00 00
GATT-TX: 03 02 00 00 02 03 04
GATT-TX: 03 03 86 03 e8 b6 50 d7 4d 33 e3 fd aa c0 fa 46
GATT-TX: d5 1c a8 58 91 c1 4d de 96 30 26 8c a0 3c c3 5b
GATT-TX: c6 87 f4 e9 b9 08 a7 e7 2d 67 ae 3a 7c f7 1c 42
GATT-TX: 6a da 6d 41 ba 77 17 69 25 a1 75 46 e5 eb 31 ee
GATT-TX: 07 5d
GATT-RX: 43 03 26 00 86 9a 35 54 40 b8 be 53 a0 88 e1 55
GATT-RX: 19 33 ee f4 4d 03 35 12 59 6d a5 63 de a2 0a dc
GATT-RX: 24 e4 a7 8a 8d 42 27 76 d8 2c a9 87 69 27 68 61
GATT-RX: 2b 56 f8 97 3c a9 bf de b6 64 00 f5 77 91
GATT-RX: c3 73 3f 94 62
Got provisioning data (65 bytes)
03 26 00 86 9a 35 54 40 b8 be 53 a0 88 e1 55 19
33 ee f4 4d 03 35 12 59 6d a5 63 de a2 0a dc 24
e4 a7 8a 8d 42 27 76 d8 2c a9 87 69 27 68 61 2b
56 f8 97 3c a9 bf de b6 64 00 f5 77 91 73 3f 94
62
Request decimal key (0 - 9999)
[AOS 1m[mesh] Enter Numeric key:`
查看server命令行OOB输出
`Initializing...
Bluetooth initialized
Mesh initialized
OOB Number: 4159`
在Raspberry PI上键入4159,进行后续provision,后续会打印一长串log
`[AOS 1m[mesh] Enter Numeric key: 4159
GATT-TX: 03 05 20 2e 58 e4 b8 06 93 0d a2 b5 2f 7b eb 16
GATT-TX: 99 07
GATT-RX: 03 05 fd ee fd f5 3d 54 71 42 91 92 64 a4 69 46
GATT-RX: f7 bc
Got provisioning data (17 bytes)
05 fd ee fd f5 3d 54 71 42 91 92 64 a4 69 46 f7
bc
GATT-TX: 03 06 e6 4e 15 4c 75 e4 2d 76 d3 0b 13 64 91 f0
GATT-TX: ac e4
GATT-RX: 03 06 54 65 35 17 f6 cb 77 bc ae af 19 8e 7c 92
GATT-RX: 71 f3
Got provisioning data (17 bytes)
06 54 65 35 17 f6 cb 77 bc ae af 19 8e 7c 92 71
f3
Confirmation Validated
S-Key b4 dc cb 8f 1d 62 4e c4 95 f5 74 6d ff bc 42 d9
S-Nonce 54 c1 e5 68 cf a6 ec c0 47 3b 8f f4 25
DevKey 0c c5 26 e9 12 e3 d2 89 39 20 3a af 27 a4 f9 d2
Data 18 ee d9 c2 a5 6a dd 85 04 9f fc 3c 59 ad 0e 12
Data 00 00 00 00 00 00 05 01 01
DataEncrypted + mic 80 bb ca b9 3f ca ff 49 5d 22 3c d3 5a 70 45 61
DataEncrypted + mic ae a4 a7 7b b6 15 b6 ed df 7c 47 8f 84 8d d4 dc
DataEncrypted + mic db
GATT-TX: 03 07 80 bb ca b9 3f ca ff 49 5d 22 3c d3 5a 70
GATT-TX: 45 61 ae a4 a7 7b b6 15 b6 ed df 7c 47 8f 84 8d
GATT-TX: d4 dc db
GATT-RX: 03 08
Got provisioning data (1 bytes)
08
Provision success. Assigned Primary Unicast 0101
Attempting to disconnect from D6:FB:47:4F:7E:A9
Characteristic property changed /org/bluez/hci0/dev_D6_FB_47_4F_7E_A9/service000a/char000d
Write closed
Service added /org/bluez/hci0/dev_D6_FB_47_4F_7E_A9/service000a
Char added /org/bluez/hci0/dev_D6_FB_47_4F_7E_A9/service000a/char000b:
Char added /org/bluez/hci0/dev_D6_FB_47_4F_7E_A9/service000a/char000d:
Services resolved no
SetDiscoveryFilter success
Discovery started
Adapter property changed
[CHG] Controller B8:27:EB:B2:E7:4A Discovering: yes
Mesh Proxy Service (00001828-0000-1000-8000-00805f9b34fb)
Identity for node 0101
Trying to connect to mesh
Adapter property changed
[CHG] Controller B8:27:EB:B2:E7:4A Discovering: no
Connection successful
Services resolved yes
Found matching char: path /org/bluez/hci0/dev_D6_FB_47_4F_7E_A9/service000a/char000b, uuid 00002add-0000-1000-8000-00805f9b34fb
Found matching char: path /org/bluez/hci0/dev_D6_FB_47_4F_7E_A9/service000a/char000d, uuid 00002ade-0000-1000-8000-00805f9b34fb
Start notification on /org/bluez/hci0/dev_D6_FB_47_4F_7E_A9/service000a/char000d
Characteristic property changed /org/bluez/hci0/dev_D6_FB_47_4F_7E_A9/service000a/char000d
AcquireNotify success: fd 7 MTU 65
Notify for Mesh Proxy Out Data started
Trying to open mesh session
GATT-RX: 01 01 00 d4 76 79 43 3f db 10 4a 00 00 00 05 f4
GATT-RX: 0a 41 fa b0 af 32 0b
iv_upd_state = IV_UPD_NORMAL
Mesh session is open
Characteristic property changed /org/bluez/hci0/dev_D6_FB_47_4F_7E_A9/service000a/char000b
AcquireWrite success: fd 8 MTU 65
GATT-TX: 02 f4 8c 6d ef 98 ac 2e 79 c8 e0 2c 83 2b 4a b4
GATT-TX: c9 1f e3 a9
GATT-TX: 00 f4 95 a2 60 a7 67 ec a4 40 e9 18 1a 69 a4 00
GATT-TX: c1 54 c7 3d a9 d7
GATT-RX: 02 f4 35 d1 c4 66 28 17 1b 6d ed 86 f9 26 19 ca
GATT-RX: d5 6f 3c 9e 7b cd
Proxy Whitelist filter length: 0
GATT-RX: 00 f4 98 0a 63 16 58 d9 d6 34 75 81 6d 7e a3 5f
GATT-RX: 83 2f 1c 58 17 ad 23 17 7d 7b 50 ee 4e 61
GATT-RX: 00 f4 cf 10 98 83 f6 b7 13 22 45 a0 6b 53 1b 51
GATT-RX: c8 35 4b a7 f4 0e f4 f3 d4 c2 0c 25 12 ec
GATT-RX: 00 f4 a3 1e 00 1c 07 b8 e8 a6 9f 29 aa 84 7e eb
GATT-RX: ee 7a 7c 6b 13 63 37 ce
Composition data for node 0101 {
"cid":"0002",
"pid":"0000",
"vid":"0000",
"crpl":"0005",
"features":{
"relay":false,
"proxy":true,
"friend":false,
"lpn":false
},
"elements":[
{
"elementIndex":0,
"location":"0000",
"models":[
"0000",
"0001",
"1102"
]
}
]
}
GATT-TX: 00 f4 71 66 e6 89 61 44 19 6b c1 75 a4 a9 b8 f2
GATT-TX: ed 9b b9 ee 99 b5 96 bc 05 `
上述log分为两个阶段,第一个阶段是利用provisioning connection进行provision,第二个阶段是建立mesh proxy connection,后续需要在这个connection上传输网络配置信息。
当上述log完整打印后,server端会打印provision成功完成的信息
`Provisioning completed!
Net ID: 0
Unicast addr: 0x0101`
接下来,是在刚才建立的mesh proxy connection上传递网络配置信息
首先是进入菜单
`[AOS Device-Node-0101]# menu config
Menu config:
Available commands:
-------------------
target <unicast> Set target node to configure
composition-get [page_num] Get Composition Data
netkey-add <net_idx> Add network key
netkey-del <net_idx> Delete network key
appkey-add <app_idx> Add application key
appkey-del <app_idx> Delete application key
bind <ele_idx> <app_idx> <mod_id> [cid] Bind app key to a model
ttl-set <ttl> Set default TTL
ttl-get Get default TTL
pub-set <ele_addr> <pub_addr> <app_idx> <per (step|res)> <re-xmt (cnt|per)> <mod id> [cid]
Set publication
pub-get <ele_addr> <model> Get publication
proxy-set <proxy> Set proxy state
proxy-get Get proxy state
ident-set <net_idx> <state> Set node identity state
ident-get <net_idx> Get node identity state
relay-set <relay> <rexmt count> <rexmt steps> Set relay
relay-get Get relay
hb-pub-set <pub_addr> <count> <period> <features> <net_idx> Set heartbeati publish
sub-add <ele_addr> <sub_addr> <model id> Subscription add
sub-get <ele_addr> <model id> Subscription get
app-get <ele_addr> <model id> Get App Keys
back Return to main menu
version Display version
quit Quit program
exit Quit program
help Display help about this program`
选择配置节点,这里可以看到节点ucast addr是0x0101
`[AOS Device-Node-0101]# target 0101
Configuring node 0101
[config: Target = 0101]# target 0101[config: Target = 0101]#`
配置app key
`[config: Target = 0101]# target 0101[config: Target = 0101]# appkey-add 1
GATT-TX: 00 f4 2b 37 95 64 e7 fe ba 41 b3 c8 d9 0c f4 0c
GATT-TX: 76 36 a4 f0 f9 c4 f8 93 73 8a 3d 7d 7e c1
GATT-TX: 00 f4 43 6e 87 5d 09 0b 4b 05 a0 1b c0 48 da a1
GATT-TX: bf d6 9b 21 91 68 d8 b0 b4 27 57 90 61 06
GATT-RX: 00 f4 7f d6 9d 40 6d bc 10 5f 41 67 68 56 9c d8
GATT-RX: b9 77 dc 71 b5 10 ec b1 85
GATT-RX: 00 f4 81 91 ee 63 66 b4 5a 42 6f 70 f6 d2 12 93
GATT-RX: 2d 9f 21 2d fa a3 89 2f 4b
Node 0101 AppKey Status Success
NetKey 000, AppKey 001`
将client节点的element 0的sensor client model (0x1102)绑定到app key index =1的app key上
`[config: Target = 0101]# bind 0 1 1102
GATT-TX: 00 f4 97 c8 22 ee 6f 11 c3 c6 7c 5c 4f 88 e4 3d
GATT-TX: 36 9e 19 c7 3f a8 f3 d3 d4 7d 90
GATT-RX: 00 f4 e9 e9 33 90 5a f3 cb 88 c1 3e 44 af f6 61
GATT-RX: d0 ef 47 35 35 c3 03 8a c9 43 01 7d
Node 0101 Model App Status Success
Element 0101 AppIdx 001
ModelId 1102`
增加sensor client model (0x1102)订阅发布地址0xc000的信息
`[config: Target = 0101]# sub-add 0101 c000 1102
GATT-TX: 00 f4 c5 5e 47 70 42 84 3b 28 14 26 60 83 01 69
GATT-TX: 7c 25 c3 c2 d9 1d d3 fb c0 e5 65
GATT-RX: 00 f4 6f 71 02 d9 ec 00 cf c1 96 f0 3a 7f ea a9
GATT-RX: b1 fb 6d 70 31 62 d8 d0 4b 5d 81 a6
Subscription changed for node 0101 status: Success
Element Addr: 0101
Subscr Addr: c000
Model ID: 1102`
设置sensor client model (0x1102)使用app key index = 1的app key发布信息,发布地址是0xc000,
`[config: Target = 0101]# pub-set 0101 c000 1 0 0 1102
GATT-TX: 00 f4 5a 22 c5 d2 d0 76 94 a9 7f 70 6e 64 c1 f3
GATT-TX: be 58 43 fc f1 61 f0 ac dc ce 4d 0b 9c f1
GATT-TX: 00 f4 1a 8a af 58 92 d2 d5 38 b2 0f 62 56 34 96
GATT-TX: 5f 08 9e 5a c6 54
GATT-RX: 00 f4 eb 12 ea 4f 6f 1f f8 e6 f2 92 c4 d7 82 a0
GATT-RX: ad 9e c9 92 9e 91 d4 a6 3c
GATT-RX: 00 f4 2a 11 82 c6 86 27 0a 4a 88 bf a6 02 74 56
GATT-RX: d5 2d 28 72 24 cd ae 91 fa dc 72 35 d7 be
GATT-RX: 00 f4 a7 08 14 6c 95 bd 62 07 67 1b c6 c8 95 b8
GATT-RX: f2 a9 3b 03 d2 82 d1 97
Set publication for node 0101 status: Success
Publication address: 0xc000
Period: 0 ms
Retransmit count: 0
Retransmit Interval Steps: 0
GATT-TX: 00 f4 f0 60 6a 70 db 3b e2 60 a6 c8 50 d9 03 36
GATT-TX: d5 a1 47 c9 2f 25 49 5e 47`
上述配置全部完成后,可以在client节点看到周期性发送温度请求信息和收到回复的log
`Sensor status Get request sent with OpCode 0x00008231
Got the sensor status
Sensor ID: 0x2a1f
Temperature value: 27`
在server节点可以看到周期性接收到温度请求和发送回复的log
`Sensor Status Get request received
Sensor status sent with OpCode 0x00000052`