打开主菜单

谷雨文档中心 β

更改

NRF52832DK协议栈实验

添加3,185字节2020年1月9日 (四) 15:40
实验现象
3、发现服务,成功发现Ghostyu LED Service
4、主机分别按下4个按键,控制从机设备的4个LED依次点亮4、主机分别按下4个按键,给从机发送数据控制从机设备的4个LED依次点亮,并且同时从从机读取我们刚刚发送的数据
[[文件:Nrf52832dk-ble-gattwirte2.png|边框|居中|无框|680x680像素]]从机设备流程:
</syntaxhighlight>看完初始化函数,我们接下来得看下当我们注册好客服端,并且在main函数中调用发现函数之后,底层如何给我们返回,这里我们需要结合main.c文件的内容一起给大家介绍。
在mian函数的中,我们可以看到注册了服务发现的功能,也就是数据库发现db_discovery_init();,并且注册了GATT初始化gatt_init();,以及我们的LED服务的客户端初始化led_c_init();。<syntaxhighlight lang="c" line="1" start="526527">
//******************************************************************
// fn : main
break;
}
ble_led_led_status_sendble_led_status_send(&m_ble_led_c,buf,LED_UUID_CHAR_LEN); // 发送Wirte属性数据包 ble_led_status_read(&m_ble_led_c); // 发送Read属性的读取消息
}
</syntaxhighlight>最后我们来分析一下这个发送函数,是如何使用我们刚刚一大圈代码处理,最终得到的connhandle以及handle_value的。
return sd_ble_gattc_write(p_ble_led_c->conn_handle, &write_params);
}
</syntaxhighlight>上面一部分已经将我们的write属性的使用都讲解完了,最后我们再来看下Read属性部分的内容。
 
首先是我们还是在main文件的按键回调函数中调用的ble_led_status_read(&m_ble_led_c);函数,去读取从机特征值中的数据的,这里我们直接分析一下这个函数。
 
可以看到函数内容很简单,只调用了一个sd_ble_gattc_read函数去读取,包含的参数内容分别是我们的connhandle以及handle_value。<syntaxhighlight lang="c" line="1" start="209">
//******************************************************************************
// fn :ble_led_status_read
//
// brief : 读取LED特征值
//
// param : p_ble_led_c -> 指向要关联的LED结构实例的指针
//
// return : none
uint32_t ble_led_status_read(ble_led_c_t * p_ble_led_c)
{
VERIFY_PARAM_NOT_NULL(p_ble_led_c);
return sd_ble_gattc_read(p_ble_led_c->conn_handle,p_ble_led_c->peer_led_db.led_handle,0);
}
</syntaxhighlight>当我们成功Read之后,底层的sotfdevice会通过ble_led_c_on_ble_evt函数给我们返回BLE_GATTC_EVT_READ_RSP事件。<syntaxhighlight lang="c" line="1" start="140">
//******************************************************************************
// fn :ble_led_c_on_ble_evt
//
// brief : BLE事件处理函数
//
// param : p_ble_evt -> ble事件
// p_context -> ble事件处理程序的参数(暂时理解应该是不同的功能,注册时所携带的结构体参数)
//
// return : none
void ble_led_c_on_ble_evt(ble_evt_t const * p_ble_evt, void * p_context)
{
if ((p_context == NULL) || (p_ble_evt == NULL))
{
return;
}
 
ble_led_c_t * p_ble_led_c = (ble_led_c_t *)p_context;
 
switch (p_ble_evt->header.evt_id)
{
case BLE_GAP_EVT_DISCONNECTED:
on_disconnected(p_ble_led_c, p_ble_evt);
break;
case BLE_GATTC_EVT_READ_RSP:
on_read(p_ble_led_c, p_ble_evt);
break;
default:
break;
}
}
</syntaxhighlight>在BLE_GATTC_EVT_READ_RSP事件中,我们调用on_read函数去处理我们读取的值,我们将读取到的值,通过RTT LOG打印出来。<syntaxhighlight lang="c" line="1" start="32">
//******************************************************************************
// fn :on_read
//
// brief : 处理read事件的函数。
//
// param : p_ble_led_c -> led服务结构体
// p_ble_evt -> ble事件
//
// return : none
static void on_read(ble_led_c_t * p_ble_led_c, ble_evt_t const * p_ble_evt)
{
if (p_ble_led_c->conn_handle == p_ble_evt->evt.gap_evt.conn_handle)
{
NRF_LOG_INFO("Recive State:%02X,%02X,%02X,%02X",
p_ble_evt->evt.gattc_evt.params.read_rsp.data[0],
p_ble_evt->evt.gattc_evt.params.read_rsp.data[1],
p_ble_evt->evt.gattc_evt.params.read_rsp.data[2],
p_ble_evt->evt.gattc_evt.params.read_rsp.data[3]);
}
}
</syntaxhighlight>
510
个编辑