更改

跳转至: 导航搜索

NRF52832DK协议栈实验

添加7,891字节2019年7月9日 (二) 16:32
工程说明
break;
}
}
</syntaxhighlight>
 
====== scan_start()函数 ======
scan_start()发起扫描的函数,调用的是nordic提供的底层的nrf_ble_scan_start()函数实现的。<syntaxhighlight lang="c" line="1" start="83">
//******************************************************************
// fn : scan_start
//
// brief : 开始扫描
//
// param : none
//
// return : none
static void scan_start(void)
{
ret_code_t ret;
 
ret = nrf_ble_scan_start(&m_scan);
APP_ERROR_CHECK(ret);
}
</syntaxhighlight>
====== 工程说明 ======
相对于LOG实验,从机工程也是新增了nRF_BLE的分组,但是我们可以看到看到分组下的文件与主机工程是不同的。
 
主机部分主要是扫描和获取服务相关,从机部分则是广播、连接参数和服务注册相关。
[[文件:Nrf group nrf ble p.png|边框|居中|无框|330x330像素]]
====== main()函数 ======
在mian()函数,我们新增了广播初始化的advertising_init()函数、以及发起广播的advertising_start()函数。并且我们还初始化了GAP,调用的是gap_params_init()函数。
 
本来我们这一实验,只是想给大家带来广播和广播数据配置的展示的,但是为了能够让大家更直观的“看到”设备,所以我们便需要在广播数据中携带设备名称,那么问题来了,在nordic的协议栈中,除非我们去修改他提供的ble_advdata.c文件,不然我们没法直接去配置这个广播数据中的设备名称(这边给大家一个建议,除非对于协议栈的理解有把握,否则尽可能的不要去修改它)。
 
为了完成上述的添加设备名称的宏愿,所以我们只能“委曲求全”的添加了gap的初始化。<syntaxhighlight lang="c" line="1" start="260">
//******************************************************************
// fn : main
//
// brief : 主函数
//
// param : none
//
// return : none
int main(void)
{
// 初始化
log_init(); // 初始化LOG打印,由RTT工作
power_management_init();// 初始化电源控制
ble_stack_init(); // 初始化BLE栈堆
gap_params_init(); // 初始化GAP
advertising_init(); // 初始化广播
// 打印例程名称
NRF_LOG_INFO("2.2_ble_peripheral_adv_all");
 
advertising_start(); // 开启广播
// 进入主循环
for (;;)
{
idle_state_handle(); // 空闲状态处理
}
}
</syntaxhighlight>
 
====== gap_params_init()函数 ======
由于广播数据介绍的篇幅会大一些,所以我们先给大家说明一下gap_params_init()函数。
 
在这个gap初始化的函数中,我们设置了设备名称设备的名称为GY-NRF52832。<syntaxhighlight lang="c" line="1" start="52">
#define DEVICE_NAME "GY-NRF52832"
</syntaxhighlight><syntaxhighlight lang="c" line="1" start="124">
//******************************************************************
// fn : gap_params_init
//
// brief : 初始化GAP
// details : 此功能将设置设备的所有必需的GAP(通用访问配置文件)参数。它还设置权限和外观。
//
// param : none
//
// return : none
static void gap_params_init(void)
{
uint32_t err_code;
 
// 设置设备名称
err_code = sd_ble_gap_device_name_set(NULL,
(const uint8_t *) DEVICE_NAME,
strlen(DEVICE_NAME));
APP_ERROR_CHECK(err_code);
}
</syntaxhighlight>
 
====== advertising_init()函数 ======
{{Note|text=在这里给大家科普一下,BLE的广播数据和扫描回调数据都是由用户自定义的,对于数据的内容没有任何的限制。我们只需要遵循下面的广播数据结构要求就行。
 
advdata[] =
{
长度A,
类型A,
数据A,
长度B,
类型B,
数据B
}|type=info}}
在我们的广播数据初始化函数中,我们首先定义了init.advdata.name_type为BLE_ADVDATA_FULL_NAME,这意味着我们的广播数据中将携带有刚刚GAP初始化中的全部设备名称。
 
然后我们定义了init.srdata.include_ble_device_addr为true,这意味着我们的扫描回调设备中将会携带有设备的MAC地址。
 
