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

11个员额/0个新员额
最后一篇文章
dhrishi
离线
最后一次见到:3年7个月前
加入:2017-02-10 09:56
在ble_app_peripheral中添加一个自定义服务/特征数据库

你好

我想在ble_app_外围示例中添加一个sdk中没有的定制服务(灯泡-128位)及其单个特性(ON-128位)。
我已删除应用程序中存在的现有服务/特征。
如果我没有错,我需要在user_prf_funcs[]中添加一个条目,然后编写两个函数:
无效应用程序创建(无效)
空白app_lb_db_enable (uint16_t)

另外,我需要在task_id?task_cust1或其他什么?

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

注意:在我的例子中,GATT数据库将通过UART从主机发送。因此,我不能使用任何已在示例应用程序中使用的const结构。雷竞技安卓下载
我需要通过解析UART上的数据来动态添加GATT数据库。

谢谢,
Hrishikesh

设备:
MT_对话框
离线
最后一次见到:6个月2个星期前
工作人员
加入:2015-06-08 34
嗨,德里希,

嗨,德里希,

您可以留下自定义任务,并仅修改特性,只需删除您不需要的那些,还有一个关于您可以使用的自定义服务的教程修改示例(教程3:构建自定义配置文件)。您还可以查看使用自定义配置文件和重命名作为DSP专用配置文件的DSP示例,并且还使用自定义启用和创建数据库函数。

谢谢你的对话

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

谢谢你的回复。我为CUST1编辑了gatt外围数据库,并添加了我的服务和特性,效果很好。这是针对已知的服务和特性(2个服务,每个服务有1个特性)

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

谢谢,
Hrishikesh

MT_对话框
离线
最后一次见到:6个月2个星期前
工作人员
加入:2015-06-08 34
嗨,德里希,

嗨,德里希,

如果上面的答案是有帮助的,请标记为接受。

关于您的第二个问题,我不确定我是否理解(我假设您使用的是完全托管的设计,您的应用程序也位于580中),因此,由于SDK的结构正常,数据库是在配置设备后立即创建的,这不是强制性的(根据设备配置创建数据库),但是,您可以通过UART发送命令来触发数据库的创建。或者,如果您希望数据库不在设备中固定,而是通过外部设备进行配置,则可以使用RW-BLE-GATT-IS_1.pdf中记录的内核消息。

谢谢你的对话

dhrishi
离线
最后一次见到:3年7个月前
加入:2017-02-10 09:56
你好

你好

谢谢您的回复。第一个答案在某种程度上是有帮助的。但是,我没有我提到的静态服务/特征,需要动态添加它们。
我正在浏览RW-BLE-GATT-IS.pdf,在其中我找到了我认为需要发送的事件GATTM_ADD_SVC_REQ、GATTM_ADD_ATTRIBUTE_REQ。
是否有一个示例应用程序,它展示了相同的。我无法找到样品应用程序或SDK中的任何位置的Gattm_add_svc_req。我需要知道如何以及在哪里发送这些消息并处理他们的答复?

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

谢谢,
Hrishikesh

MT_对话框
离线
最后一次见到:6个月2个星期前
工作人员
加入:2015-06-08 34
嗨,德里希,

嗨,德里希,

不幸的是,没有使用这些消息来创建数据库的示例,但逻辑与内核中交换的所有其他消息相同,从应用程序任务向ATTM_任务发送消息,并得到相应的响应。您可以在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);
请求->启动\u hdl=0;
请求->任务id=56;
申请- > total_size = 3;
req->nb\U att\U uuid\U 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);
//捕获服务数据库已被分配的消息并开始添加属性
}打破;

谢谢你的对话

dhrishi
离线
最后一次见到:3年7个月前
加入:2017-02-10 09:56
谢谢这正是我想要的

谢谢这正是我想要的was looking for. Using the above I am trying to add 1 service (128 bit) and 1 char (128 bit). When connected to the peripheral, I can see the service but not the characteristic (empty service) in the nrf app. Do you have a clue about what could be going wrong here?

从添加服务开始,我已经在每个服务的适当响应中添加了所有属性。
关于服务和属性的详细信息,按照我调用它们的相同顺序如下所示。你能帮我检查一下可能缺了什么吗

**************************************** SVC **************************************************
//添加服务(GATTM\U添加\U SVC\U请求)
请求->启动\u hdl=0;
申请- > task_id = TASK_APP;
需求->总尺寸=36;//16 + 19 + 1
req->nb\U att\U uuid\U 16=2;
req->nb\U att\U uuid\U 32=0;
申请- > nb_att_uuid_128 = 1;

*******************************属性*****************************************************************
//添加svc decl属性(GATTM_ADD_ATTRIBUTE_REQ)
申请- > start_hdl = svc_handle;//从SVC成功的RSP上面
req->perm=perm(RD,启用);
申请- > 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\U句柄;
req->length=ATT\U UUID\U 128\U LEN;
memcpy(请求- >值、svc_uuid sizeof (svc_uuid));/ / uint8_t svc_uuid [16];

//添加decl属性(GATTM_ADD_ATTRIBUTE_REQ)
申请- > start_hdl = svc_handle;//从SVC成功RSP
req->perm=perm(RD,启用);
申请- > uuid_len = ATT_UUID_16_LEN;
请求->最大数据大小=ATT\u UUID\u 128\u LEN+3;
memcpy(请求- > uuid、&att_decl_char sizeof (att_decl_char));

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

//设置初始值(GATTM\U ATT\U设置值\U REQ)
req->handle=char\U decl\U 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_对话框
离线
最后一次见到:6个月2个星期前
工作人员
加入:2015-06-08 34
嗨,德里希,

嗨,德里希,

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

谢谢你的对话

dhrishi
离线
最后一次见到:3年7个月前
加入:2017-02-10 09:56
你好

你好

我引用了同样的方法来编写上述代码。此外,在大多数地方,我还看到一个将服务权限设置为PERM(SVC,DISABLE)的调用。为什么需要这样做?我试着使用ENABLE和DISABLE,但仍然没有成功。另外,在我的代码中,total size和nb_att_uuid_*值是合适的,对吗?

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

谢谢,
Hrishikesh

MT_对话框
离线
最后一次见到:6个月2个星期前
工作人员
加入:2015-06-08 34
嗨,德里希,

嗨,德里希,

PERM(SVC,xxx)用于在创建后设置服务的权限(禁用它只是在您未连接时禁用服务),当您连接时,应使用PERM(SVC,启用)以便从中央服务器访问它,或设置安全级别(例如,服务需要安全性才能访问)。是的,您服务的总大小是正确的1个服务(+16)+1个特征(+19)+1个特征值(+1),属性的数量是正确的2个16位UUID值和1个128位UUID值。

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

谢谢你的对话

dhrishi
离线
最后一次见到:3年7个月前
加入:2017-02-10 09:56
你好

你好

好的。我会这样做,以获取文件。
最后,我终于成功了。我错过了在att_char128_desc on_char中填充特征值句柄,因此看到了空服务。通过这种改变,我现在可以看到我的服务和特点。谢谢你的帮助。:-)

——Hrishikesh