据我所知,高版本的SDK默认是打开了DLE的,可以发送251字节的数据。其启用位置大概位于simple_peripheral.c的678行左右。
但是我现在基于最基本的3_40_00_10 SDK中的Simple_peripheral程序,将Char4的长度设置为21个字节,此时进行Notify时接收端没有任何反应。
而且通过在网上搜索(这一条在官方的指导里好像没有说)我在工程的Predefined Symbols中添加了MAX_PDU_SIZE=255 但是还是没有什么效果。
我的接收端应该是没有问题的,因为可以接收到其他厂家生产的BLE5模块的大于20字节的数据。
我将工程文件直接上传了,希望有了解的专家可以帮忙看一下,谢谢!Modified_ble5_simple_peripheral_cc2640r2lp_app.7z
Viki Shi:
例程是开启DLE的,你那边能否提供抓包看一下,或者用btool测一下peripheral是否能正确把数据发出?
user4746063:
回复 Viki Shi:
手头没有Dongle硬件,请问有没有软件的方法可以测试?
我在GATT_Notification函数位置打断点,可以看到周期性调用。
Viki Shi:
回复 user4746063:
你那边有没有launchpad?两块板子就可以测试
“可以看到周期性调用”,返回值是什么?
user4746063:
回复 Viki Shi:
返回值确实有异常。
gattServApp_SendNotiInd函数中:
(*pfnReadAttrCB)( connHandle, pAttr, noti.pValue, ¬i.len,0, len, GATT_LOCAL_READ );函数的返回值为0
GATT_Notification( connHandle, ¬i, authenticated );的返回值为0X1B对照comdef.h,有INVALID_MEM_SIZE0x0B但是不知道第5位的1是哪里来的。请问这个可能的原因是哪里呢?
noti.pValue所指向的内存空间也是有数据的。
Viki Shi:
回复 user4746063:
#define bleInvalidMtuSize0x1B//!< MTU size is out of range
你的MTU size设置不对,请按照如下链接的方法配置:
dev.ti.com/…/node
user4746063:
回复 Viki Shi:
根据资料,我认为我已经设置了。包含两处
HCI_LE_WriteSuggestedDefaultDataLenCmd(251, 2120);
还有在工程属性中的Perdefined Symbols里定义了MAX_PDU_SIZE=255
目前是没有效果的。我注意到一点,gattServApp_SendNotiInd函数的GATT_bm_alloc第4个参数将len地址传入以更新,他的返回值为20.
所以我认为可能是我的服务特征值长度没有设置好,但是我以例程为例搜索了所有包含SIMPLEPROFILE_CHAR5_LEN的地方,并把相应的SIMPLEPROFILE_CHAR4_LEN进行设置,不知道这个特征值的长度是不是还有哪里进行限制的。
请问这个len值是通过哪里获取的?
user4746063:
回复 Viki Shi:
我的GATT_MAX_MTU宏定义值为0xffff
Viki Shi:
回复 user4746063:
一、默认的ATT_MTU_SIZE为23字节,需要更新MTU size,请根据以下步骤进行设置,并确认更新生效。
1.Set the MAX_PDU_SIZE preprocessor symbol in the application project to the desired value to the maximum desired size of the L2CAP PDU size. The maximum is set by the following equation ATT_MTU=MAX_PDU_SIZE-L2CAP_HDR_SIZE
2.Call GATT_ExchangeMTU() after a connection is formed (GATT client only). The MTU parameter passed into this function must be less than or equal to the definition from step 1.
3.Receive the ATT_MTU_UPDATED_EVENT in the calling task to verify that the MTU was successfully updated. This update requires the calling task to have registered for GATT messages. See Registering to Receive Additional GATT Events in the Application for more information.二、“我注意到一点,gattServApp_SendNotiInd函数的GATT_bm_alloc第4个参数将len地址传入以更新,他的返回值为20.”是不是说的这句代码:noti.pValue = (uint8 *)GATT_bm_alloc( connHandle, ATT_HANDLE_VALUE_NOTI,GATT_MAX_MTU, &len ); ?
就是我上面说的,默认大小是23,需要更新MTU。pValue 的定义:
typedef struct
{uint16 handle; //!< Handle of the attribute that has been changed (must be first field)uint16 len;//!< Length of valueuint8 *pValue; //!< Current value of the attribute (0 to ATT_MTU_SIZE-3)
} attHandleValueNoti_t;