你好对话框,
我们已经在原型板上通过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个字节的情况进行哪些更改?
谢谢
D.Vishnu.
设备:
嗨Vishnuatdialog,
由于我能够理解您的查询,您想要实现的是数据长度扩展(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个字节(在我们的原型板上有SDK 6.0.10)
产值; {:0.01:-O25:0.97:4。
HEX:OX7B3A302E30313A2D302E32353A302039373A342E
我也用DSPS代码验证,到处都是默认值最大值(251)。没有自定义定义的值。
如果需要在我的代码中做任何修改,请提到。
谢谢
D.Vishnu.
嗨Vishnuatdialog,
抱歉,但我不明白您想将数据存储到广告字符串中。为用户的广告数据的有效可用字节仅为31个字节中的28个字节,因为3个字节保留用于设置标志数据。由于这是规范相关的限制,因此您将无法在广告数据包中符合超过28个字节的数据。虽然,当您使用智能手机作为扫描仪时,您可以收到超过31个字节(最多62个字节),但这是因为智能手机使用的是主动扫描,这意味着它将在其检测到广告时请求第二个PDU一个外围。这被称为扫描请求和对此请求的响应,另一个31个字节(可用于使用和3保留的28),适当地命名为扫描响应。因此,我建议您将数据存储到user_advertise_data中,并将数据存储到user_config.h头文件的user_advertise_scan_response_data定义中。
谢谢,PM_Dialog
你好pm_dialog,
我试图以这种方式存储两个变量中的数据
///广告数据
#define user_advertise_data(“\ x03”\
adv_type_complete_list_16bit_service_ids \
avd_uuid_device_information_service \
“\ x11”\
adv_type_complete_list_128bit_service_ids \
“\ 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”\
adv_type_complete_list_16bit_service_ids \
avd_uuid_device_information_service \
“\ x11”\
adv_type_complete_list_128bit_service_ids \
“\ 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字节。
我不知道我定义的是正确的方式。请澄清。
谢谢
D.Vishnu.
嗨Vishnuatdialog,
我从我的方面测试了相同的代码,你已经发布,我能够得到广告和扫描响应数据在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扫描仪应用中只有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_advertise_scan_response_data变量没有什么工作。
请告诉我我是否错过了我的代码中的任何东西?
谢谢
D.Vishnu.
嗨Vishnuatdialog,
抱歉,我误解了之前的帖子,因为你提到了“广告数据”,我以为你指的是广告字符串。你可以尝试写长特征值的实现,在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_svc1_rest_att_info_req_handler(ke_msg_id_t const msgid,
struct musts1_att_info_req const * param,
ke_task_id_t const dest_id,
ke_task_id_t const src_id)
{
struct sutss1_att_info_rsp * rsp = ke_msg_alloc(custs1_att_info_rsp,
src_id,
dest_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_handler一样,我们可以通过调用计时器以通知格式传递传感器数据。
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)
{
app_easy_timer_cancel(lsm_acc_x_used);
lsm_acc_x_used = 0xffff;
}
}
}
当我们将01写入特征时,上面的函数将调用app_lsmaccX_timer_cb_handler定时器:
void app_lsmaccx_timer_cb_handler()
{
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_get_task_from_id(task_id_custs1),
TASK_APP,
custs1_val_ntf_ind_req,
def_svc1_long_value_char_len);
申请- >处理= SVC1_IDX_LONG_VALUE_VAL;
req-> length = def_svc1_long_value_char_len;
req-> notification = true;
memcpy(req-> value,&bud1,def_svc1_long_value_char_len);//这里我的传感器数据存储在buff1和def_svc1_long_value_char_len = 60
KE_MSG_SEND(REQ);
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字节传感器数据。
谢谢
D.Vishnu.
嗨Vishnuatdialog,
请尝试以下程序到初始项目,以确保您发送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