CC2541 central與peripheral的連線問題
我設計的系統上,是由central端發起連線的,而central端已事先知道peripheral的MAC address
故我做了以下過程
1.peripheral 廣播
2.central scan request
3. 此時我在central端加入,simpleBLEAddDeviceInfo( &(PeripheralMACaddr[0]), 0x00 );,預計透過這個建立連線
4.peripheral scan response
5.central connect request
if ( p->simpleBLEState == BLE_STATE_IDLE ){
peerAddr = simpleBLEDevList[0].addr;
addrType = simpleBLEDevList[0].addrType;
GAPCentralRole_EstablishLink( DEFAULT_LINK_HIGH_DUTY_CYCLE,
DEFAULT_LINK_WHITE_LIST,
addrType, peerAddr );
}
至此可以連線會被建立,也能notify。
但我今天刻意間在central端,填入peripheral的MAC address的地方,也就是simpleBLEAddDeviceInfo( &(PeripheralMACaddr[0]), 0x00 );
PeripheralMACaddr[ ]的內容值改變,意圖使其故意成功無法連線。
但我發現這樣做仍然會有機會"成功"建立起兩者的連線,請問這是為什麼?
測試了一下,似乎跟以下的functions有關係,DEFAULT_DEV_DISC_BY_SVC_UUID 被我刻意設成FALSE,所以會進入判斷。
case GAP_DEVICE_DISCOVERY_EVENT:
{
NPI_PrintString(">>>GAP_DEVICE_DISCOVERY_EVENT\r\n");
// discovery complete
simpleBLEScanning = FALSE;
// if not filtering device discovery results based on service UUID
if ( DEFAULT_DEV_DISC_BY_SVC_UUID == FALSE )
{
// Copy results
simpleBLEScanRes = pEvent->discCmpl.numDevs;
osal_memcpy( simpleBLEDevList, pEvent->discCmpl.pDevList,
(sizeof( gapDevRec_t ) * pEvent->discCmpl.numDevs) );
}
break;
Huazhen Jiang,
这个原理上是不成立的,你确定你修改地址成功了吗?
請問您指的修改地址是指在central端上儲存的"預先寫好的peripheral端MAC address嗎"??這點是確認的。
而我也有在central端連線成功時,加了一段程序設break point,查看連線成功的MAC address是不是與我預先寫好的一致,如下:
case GAP_LINK_ESTABLISHED_EVENT:
{
BLE_DEV *p = &(gDev[simpleBLEScanIdx]);
uint8 tempAddr[6]= {0};
osal_memcpy(tempAddr ,pEvent->deviceInfo.addr,6);
..
break;
}
結果是不一致,我的central端是與正在進行廣播的peripheral MAC address連線成功。
我也感到很納悶,因為我連線動作已經指定對simpleBLEDevList[0]做連接,所以不得其解
#define DEFAULT_LINK_HIGH_DUTY_CYCLE FALSE
#define DEFAULT_LINK_WHITE_LIST FALSE
uint8 addrType= simpleBLEDevList[0].addrType;
uint8 *peerAddr= simpleBLEDevList[0].addr;
GAPCentralRole_EstablishLink( DEFAULT_LINK_HIGH_DUTY_CYCLE,
DEFAULT_LINK_WHITE_LIST,
addrType, peerAddr );