如何在BLE上发送超过20个字节的Senor数据

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

你好,对话框,
我们在我们的原型板上通过I2C将传感器连接到DA14585。我们的传感器数据长度为60字节,但BLE仅广播了我使用通用应用程序(BLE扫描仪)的20个字节。我试图增加MTU大小(.max_mtu),def_svc4_lsm_acc_x_char_len = 60,但没有什么影响仍然仅广播20个字节。

以前我们在Pro-Development Loard上使用SDK 6.0.2进行了相同的60个字节传感器数据,具有DA14585 AB硅芯片和传感器断路板。现在我们开发了一种基于AC硅芯片的原型,并使用SDK 6.0.10这次没有发生。

请告诉我们,我需要做什么改变广播超过20字节的BLE?

谢谢你!
D.Vishnu

设备:
PM_DIALOG.
离线
最后一次露面:2天2小时前
工作人员
加入: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 packet是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天2小时前
工作人员
加入:2018-02-08 11:03
嗨vishnuatdialog,

嗨vishnuatdialog,

对不起,我不明白你想把你的数据存储到广告字符串。向用户发布数据的有效可用字节只有31字节中的28字节,因为为设置标志数据保留了3字节。由于这是与规范相关的限制,您将无法在广告包中容纳超过28字节的数据。虽然,当您使用智能手机作为扫描仪时,您可以接收超过31字节(最多62字节),但这是因为智能手机使用主动扫描,这意味着它将请求第二个PDU,每当它检测到来自外设的广告。这称为扫描请求,对该请求的响应(另外31个字节(28个可用,3个保留))被恰当地命名为扫描响应。因此,我建议您将数据存储到USER_ADVERTISE_DATA和USER_ADVERTISE_SCAN_RESPONSE_DATA定义的user_config.h头文件。

谢谢,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以\ \ . xC6 \表示就是x10 \ x99 \ x2E 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以\ \ . xC6 \表示就是x10 \ x99 \ x2E xFE \ xED”)

///扫描响应数据长度-最大31字节
#定义USER_ADVERTISE_SCAN_RESPONSE_DATA_LEN (sizeof (USER_ADVERTISE_SCAN_RESPONSE_DATA) 1)

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

我不知道我已经定义了正确的方式。请澄清。

谢谢你!
D.Vishnu

PM_DIALOG.
离线
最后一次露面:2天2小时前
工作人员
加入:2018-02-08 11:03
嗨vishnuatdialog,

嗨vishnuatdialog,

我从我的身边测试了与发布的相同代码,我能够在BLE扫描仪移动应用程序中获得广告和扫描响应数据。您的扫描响应数据已正确定义。您能否描述如何尝试测试它?此外,你能澄清你想完成的内容吗?您希望将传感器数据存储到广告字符串中?我明白了吗?

谢谢,PM_DIALOG.

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

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

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

之后,我们进行了传感器和DA14585芯片的原型设计。由于之前的SDK版本不支持新的AC硅芯片,我们将代码更新到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 scanner app中的传感器数据只有20字节。我们尝试了很多方法,但是无法增加我们的传感器数据长度。

我不确定我已经把我的数据放在了广告字符串中,我们在user_cust1_impl.c中创建了一个回调计时器,一旦我们写入控制点,计时器将开始,然后单击通知通知我们的传感器数据在BLE扫描仪中每秒自动更新。应用程序。在计时器内部,我们已经定义了Sprintf功能,它将转换我们的传感器数据在BLE扫描仪应用中可见,如下方式{:0.02:-0.00:1.06:.4.83:0.91:1.05:25:100:}。表示我们的传感器数据的数据格式如下{AX:AY:AZ:GX:GY:GZ:TC:BAT,}。

但是,现在我们可以像{:0.02:-0.00:1.06:.4,这样只读取前20个字节。为了增加传感器数据长度,我们需要在代码中更改哪些地方?
正如你在我的前一篇文章中看到的,我试图改变DLE, DEF_SVC4_LSM_ACC_X_CHAR_LEN, USER_ADVERTISE_SCAN_RESPONSE_DATA变量,什么都没有得到解决。

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

谢谢你!
D.Vishnu

PM_DIALOG.
离线
最后一次露面:2天2小时前
工作人员
加入:2018-02-08 11:03
嗨vishnuatdialog,

嗨vishnuatdialog,

道歉,但我误解了以前的帖子,因为你提到了“广告数据”,我认为你的意思是广告字符串。请问尝试写入长度的特征值实现,作为SDK的BLE_APP_PERITIVELAL示例中的实现吗?请看看SDK的这个例子。如果要写入的特征值的长度大于20字节,则将触发user_catch_rest_hndl()函数中的user_svc1_long_val_att_info_req_handler()。如果长度小于20字节,则将执行user_svc1_long_val_wr_ind_handler()。因此,如果要在没有MTU Exchange的情况下发送超过20个字节的字节,则应在BLE_APP_PERITIALLAL示例的user_svc1_long_val_att_info_req_handler()函数中执行相同的实现。你能试试这个实施,让我知道吗?

谢谢,PM_DIALOG.

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

你好PM_Dialog,

如您所提到的,我在ble_app_peripheralizal示例中看到了user_svc1_long_val_att_info_req_handler。它被定义为这样。

Void user_svc1_rest_att_info_req_handler(ke_msg_id_t const msgid,
Struct custs1_att_info_req const *param,
ke_task_id_t const dest_id,
ke_task_id_t const src_id)
{
struct custs1_att_info_rsp *rsp = KE_MSG_ALLOC(custs1_att_info_rsp,
src_id,
dest_id,
custs1_att_info_rsp);
//提供连接索引。
rsp-> conidx = app_env [param-> conidx] .conidx;
//提供属性索引。
负责- - - - - - > att_idx =参数- > 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;
}
}
}
上面的函数将在向Charactreristic写入01时调用app_lsmaccx_timer_cb_handler计时器:
空白app_lsmaccX_timer_cb_handler ()
{
char buff1 [60];
Sprintf(Buff1,“{:GES0090001:%。2F:%。2F:%。2F:%。2F:%d:}”,readfloataccelx(),readfloataccaly(),
readfloataccelz(),readtempc(),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);

req-> handle = svc1_idx_long_value_val;
申请- >长度= DEF_SVC1_LONG_VALUE_CHAR_LEN;
申请- >通知= true;
memcpy(req->value, &buff1, DEF_SVC1_LONG_VALUE_CHAR_LEN);//这里我的传感器数据存储在buff1和DEF_SVC1_LONG_VALUE_CHAR_LEN= 60

ke_msg_send(要求的);
if (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天2小时前
工作人员
加入:2018-02-08 11:03
嗨vishnuatdialog,

嗨vishnuatdialog,

请尝试将以下过程尝试到初始项目中,以确保您在通知中发送60个字节,并且主设备能够获得这些60个字节。请在user_config.h标头文件中更改user_gapm_conf结构的max_mtu项到60.完成此操作后,尝试通过通知发送60bytes并尝试使用嗅探器才能检查60个字节是否通过空气发送.如果您发现可以发送60个字节,这意味着主设备无法接收60个字节。关于通知,设备可以通过MTU(最大传输单元)发送设备的字节的量由MTU(最大传输单元)限制,默认情况下MTU是限制在包括ATT层开销的23个字节中,因此通知的有效载荷是20个字节。通过增加MTU大小意味着您可以在一个通知上发送更多字节,因此在您的情况下,最大传输单元应为您想要发送+ 3额外字节的字节数。请尝试在您的初始项目中,让我知道。

谢谢,PM_DIALOG.