我的架構為一peripheral與一central,若我已經知道這兩個裝置的MAC address,是否可以直接進行"連接"使用notify傳輸小量資料約(10 Bytes)後,馬上斷開。
而不需要進行配對與綁定,還是說兩者之間的溝通必定需經過配對與綁定的過程才能交換data,謝謝。
Yan:
Huazhen Jiang,
BLE的话是必须通过先广播再连接的这一过程。
如果已经知道两边的地址,你可以通过让peripheral进行direct adverting,这种模式会进行及其快速的广播和连接过程,比一般的广播连接快很多。
Huazhen Jiang:
回复 Yan:
您好,可以跟您請教如何用peripheral進行direct adverting嗎?例如有甚麼範例或步驟之類的。
這個方式跟一般廣播的連接差異在哪? 因為我只需要短時間、少量的data交換而已,交換完成就會斷開連接。
Yan:
回复 Huazhen Jiang:
Huazhen Jiang,
默认的是普通的广播,你可以照如下步骤修改,比如在SimpleBLEPeripheral_Init()里面
GAPRole_SetParameter( GAPROLE_ADV_EVENT_TYPE, GAP_ADTYPE_ADV_HDC_DIRECT_IND)
GAPRole_SetParameter( GAPROLE_ADV_DIRECT_ADDR, 蓝牙地址)
GAPRole_SetParameter( GAPROLE_ADVERT_ENABLED, sizeof( uint8 ), &initial_advertising_enable );
Huazhen Jiang:
回复 Yan:
GAPRole_SetParameter( GAPROLE_ADV_EVENT_TYPE, GAP_ADTYPE_ADV_HDC_DIRECT_IND)
GAPRole_SetParameter( GAPROLE_ADV_DIRECT_ADDR, 蓝牙地址) <<
GAPRole_SetParameter( GAPROLE_ADVERT_ENABLED, sizeof( uint8 ), &initial_advertising_enable );
請問上述的"藍芽地址"指的是central端的MAC address吧?
我看串的行為應該是設置peripheral的初始過程。您的意思是假若在SimpleBLEPeripheral_Init()加入這幾行,後續只要兩個裝置一上電,就會自動進行連接嗎?又假若有連接成功,就可以利用notify char去"交換" 兩端所需要的數據對嗎?
Huazhen Jiang:
回复 Yan:
GAPRole_SetParameter( GAPROLE_ADV_EVENT_TYPE, GAP_ADTYPE_ADV_HDC_DIRECT_IND)
GAPRole_SetParameter( GAPROLE_ADV_DIRECT_ADDR, 蓝牙地址) <<
GAPRole_SetParameter( GAPROLE_ADVERT_ENABLED, sizeof( uint8 ), &initial_advertising_enable );
請問上述的"藍芽地址"指的是central端的MAC address吧?
我看串的行為應該是設置peripheral的初始過程。您的意思是假若在SimpleBLEPeripheral_Init()加入這幾行,後續只要兩個裝置一上電,就會自動進行連接嗎?又假若有連接成功,就可以利用notify char去"交換" 兩端所需要的數據對嗎?
Yan:
回复 Huazhen Jiang:
Huazhen Jiang,
是的,这个“蓝牙地址” 指的是 central端的MAC Address.
这个不是为了能自动重连,这个是能和指定的设备快速重连。
如果你需要自动连接的话,就需要在断开连接的时候,peripheral就开始广播,然后central就自动开始scan,scan到特定的peripheral的时候,就直接连接。
连接成功之后,peripheral是通过notify char发送数据到central,central是通过write char发送数据到peripheral。
Huazhen Jiang:
回复 Yan:
真的謝謝您的細心回答,
我是不需求自動重連,而是您提到的指定連接,所以我只要在peripheral端初始話的時候,增加您提到的那三行程式碼,再打開central端進行discover device,應該就會自動連接了吧?
而關於您提到的從Central端透過notify傳輸data至peripheral端,我有看到OneConnetedDevice_WriteCharX(simpleBLEScanIdx, BLE_CHAR6, (uint8*)str, osal_strlen(str));這個可19bytes的長度可以使用。
我會先進行實驗看看,謝謝您。
Yan:
回复 Huazhen Jiang:
Huazhen Jiang ,
是的,只要知道对方的MAC 地址,你就可以加那几行代码。我只是举了个例子,更合适的地方是你在第一次连接绑定之后(因为iOS设备之类只有在绑定之后才能得到他们的MAC Address,它们平常用的是private的随机地址)。
所以更适合的位置可以是这里:
SimpleBLEPeripheral.c 中的peripheralStateNotificationCB(),
case GAPROLE_CONNECTED: 之后
GAPRole_GetParameter ( GAPROLE_CONN_BD_ADDR,蓝牙地址); // 先得到对方的地址,多加这一行
GAPRole_SetParameter( GAPROLE_ADV_EVENT_TYPE, GAP_ADTYPE_ADV_HDC_DIRECT_IND)
GAPRole_SetParameter( GAPROLE_ADV_DIRECT_ADDR, 蓝牙地址) ;
然后在你需要使能广播的地方加入
GAPRole_SetParameter( GAPROLE_ADVERT_ENABLED, sizeof( uint8 ), &initial_advertising_enable );
Huazhen Jiang:
回复 Yan:
您好,我將您提供的三行指令
GAPRole_SetParameter( GAPROLE_ADV_EVENT_TYPE, GAP_ADTYPE_ADV_HDC_DIRECT_IND)
GAPRole_SetParameter( GAPROLE_ADV_DIRECT_ADDR, CentralMAC)
GAPRole_SetParameter( GAPROLE_ADVERT_ENABLED, sizeof( uint8 ), &initial_advertising_enable );
貼上並編譯,但顯示error,沒有GAP_ADTYPE_ADV_HDC_DIRECT_IND這個宣告,且GAPRole_SetParameter傳入參數個數不足。
於是我找了一下資料,將其改成
uint8 adType = GAP_ADTYPE_ADV_DIRECT_IND;uint8 initial_advertising_enable = TRUE;
GAPRole_SetParameter( GAPROLE_ADV_EVENT_TYPE, sizeof( uint8 ), &adType);GAPRole_SetParameter( GAPROLE_ADV_DIRECT_ADDR,sizeof( CentralMAC ) , CentralMAC );
GAPRole_SetParameter( GAPROLE_ADVERT_ENABLED, sizeof( uint8 ), &initial_advertising_enable );
然後觀察sniffer,只看到有定向的ADV出現,如下圖。
看起來似乎沒有成功連接,請問central端需要做什麼設置嗎?
Yan:
回复 Huazhen Jiang:
Huazhen Jiang,
这个时候central设备也需要进行scan和发送connect request。