TI论坛
直播中

余姗姗

7年用户 180经验值
私信 关注
[问答]

如何分析安卓手机与CC2640连接和配对过程中的packet sniffer?

1、问题概述
手机与CC2640进行配对的过程中,使用CC2640 DONGLE和packet sniffer软件,抓到了空中数据包。但是抓到的空中数据包数量较多,且每种空中数据包的实际含义看不明白。该空中数据包可从“5、附件”中下载。
目前正在阅读蓝牙核心协议《core_V5.0.pdf》,但是依旧无法看懂空中数据包。《core_V5.0.pdf》可从“5、附件”中下载。
能否提供一些关于空中数据包的资料?
2、pair mode的配置
使用官方开发板CC2640_LAUNCHPAD ,并使用simple_peripheral例程,在SimpleBLEPeripheral_init(void)函数中配置pair mode,代码如下所示:
  // Setup the GAP Bond Manager. For more information see the section in the  // User's Guide:  // software-dl.ti.com/.../  [    // Don't send a pairing request after connecting; the peer device must    // initiate pairing    //uint8_t pairMode = GAPBOND_PAIRING_MODE_WAIT_FOR_REQ;      uint8_t pairMode = GAPBOND_PAIRING_MODE_INITIATE;    // Use authenticated pairing: require passcode.    uint8_t mitm = TRUE;    // This device only has display capabilities. Therefore, it will display the    // passcode during pairing. However, since the default passcode is being    // used, there is no need to display anything.    uint8_t ioCap = GAPBOND_IO_CAP_DISPLAY_ONLY;   //手机不显示密码,只有这个可用    // Request bonding (storing long-term keys for re-encryption upon subsequent    // connections without repairing)    uint8_t bonding = TRUE;    //uint8_t scMode = GAPBOND_SECURE_CONNECTION_ALLOW;    GAPBondMgr_SetParameter(GAPBOND_PAIRING_MODE, sizeof(uint8_t), &pairMode);    GAPBondMgr_SetParameter(GAPBOND_MITM_PROTECTION, sizeof(uint8_t), &mitm);    GAPBondMgr_SetParameter(GAPBOND_IO_CAPABILITIES, sizeof(uint8_t), &ioCap);    GAPBondMgr_SetParameter(GAPBOND_BONDING_ENABLED, sizeof(uint8_t), &bonding);    //GAPBondMgr_SetParameter(GAPBOND_SECURE_CONNECTION, sizeof(uint8_t), &scMode);  ]
3、packet sniffer的获取步骤
(1)在CC2640上运行simple_peripheral例程,在安卓手机上安装BLE SCANNER,找到CC2640,如图1所示。并输入配对密码“123456”,如图2所示。




(2)在配对的过程中,抓到的空中数据包如图3所示。


4、问题详细描述
(1)LL_Opcode 与 LL_Feature_Req是什么意思?如图4所示

(2)Data Type = L2CAP-S 是什么意思?如图5所示

(3)L2CAP Header 是什么意思?如图6所示

(4)Empty PDU是什么意思?如图7所示

(5)direction = ? 是什么意思?如图8所示

5、我的附件
(1)simple_peripheral工程在我的电脑上的位置
C:tisimplelink_cc2640r2_sdk_1_40_00_45examplesrtosCC2640R2_LAUNCHXLblestacksimple_peripheral
(2)空中数据包可从如下路径下载:
2604.11success-MEIZU.psd
(3)《core_V5.0.pdf》可从如下路径下载:
www.bluetooth.com/.../bluetooth-core-specification
(4)simplelink_cc2640r2_sdk_1_40_00_45 可从如下路径下载:
dev.ti.com/.../
(5)CC2640R2 launchpad 可从这里购买:
www.ti.com/.../launchxl-cc2640r2

6、我的开发环境
CCS:Code Composer Studio 7.2.0
SDK:simplelink_cc2640r2_sdk_1_40_00_45
hardware:CC26640R2 launchpad develop kit
VS: Microsoft Visual C++ 2010 Express
系统:win7 64 位

回帖(7)

庄当甜

2019-10-29 09:30:43
您可以参考下

processors.wiki.ti.com/.../BLE_sniffer_guide
另外有时候packet sniffer会看不到连接中的广播包,需要packet sniffer软件“停止-开始”地重开一下。
举报

余姗姗

2019-10-29 09:39:56
引用: 小Qhhui 发表于 2019-10-29 14:28
您可以参考下

processors.wiki.ti.com/.../BLE_sniffer_guide

标题:安卓手机与CC2640连接失败,因为没有发出“Connection establishment”的数据包

