更改

跳转至: 导航搜索

NRF52832DK协议栈实验

添加7,127字节2019年7月10日 (三) 17:39
实验现象
==== 实验现象 ====
主机部分,先打印实验名称1.5_ble_central_conn_all5_ble_central_conn_all,然后开始扫描周围的从机设备。当我们将两块开发板靠近的时候(当RSSI大于-30dBm),则会发起连接。然后打印连接成功的消息,并且打印连接参数。
然开始扫描周围的设备后r{{Note|text=Connected. conn_DevAddr: 0xD363BFCE5C46 // 连接的对方设备MAC地址  conn_handle: 0x0000 // 连接的句柄,第一个连接的设备是0x0000,第二个是0x0001,以此类推 conn_Param: 24,24,0,400 // 连接参数|type=tips}} [[文件:Nrf rtt 15.png|边框|居中|无框|656x656像素]]从机部分,先打印实验名称2.5_ble_peripheral_conn_all,当被主机成功连接之后,会打印连接成功的消息;当断开连接之后,会打印断开连接的句柄,并且会打印断开连接的原因。{{Note|text=Connected. conn_DevAddr: 0xE51F64D6BFF4 // 连接的对方设备的MAC Connected. conn_handle: 0x0000 // 连接的句柄 Connected. conn_Param: 24,24,0,400 // 连接参数  Disconnected. conn_handle: 0x0, reason: 0x0008 // 断开连接的设备句柄,以及断开的原因|type=tips}}[[文件:Nrf rtt 25.png|边框|居中|无框|656x656像素]]
==== 工程及源码讲解 ====
 
===== 主机部分 =====
 
====== 工程说明 ======
通用连接主机工程,是在通用扫描主机工程的基础上,新增了连接的过程,主要的修改集中在扫描事件处理函数,以及ble协议栈事件处理函数。
 
====== scan_evt_handler()函数 ======
我们可以看到,在扫描回调事件处理的函数中,前面一部分还是和之前一样的,就是获取扫描到的从机设备的信息。
 
在159行,我们对扫描到的从机设备的RSSI进行了判断,我们人为定义,当设备的RSSI大于-30dBm的时候,也就是信号强度非常好,我们就默认连接该设备。
 
首先,我们先定义准备连接的从机设备的地址和信息,配置m_addr.addr_type为BLE_GAP_ADDR_TYPE_RANDOM_STATIC,配置m_addr.addr为扫描到的设备地址p_scan_evt->params.p_not_found->peer_addr.addr。
 
配置好准备连接的设备的MAC信息,在发起连接之前,我们一定要先调用nrf_ble_scan_stop()函数去停止扫描,不然会出错。
 
停止扫描之后,我们调用sd_ble_gap_connect()函数,发起对从机设备的连接。<syntaxhighlight lang="c" line="1" start="107">
//******************************************************************
// fn : scan_evt_handler
//
// brief : 处理扫描回调事件
//
// param : scan_evt_t 扫描事件结构体
//
// return : none
static void scan_evt_handler(scan_evt_t const * p_scan_evt)
{
switch(p_scan_evt->scan_evt_id)
{
// 未过滤的扫描数据
case NRF_BLE_SCAN_EVT_NOT_FOUND:
{
// 判断是否为扫描回调数据
if(p_scan_evt->params.p_not_found->type.scan_response)
{
if(p_scan_evt->params.p_not_found->data.len) // 存在扫描回调数据
{
NRF_LOG_INFO("scan data: %s",
Util_convertHex2Str(
p_scan_evt->params.p_not_found->data.p_data,
p_scan_evt->params.p_not_found->data.len));
}
else
{
NRF_LOG_INFO("scan data: %s","NONE");
}
NRF_LOG_INFO("rssi: %ddBm",p_scan_evt->params.p_not_found->rssi);
}
else // 否则为广播数据
{
// 打印扫描的设备MAC
NRF_LOG_INFO("Device MAC: %s",
Util_convertBdAddr2Str((uint8_t*)p_scan_evt->params.p_not_found->peer_addr.addr));
if(p_scan_evt->params.p_not_found->data.len) // 存在广播数据
{
NRF_LOG_INFO("adv data: %s",
Util_convertHex2Str(
p_scan_evt->params.p_not_found->data.p_data,
p_scan_evt->params.p_not_found->data.len));
}
else
{
NRF_LOG_INFO("adv data: %s","NONE");
}
}
// 如果扫描到的设备信号强度大于-30dBm
if(p_scan_evt->params.p_not_found->rssi > (-30))
{
ret_code_t err_code;
// 配置准备连接的设备MAC
ble_gap_addr_t m_addr;
m_addr.addr_id_peer = 1;
m_addr.addr_type = BLE_GAP_ADDR_TYPE_RANDOM_STATIC;
memcpy(m_addr.addr,p_scan_evt->params.p_not_found->peer_addr.addr,BLE_GAP_ADDR_LEN);
// 停止扫描
nrf_ble_scan_stop();
// 发起连接
err_code = sd_ble_gap_connect(&m_addr,&m_scan_params,&m_conn_params,APP_BLE_CONN_CFG_TAG);
APP_ERROR_CHECK(err_code);
}
} break;
 
default:
break;
}
}
</syntaxhighlight>
 
====== ble_evt_handler()函数 ======
当我们的主机设备进行连接,或者断开连接的时候,BLE的事件回调中,都会给我们状态事件提示。
 
连接成功的状态BLE_GAP_EVT_CONNECTED,我们可以在这边获取到连接的设备的MAC、连接参数等等。
 
断开连接的状态BLE_GAP_EVT_DISCONNECTED,我们可以获取到断开的连接的原因等等。<syntaxhighlight lang="c" line="1" start="210">
//******************************************************************
// fn : ble_evt_handler
//
// brief : BLE事件回调
// details : 包含以下几种事件类型:COMMON、GAP、GATT Client、GATT Server、L2CAP
//
// param : ble_evt_t 事件类型
// p_context 未使用
//
// return : none
static void ble_evt_handler(ble_evt_t const * p_ble_evt, void * p_context)
{
ble_gap_evt_t const * p_gap_evt = &p_ble_evt->evt.gap_evt;
ble_gap_evt_connected_t const * p_connected_evt = &p_gap_evt->params.connected;
switch (p_ble_evt->header.evt_id)
{
// 连接
case BLE_GAP_EVT_CONNECTED:
NRF_LOG_INFO("Connected. conn_DevAddr: %s\nConnected. conn_handle: 0x%04x\nConnected. conn_Param: %d,%d,%d,%d",
Util_convertBdAddr2Str((uint8_t*)p_connected_evt->peer_addr.addr),
p_gap_evt->conn_handle,
p_connected_evt->conn_params.min_conn_interval,
p_connected_evt->conn_params.max_conn_interval,
p_connected_evt->conn_params.slave_latency,
p_connected_evt->conn_params.conn_sup_timeout
);
break;
// 断开连接
case BLE_GAP_EVT_DISCONNECTED:
NRF_LOG_INFO("Disconnected. conn_handle: 0x%x, reason: 0x%04x",
p_gap_evt->conn_handle,
p_gap_evt->params.disconnected.reason);
// 如果需要异常断开重连,可以打开下面的注释
// scan_start(); // 重新开始扫描
break;
 
default:
break;
}
}
</syntaxhighlight>
 
===== 从机部分 =====
 
====== 工程说明 ======
通用连接的从机工程,是在通用广播的从机工程的基础上修改的。
==== 实验总结 ====
510
个编辑

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

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

导航菜单