乐于分享
好东西不私藏

手把手教你:BLE如何发送消息给手机APP

手把手教你:BLE如何发送消息给手机APP

一、前言  
本篇开始讲解ble从机如何发消息给到主机(APP)
二、阅读说明
1、泰凌微芯片学习者,前期使用过该芯片。
2、能够知道怎么进行创建工程,下载代码。
3、有一块开发板,板上的芯片可以是8251,8253或者8258。
4、需使用蓝牙抓包工具52840 Sniffer和协议分析软件Wireshark
三、正文
1、使用的SDK
如何使用TLSR8258芯片进行蓝牙广播
使用的SDK为该篇文章描述的
2、代码编写
voidsend_battery_value_to_app(){    static unsigned int clock_cnt = 0;    static unsigned char value = 0;    if(clock_time_exceed(clock_cnt, 1000000)){        clock_cnt = clock_time();        value++;        blc_gatt_pushHandleValueNotify (BLS_CONN_HANDLE, BATT_LEVEL_INPUT_DP_H, (u8 *)&value, 1);    }}
代码解释:
  • 函数功能为一秒钟增加一次value的值,然后发送给主机(手机APP)
  • blc_gatt_pushHandleValueNotify为发送通知的api,将value的值发送给主机app

备注:send_battery_value_to_app()函数需要放入主函数里面,不然无法发出数据

3、blc_gatt_pushHandleValueNotify函数详细解释

/** * @brief      This function is used to notify a client of the value of a Characteristic Value from a server. * @param[in]  connHandle -  connection handle * @param[in]  attHandle  -  attribute handle. * @param[in]  p -  data buffer pointer * @param[in]  len - data byte number * @return     Status - 0x00: command succeeded; 0x01-0xFF: command failed */ble_sts_t   blc_gatt_pushHandleValueNotify  (u16 connHandle, u16 attHandle, u8 *p, int len);
  • connHandle:连接句柄,如下说明

/** * @brief   LE connection handle for slave & master role *          Telink single connection SDK support only one ACL Slave or only one Master connection, *          We use constant connection handle value for them in controller to simplify design and development, *          so user can use these two connection handle directly. *          attention: If using Telink multiple connection SDK, connection handle must be managed dynamically !!! */#define         BLM_CONN_HANDLE                                 0x0080  //ACL Master connection handle#define         BLS_CONN_HANDLE                                 0x0040  //ACL Slave connection handle
  • attHandle:属性句柄,我们这里要填写的是my_batVal属性的句柄,如何查找my_batVal的句柄,请看4小节

  • p:数据指针,也就是我们需要传入数据的指针

  • len:数据的长度

4、my_batVal的句柄

如上图所示,我们需要知道红框里面的句柄值,通过查看该特征属性值的特征声明就可以知道红框里面的句柄为多少,那么特征属性值的特征声明在哪里呢,如下图所示

此时需要查找my_batCharVal数组里面句柄值,如下图所示

由上图可以看到句柄值为BATT_LEVEL_INPUT_DP_H,如果对这个数组的结构定义有疑问的话,请看我的这篇文章手把手教你:BLE特征声明与特征值代码抓包全解析

备注:该特征的值支持读和通知,读的意思是允许主机读取我的数值,通知的意思是我可以通过通知的方式将数据发送给主机,不需要主机的回复,参见第2小节,我使用的是通知。

5、手机上使用nRF Connect工具进行查看通知数据的值

5.1、查找vSample广播包,并点击CONNECT

5.2、查看服务列表,点开Battery Service,查看Battery Level的值

备注:APP不用使能通知,泰凌微SDK默认开启通知

四、结尾
本篇介绍了如何发送通知消息,下一篇介绍通知的协议结构以及抓包消息。