我參考甜甜的大香瓜的博客文章給沁恒579增加特征值6,只成功了一半。
其中我感覺有兩個(gè)地方可能有問題:
博客中第9步:
9、增加 char6 的發(fā)送通知數(shù)據(jù)的函數(shù) 1)定義 char6 的發(fā)送通知數(shù)據(jù)的函數(shù)(simpleGATTprofile.c 中) ?//******************************************************************************?
?//name: GUA_SimpleGATTprofile_Char6_Notify ?
//introduce: 發(fā)送 char6 通道的數(shù)據(jù) ?
//parameter: nGUA_ConnHandle: 連接句柄
// npGUA_Value: 要通知的數(shù)據(jù),范圍為 0~SIMPLEPROFILE_CHAR6,最多 20 個(gè)字節(jié)
// nGUA_Len: 要通知的數(shù)據(jù)的長度 ?
//return: none ?
//author: 甜甜的大香瓜 ?
//email: 個(gè)人信息保護(hù),已隱藏 ?
//QQ group 香瓜 BLE 之 CC2541(127442605)?
?//changetime: 2016.12.29 ?
//******************************************************************************?
?void GUA_SimpleGATTprofile_Char6_Notify(uint16 nGUA_ConnHandle, uint8 *pGUA_Value, uint8 ?nGUA_Len)?
{ ??
????attHandleValueNoti_t stGUA_Noti; ??
????uint16 nGUA_Return; ? //讀出 CCC 的值?
????nGUA_Return = GATTServApp_ReadCharCfg(nGUA_ConnHandle, simpleProfileChar6Config); ? //判斷是否打開通知開關(guān),打開了則發(fā)送數(shù)據(jù) ?
????if (nGUA_Return & GATT_CLIENT_CFG_NOTIFY) ??
????{ ??
????????????//填充數(shù)據(jù)?
????????????stGUA_Noti.handle = simpleProfileAttrTbl[GUA_ATTRTBL_CHAR6_VALUE_IDX].handle; ??
????????????stGUA_Noti.len = nGUA_Len; ??
????????????osal_memcpy(stGUA_Noti.value, pGUA_Value, nGUA_Len); //發(fā)送數(shù)據(jù)?
????????????GATT_Notification(nGUA_ConnHandle, &stGUA_Noti, FALSE); ??
????} ?
}?
注意,本函數(shù)僅適用于協(xié)議棧 1.3.2 和 1.4.0 版本。
1.4.2 版本的 attHandleValueNoti_t 結(jié)構(gòu)體發(fā)生變化,需要多一條分配發(fā)送數(shù)據(jù)緩沖區(qū)的 代碼??梢詤⒖肌禖C2640 之自定義服務(wù)》的 notify 代碼(不一定完全一樣):?
?//分配發(fā)送數(shù)據(jù)緩沖區(qū) ?stGUA_Noti.pValue = GATT_bm_alloc(nGUA_ConnHandle, ATT_HANDLE_VALUE_NOTI, GUAPROFILE_CHAR6_LEN, NULL);
我改的沁恒代碼如下:
void GUA_SimpleGATTprofile_Char6_Notify(uint16 nGUA_ConnHandle, uint8 *pGUA_Value, uint8 nGUA_Len)?
{?
?attHandleValueNoti_t stGUA_Noti;?
?uint16 nGUA_Return;?
?
?//讀出 CCC 的值
?nGUA_Return = GATTServApp_ReadCharCfg(nGUA_ConnHandle, simpleProfileChar6Config);?
?
?//判斷是否打開通知開關(guān),打開了則發(fā)送數(shù)據(jù)?
?if (nGUA_Return & GATT_CLIENT_CFG_NOTIFY)?
?{?
?//填充數(shù)據(jù)
?stGUA_Noti.handle = simpleProfileAttrTbl[GUA_ATTRTBL_CHAR6_VALUE_IDX].handle;?
?stGUA_Noti.len = nGUA_Len;?
?//分配發(fā)送數(shù)據(jù)緩沖區(qū)?
stGUA_Noti.pValue = GATT_bm_alloc(nGUA_ConnHandle, ATT_HANDLE_VALUE_NOTI, SIMPLEPROFILE_CHAR6_LEN, NULL,0);
?tmos_memcpy(stGUA_Noti.pValue, pGUA_Value, nGUA_Len);
?//發(fā)送數(shù)據(jù)
if( simpleProfile_Notify( nGUA_ConnHandle, &stGUA_Noti ) != SUCCESS )
? {
? ? GATT_bm_free( (gattMsg_t *)&stGUA_Noti, ATT_HANDLE_VALUE_NOTI );
? }
?}?
}
另一個(gè)地方:
香瓜博客為:
2)修改應(yīng)用層的回調(diào)函數(shù)(simpleBLEPeripheral.c 的 simpleProfileChangeCB 函數(shù)中)
static void simpleProfileChangeCB( uint8 paramID )?
{?
????uint16 nGUA_ConnHandle;?
????uint8 nbGUA_Char6[20] = {0}; ??
????switch( paramID ) { //char1 case SIMPLEPROFILE_CHAR1:
????以下從略。。。。。
//char6?
????case SIMPLEPROFILE_CHAR6: ?
????{?
????????//獲取連接句柄?
????????GAPRole_GetParameter(GAPROLE_CONNHANDLE, &nGUA_ConnHandle);?
????????//讀取 char6 的數(shù)值?
????????SimpleProfile_GetParameter(SIMPLEPROFILE_CHAR6, &nbGUA_Char6);
????????//發(fā)送數(shù)據(jù) ??
????????GUA_SimpleGATTprofile_Char6_Notify(nGUA_ConnHandle, nbGUA_Char6, 20);?
????????break; ??
????}
。。。。。。。。。。。。。。。
我改的沁恒代碼:
//char6
case SIMPLEPROFILE_CHAR6:?
{
//獲取連接句柄
GAPRole_GetParameter(paramID, &nGUA_ConnHandle);
//讀取 char6 的數(shù)值
SimpleProfile_GetParameter(SIMPLEPROFILE_CHAR6, &nbGUA_Char6);
//發(fā)送數(shù)據(jù)?
GUA_SimpleGATTprofile_Char6_Notify(nGUA_ConnHandle, nbGUA_Char6, 20);
?
break;?
}
下面說說實(shí)際效果
①紅框?yàn)?app 主動(dòng)讀取到的數(shù)值,為默認(rèn)的 1~20(hex 顯示)。
②藍(lán)框?yàn)?app 主動(dòng)寫入 cc2541 的數(shù)值。?
③紫框?yàn)閏c2541接收到app的數(shù)值后,再將char6的數(shù)值通過通知發(fā)送出來,可見當(dāng)前char6 的數(shù)值已被 app 改變。
上述3步,第一步已實(shí)現(xiàn)。
第二步可以主動(dòng)寫入,但是第三步?jīng)]實(shí)現(xiàn)。
用CC2541試驗(yàn),主動(dòng)寫入后,很快就能收到數(shù)據(jù),不用手動(dòng)讀取。
用沁恒板子,主動(dòng)寫入后,收不到數(shù)據(jù)。需要手動(dòng)讀取。
請(qǐng)大神給看看,哪里出錯(cuò)了?謝謝