510
个编辑
更改
→PB-ADV
[[文件:PB-ADV-04.png|边框|居中|无框|1200x1200像素]]
send_unprov_beacon()函数是用于发送Unprov Beacon数据的函数,在这个函数中我们调用prov_beacon_unprov_build函数去创建用于广播的Unprov Beacon数据包,然后调用advertiser_interval_set函数去设置广播的间隔,最后调用advertiser_packet_send函数去将我们的数据包发送出去。
默认的Unprov Beacon广播间隔是NRF_MESH_PROV_BEARER_ADV_UNPROV_BEACON_INTERVAL_MS 2000。
[[文件:PB-ADV-05.png|边框|居中|无框|1200x1200像素]]这里我们再最后看一下prov_beacon_unprov_build()函数,这个函数是生成我们的Unprov Beacon的数据包。
[[文件:PB-GATT-08.png|边框|居中|无框|1200x1200像素]]
然后我们继续追踪a_listen_start(),可以看到其中调用了mesh_adv_params_set函数设置了我们广播的超时时间MESH_ADV_TIMEOUT_INFINITE以及广播间隔NRF_MESH_PROV_BEARER_GATT_UNPROV_BEACON_INTERVAL_MS,调用mesh_adv_data_set函数设置了我们的广播数据内容,最后调用mesh_adv_start函数启动广播。
默认的PB-GATT的广播数据的Unprov Beacon的广播周期是NRF_MESH_PROV_BEARER_GATT_UNPROV_BEACON_INTERVAL_MS 200。
[[文件:PB-GATT-09.png|边框|居中|无框|1200x1200像素]]最后我们同样的看一下mesh_adv_data_set()函数最终配置生成的广播数据,可以看到广播数据的flag是0x06,服务的UUID就是我们上面提到的PB-GATT服务的UUID,接下来16字节UUID是和PB-ADV一样的FICR寄存器的device id值,最后的扫描回调数据携带的是设备的全名“nRF5x Mesh Light”。
[[文件:PB-GATT-13.png|边框|居中|无框|1200x1200像素]]
== ②扫描 ==
看过了我们的广播功能之后,我们来看下扫描的部分。在ble mesh中,我们的扫描功能scan,就是用于获取数据的,类似于数据通信的RX。
我们从main文件中的initialize()函数开始,首先是我们mesh_init()函数,最终我们会调用mesh_stack_init()函数。
[[文件:SCAN-01.png|边框|居中|无框|1200x1200像素]]
在mesh_satck_init函数中,我们可以看到调用了nrf_mesh_init函数去初始化core的参数。
[[文件:SCAN-02.png|边框|居中|无框|1200x1200像素]]
这一段是nrf_mesh_init函数部分,由于这个初始化函数太长,所以我们只截取了scan相关的部分。
首先是第一点scanner_init(scanner_packet_process_cb)函数,在这个函数中,我们回去初始化扫描的参数配置,并且会开启扫描功能。最终我们可以从scanner_packet_process_cb这个回调中得到我们扫描到的数据(获得所有的BLE广播数据)。
然后是第二点ad_listener_subscribe(&m_nrf_mesh_listener),这个是用来侦听订阅的消息的(从获得的所有BLE广播数据中,筛选出的订阅的消息)。
[[文件:SCAN-03.png|边框|居中|无框|1200x1200像素]]
然后我们继续看一下scanner_init的扫描初始化函数,在这个函数中我们首先调用scanner_config_reset()函数去配置扫描的默认参数。其中包含了:
1、扫描的通道SCANNER_CHANNELS_DEFAULT,也就是BLE的{37,38,39}三个channels都去扫描。
2、规范定义的非连接状态访问地址BEARER_ACCESS_ADDR_DEFAULT。
3、配置物理层协议是1Mbit模式。
4、扫描的间隔时间BEARER_SCAN_INT_DEFAULT_MS,扫描的窗口时间BEARER_SCAN_WINDOW_DEFAULT_MS
5、射频的发射功率RADIO_POWER_NRF_0DBM。
6、BLE广播包最大长度RADIO_CONFIG_ADV_MAX_PAYLOAD_SIZE。
最后我们会在nrf_mesh_enable()函数中调用scanner_enable()函数去启动扫描,这个大家可以自己查看一下代码,比较容易理解。
[[文件:SCAN-04.png|边框|居中|无框|1200x1200像素]]
[[文件:SCAN-05.png|边框|居中|无框|1200x1200像素]]
最后我们来看一下scanner_packet_process_cb()回调函数,
[[文件:SCAN-06.png|边框|居中|无框|1200x1200像素]]
[[分类:NRF52832DK]]
[[分类:实验手册]]