attHandleValueNoti_t pReport;
pReport.handle=0x2e;
pReport.len = 1 ;
pReport.value[0]='f';
GATT_Notification(0, &pReport, FALSE );
上面函数中,为什么pReport.handle要等于0x2e?还有GATT_Notification(0, &pReport, FALSE )中第一个参数为什么是0?求解!!!
Jeffrey Lee:
这个handle的值也是我在纠结的问题,如果楼主知道了请不吝回复。
GATT_Notification的第一个参数是connHandle,也就是蓝牙连接的handle,因为比如BLEcentral的话可以连接多个Periphral,所以可能连接数不止一个。0的话就是第一个连接了。具体的handle如何确定请看http://www.deyisupport.com/question_answer/wireless_connectivity/f/45/t/23478.aspx
Yan:
dengchenguang,
能说明一下是在哪个工程里的代码吗?我记得TI提供的标准协议栈里面应该没有这些代码。
这个handle是特征值attribute在系统中被指定的句柄值。在cc254x代码中由服务注册的时候底层系统自动分配的。像这样在代码里面直接十六进制写出来,一般都是之前代码做过测试,通过远端,比如BTool通过服务查找功能知道句柄后,然后在代码里写死来完成一些特定功能吧。
guobao wang:
回复 Yan:
是淘宝卖家ghostyu的代码,代码如附件所示,截图如下:
uint8 len;if(length > 20)len = 20;elselen = length;static attHandleValueNoti_t pReport;pReport.handle=0x2e;//char4pReport.len = len;osal_memcpy(pReport.value, pBuffer, len);GATT_Notification( 0, &pReport, FALSE );
下面是simpleGATTprofile.c里的代码,我也不明白
static bStatus_t simpleProfile_WriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr,uint8 *pValue, uint8 len, uint16 offset ){bStatus_t status = SUCCESS;uint8 notifyApp = 0xFF;// If attribute permissions require authorization to write, return errorif ( gattPermitAuthorWrite( pAttr->permissions ) ){// Insufficient authorizationreturn ( ATT_ERR_INSUFFICIENT_AUTHOR );}if ( pAttr->type.len == ATT_BT_UUID_SIZE ){// 16-bit UUIDuint16 uuid = BUILD_UINT16( pAttr->type.uuid[0], pAttr->type.uuid[1]);switch ( uuid ){case SIMPLEPROFILE_CHAR1_UUID:case SIMPLEPROFILE_CHAR3_UUID://Validate the value// Make sure it's not a blob operif ( offset == 0 ){//对方(Central)用串口发送数据个数的随意的(暂时人为约定小于等于20 SIMPLEPROFILE_CHAR1_LEN)//若>20就任务错了,因为我的attribute table中的buffer只有 SIMPLEPROFILE_CHAR1_LEN 大//(也可以不用判断,我只接收20个一次)//还可以在Central端发送的时候判断下,多于20个就不发并且提示错误 这样比发过来接收了不处理更好//还可以在Central端把多于20字节的情况分多次发送 暂时不考虑这种情况if ( len > SIMPLEPROFILE_CHAR1_LEN )//len 等于多少是由谁决定的 ,是simpleProfileAttrTbl之characteristic 1之Characteristic Value长度决定的(错){//为什么不是其他 characteristic(错)status = ATT_ERR_INVALID_VALUE_SIZE;}}else{status = ATT_ERR_ATTR_NOT_LONG;}//Write the valueif ( status == SUCCESS ){uint8 *pCurValue = (uint8 *)pAttr->pValue;osal_memset(pCurValue,0,SIMPLEPROFILE_CHAR1_LEN);//将开辟的内存全部设置为0//osal_memcpy(void * dst,const void GENERIC * src,unsigned int len)//VOID osal_memcpy( pCurValue, pValue, SIMPLEPROFILE_CHAR1_LEN );VOID osal_memcpy( pCurValue, pValue, len );//再看下//这个len在本文件的其他函数也能用到比如GetParameter//在本函数的最后回调函数也能用到,虽不能传参数,但是可用全局变量//但是由于len长度不会太长,所以就用最大值 SIMPLEPROFILE_CHAR1_LEN 也可以if( pAttr->pValue == simpleProfileChar1 )//等于simpleProfileChar1是由谁决定的//simpleProfileAttrTbl之characteristic 1之Characteristic Value决定的//(为什么不是其他characteristic 2、3、4、5,怎样才能用上这些characteristic)//在这里是数组名 simpleProfileChar1{notifyApp = SIMPLEPROFILE_CHAR1;//除了char1和char3还有其他的吧,特别是char5SPChar1_datalen = len;}else{notifyApp = SIMPLEPROFILE_CHAR3;}}break;case GATT_CLIENT_CHAR_CFG_UUID://干什么用的? 能否被执行到 ?status = GATTServApp_ProcessCCCWriteReq( connHandle, pAttr, pValue, len,offset, GATT_CLIENT_CFG_NOTIFY );break;default:// Should never get here! (characteristics 2 and 4 do not have write permissions)status = ATT_ERR_ATTR_NOT_FOUND;break;}}else{// 128-bit UUIDstatus = ATT_ERR_INVALID_HANDLE;}// If a charactersitic value changed then callback function to notify application of changeif ( (notifyApp != 0xFF ) && simpleProfile_AppCBs && simpleProfile_AppCBs->pfnSimpleProfileChange ){simpleProfile_AppCBs->pfnSimpleProfileChange( notifyApp );//调用回调函数 simpleProfileChangeCB()}return ( status ); }
TI中文支持网


