本篇博文最后修改时间:2017年01月06日,11:06。
一、简介
本文以SimpleBLECentral工程和SimpleBLEPeripheral工程为例,介绍CC2541作为主机时是如何获取从机char4通道的notify数据。
二、实验平台
协议栈版本:BLE-CC254x-1.4.0
编译软件:IAR 8.20.2
硬件平台:Smart RF开发板(主芯片CC2541)*2
三、版权声明
博主:甜甜的大香瓜
声明:喝水不忘挖井人,转载请注明出处。
原文地址:http://blog.csdn.NET/feilusia
联系方式:[email protected]
香瓜BLE之CC2541群:127442605
香瓜BLE之CC2640群:557278427
香瓜BLE之Android群:541462902
五、基础知识
暂无
六、实验步骤
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数据。
因此,实验成功。