微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI蓝牙设计交流 > 請問BLE的連接notify

請問BLE的連接notify

时间:10-02 整理:3721RD 点击:

我的架構為一peripheral與一central,若我已經知道這兩個裝置的MAC address,是否可以直接進行"連接"使用notify傳輸小量資料約(10 Bytes)後,馬上斷開。

而不需要進行配對與綁定,還是說兩者之間的溝通必定需經過配對與綁定的過程才能交換data,謝謝。

Huazhen Jiang,

BLE的话是必须通过先广播再连接的这一过程。

如果已经知道两边的地址,你可以通过让peripheral进行direct adverting,这种模式会进行及其快速的广播和连接过程,比一般的广播连接快很多。

您好,可以跟您請教如何用peripheral進行direct adverting嗎?例如有甚麼範例或步驟之類的。

這個方式跟一般廣播的連接差異在哪? 因為我只需要短時間、少量的data交換而已,交換完成就會斷開連接。

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 );

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去"交換" 兩端所需要的數據對嗎?

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,

是的,这个“蓝牙地址” 指的是 central端的MAC Address.

这个不是为了能自动重连,这个是能和指定的设备快速重连。

如果你需要自动连接的话,就需要在断开连接的时候,peripheral就开始广播,然后central就自动开始scan,scan到特定的peripheral的时候,就直接连接。

连接成功之后,peripheral是通过notify char发送数据到central,central是通过write char发送数据到peripheral。

真的謝謝您的細心回答,

我是不需求自動重連,而是您提到的指定連接,所以我只要在peripheral端初始話的時候,增加您提到的那三行程式碼,
再打開central端進行discover device,應該就會自動連接了吧?

而關於您提到的從Central端透過notify傳輸data至peripheral端,我有看到
OneConnetedDevice_WriteCharX(simpleBLEScanIdx, BLE_CHAR6, (uint8*)str, osal_strlen(str));這個可19bytes的長度可以使用。

我會先進行實驗看看,謝謝您。

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 );

您好,我將您提供的三行指令

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端需要做什麼設置嗎?

Huazhen Jiang,

这个时候central设备也需要进行scan和发送connect request。

您好,關於central端的scan與發送connect request,是指以下的程序嗎?

1.scan

GAPCentralRole_StartDiscovery( DEFAULT_DISCOVERY_MODE,
DEFAULT_DISCOVERY_ACTIVE_SCAN,
DEFAULT_DISCOVERY_WHITE_LIST );

2.connect request

uint8 addrType;
uint8 *peerAddr;

BLE_DEV *p = &(gDev[simpleBLEScanIdx]);



if ( p->simpleBLEState == BLE_STATE_IDLE )
{
// if there is a scan result
if ( simpleBLEScanRes > 0
&& simpleBLEScanIdx < simpleBLEScanRes )
{
// connect to current device in scan result
peerAddr = simpleBLEDevList[simpleBLEScanIdx].addr;
addrType = simpleBLEDevList[simpleBLEScanIdx].addrType;

p->simpleBLEState = BLE_STATE_CONNECTING;

GAPCentralRole_EstablishLink( DEFAULT_LINK_HIGH_DUTY_CYCLE,
DEFAULT_LINK_WHITE_LIST,
addrType, peerAddr );

}

我試了以上的,好像還是連接不上。

Huazhen Jiang,

是的。

你是通过先scan到,然后再发起连接的顺序吗?你可以看看空中的log,有没有发出connect request出来。

另外,你也可以试一下在修改direct adv的时候,把central的地址倒过来写。

我看了一下Central的連接程序,發現scan似乎只是將peripheral端的MAC address添加到simpleBLEDevList[ ]裏頭,

而connect request,應該也是對simpleBLEDevList[ ]裏頭的addr發起連接,於是我想到既然我都已經知道peripheral的MAC address,我就在SimpleBLECentral_Init()內直接添加了以下兩行: 
static uint8 PeripheralMACaddr[6]={0xF7,0x25,0xAA,0x21,0xF8,0x5C};
simpleBLEAddDeviceInfo( &(PeripheralMACaddr[0]), 0x01 );

再使用button中斷去觸發connect request,如下:
BLE_DEV *p = &(gDev[simpleBLEScanIdx]);
p->simpleBLEState = BLE_STATE_CONNECTING;
GAPCentralRole_EstablishLink( DEFAULT_LINK_HIGH_DUTY_CYCLE,DEFAULT_LINK_WHITE_LIST,
simpleBLEDevList[0].addrType, simpleBLEDevList[0].addr );

如此我只要按下button,應該就可以直接對我剛剛添加進去的peripheral端MAC address做連接動作,是這樣嗎?
 

 

Huazhen Jiang,

是的。

BLE和传统的蓝牙不一样,必须按照scan -> connect的流程来,即使你既已经知道对方的地址。

请问iOS设备之类只有在绑定之后才能得到他们的MAC Address,它们平常用的是private的随机地址。

如何在IOS绑定状态下获取可用于定向广播的MAC ADDRESS?

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top