内容:使用安卓手机(小米6、Android8.0)与CC2640连接,会连接失败。平均连接10次,失败4次。通过packet sniffer抓包工具发现,手机与cc2640之间发射了多个“Scan request / response”数据包,但是没有发出“Connection establishment”的数据包。
通过UART的串口信息显示,CC2640连接失败之后,就一直停留在“GAPROLE_WAITING”状态。
如果使用iphone5与CC2640连接,则成功率为100%
请问如何调整CC2640的GAP层的参数,以提高连接的成功率?
问题详细描述:
(1)更改配对模式,代码如下:
  [    // Don't send a pairing request after connecting; the peer device must    // initiate pairing    //uint8_t pairMode = GAPBOND_PAIRING_MODE_WAIT_FOR_REQ;      uint8_t pairMode = GAPBOND_PAIRING_MODE_INITIATE;    // Use authenticated pairing: require passcode.    uint8_t mitm = TRUE;    // This device only has display capabilities. Therefore, it will display the    // passcode during pairing. However, since the default passcode is being    // used, there is no need to display anything.    uint8_t ioCap = GAPBOND_IO_CAP_DISPLAY_ONLY;   //手机不显示密码,只有这个可用    // Request bonding (storing long-term keys for re-encryption upon subsequent    // connections without repairing)    uint8_t bonding = TRUE;    //uint8_t scMode = GAPBOND_SECURE_CONNECTION_ALLOW;    GAPBondMgr_SetParameter(GAPBOND_PAIRING_MODE, sizeof(uint8_t), &pairMode);    GAPBondMgr_SetParameter(GAPBOND_MITM_PROTECTION, sizeof(uint8_t), &mitm);    GAPBondMgr_SetParameter(GAPBOND_IO_CAPABILITIES, sizeof(uint8_t), &ioCap);    GAPBondMgr_SetParameter(GAPBOND_BONDING_ENABLED, sizeof(uint8_t), &bonding);    //GAPBondMgr_SetParameter(GAPBOND_SECURE_CONNECTION, sizeof(uint8_t), &scMode);  ]
(2)利用小米6与CC2640连接,利用packet sniffer抓包,抓到了多个“Scan request / response”数据包,如图1所示。

(3)没有抓到“Connection establishment”的数据包。抓到了许多“FCS = “ERROR”的包,如图2所示

(4)参照官方的参考文档(链接见附件),如果连接成功,会收到“Connection establishment”的数据包,如图3所示。

(5)我抓到的数据包的文件在附件中。
(6)通过UART的串口信息显示,CC2640连接失败之后,就一直停留在“GAPROLE_WAITING”状态。UART信息打印的代码如下所示. 该代码在“simple_peripheral.c”文件中:
static void SimpleBLEPeripheral_processStateChangeEvt(gaprole_States_t newState)[  .......    case GAPROLE_WAITING:      Util_stopClock(&periodicClock);      SimpleBLEPeripheral_freeAttRsp(bleNotConnected);      Display_print0(dispHandle, 2, 0, "Disconnected");      UART_write(uart, "GAPROLE_WAITINGrn", sizeof("GAPROLE_WAITINGrn"));      // Clear remaining lines      Display_clearLines(dispHandle, 3, 5);      break;......]

附件:
(1)官方的参考文档
http://processors.wiki.ti.com/index.php/BLE_sniffer_guide

(2)我抓到的数据包的文件
02_fail_pairing.psd
举报

李维兴

2019-10-29 09:49:47
引用: 60user49 发表于 2019-10-29 14:37
标题:安卓手机与CC2640连接失败,因为没有发出“Connection establishment”的数据包

内容:使用安卓手机(小米6、Android8.0)与CC2640连接,会连接失败。平均连接10次,失败4次。通过packet sniffer抓包工具发现,手机与cc2640之间发射了多个“Scan request / response”数据包,但是没有发出“Connection establishmen ...

你在
static void SimpleBLEPeripheral_init(void)函数里面增加以下代码在抓一次包给我看看。
#define APP_TX_PDU_SIZE 27
#define APP_RX_PDU_SIZE 27
#define APP_TX_TIME 328
#define APP_RX_TIME 328

//This API is documented in hci.h
HCI_EXT_SetMaxDataLenCmd(APP_TX_PDU_SIZE ,  APP_TX_TIME,
   APP_RX_PDU_SIZE, APP_RX_TIME);
举报

余姗姗

2019-10-29 10:07:05
引用: uuwufydsw 发表于 2019-10-29 14:47
你在
static void SimpleBLEPeripheral_init(void)函数里面增加以下代码在抓一次包给我看看。
#define APP_TX_PDU_SIZE 27

1、将上述配置代码添加到void SimpleBLEPeripheral_init(void)中以后,BLE packet sniffer就难以抓到包了。我尝试过好多次,BLE packet sniffer都没有抓到包。
2、当删除上述配置代码后,BLE packet sniffer就可以抓到包了。说明上述配置代码会影响抓包工具。
3、将上述配置代码添加到void SimpleBLEPeripheral_init(void)中以后,再用Android手机与CC2640连接。发现连接的成功率不变。也就是说,上述配置代码对CC2640的连接与配对基本没有影响。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分