我設計的系統上,是由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[ ]的內容值改變,意圖使其故意成功無法連線。
但我發現這樣做仍然會有機會"成功"建立起兩者的連線,請問這是為什麼?
Yan:
Huazhen Jiang,
这个原理上是不成立的,你确定你修改地址成功了吗?
Huazhen Jiang:
回复 Yan:
請問您指的修改地址是指在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 );