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

⚠️
大家好. .感谢来到论坛。令人兴奋的消息!我们现在正在转移到新的论坛平台的过程中,它将提供更好的功能,并包含在主对话网站。所有的帖子和账号已经迁移。我们现在只接受新论坛的流量-请发布任何新的帖子在//www.xmece.com/support.我们会在接下来的几天修复bug /优化搜索和标记。
10个员额/0个新员额
最后发表
毗湿奴
离线
最后一次见到:1年1个月前
加入: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字节,没有任何影响。

之前,我们使用SDK6.0.2在pro开发板上广播了相同的60字节传感器数据,该开发板带有DA14585 AB硅芯片和传感器转接板。现在我们已经开发了一个原型,基于AC硅芯片,并与SDK 6.0.10合作,这一次它没有发生。

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

谢谢你!
D.Vishnu

设备:
PM_对话框
离线
最后一次见到:1周5天前
工作人员
加入: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哈希定义。

谢谢,下午好

毗湿奴
离线
最后一次见到:1年1个月前
加入:2017-07-25 07:44
你好PM_Dialog,

你好PM_Dialog,

我的数据包是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_对话框
离线
最后一次见到:1周5天前
工作人员
加入: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头文件。

谢谢,下午好

毗湿奴
离线
最后一次见到:1年1个月前
加入: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_对话框
离线
最后一次见到:1周5天前
工作人员
加入:2018-02-08 11:03
嗨vishnuatdialog,

嗨vishnuatdialog,

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

谢谢,下午好

毗湿奴
离线
最后一次见到:1年1个月前
加入: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 scanner应用程序中每秒自动更新一次的通知传感器数据后。在计时器中,我们定义了将转换传感器的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_对话框
离线
最后一次见到:1周5天前
工作人员
加入:2018-02-08 11:03
嗨vishnuatdialog,

嗨vishnuatdialog,

抱歉,但我误解了之前的一篇文章,因为你提到了“广告数据”我想你指的是广告字符串。你能试试写长特征值实现吗,就像SDK的ble_app_外围示例中的实现一样?请看一下SDK的这个示例。如果要写的特征值的长度大于20字节,那么用户_svc1_Long_将触发user_catch_rest_hndl()函数中的val_att_info_req_handler()。如果长度小于20字节,则将执行user_svc1_long_val_wr_indu handler()。因此,如果要在不交换MTU的情况下发送超过20个字节,则应执行与user_svc1_long_val_att_info_req_handler()相同的实现ble_应用程序_外围设备示例的功能。请尝试此实现并告诉我好吗?

谢谢,下午好

毗湿奴
离线
最后一次见到:1年1个月前
加入:2017-07-25 07:44
你好PM_Dialog,

你好PM_Dialog,

正如您提到的,我在ble_app_外围示例中看到了用户_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->value的函数。如果req->value存在,那么每当调用user\u catch\u rest\u 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写入character属性时,上述函数将调用app_lsmaccX_timer_cb_handler timer:
空白app_lsmaccX_timer_cb_handler ()
{
char buff1 [60];
sprintf(buff1,“{:GES0090001:%.2f:%.2f:%.2f:%.2f:%.2f:%d:}”,readFloatAccelX(),readFloatAccelY(),
readFloatAccelZ()、readTempC()、电池获取层(电池CR1225));

struct custs1_val_ntf_ind_req *req = KE_MSG_ALLOC_DYN(CUSTS1_VAL_NTF_REQ,
prf_get_task_from_id (TASK_ID_CUSTS1),
任务应用程序,
custs1_val_ntf_ind_req,
DEF_SVC1_LONG_VALUE_CHAR_LEN);

请求->句柄=SVC1\u IDX\u LONG\u VALUE\u 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_对话框
离线
最后一次见到:1周5天前
工作人员
加入:2018-02-08 11:03
嗨vishnuatdialog,

嗨vishnuatdialog,

请尝试在初始项目中执行以下步骤,以确保发送60字节的通知,并且主机能够获取这60字节。请将user_config.h头文件中user_gapm_conf结构的max_mtu项更改为60。完成此操作后,尝试通过通知发送60字节,并尝试使用sniffer,以检查60字节是否通过空中发送。如果您看到60字节可以发送,这意味着主机无法接收60字节。关于通知,设备可以通过特征通知发送的字节数受MTU(最大传输单位)的限制,MTU默认限制为23字节,包括ATT层开销,因此通知的有效负载为20字节。通过增加MTU大小,意味着您可以在一个通知上发送更多字节,因此在您的情况下,最大传输单位应为您希望发送的字节数+3个额外字节。请尝试使用此方法你的初始项目,让我知道。

谢谢,下午好