【无接触的人脸识别门禁系统】+ 5-EFR32BG22蓝牙主机的创建
[复制链接]
EFR32BG22是silicon公司的蓝牙芯片,能实现BLE的主机和从机功能。内部包含一个cortex-M33内核。
使用EFR32BG22需要使用其配套的IDE,"simplicity studio"。这个IDE用起来也挺方便的,当把开发板接上电脑的时候,会自动识别出芯片型号。
点击"start"按键,能够进入对应芯片的界面,通过选择相应的例子,就能够很快的开始一个项目的开发,这点还是挺便捷的。这里选择了BLE的client的一个例程。
在这个例程中发现,BLE的协议栈也是事件驱动的,貌似类似的协议栈都是事件驱动的方式构成的。源代码主要集中在 'app.c' 和 'main.c' 中。
一、 main.c :
int main(void)
{
// Initialize Silicon Labs device, system, service(s) and protocol stack(s).
// Note that if the kernel is present, processing task(s) will be created by this call.
sl_system_init();
// Initialize the application. For example, create periodic timer(s) or task(s) if the kernel is present.
app_init();
while (1) {
// Do not remove this call: Silicon Labs components process action routine must be called from the super loop.
sl_system_process_action();
// Application process.
app_process_action();
// Let the CPU go to sleep if the system allows it.
sl_power_manager_sleep();
}
}
用户如果想添加自己的代码,可以选择在 app_init() 和 app_process_action() 中添加。
二、 app.c
这文件里主要关注的是事件处理函数。整个蓝牙的事件处理函数在'app.c'中,函数名是 void sl_bt_on_event(sl_bt_msg_t* evt) 。
如果作为BLE的客户端,那么需要扫描设备、连接设备、发现服务以及特性,还需要处理BLE服务端的notify事件、对服务端的特性进行读写操作。
因此主要用到的事件如下:
- 事件
sl_bt_evt_scanner_scan_report_id ,这个事件表明扫描到了设备,需要在这个事件中判断扫描到的设备是否为需要连接的,可以通过地址或者名字判断设备,如果设备是需要连接的那个,那么就要执行停止扫描函数,并建立连接
- 事件
sl_bt_evt_connection_opened_id ,表明已经建立一个连接,需要在这个事件里调用发现服务的函数
- 事件
sl_bt_evt_gatt_service_id ,表明发现了服务
- 事件
sl_bt_evt_gatt_characteristic_id ,表明发现了特性,在这个事件里需要判断特性是否为我们要操作的特性,需要根据UUID判断
- 事件
sl_bt_evt_gatt_procedure_completed_id ,这个事件比较杂,是某个行为完成的一个事件,这个行为可能是服务扫描完成,也可能是特性扫描完成。当服务扫描完成后,需要开始扫描对应的特性
- 事件
sl_bt_evt_gatt_characteristic_value_id ,表明收到了服务端的某个特性的通知
还有特性的读写函数:
// 读函数
sl_status_t sl_bt_gatt_read_characteristic_value(uint8_t connection,
uint16_t characteristic);
// 写函数
sl_status_t sl_bt_gatt_write_characteristic_value(uint8_t connection,
uint16_t characteristic,
size_t value_len,
const uint8_t* value);
读写函数有好多种,这里只列举了用到的函数。
三、总结
至此就基本完成BLE客户端的代码编写了,实现了连接服务端,找到需要的特性进行读写,同时能够接收到服务端主动发送的notify。接下来就需要操作一下EFR32BG22上的外设了。
|