雷竞技注册
项目

使用nrf51:创建一个ble外设

2015年9月20日经过特拉维斯船用伪造

如何通过创建服务和特性使用NRF51创建自定义BAT GATT外设。

如何通过创建服务和特性使用NRF51创建自定义BLE外设。

概述

这是一系列文章的一部分NRF51.。NRF51是芯片系统,具有Cortex M0和BLE无线电芯片。本文演示了如何通过设置BLE服务和两个特征来创建外设。

上一篇文章:使用NRF51:ARM-GCC构建环境

需求

  • 具有nRF51的设备
  • 构建环境,教程这里
  • 手机应用:北欧的Master Control Panel
    • 本文使用:Android v5.1.1

博格评论

所有预定义的BLE外围设备都具有与其相关的某些属性。例如,所有心率监视器都需要支持包含心率数据的数据字段。这些属性构成了BLE配置文件。这样,不同公司制作的所有设备都可以互操作。配置文件包含定义服务特征。配置文件具有一个或多个服务,每个服务具有一个或多个特征。

服务

服务是一种逻辑分组设备的类似功能或功能。该服务使用uuid或唯一编号定义,允许其他设备访问。服务可以在其中有几个特征。

特征

一个特征是实际数据传输发生的地方。一个特征最长可达20个字节,可以设置为读、写或读/写。当数据发生变化时,还可以设置一个特征来通知。通过这种方式,新数据将立即发送到手机/平板电脑。

软件

custom_ble_peripheral.zip.

该软件由两个源文件组成,依赖SDK软设备实现BLE连接。SDK必须根据北欧SDK许可协议单独下载。如何做到这一点的指导在构建环境的文章中。这个项目的文件夹结构如下所示:

custom_peripheral_service.c.

这个文件有两个功能。其中一个称为custom_service_init,负责启动自定义服务,还有两个特征。第二个是custom_service_update_data,它更新特征中的数据,以便移动设备能够读取数据。在init函数中,使用sd_ble_gatts_service_add函数创建一个UUID为“BLE_UUID_CUSTOM_SERVICE”(定义在“custom_peripheral_service.h”中)的新服务:

/*创建自定义服务*/err_code = sd_ble_gatts_service_add(BLE_GATTS_SRVC_TYPE_PRIMARY, &ble_uuid, &service_handle);if (err_code != NRF_SUCCESS) {return err_code;}

然后,使用UUID“BLE_UUID_CUSTOM_CHAR1”和“BLE_UUID_CUSTOM_CHAR2”创建两个特征,它们都在标题文件中定义。该特性的数据大小设置为定义“Charactist_Size”的最大值为20个字节。

#define ble_uuuid_custom_service 0x1110 #define ble_uuid_custom_char1 0x0001 #define ble_uuid_custom_char2 0x0002 #define特征_size20

要创建一个新的特征,您必须为该特征填充某些属性。其中包括是否可以读写数据、可用的字节数以及是否可以提供通知。在下面的代码中,通过修改“ble_gatts_char_md_t”变量中的参数“write_wo_respp”和“write”,将CHAR1设置为可写的。通过指向属性“p_value”中的变量“initial_char_values”,数据被初始化为数字0-19。

/ * char1将用于写作* / memset(&char_md,0,sizeof(char_md));char_md.char_props.write_wo_rep = 1;char_md.char_props.write = 1;char_md.p_char_user_desc = null;char_md.p_char_pf = null;char_md.p_user_desc_md = null;char_md.p_cccd_md = null;char_md.p_sccd_md = null;ble_uuid_ble_assign(ble_uuid,ble_uuid_custom_char1);Memset(attr_md,0,sizef(attr_md)); BLE_GAP_CONN_SEC_MODE_SET_OPEN(&dis_attr_md.read_perm); BLE_GAP_CONN_SEC_MODE_SET_OPEN(&dis_attr_md.write_perm); attr_md.read_perm = dis_attr_md.read_perm; attr_md.write_perm = dis_attr_md.write_perm; attr_md.vloc = BLE_GATTS_VLOC_STACK; attr_md.rd_auth = 0; attr_md.wr_auth = 0; attr_md.vlen = 0; memset(&attr_char_value, 0, sizeof(attr_char_value)); attr_char_value.p_uuid = &ble_uuid; attr_char_value.p_attr_md = &attr_md; attr_char_value.init_len = CHARACTERISTIC_SIZE; attr_char_value.init_offs = 0; attr_char_value.max_len = CHARACTERISTIC_SIZE; attr_char_value.p_value = initial_char_values; err_code = sd_ble_gatts_characteristic_add(service_handle, &char_md, &attr_char_value, &char1_handles); if (err_code != NRF_SUCCESS) { return err_code; }

对于CHAR2也是如此,除了写属性没有设置为1。相反,通过下面这行,read属性被设置为1:

char_md.char_props。阅读= 1;

功能custom_service_update_data使用softdevice函数sd_ble_gatts_value_set.为了更新移动设备可以读取的数据。

uint32_t custom_service_update_data(uint16_t conn_handle,uint8_t *new_data) {uint32_t err_code = NRF_SUCCESS;ble_gatts_value_t gatts_value;memset (&gatts_value 0 sizeof (gatts_value));gatts_value。len = CHARACTERISTIC_SIZE;gatts_value。抵消= 0;gatts_value。p_value = new_data;if(conn_handle!=BLE_CONN_HANDLE_INVALID) {err_code = sd_ble_gatts_value_set(conn_handle, char2_handles. conf);value_handle &gatts_value);}返回err_code; }

main.c

主应用程序设置一个UART调试终端,在软设备中启动BLE堆栈,并在连接期间写入特征。如果手机/平板电脑写入CHAR1,则在调试控制台中显示。

ble_stack_init.

此函数初始化SoftDevice并启用BLE。

gap_params_init.

GAP参数包括设备名称和连接间隔等。连接间隔是指移动设备和外设通信的速度。更快的连接允许更多的数据吞吐量和更低的延迟,但以功耗为代价。

advertising_init.

当外设希望被移动设备找到时,它就会做广告。该功能设置了设备多长时间发布一次广告,以及如果没有连接,多久可以放弃广告。这个例子从不超时。

services_init.

服务已启动。通过调用在此示例中仅在此示例中启动自定义服务custom_service_init.

ble_advertising_start.

在设备开始广告之前,实际上没有任何内容。在它广告之前,移动设备将无法找到外围设备。

应用程序的其余部分只是一个无限循环,用于更新CHAR2中的数据。使用该功能可以节省电力sd_app_evt_wait,但数据更新必须转移到某种背景计时器。此功能睡眠设备,直到发生事件。

虽然(1){nrf_delay_ms(1000);for(i = 0; i 

建造

通过键入构建应用程序制作在控制台。通过键入闪存设备闪光。假设您已经将S110软设备上传到设备。

制作

闪光

终端输出

编程后,在连接到北欧移动应用程序并编写一些数据时,您应该在终端上看到以下内容。所采取的步骤是:

  1. 开放北欧应用
  2. 打开“扫描仪”
  3. 找到设备“自定义ble”
  4. 单击“连接”
  5. 单击“未知服务”
  6. 点击“未知特性”旁边的向上箭头。
  7. 现在您可以使用“New value”和“Add value”来输入数据。

结论

接下来的系列将是如何创建Android应用程序来读写特征数据。然后,使用该文章的Android应用程序和知识作为模板,我们可以创建应用程序来控制其他设备并读取传感器数据!

下一篇文章串联:FREERTOS介绍NRF51

为自己提供这个项目!得到bom。

1条评论