TI中文支持网
TI专业的中文技术问题搜集分享网站

請問BLE的連接notify

我的架構為一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。

赞(0)
未经允许不得转载:TI中文支持网 » 請問BLE的連接notify
分享到: 更多 (0)