510
个编辑
更改
→gy_profile_btn.c\.h
|-
|3.2_ble_peripheral_beacon
|基站实验基站(信标)实验
|BEACON格式广播
|-
首先我们还是先看一下服务配置文件,首先还是注册一下服务,注册的服务句柄是p_btn->service_handle。服务注册完成之后,我们注册按键的特征值,可以看到我们分别使能了按键的notify通知属性(add_char_params.char_props.notify = 1;),并且同样使能了read属性(add_char_params.char_props.read = 1;)。
//******************************************************************************
// fn :ble_btn_init
return characteristic_add(p_btn->service_handle, &add_char_params, &p_btn->btn_char_handles);
}
</syntaxhighlight>服务部分剩下的处理流程和上一实验是类型的,只不过上一个实验是处理的wirte属性,而这个实验是处理notify属性。
首先在BLE事件处理的函数中,本来我们应该要处理CCCD_Write的数据的,但是这边我们偷懒了,不去做处理,验证一下主机不发送数据使能notify,我们也可以通过notify发送数据出去。<syntaxhighlight lang="c" line="1" start="31">
//******************************************************************************
// fn :ble_led_on_ble_evt
//
// brief : BLE事件处理函数
//
// param : p_ble_evt -> ble事件
// p_context -> ble事件处理程序的参数(暂时理解应该是不同的功能,注册时所携带的结构体参数)
//
// return : none
void ble_led_on_ble_evt(ble_evt_t const * p_ble_evt, void * p_context)
{
switch (p_ble_evt->header.evt_id)
{
default:
break;
}
}
</syntaxhighlight>下面这个函数,就是我们notify发送数据的函数,他的参数我们只需要配置4个。
type配置为BLE_GATT_HVX_NOTIFICATION,代表是notify属性的数据;
handle我们需要配置为我们按键特征值的value.handle,代表的是按键特征值的Value这个列表的句柄;
剩下的p_data和p_len就是我们需要发送的数据以及数据的长度。<syntaxhighlight lang="c" line="1" start="7">
//******************************************************************************
// fn :ble_lbs_on_button_change
//
// brief : 处理按键按下,状态更新的事件
//
// param : conn_handle -> 连接的句柄
// p_btn -> btn结构体
// button_state -> 按键状态
//
// return : none
uint32_t ble_lbs_on_button_change(uint16_t conn_handle, ble_btn_t * p_btn, uint8_t *button_state)
{
ble_gatts_hvx_params_t params;
uint16_t len = BTN_UUID_CHAR_LEN;
memset(¶ms, 0, sizeof(params));
params.type = BLE_GATT_HVX_NOTIFICATION;
params.handle = p_btn->btn_char_handles.value_handle;
params.p_data = button_state;
params.p_len = &len;
return sd_ble_gatts_hvx(conn_handle, ¶ms);
}
</syntaxhighlight>
=== 基站实验 == gy_serial_btn.c\.h =====按键的外设处理驱动文件,这个详细的说明也是请大家查看基础实验部分的,这里我们只关注一下按键被触发,然后通过notify函数,去向手机发送通知。<syntaxhighlight lang="c" line="1" start="41">//******************************************************************// fn : btn_timeout_handler//// brief : 按键定时器超时任务// // param : p_event -> 指向数据库发现事件的指针//// return : nonestatic void btn_timeout_handler(void * p_context){ uint8_t btnStateBuf[BTN_UUID_CHAR_LEN] = {0}; if(nrf_drv_gpiote_in_is_set(BUTTON_1) == 0) { NRF_LOG_INFO("BTN1"); btnStateBuf[0] = 0x01; btnState = 1; } if(nrf_drv_gpiote_in_is_set(BUTTON_2) == 0) { NRF_LOG_INFO("BTN2"); btnStateBuf[1] = 0x01; btnState = 1; } if(nrf_drv_gpiote_in_is_set(BUTTON_3) == 0) { NRF_LOG_INFO("BTN3"); btnStateBuf[2] = 0x01; btnState = 1; } if(nrf_drv_gpiote_in_is_set(BUTTON_4) == 0) { NRF_LOG_INFO("BTN4"); btnStateBuf[3] = 0x01; btnState = 1; } if(btnState) { ble_lbs_on_button_change(0x0000, &m_btn, btnStateBuf); } btnState = 0;}</syntaxhighlight> ==== main.c ====由于这个例程的按键通知我们是放到了按键驱动文件中处理,所以在main函数当中我们只需要去初始化一下这个服务就可以了。<syntaxhighlight lang="c" line="1" start="194">//******************************************************************// fn : services_init//// brief : 初始化复位(本例程展示NUS:Nordic Uart Service)//// param : none//// return : nonestatic void services_init(void){ uint32_t err_code; err_code = ble_btn_init(&m_btn); APP_ERROR_CHECK(err_code);}</syntaxhighlight> === 基站(信标)实验 ===
==== 实验简介 ====
无线技术中的信标是广播小块信息的概念。 信息可以是任何东西,范围从环境数据(温度,气压,湿度等)到微位置数据(资产跟踪,零售等)或方向数据(加速,旋转等)。
传输的数据通常是静态的,但也可以是动态的并随时间变化。 通过使用蓝牙低功耗,可以将信标设计为在单个纽扣电池上运行多年。 本应用报告介绍了信标的概念以及如何开始实施信标解决方案。 本文档中的命名约定可以概括为使用蓝牙低能耗技术广告来广播信息的信标,该技术可被称为蓝牙低功耗。
==== 实验现象 ====