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

⚠️
大家好. .感谢来到论坛。令人兴奋的消息!我们现在正在转移到新的论坛平台的过程中,它将提供更好的功能,并包含在主对话网站。所有的帖子和账号已经迁移。我们现在只接受新论坛的流量-请发布任何新的帖子在//www.xmece.com/support.我们会在接下来的几天修复bug /优化搜索和标记。
10个帖子/ 0个新帖子
最后发表
vishnuatdialog
离线
最后看到:8个月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小时22分钟前
工作人员
加入: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
离线
最后看到:8个月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小时22分钟前
工作人员
加入: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
离线
最后看到:8个月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小时22分钟前
工作人员
加入:2018-02-08 11:03
嗨vishnuatdialog,

嗨vishnuatdialog,

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

谢谢,PM_Dialog

vishnuatdialog
离线
最后看到:8个月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版本不支持新的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一旦我们写信给控制点计时器将开始后,点击自动通知我们的传感器数据在每秒钟所祝福扫描仪应用。在定时器,我们已经定义了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小时22分钟前
工作人员
加入: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
离线
最后看到:8个月3个星期前
加入:2017-07-25 07:44
你好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 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);
//提供连接索引。
负责- - - - - - > 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;



当我们将01写入特征时,上面的函数将调用app_lsmaccX_timer_cb_handler定时器:
空白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 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;
申请- >长度= 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小时22分钟前
工作人员
加入: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