在ble_app_peripheral中添加自定义服务/特征数据库

11个帖子/ 0个新帖子
最后发表
dhrishi
离线
最后看到:3年3个月前
加入:2017-02-10 09:56
在ble_app_peripheral中添加自定义服务/特征数据库

你好,

我想添加一个自定义服务,不存在于sdk,(灯泡- 128位)和它的单一特征(ON - 128位)在ble_app_peripheral的例子。
我已经删除了应用程序中现有的服务/特征。
如果我没有错,我需要在user_prf_funcs[]中添加一个条目,然后编写两个函数:
空白app_lb_db_create(空白)
空白app_lb_db_enable (uint16_t)

另外,我需要添加那些在哪个task_id?task_cust1或者其他什么?

我试图在app_lb_db_create()中使用attmdb_add_service()和attmdb_add_attribute()创建服务和特征。但是,当我执行代码时,我认为看门狗过期了。
另外,app_lb_db_enable(uint16_t)的内容应该是什么。
是否有一些文档或者例子可以帮助我在这方面。

注意:在我的情况下,GATT数据库将通过UART从主机发送。因此,我不能使用在示例应用程序中使用过的任何const结构。亚博国际官网平台网址
我需要通过解析UART上的数据来动态添加GATT数据库。

谢谢,
Hrishikesh

设备:
MT_dialog
离线
最后看到:两个月两个星期前
工作人员
加入:2015-06-08 34
嗨dhrishi,

嗨dhrishi,

您可以保留自定义任务,只修改特征,只删除您不需要的特征,还有一个关于自定义服务的教程,您可以使用它来修改示例(教程3:构建自定义概要文件)。您还可以查看DSPS示例,该示例使用自定义配置文件和重命名作为DSPS专用配置文件,还使用自定义启用和创建数据库功能。

由于MT_dialog

dhrishi
离线
最后看到:3年3个月前
加入:2017-02-10 09:56
谢谢你的回复。我

谢谢你的回复。我为CUST1编辑了外围gatt数据库,并添加了我的服务和特性,它工作得很好。这是针对已知的服务和特征(两种服务各有一种特征)

现在,我想通过UART发送相同的服务/特征,并动态分配GATT数据库。这是可能的吗?
根据我所看到的,struct cust_prf_func_callbacks中的att_db指针是const struct cust_prf_func_callbacks *类型。
那么,我该怎么做呢?
是否有其他方式,我可以添加GATT数据库时,我接收它通过UART?

谢谢,
Hrishikesh

MT_dialog
离线
最后看到:两个月两个星期前
工作人员
加入:2015-06-08 34
嗨dhrishi,

嗨dhrishi,

如果以上答案对你有帮助,请标记为接受。

关于你提到的第二个问题,我不确定我理解(我假设您使用的是一个完全主持设计,应用程序位于580),因此,随着SDK创建数据库结构饱和后配置设备,这并不是强制性的(在设备配置数据库的创建),但是您可以通过UART发送命令来触发数据库的创建。或者,如果您不希望将数据库固定在设备中,而是希望通过外部设备对其进行配置,您可以使用RW-BLE-GATT-IS_1.pdf中记录的内核消息。

由于MT_dialog

dhrishi
离线
最后看到:3年3个月前
加入:2017-02-10 09:56
你好,

你好,

谢谢你的回复。第一个答案在某种程度上是有用的。但是,我没有我提到的静态服务/特征,需要动态地添加它们。
我正在浏览RW-BLE-GATT-IS.pdf,在那里我发现了事件GATTM_ADD_SVC_REQ, GATTM_ADD_ATTRIBUTE_REQ,我认为我需要发送。
是否有演示相同的示例应用程序。我找不到GATTM_ADD_SVC_REQ正在任何地方使用的样例应用程序或sdk。我需要知道如何和在哪里发送这些信息和处理他们的回复?

一个合适的起点可能会帮助我遵循正确的方式将是有帮助的。

谢谢,
Hrishikesh

MT_dialog
离线
最后看到:两个月两个星期前
工作人员
加入:2015-06-08 34
嗨dhrishi,

嗨dhrishi,

不幸的是,没有使用这些消息来创建数据库的例子,但其逻辑与内核中交换的所有其他消息相同,从应用程序任务发送消息到ATTM_TASK,并得到相应的响应。您可以在user_catch_rest_hndl处理程序中捕获消息并触发您的下一个操作,添加服务,然后在获得创建服务的响应之后添加属性等。创建服务的消息如下所示:

空白create_service_database(空白)

struct gattm_add_svc_req * req = KE_MSG_ALLOC(gattm_add_svc_req, TASK_ATTM, TASK_APP, gattm_add_svc_req);
申请- > start_hdl = 0;
申请- > task_id = 56;
申请- > total_size = 3;
申请- > nb_att_uuid_16 = 2;
申请- > nb_att_uuid_128 = 1;
ke_msg_send(要求的);

在user_catch_rest_hndl中,您可以捕获您的响应

案例GATTM_ADD_SVC_RSP:

Struct gattm_add_svc_rsp const *msg_param = (Struct gattm_add_svc_rsp const *)(param);
//捕获服务数据库已经被分配的消息,并开始添加属性
}打破;

由于MT_dialog

dhrishi
离线
最后看到:3年3个月前
加入:2017-02-10 09:56
谢谢!这正是我

