你好,我们实现了一个项目的关贸总协定外围模式。服务中有1个服务和2个属性。每个属性都有一个特征。
const struct attm_desc_128 custs1_att_db[SVC_INDEX_MAX] =
{
[SVC_INDEX_SERVICE] = {(uint8_t*)&att_decl_service, ATT_UUID_128_LEN, PERM(RD, ENABLE),
sizeof (lt_service_uuid), sizeof (svc_uuid), (uint8_t *) &svc_uuid},
[SVC_INDEX_GET_CHAR] = {(uint8_t*)&att_decl_characteristic, ATT_UUID_16_LEN, PERM(RD, DISABLE),
0 0零},
[SVC_INDEX_GET_VAL] = {get_char_uuid, ATT_UUID_128_LEN, PERM(WR, ENABLE) | PERM(WRITE_REQ, ENABLE),
Perm (ri, enable) | 1024,0, null},
[SVC_INDEX_SEND_CHAR] = {(uint8_t*)&att_decl_characteristic, ATT_UUID_16_LEN, PERM(RD, ENABLE),
0, 0, null},
[SVC_INDEX_SEND_VAL] = {send_char_uuid, ATT_UUID_128_LEN, PERM(RD, ENABLE),
Perm (ri, enable) | 1024, 0, null},
};
我们定义了cust_att_db。但是当我们连接它们时,我们可以在一个命令中发送256字节。但我们希望在接受写请求(来自user_catch_rest_hndl中的CUSTS1_ATT_INFO_REQ)后将512字节写入冻结的应用程序。
总结,有多少字节(从中央)写入da14585外设模式?我们在哪里犯了错误?
另外,我们如何捕获写入缓冲区溢出?我们是否可以给custs1_att_db另一个缓冲区。这样的例子吗?
走读生userBuffer [1024];
const struct attm_desc_128 custs1_att_db[SVC_INDEX_MAX] =
{
[SVC_INDEX_SERVICE] = {(uint8_t*)&att_decl_service, ATT_UUID_128_LEN, PERM(RD, ENABLE),
sizeof (lt_service_uuid), sizeof (svc_uuid), (uint8_t *) &svc_uuid},
[SVC_INDEX_GET_CHAR] = {(uint8_t*)&att_decl_characteristic, ATT_UUID_16_LEN, PERM(RD, DISABLE),
0 0零},
[SVC_INDEX_GET_VAL] = {get_char_uuid, ATT_UUID_128_LEN, PERM(WR, ENABLE) | PERM(WRITE_REQ, ENABLE),
PERM(RI,ENABLE) | 1024,0, userBuffer},
[SVC_INDEX_SEND_CHAR] = {(uint8_t*)&att_decl_characteristic, ATT_UUID_16_LEN, PERM(RD, ENABLE),
0, 0, null},
[SVC_INDEX_SEND_VAL] = {send_char_uuid, ATT_UUID_128_LEN, PERM(RD, ENABLE),
Perm (ri, enable) | 1024, 0, null},
};
最好的祝福……
嗨ltdev,
根据BKLE规范,一个属性的最大长度为512字节。SDK的ble_app_peripheral示例包含一个“写长特性”。请看看SDK的这个例子。如果要写入的特征值的长度大于20字节,则会触发user_catch_rest_hndl()函数中的user_svc1_long_val_att_info_req_handler()。如果长度小于20字节,将执行user_svc1_long_val_wr_ind_handler()。因此,如果希望在不进行MTU交换的情况下发送超过20个字节,则应该执行与ble_app_peripheral示例中的user_svc1_long_val_att_info_req_handler()函数相同的实现。因为你这样做,主服务器将发送一个“准备写请求”,从服务器将响应一个“准备写响应”。当然,特征应该有512字节的长度- DEF_SVC1_LONG_VALUE_CHAR_LEN。
谢谢,PM_Dialog
嗨,我想我无法解释我的问题。我已经可以写超过20个字节了。但是当我定义CHAR_LEN为512字节时,我只能写315字节。如果我试图写超过315字节,应用程序冻结和看门狗不工作。
我可以捕获写缓冲区溢出吗?我可以使用任何字符值缓冲区吗?
编辑:在我的调试与nrf连接移动;
我定义;#定义DEF_SVC1_LONG_VALUE_CHAR_LEN 50
我想发送51Bytes的nrf连接得到GATT_ATTR_LEN错误。我能在我的申请中写出来吗?
嗨ltdev,
有没有可能分享一个屏幕截图,显示应用程序在哪里冻结?是因为WDOG过期吗?
如果增加DEF_SVC1_LONG_VALUE_CHAR_LEN,是否能够发送超过51个字节?
>>> " Additionaly can catch write buffer overflow? "
你能澄清一下上述说法吗?
谢谢,PM_Dialog