接下来我们设置了快慢广播,如下代码配置的结果是先快速广播18s(周期40ms),再慢速广播18s(周期100ms),最后停止广播。
 
最后我们调用nordic提供的广播初始化函数ble_advertising_init()。
{{Note|text=我们展示的仅仅是nordic配置广播和扫描回调数据中的部分,除了上述的名称和设备地址。广播数据中还可以携带设备的类型、信号发射强度、连接参数、uuid等等,具体的大家可以go to define,查看ble_advdata_t结构体参数说明。|type=warning}}
<syntaxhighlight lang="c" line="1" start="85">
//******************************************************************
// fn : advertising_init
//
// brief : 用于初始化广播
//
// param : none
//
// return : none
static void advertising_init(void)
{
uint32_t err_code;
ble_advertising_init_t init;
 
memset(&init, 0, sizeof(init));
 
// 广播数据包含所有设备名称(FULL NAME)
init.advdata.name_type = BLE_ADVDATA_FULL_NAME;
// // 广播数据只包含部分设备名称(SHORT NAME,长度为6)
// init.advdata.name_type = BLE_ADVDATA_SHORT_NAME;
// init.advdata.short_name_len = 6;
// 扫描回调数据中包含设备MAC地址
init.srdata.include_ble_device_addr = true;
// 配置广播周期,先快速广播18s(周期40ms),再慢速广播18s(周期100ms),最后停止广播
init.config.ble_adv_fast_enabled = true;
init.config.ble_adv_fast_interval = 64; // 64*0.625 = 40ms
init.config.ble_adv_fast_timeout = 1800; // 1800*10ms = 18s
init.config.ble_adv_slow_enabled = true;
init.config.ble_adv_slow_interval = 160; // 160*0.625 = 100ms
init.config.ble_adv_slow_timeout = 1800; // 1800*10ms = 18s
err_code = ble_advertising_init(&m_advertising, &init);
APP_ERROR_CHECK(err_code);
 
ble_advertising_conn_cfg_tag_set(&m_advertising, APP_BLE_CONN_CFG_TAG);
}
</syntaxhighlight>
 
====== advertising_start()函数 ======
advertising_start()作为我们开启广播功能的函数,我们调用了nordic协议栈中的ble_advertising_start()函数去实现功能。<syntaxhighlight lang="c" line="1" start="71">
//******************************************************************
// fn : advertising_start
//
// brief : 用于开启广播
//
// param : none
//
// return : none
static void advertising_start(void)
{
uint32_t err_code = ble_advertising_start(&m_advertising, BLE_ADV_MODE_FAST);
APP_ERROR_CHECK(err_code);
}
</syntaxhighlight>
==== 实验总结 ====
经过通用扫描实验的学习,我们需要掌握的蓝牙协议有如下几点。
 
主机部分:
 
1.如何配置扫描的参数
 
2.如何发起扫描,并触类旁通,自行了解如何停止(大家自己了解一下,很容易)
 
3.如何获取扫描到的附近的BLE从机设备的信息
 
从机部分:
 
1.如何配置从机的广播数据、以及广播的参数(从机广播部分)
 
2.了解如何设置从机设备的名称(这个是正式项目经常需要使用到的)
 
3.了解如何开启从机广播,并触类旁通,自行了解如何关闭广播(大家自己了解一下,很容易)
=== 过滤扫描实验 ===
==== 实验简介 ====
经过通用扫描实验的学习,大家应该对于蓝牙的扫描和广播有一定的了解了。那么在我们实际的项目使用中,由于我们的附近可能存在的BLE设备太多,导致我们去扫描的时候,没法在第一时间找到我们想要的设备,那么这个时候,我们有没有好的处理方法呢。
 
上面的疑问答案是肯定的,因为我们在扫描的时候,可以先判断一下扫描到的广播数据或者扫描回调数据,这样就可以找到我们的设备。nordic对这部分处理的很细心,
==== 实验现象 ====
510
个编辑

本PDF由谷雨文档中心自动生成,点击下方链接阅读最新内容。

取自“http://doc.iotxx.com/特殊:移动版差异/1751

导航菜单