一、简介
本篇以SimpleBLECentral工程和SimpleBLEPeripheral工程为例,介绍CC2541作为主机时是如何获取从机char4通道的notify数据。
二、实验平台
协议栈版本:BLE-CC254x-1.4.0
编译软件:IAR 8.20.2
硬件平台:Smart RF开发板*2
三、版权声明
博主:甜甜的大香瓜
声明:喝水不忘挖井人,转载请注明出处。
原文地址:http://blog.csdn.net/feilusia
联系方式:[email protected]
技术交流QQ群:127442605
四、相关博文
阅读本文前,请先阅读本博客的两篇博文:
1)《CC2541之notify通知》:http://blog.csdn.net/feilusia/article/details/47020073
2)《CC2541之indicate指示》:http://blog.csdn.net/feilusia/article/details/48917625
五、代码修改
1、添加宏定义(SimpleBLECentral.c中)
//GUA #define GATT_CLIENT_CFG_NOTIFY 0x0001 //打开notify开关的数值 #define GATT_CLIENT_CFG_INDICATE 0x0002 //打开indicate开关的数值 #define GUA_CHAR4_Hdl 0x2E //char4的句柄 #define GUA_CHAR4_CCC_Hdl 0x2F //char4的CCC的句柄 //GUA
if ( keys & HAL_KEY_UP ) { // Start or stop discovery if ( simpleBLEState != BLE_STATE_CONNECTED ) { if ( !simpleBLEScanning ) { simpleBLEScanning = TRUE; simpleBLEScanRes = 0; LCD_WRITE_STRING( "Discovering...", HAL_LCD_LINE_1 ); LCD_WRITE_STRING( "", HAL_LCD_LINE_2 ); GAPCentralRole_StartDiscovery( DEFAULT_DISCOVERY_MODE, DEFAULT_DISCOVERY_ACTIVE_SCAN, DEFAULT_DISCOVERY_WHITE_LIST ); } else { GAPCentralRole_CancelDiscovery(); } } else if ( simpleBLEState == BLE_STATE_CONNECTED && simpleBLECharHdl != 0 && simpleBLEProcedureInProgress == FALSE ) { //香瓜 //开启notify的CCC attWriteReq_t req; req.handle = GUA_CHAR4_CCC_Hdl; //char4的CCC的特征值句柄,这里写死0x2F,可通过btool获取到 req.len = 2; req.value[0] = LO_UINT16(GATT_CLIENT_CFG_NOTIFY); //0x0001为开notify req.value[1] = HI_UINT16(GATT_CLIENT_CFG_NOTIFY); req.sig = 0; req.cmd = 0; GATT_WriteCharValue( 0, &req, simpleBLETaskId ); /* uint8 status; // Do a read or write as long as no other read or write is in progress if ( simpleBLEDoWrite ) { // Do a write attWriteReq_t req; req.handle = simpleBLECharHdl; req.len = 1; req.value[0] = simpleBLECharVal; req.sig = 0; req.cmd = 0; status = GATT_WriteCharValue( simpleBLEConnHandle, &req, simpleBLETaskId ); } else { // Do a read attReadReq_t req; req.handle = simpleBLECharHdl; status = GATT_ReadCharValue( simpleBLEConnHandle, &req, simpleBLETaskId ); } if ( status == SUCCESS ) { simpleBLEProcedureInProgress = TRUE; simpleBLEDoWrite = !simpleBLEDoWrite; }*/ //香瓜 } }
用“//香瓜”包含起来的部分为主要修改部分。也就是在连接时,按UP键能打开char4的notify开关。
3、添加接收通知数据的处理部分代码(SimpleBLECentral.c的simpleBLECentralProcessGATTMsg函数末尾)
//香瓜 else if ( ( pMsg->method == ATT_HANDLE_VALUE_NOTI ) ) //通知 { if( pMsg->msg.handleValueNoti.handle == GUA_CHAR4_Hdl) //CHAR6的通知 串口打印 { char str[32] = {0}; osal_memcpy(str, pMsg->msg.handleValueNoti.value, pMsg->msg.handleValueNoti.len ); } } //香瓜
在连接状态时,按UP键会打开char4的notify开关。在5S内会接收到来自从机的1个字节数据(0x03)。
设置断点在如下图的地方,可以在代码中查看到结果:
因此,主机成功地读取到了从机的notify数据。