你好,
我想在BLE_APP_PERITIELAL示例中添加一个自定义服务,不存在于SDK中,(灯泡 - 128位)及其单个特征(ON-128位)。
我已删除了应用程序中存在的现有服务/特征。
如果我没有错,我需要在user_prf_funcs []中添加一个条目,然后写两个函数:
void app_lb_db_create(void)
空白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
设备:
嗨Dhrishi,
您可以保持自定义任务不变,只修改特征,只删除不需要的特征,还有一个关于自定义服务的教程,您可以使用它来修改示例(教程3:构建自定义概要文件)。您还可以查看一下DSPS示例,该示例使用自定义配置文件和重命名作为DSPS专用配置文件,并使用自定义启用和创建数据库功能。
谢谢mt_dialog.
谢谢你的回复。我编辑了CUST1的外围GATT数据库,并添加了我的服务和特征,并效果正常。这是为了知名的服务和特征(每次有1种特征的服务)
现在,我想通过UART发送相同的服务/特征,并动态分配GATT数据库。这是可能的吗?
根据我看到的,struct cust_prf_func_callbacks中的att_db指针是const struct cust_prf_func_callbacks *类型。
那么,我该怎么做呢?
是否有任何其他方式可以动态地添加GATT数据库,当我收到UART时?
谢谢,
Hrishikesh
嗨Dhrishi,
如果上面的答案是有帮助的,请标记为接受。
关于你的第二个问题,我不确定我理解(我假设你使用完全托管的设计,你的应用程序也位于580中),因此,随着SDK的结构,数据库在配置后创建了数据库该设备不是强制性的(在设备配置时创建数据库),但您可以在命令发送通过UART时触发数据库的创建。或者,如果您希望在设备中修复数据库,而且通过外部设备配置它,您可以使用由RW-BLE-GATT-IS_1.PDF记录的内核消息。
谢谢mt_dialog.
你好,
谢谢您的回复。第一个答案在某种程度上是有帮助的。但是,我没有我提到的静态服务/特征,需要动态添加它们。
我正在经历RW-BLE-GATT-IS.PDF,并在我发现事件gattm_add_svc_req,gattm_add_attribute_req,我认为我需要发送。
是否有演示相同内容的示例应用程序。我找不到GATTM_ADD_SVC_REQ正在使用的任何地方的样例应用程序或sdk。我需要知道如何以及在哪里发送这些消息,并处理它们的响应?
适当的起点可能以跟随正确的方式帮助我会有所帮助。
谢谢,
Hrishikesh
嗨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);
req-> start_hdl = 0;
req-> task_id = 56;
申请- > total_size = 3;
req-> 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.
谢谢!这正是我想要的。使用上面的我试图添加一个服务(128位)和一个字符(128位)。当连接到外围设备时,我可以在nrf应用程序中看到服务,但不能看到特征(空服务)。你对这里可能出现的问题有线索吗?
从添加服务开始,我已经在每个服务的适当响应中添加了所有属性。
关于服务和属性的详细信息,按照我调用它们的相同顺序如下所示。你能帮我检查一下可能缺了什么吗
**************************************** SVC **************************************************
//添加服务(gattm_add_svc_req)
req-> start_hdl = 0;
申请- > task_id = TASK_APP;
req-> total_size = 36;// 16 + 19 + 1
req-> nb_att_uuid_16 = 2;
req-> nb_att_uuuid_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(req-> uuid,&att_decl_svc,sizeof(att_decl_svc));
//设置svc uuid值(GATTM_ATT_SET_VALUE_REQ)
req-> handle = svc_handle;
req-> length = att_uuid_128_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;
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;
req-> 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 derv填充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
嗨Dhrishi,
我没有看到任何可能是错误的,你的实现似乎是正确的。这个功能在最新的SDK中是隐藏的,但是您可以在SDK 3中查看数据库是如何创建的。AN-B-029文档附带了一些关于创建自定义概要文件的示例(文档和示例文件都可以在已停产应用程序说明的Documents选项卡中找到)。在. zip文件中有自定义配置文件的例子在sample128_task.c文件SDK3 sample128_create_db_req_handler()函数你可以找到一个例子在128年如何创建一个定制的概要文件(本质上是相同的命令,使用的命令栈执行当接收到命令,您正在使用)。
谢谢mt_dialog.
你好,
我已经提到了相同的写上面的代码。此外,在大多数地点,我看到一个呼叫将服务权限设置为perm(svc,disable)。为什么这需要?我尝试使用Enable,但仍然没有运气。此外,在我的代码中,总大小和nb_att_uuuid_ *值的值是合适的,对吧?
而且,访问AN-B-029似乎受到了限制。你能发邮件过来吗?
谢谢,
Hrishikesh
嗨Dhrishi,
使用权限(SVC,XXX)以便在创建后设置服务的右侧(禁用它只禁用您在未连接时禁用服务),当您连接时,您应该使用PERM(SVC,ENABLE)启用此服务以便从中央访问它或设置安全级别(例如,服务需要访问安全性以便访问)。是的总体大小为合适的1服务(+16)+ 1特征(+19)+ 1特征值(+1),属性的数量是适当的2 16bit uuid值和1 128bit uuid值。
关于AN-B-029的限制,我提到的文档没有限制,但我可以看到您没有权限访问任何文档或SDK本身,所以请转到产品DA14580并导航到软件和工具。在那里,你会看到挂锁图标 - 点击即可接受协议,您将被授予将在几天内进行SDK访问。
谢谢mt_dialog.
你好,
好的。我会这样做,以获取文件。
最后,我终于成功了。我错过了在att_char128_desc on_char中填充特征值句柄,因此看到了空服务。通过这种改变,我现在可以看到我的服务和特点。谢谢你的帮助。:-)
——Hrishikesh