如何通过BLE发送超过20字节的传感器数据

⚠️
大家好. .感谢来到论坛。令人兴奋的消息!我们现在正在转移到新的论坛平台的过程中,它将提供更好的功能,并包含在主对话网站。所有的帖子和账号已经迁移。我们现在只接受新论坛的流量-请发布任何新的帖子在//www.xmece.com/support.我们会在接下来的几天修复bug /优化搜索和标记。
10个帖子/ 0个新帖子
最后发表
vishnuatdialog
离线
最后看到:1年3个星期前
加入:2017-07-25 07:44
如何通过BLE发送超过20字节的传感器数据

你好,对话框,
我们已经在原型板上通过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,这次它没有发生。

请告诉我们,我需要为播放超过20个字节在BLE做什么样的变化?

谢谢你!
D.Vishnu

设备:
PM_Dialog
离线
最后看到:2天7小时前
工作人员
加入:2018-02-08 11:03
嗨vishnuatdialog,

嗨vishnuatdialog,

正如我能够理解你的查询,你想实现的是数据长度扩展(DLE)功能。如果我误解了你的问题,请让我知道。在这种情况下,应该使用正确的DLE包配置da1458x_config_advanced.h头文件的CFG_MAX_RX_PACKET_LENGTH和CFG_MAX_TX_PACKET_LENGTH定义。然后,您应该修改user_config.h头文件的user_gapm_conf结构中的.max_txoctets和.max_txtime。此外,您应该使用MTU大小.max_mtu = 60。另外,我强烈建议您DA14585 SoC的DSPS应用程序。此应用程序使用数据长度扩展。请搜索USE_DLE哈希定义。

谢谢,PM_Dialog

vishnuatdialog
离线
最后看到:1年3个星期前
加入:2017-07-25 07:44
你好PM_Dialog,

你好PM_Dialog,

我的DLE包是60字节。

// BLE扫描器读取的数据格式:{:0.02:-0.00:1.06:.4.83:0.91:1.05:25:100:}
/ /十六进制:Ox7B3A302E30323A2D302E30303A312E30363A2D342E38333A302E39313A312E30353A32353A3130303A7D000700000000400000004000000FF000000
//这个数据我仍然在DA14585DB的pro开发板上通过I2C (P0_2,P0_3引脚)集成传感器分路板与SDK 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。
十六进制:Ox7B3A302E30313A2D302E32353A302E39373A342E

我也验证了DSPS代码,它的所有地方都是默认最大值(251)。没有自定义的值。

如果需要在我的代码中做任何修改,请提到。

谢谢你!
D.Vishnu

PM_Dialog
离线
最后看到:2天7小时前
工作人员
加入:2018-02-08 11:03
嗨vishnuatdialog,

嗨vishnuatdialog,

很抱歉,但我不明白,你想你的数据存储到广告的字符串。所述广告数据提供给用户的有效可用的字节是仅作为3个字节被保留用于设置标志数据28个字节的31个字节的进行。由于这是规范相关的限制,你将无法适应超过28个字节的数据在广告数据包。虽然,当你使用智能手机作为一台扫描仪,你都能够获得超过31个字节(最多62个字节),但是这是因为智能手机正在使用主动扫描,这意味着它将请求第二个PDU时,它检测到来自广告外围。这就是所谓的扫描请求和对该请求的响应,另一个31个字节(28可用于使用和3保留),则适当命名扫描响应。所以,我建议你将数据存储双双进入USER_ADVERTISE_DATA进入user_config.h头文件的USER_ADVERTISE_SCAN_RESPONSE_DATA定义。

谢谢,PM_Dialog

vishnuatdialog
离线
最后看到:1年3个星期前
加入:2017-07-25 07:44
你好PM_Dialog,

你好PM_Dialog,
我已经以这种方式尝试将数据存储在这两个变量
///广告数据
#定义USER_ADVERTISE_DATA(\“\ x03”
ADV_TYPE_COMPLETE_LIST_16BIT_SERVICE_IDS \
ADV_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个字节被保留到集
#定义USER_ADVERTISE_DATA_LEN (sizeof (USER_ADVERTISE_DATA) 1)

///扫描响应数据
#定义USER_ADVERTISE_SCAN_RESPONSE_DATA(\“\ x03”
ADV_TYPE_COMPLETE_LIST_16BIT_SERVICE_IDS \
ADV_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字节
#定义USER_ADVERTISE_SCAN_RESPONSE_DATA_LEN (sizeof (USER_ADVERTISE_SCAN_RESPONSE_DATA) 1)

尽管如此,BLE只宣传了20个字节。

