你好对话框,
我们已经在原型板上通过I2C将传感器连接到Da14585。我们的传感器数据长度是60字节,但BLE只广播了20字节,这是我用通用应用程序(BLE扫描仪)检查过的。我尝试增加MTU大小(.max_mtu), DEF_SVC4_LSM_ACC_X_CHAR_LEN = 60,但没有影响仍然广播20字节。
以前,我们使用SDK 6.0.2在带有DA14585 AB硅芯片和传感器接线板的支持开发板上广播相同的60字节传感器数据。现在我们已经开发了一个原型,基于AC硅片,并且使用SDK 6.0.10,这次它没有发生。
请告诉我们,如果通过BLE广播超过20字节,我需要做哪些更改?
谢谢
毗湿奴
设备:
嗨,毗瑟奴,
由于我能够理解您的查询,您想要实现的是数据长度扩展(DLE)功能。如果我误解了你的问题,请告诉我。如果您的意思是,则应使用正确的DLE报文配置DA1458x_config_Advanced.h标头文件的CFG_MAX_RX_PACKET_LENGTH和CFG_MAX_TX_PACKET_LENGHED定义。然后,您应该修改user_config.h标题文件的user_gapm_conf结构的.max_txoctets和.max_txtime。此外,您应该使用MTU大小.max_mtu = 60.此外,我非常建议您为DA14585 SoC的DSP应用程序。此应用程序使用数据长度扩展。请搜索USE_DLE哈希定义。
谢谢,PM_Dialog
你好,PM_Dialog,
我的DLE包是60字节。
//我们的预期数据格式由BLE扫描仪读取:{:0.02:-0.00:1.06:.4.83:0.91:1.05:25:100:}
//十六进制:OX7B3A302E30323A2D303033A2D342C30393A3A353A32353A30350393A3A3939393A3A39350393A3A3539393A2D342C30393A2D342S30363A2D342C30393A2D342C30393A2D342C30393A2D342C30393A3A30353A32353A3035393A33A303539393A3A30353932CFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
//此数据仍然在Pro开发板上使用DA14585DB与传感器分组板通过I2C(P0_2,P0_3引脚)进行划整个带有SDK 6.0.2的Pro开发板,所有DLE 6.0.2和SDK中的各处定义的所有DLE变量的默认值为251。
我在代码中更改了以下内容(SDK 6.0.10)
CFG_MAX_RX_PACKET_LENGTH=61//默认为251
cfg_max_tx_packet_length = 61 //默认情况下是251
.max_txoctets=61//默认值为251
.max_txtime=600 //默认为2120
.max_mtu=60//默认值为150
不过,我的BLE广告数据只发送了20个字节,没有任何变化(在我们的SDK6.0.10原型板上)
产值;{:0.01:-O25:0.97:4。
HEX:OX7B3A302E30313A2D302E32353A302039373A342E
我也用DSPS代码验证,到处都是默认值最大值(251)。没有自定义定义的值。
如果需要在我的代码中做任何修改,请提到。
谢谢
毗湿奴
嗨,毗瑟奴,
很抱歉,我不明白您想将数据存储到广告字符串中。向用户提供的广告数据的有效可用字节仅为31个字节中的28个字节,因为为设置标志数据保留了3个字节。由于这是与规范相关的限制,您将无法在广告数据包中容纳超过28字节的数据。虽然,当您将智能手机用作扫描仪时,您可以接收超过31个字节(最多62个字节),但这是因为智能手机使用的是活动扫描,这意味着它将在检测到来自外围设备的广告时请求第二个PDU。这称为扫描请求,对该请求的响应(另外31个字节(28个可用,3个保留)被恰当地命名为扫描响应。因此,我建议您将数据存储到USER_advision_数据和USER_advision_SCAN_RESPONSE_USER_config.h头文件的数据定义中。
谢谢,PM_Dialog
你好,PM_Dialog,
我试图用这种方式在两个变量中存储数据
///广告数据
#define user_advertise_data(“\ x03”\
高级类型完整列表16位服务ID\
高级设备信息服务\
“\x11”\
高级类型完整列表128位服务ID\
“\x2F\x2A\x93\xA6\xBD\xD8\x41\x52\xAC\x0B\x10\x99\x2E\xC6\xFE\xED”)
///广告数据长度-最大28字节,保留3个字节进行设置
#define user_advertise_data_len(sizeof(user_advertise_data)-1)
///扫描响应数据
#define user_advertise_scan_response_data(“\ x03”\
高级类型完整列表16位服务ID\
高级设备信息服务\
“\x11”\
高级类型完整列表128位服务ID\
“\x2F\x2A\x93\xA6\xBD\xD8\x41\x52\xAC\x0B\x10\x99\x2E\xC6\xFE\xED”)
///扫描响应数据长度 - 最多31个字节
#define user_advertise_scan_response_data_len(sizeof(user_advertise_scan_response_data)-1)
但是,BLE仅广告20字节。
我不知道我定义的是正确的方式。请澄清。
谢谢
毗湿奴
嗨,毗瑟奴,
我从我的方面测试了相同的代码,你已经发布,我能够得到广告和扫描响应数据在BLE Scanner移动应用程序。您的扫描响应数据已正确定义。你能描述一下你是如何测试它的吗?另外,你能说明一下你想要完成什么吗?您希望将传感器数据存储到广告字符串中吗?我理解对了吗?
谢谢,PM_Dialog
你好,PM_Dialog,
一旦我将原型连接到BLE Scanner应用程序,我们将写入“01”数据到控制点,然后,我们将点击通知按钮,我的传感器数据将每秒更新。
正如我之前告诉过你的那样,当我们使用带有SDK 6.0.2的DA14585 DEV板(AB Silicon)+传感器分配板时,我已经看到了我的传感器数据60字节上的单个特征更新。
之后,我们开始制作传感器和DA14585芯片的原型。由于以前的SDK版本不支持新的AC硅芯片,我们将代码更新为SDK 6.0.10。现在BLE只发送每个特征的20字节数据。
与Prevional版本(SDK 6.0.2)一样,我们没有更改我们的MTU大小,CFG_MAX_RX_PACKET_LENGTH,我们没有将user_advertise_scan_response_data变量中的任何数据放入。所有是预定义的值,因为SDK定义仍然我们在BLE扫描仪应用中获得了60个字节的传感器数据,并且我们使用外部网关(在BLE客户端中的相同数据)。
但是,有了新的SDK,我们在原型板上面临的问题是,我们的传感器数据在BLE scanner应用程序中只有20字节。我们尝试了很多方法,但无法增加传感器数据长度。
我不确定,我已经把我的广告数据字符串,我们已经创建了一个回调计时器user_cust1_impl.c一旦我们写信给控制点计时器将开始后,点击自动通知我们的传感器数据在每秒钟所祝福扫描仪应用。在定时器,我们已经定义了sprintf函数,该函数将我们的传感器数据转换为BLE扫描仪应用程序中可见的{:0.02:-0.00:1.06:.4.83:0.91:1.05:25:100:}。表示传感器数据的数据格式为{ax:ay:az:gx:gy:gz:Tc:Bat,}。
但是,现在我们可以像这样只读取前20个字节{:0.02:-0.00:1.06:.4。,以增加传感器数据长度,我们需要在代码中进行更改吗?
正如我在上一篇文章中所看到的,我试图更改DLE、DEF_SVC4_LSM_ACC_X_CHAR_LEN、USER_Advertised_SCAN_RESPONSE_数据变量,但没有任何结果。
请告诉我我是否错过了我的代码中的任何东西?
谢谢
毗湿奴
嗨,毗瑟奴,
抱歉,我误解了之前的帖子,因为你提到了“广告数据”,我以为你指的是广告字符串。你可以尝试写长特征值的实现,在ble_app_peripheral的SDK示例中的实现?请看看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()函数相同的实现。您可以尝试这个实现并让我知道吗?
谢谢,PM_Dialog
你好,PM_Dialog,
正如您提到的,我在ble_app_peripheral示例中看到了user_svc1_long_val_att_info_req_handler。它是这样定义的。
void user\u svc1\u rest\u att\u info\u req\u handler(ke\u msg\u id\u const msgid,
结构custs1_att_info_req const*param,
ke_task_id_t const dest_id,
ke_task_id_t const src_id)
{
结构custs1\u att\u info\u rsp*rsp=KE\u MSG\u ALLOC(custs1\u att\u info\u rsp,
src_id,
目的地id,
custs1_att_info_rsp);
//提供连接索引。
负责- - - - - - > conidx = app_env [param - > conidx] .conidx;
//提供属性索引。
rsp->att_idx=param->att_idx;
//强制当前长度为零。
RSP->长度= 0;
//提供ATT错误代码。
rsp-> status = att_err_write_not_permited;
KE_MSG_SEND(RSP);
}
在上面的函数中,没有这样的函数可以要求->值。如果req->值存在,那么当user_catch_rest_hndl被调用时,只有我可以以缓冲区格式传递我的传感器数据。
正如在user_svc1_long_val_wr_ind_处理程序中一样,我们可以通过调用计时器以通知格式传递传感器数据。
void user_svc1_long_val_wr_ind_handler(ke_msg_id_t const msgid,
struct musts1_val_write_ind const * param,
ke_task_id_t const dest_id,
ke_task_id_t const src_id)
{
uint8_t val = 0;
memcpy(&val,&param->值[0],param->长度);
if(val!= custs1_cp_lsm_accx_disable)
{
lsm_acc_xused = app_easy_timer(app_peripheral_ctrl_timer_delay,app_lsmaccx_timer_cb_handler);
}
别的
{
if(lsm_acc_x_used!= 0xffff)
{
应用程序\u轻松\u定时器\u取消(使用lsm\u acc\u x\u);
lsm_acc_x_used = 0xffff;
}
}
}
当我们将01写入特征时,上面的函数将调用app_lsmaccX_timer_cb_handler定时器:
无效应用程序\u lsmaccX\u计时器\u cb\u处理程序()
{
char-buff1[60];
sprintf (buff1,“{:GES0090001: % .2f: % .2f: % .2f: % .2f: % d:}”,readFloatAccelX (), readFloatAccelY (),
readTempC readFloatAccelZ (), (), battery_get_lvl (BATT_CR1225));
struct susts1_val_ntf_ind_req * req = ke_msg_alloc_dyn(custs1_val_ntf_req,
prf_从_id获取_任务_(任务_id_CUSTS1),
TASK_APP,
客户1_val_ntf_ind_req,
定义SVC1长度值字符长度);
申请- >处理= SVC1_IDX_LONG_VALUE_VAL;
req->length=DEF_SVC1_LONG_VALUE_CHAR_LEN;
请求->通知=true;
memcpy(req-> value,&bud1,def_svc1_long_value_char_len);//这里我的传感器数据存储在buff1和def_svc1_long_value_char_len = 60
发送消息(请求);
if(ke_state_get(TASK_APP)==APP_CONNECTED)
{
lsm_acc_xused = app_easy_timer(app_peripheral_ctrl_timer_delay,app_lsmaccx_timer_cb_handler);
}
}
对不起,我没有得到我如何提高我的表现的长度,这样我就可以通过我的传感器数据在user_svc1_long_val_att_info_req_handler()函数中,并且还如何在应用程序侧实现这一点(在BLE扫描仪中)。
由于所有其他处理程序都有写入和通知请求,可以在特性上实现为属性,然后我们可以使用BLE扫描仪调用它们来协议。
请帮助我,如何chnage user_svc1_long_val_att_info_req_handler()函数我可以通过ble发送我的完整60字节传感器数据。
谢谢
毗湿奴
嗨,毗瑟奴,
请尝试以下程序到初始项目,以确保您发送60字节的通知和主人能够得到这些60字节。请将user_config.h头文件中user_gapm_conf结构的max_mtu项修改为60。完成此操作后,尝试通过通知发送60个字节,并尝试使用嗅探器来检查60个字节是否通过空中发送。如果您看到60字节可以发送,这意味着主服务器不能接收60字节。关于通知,设备可以通过特征通知发送的字节数量受到MTU (Maximum Transfer Unit)的限制,MTU默认被限制在23字节(包括ATT层开销),因此通知的有效负载是20字节。通过增加MTU大小,这意味着您可以在一个通知上发送更多字节,因此在您的情况下,最大传输单元应该是您想发送的字节数量+ 3个额外字节。请尝试这到您的初始项目,并让我知道。
谢谢,PM_Dialog