谢谢!这正是我想要的。使用上面我试图添加一个服务(128位)和一个字符(128位)。当连接到外围设备时,我可以在nrf应用程序中看到服务,但不能看到特征(空服务)。你有什么线索可能会出问题吗?

从添加服务开始,我已经在每个服务的适当响应中添加了所有属性。
关于服务和属性的细节如下所示,这些属性的顺序与我调用它们的顺序相同。你能检查一下可能丢失了什么吗:

**************************************** SVC **************************************************
//添加服务GATTM_ADD_SVC_REQ
申请- > start_hdl = 0;
申请- > task_id = TASK_APP;
申请- > total_size = 36;// 16 + 19 + 1
申请- > nb_att_uuid_16 = 2;
申请- > nb_att_uuid_32 = 0;
申请- > nb_att_uuid_128 = 1;

******************************* 属性 *****************************************************************
//添加svc decl属性(GATTM_ADD_ATTRIBUTE_REQ)
申请- > start_hdl = svc_handle;//从上面的SVC成功RSP填充
req->perm = perm (RD, ENABLE);
申请- > uuid_len = ATT_UUID_16_LEN;
申请- > max_data_size = ATT_UUID_128_LEN;
memcpy(请求- > uuid、&att_decl_svc sizeof (att_decl_svc));

//设置svc uuid值(GATTM_ATT_SET_VALUE_REQ)
申请- >处理= svc_handle;
申请- >长度= ATT_UUID_128_LEN;
memcpy(请求- >值、svc_uuid sizeof (svc_uuid));/ / uint8_t svc_uuid [16];

//添加char decl属性(GATTM_ADD_ATTRIBUTE_REQ)
申请- > start_hdl = svc_handle;//从SVC成功RSP填充
req->perm = perm (RD, ENABLE);
申请- > uuid_len = ATT_UUID_16_LEN;
req->max_data_size = ATT_UUID_128_LEN + 3;
memcpy(请求- > uuid、&att_decl_char sizeof (att_decl_char));

//添加char值属性GATTM_ADD_ATTRIBUTE_REQ
申请- > start_hdl = svc_handle;
req->perm = perm (RD, ENABLE) | perm (WR, ENABLE);
申请- > uuid_len = ATT_UUID_128_LEN;
申请- > max_data_size = sizeof (uint8_t);
memcpy(请求- > uuid、char_uuid sizeof (char_uuid));/ / uint8_t char_uuid [16];

//设置初始值GATTM_ATT_SET_VALUE_REQ
Req ->handle = char_decl_handle //填充char decl RSP
申请- >长度= sizeof (on_char);
memcpy(请求- >值、&on_char sizeof (on_char));// on_char - struct att_char128_desc on_char = {ATT_CHAR_PROP_RD | ATT_CHAR_PROP_WR,{0,0},{16字节char UUID}};

谢谢,
Hrishikesh

MT_dialog
离线
最后看到:两个月两个星期前
工作人员
加入:2015-06-08 34
嗨dhrishi,

嗨dhrishi,

我没有看到任何可能是错误的,你的实现似乎是正确的。这个功能在最新的SDK中有些隐藏,但是您可以检查数据库是如何在SDK 3中创建的。AN-B-029文档附带了一些关于创建自定义配置文件的示例(文档和示例文件都可以在中断应用程序注释中的Documents选项卡中找到)。在. zip文件中有自定义配置文件的例子在sample128_task.c文件SDK3 sample128_create_db_req_handler()函数你可以找到一个例子在128年如何创建一个定制的概要文件(本质上是相同的命令,使用的命令栈执行当接收到命令,您正在使用)。

由于MT_dialog

dhrishi
离线
最后看到:3年3个月前
加入:2017-02-10 09:56
你好,

你好,

我提到了相同的写上面的代码。此外,在大多数地方,我看到了一个将服务权限设置为PERM(SVC,DISABLE)的调用。为什么需要这样做?我尝试使用ENABLE和DISABLE,但仍然没有运气。此外,在我的代码中,总大小和nb_att_uuid_*值的值是合适的,对吗?

而且,对AN-B-029的访问似乎受到了限制。你能发邮件给我吗?

谢谢,
Hrishikesh

MT_dialog
离线
最后看到:两个月两个星期前
工作人员
加入:2015-06-08 34
嗨dhrishi,

嗨dhrishi,

xxx烫(SVC)是为了设置使用服务后的正确的创建(禁用它只是禁用服务当你无关的)当你连接应该启用此服务的烫(SVC,使)为了访问它从中央或设置安全级别(例如,为了服务需要安全访问)。是的,您的服务的总大小是适当的1个服务(+16)+1个特征(+19)+1个特征值(+1)和属性的数字是适当的2个16位UUID值和1个128位UUID值。

关于AN-B-029的限制,我提到的文件没有限制,但是我可以看到你没有权限访问任何文件或者SDK本身,所以请转到产品DA14580,找到软件和工具。在那里你会看到一个挂锁图标-点击,接受协议,你将被授予将SDK访问在几天内。

由于MT_dialog

dhrishi
离线
最后看到:3年3个月前
加入:2017-02-10 09:56
你好,

你好,

好的。我这样做是为了拿到文件。
终于,我成功了。我没有在att_char128_desc on_char中填充特征值句柄,因此看到服务为空。通过这个改变,我现在可以看到我的服务和特点。谢谢你的帮助。:-)

——Hrishikesh