ble 开发流程
BLE开发流程
本文档主要以让客户可以快速开发为目的,所以一些ble相关的专业名词含义只做简答介绍,以应用为主,详细的含义可以百度即可。客户可在文档下留言,会动态对文档进行改动。

图1.1
profile可用该工具生成,具体使用可参考文件下的工具说明。如图1.1。
图1.2
图1.3
运行工具后会生成一个gatt_profile_cfg.h文件,打开文件,复制对应的profile加入到le_smartbox_module.h中,如图1.2所示。并把生成的handle加入到le_smartbox_module.h中。le_smartbox_module.c和le_smartbox_module.h是与app通讯默认的文件,如果是其他模式,需要加入到对应模式下的头文件下的profile数组里。
- ble初始化 void ble_profile_init (void)

图2.1
如图2.1,该函数主要是配置了加密参数,注册各类回调函数的功能,用户一般无需修改。修改的参数主要是加密参数,详情请参考第7点。
- 广播包

图3.1
图3.2
BLE的广播包主要由2个包组成,adv包和 包,每个包31Byte。sdk中的广播包在le_smartbox_adv.c,如图3.1,主要是适配我们app的rcsp协议,如果用户不用,可自行修改。修改的方式可以直接对字节进行赋值,也可调用make_eir_packet_data函数进行修改,该函数使用方法可参考图3.1中名字类型的添加即可。
如图3.2,是我们用nrf软件看到的ble广播包,我们可以看到前面31B是adv,后面的是rsp,都可以与代码中的一一对应。
4. mac地址 
图4.1
ble的mac地址在sdk中有两种方式生成,我们看图4.1中的代码,如果开了一键连接,就会调用memcpy直接将edr的mac地址复制给ble,如果没开一键连接,就会调用lib_make_ble_address在edr的mac地址的基础上随机生成ble的mac地址。如果客户想修改成自己的方式,就可以在图中的地方修改tmp_ble_addr数组的值,最后调用le_controller_set_mac函数设置即可。
5. ble蓝牙名 
图5.1
sdk中默认使用edr的名字做ble的名字,ble名字的修改可在广播包中修改,修改方式如图5.1。
6. 广播间隔 
图6.1
sdk中支持客户自定义广播类型、间隔、信道,修改方法可参考图6.1.直接修改传入的参数即可。值得注意的是,广播间隔和功耗息息相关,越小功耗越大。
7. 连接参数 
图7.1
连接参数是ble通讯中很重要的一个参数,它决定着通讯的频率以及数据发送速率。sdk中,待机时会使用第一个数组中的连接参数,但如果app需要传输文件或者ota时就要通过图7.1中的函数,切换成第二个数组中的连接参数了,需要提高通讯频率,更快传输。当然,不同手机支持的连接参数不一定相同,固件端请求的连接参数,手机端也不一定支持,一般由手机端来决定连接参数的值。
如果客户不想用sdk中默认的连接参数,想更新自己的连接参数,可参考图7.2的改法。
图7.2
修改成功后,会有cbk_packet_handler函数中,有HCI_SUBEVENT_LE_CONNECTION_UPDATE_COMPLETE事件返回,可以在此处看到连接参数是否更新成功,如图7.3所示。
图7.3
8. smp蓝牙加密配对 配对流程这里就只做简单介绍,详情可参考 HYPERLINK "https://blog.csdn.net/feelinghappy/article/details/110286696" https://blog.csdn.net/feelinghappy/article/details/110286696
void ble_sm_setup_init( io_capability_t io_type, u8 auth_req, uint8_t min_key_size, u8 security_en)
该函数的功能为配置ble的加密配对参数。
第一个参数io_type,含义是io能力,指的是设备的输入输出能力

第二个参数 auth_req,含义是鉴权等级
第三个参数 min_key_size,为最小加密字节的数
第四个参数 security_en,为是否由底层发起配对请求,传0不发起,传1发起。
简而言之,该函数的功能其实就是配置了手表端在建立ble连接时交换的配对信息。在我们sdk中,ble默认是只连接不配对,即ble连接时,不会弹出配对窗口。ios会有配对窗口弹出是因为会自动搜索ancs服务并连接,会在底层自动发起配对。
下面简单介绍几种可能会用到的配对情况的改法:
不配对(即ble连接时不弹配对窗口)

该宏配置为0,或者profile中在characteristic中不要添加AUTHENTICATION_REQUIRED属性,就不会有配对窗口弹出了。ios还需要把ancs功能关掉。

配对 如果不把ancs使能关闭,ios会自动配对,安卓则需要在将SMART_TCFG_BLE_SECURITY_EN置1即可。
ble数据读写

图9.1
这里指的数据读写,是指client端(主机端)对server端(从机端)的操作,即图9.1中定义的具有READ、WRITE、WRITE_WITHOUT_RESPONSE属性的characterristic。可以将工具生成的handle(即图9.1中下部分的value_handle)放在att_read_callback或者att_wirte_callback函数中,具有read属性的就放在att_read_callback中,具有write属性就放在att_write_callback函数中,就可以用ble测试软件进行测试了。
图9.2
下面是测试分析:

图9.3
图9.4
可以参考图9.2在对应的handle下添加打印,我们可以看到。
在图9.3中,当我们用ble测试软件,选择具有read属性的character时,点击软件中read again时,我们可以通过将自己想让手机端读取到的值复制给buffer,就可以在手机端读取到相应的16进制的值;
同理在图9.4中,当我们用ble测试软件,选择具有write属性或wirte_without_response属性的character时,点击软件中write new value时,我们可以输入想让小机端能读取到的值,就可以在对应的handle回调中,看到传过来的值,如图9.4中,我在手机上输入了2,在该回调中打印出来的就是2。
10. ble数据发送 
图10.1
如图10.1,当我们声明一个具有NOTIFY或INDICATE属性的CHARACTERISITIC时,工具会默认生成其对应的端特征配置Client Characteristic Configuration(简称CCC)数据,所以不用额外添加CCC配置。代码中体现为两个handle。一个handle是图中上半部分带有CLIENT_CONFIGURATION的handle,此handle的主要用处就是可以放在att_write_callback回调中,动态设置该特征发送数据的使能。另一个handle则是下半部分,此handle可用于发送数据时的传参,ble发送数据可参考图10.1中下部分的代码,函数的参数含义依次为:对应的handle、数组、数组长度、ATT类型。
下面是测试分析:
图10.2
图10.3
在图10.2中我们可以看到,当在LightBlue中按下Listen for notifications时,此时会有图10.1中的打印回调,此时代表手机(client端)那边发个消息过来告诉手表(server端),可以发消息给我了,于是手表这边会做个使能特征通道的操作。只有将该CCC配置为1,并且client端开启了监听,client端才能接收到数据。
在图10.3中,我们做了个简单的测试代码,按键发送"111"值给手机,我们可以在LightBlue上看到我们发送过去的值。
11. ble常用事件说明
11.1HCI_SUBEVENT_LE_CONNECTION_COMPLETE
连接完成事件
11.2HCI_SUBEVENT_LE_CONNECTION_UPDATE_COMPLETE
连接参数更新完成事件
11.3HCI_EVENT_DISCONNECTION_COMPLETE
断开连接
11.4L2CAP_EVENT_CONNECTION_PARAMETER_UPDATE_RESPONSE
连接参数更新远端的回应
11.5HCI_EVENT_ENCRYPTION_CHANGE
配对加密事件
11.6ATT_EVENT_MTU_EXCHANGE_COMPLETE
MTU交换完成
- 常见问题解答