手把手教你:BLE如何发送消息给手机APP
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默认开启通知
夜雨聆风