我不知道我定义的是正确的方式。请澄清。

谢谢你!
D.Vishnu

PM_Dialog
离线
最后看到:2天7小时前
工作人员
加入:2018-02-08 11:03
嗨vishnuatdialog,

嗨vishnuatdialog,

我从我的方面测试了相同的代码,你已经发布,我能够得到广告和扫描响应数据在BLE Scanner移动应用程序。您的扫描响应数据已正确定义。你能描述一下你是如何测试它的吗?另外,你能说明一下你想要完成什么吗?您希望将传感器数据存储到广告字符串中吗?我理解对了吗?

谢谢,PM_Dialog

vishnuatdialog
离线
最后看到:1年3个星期前
加入:2017-07-25 07:44
你好PM_Dialog,

你好PM_Dialog,
一旦我将原型连接到BLE Scanner应用程序,我们将写入“01”数据到控制点,然后,我们将点击通知按钮,我的传感器数据将每秒更新。

正如我之前告诉你的,我已经看到了我的传感器数据60字节的单一特征更新在BLE Scanner应用程序,当我们与DA14585 Dev板(AB硅)+传感器breakout板与SDK 6.0.2。

在那之后,我们已经走了原型传感器和DA14585芯片。由于以前的SDK版本将不支持新的交流硅芯片,我们更新了我们的代码SDK 6.0.10。现在BLE是在每个单独的特征仅发送20字节的数据。

在版本(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:0.4 ,.为了提高该传感器的数据长度,我们需要改变我们的代码?
正如你在我以前的帖子看,我试图改变DLE,DEF_SVC4_LSM_ACC_X_CHAR_LEN,USER_ADVERTISE_SCAN_RESPONSE_DATA变量没有被解决。

请告诉我,如果我的代码缺少什么?

谢谢你!
D.Vishnu

PM_Dialog
离线
最后看到:2天7小时前
工作人员
加入:2018-02-08 11:03
嗨vishnuatdialog,

嗨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

vishnuatdialog
离线
最后看到:1年3个星期前
加入:2017-07-25 07:44
你好PM_Dialog,

你好PM_Dialog,

正如您提到的,我在ble_app_peripheral示例中看到了user_svc1_long_val_att_info_req_handler。它是这样定义的。

空隙user_svc1_rest_att_info_req_handler(ke_msg_id_t常量MSGID,
结构custs1_att_info_req常量* PARAM,
ke_task_id_t const dest_id,
ke_task_id_t const src_id)

结构custs1_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;
//强制当前长度为零。
负责- >长度= 0;
//提供ATT错误码。
负责- - - - - - >状态= ATT_ERR_WRITE_NOT_PERMITTED;

ke_msg_send(负责);

在上面的函数中,没有这样的函数可以要求->值。如果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 custs1_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,参数[0]- >值,参数- >长度);
if (val != CUSTS1_CP_LSM_ACCX_DISABLE)

lsm_acc_x_used = 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 = 0 xffff;



当我们将01写入特征时,上面的函数将调用app_lsmaccX_timer_cb_handler定时器:
无效app_lsmaccX_timer_cb_handler()

炭BUFF1 [60];
sprintf (buff1,“{:GES0090001: % .2f: % .2f: % .2f: % .2f: % d:}”,readFloatAccelX (), readFloatAccelY (),
readTempC readFloatAccelZ (), (), battery_get_lvl (BATT_CR1225));

struct custs1_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->长度= DEF_SVC1_LONG_VALUE_CHAR_LEN;
req-> notification = true;
memcpy(req->value, &buff1, DEF_SVC1_LONG_VALUE_CHAR_LEN);//这里我的传感器数据存储在buff1和DEF_SVC1_LONG_VALUE_CHAR_LEN= 60

KE_MSG_SEND(REQ);
如果(ke_state_get(TASK_APP)== APP_CONNECTED)

lsm_acc_x_used = app_easy_timer(APP_PERIPHERAL_CTRL_TIMER_DELAY, app_lsmaccX_timer_cb_handler);


对不起,我不知道如何增加我的特征长度,以便在user_svc1_long_val_att_info_req_handler()函数中传递我的传感器数据,以及如何在应用程序端实现这一点(在BLE Scanner中)。

由于所有其他处理程序都有写和通知请求,这些请求可以作为特性的属性实现,那么我们可以使用BLE Scanner调用它们来实现。

我可以通过BLE发送我完整的60字节的传感器数据。

谢谢你!
D.Vishnu

PM_Dialog
离线
最后看到:2天7小时前
工作人员
加入:2018-02-08 11:03
嗨vishnuatdialog,

嗨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