你好,
我想添加一个自定义服务,没有在sdk中,(灯泡- 128位)和它的单一特征(ON - 128位)在ble_app_peripheral的例子。
我已经删除了应用程序中现有的服务/特征。
如果我没有错,我需要在user_prf_funcs[]中添加一个条目,然后写两个函数:
空白app_lb_db_create(空白)
void app_lb_db_enable(uint16_t)
此外,我需要添加那些task_id的那些?task_custs1或其他什么?
我正在尝试使用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数据库,并添加了我的服务和特性,它工作得很好。这是针对已知的服务和特征(2个服务各有1个特征)
现在,我想通过UART发送相同的服务/特征,并动态分配GATT数据库。这是可能的吗?
使用我所看到的,struct cust_prf_func_callbacks中的att_db指针是const struct cust_prf_func_callbacks *类型。
那么,我该怎么做呢?
当我通过UART接收GATT数据库时,是否有其他方法可以动态添加它?
谢谢,
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我认为我需要发送的事件。
是否有一个示例应用程序演示了这一点。在示例应用程序或sdk中,我找不到使用GATTM_ADD_SVC_REQ的地方。我需要知道如何以及在哪里发送这些消息并处理他们的响应?
一个合适的起点可能会帮助我遵循正确的方式,这将是有帮助的。
谢谢,
hrishikesh.
嗨dhrishi,
不幸的是,没有使用这些消息来创建数据库的例子,但其逻辑与内核中交换的所有其他消息相同,从应用程序任务向ATTM_TASK发送消息,然后得到相应的响应。您可以在user_catch_rest_hndl处理程序中捕获消息并触发您的下一个操作,添加服务,然后在获得创建服务的响应后添加属性等。创建服务的消息如下所示:
void create_service_database(void)
{
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;
req-> total_size = 3;
申请- > nb_att_uuid_16 = 2;
req-> nb_att_uuid_128 = 1;
KE_MSG_SEND(REQ);
}
在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
谢谢!这正是我所寻找的。使用上面的我正在尝试添加1服务(128位)和1个字符(128位)。连接到外围设备时,我可以看到该服务但不是NRF应用程序中的特征(空服务)。你有关于在这里出现问题的线索吗?
从添加服务开始,我在每个属性中添加了所有属性。
有关服务的详细信息以及我所谓的序列中的属性如下所示。请你检查可能缺少的内容:
**************************************** svc ****************************************************
//添加服务(GATTM_ADD_SVC_REQ)
申请- > start_hdl = 0;
req-> task_id = task_app;
申请- > total_size = 36;// 16 + 19 + 1
申请- > nb_att_uuid_16 = 2;
申请- > nb_att_uuid_32 = 0;
req-> nb_att_uuid_128 = 1;
******************************* 属性 *****************************************************************
// add svc delp属性(gattm_add_attribute_req)
req-> start_hdl = svc_handle;//从SVC成功填充以上的RSP
req->perm = perm (RD, ENABLE);
req-> uuid_len = att_uuid_16_len;
req-> 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(req->值,svc_uuid,sizeof(svc_uuid));// uint8_t svc_uuid [16];
//添加char delp属性(gattm_add_attribute_req)
req-> start_hdl = svc_handle;//填充SVC成功RSP
req->perm = perm (RD, ENABLE);
req-> uuid_len = att_uuid_16_len;
req->max_data_size = ATT_UUID_128_LEN + 3;
memcpy(req-> uuid,&att_decl_char,sizeof(att_decl_char));
//添加char值属性(gattm_add_attribute)
req-> start_hdl = svc_handle;
req-> perm = perm(rd,启用)|perm(wr,启用);
req-> uuid_len = att_uuid_128_len;
申请- > max_data_size = sizeof (uint8_t);
memcpy(req-> uuid,char_uuid,sizeof(char_uuid));// uint8_t char_uuuid [16];
//设置初始值(GATTM_ATT_SET_VALUE_REQ)
Req ->句柄= char_decl_handle //从char decl RSP填充
req-> length = sizeof(on_char);
memcpy(req->值,&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中创建数据库3.有关创建的一些示例,还有一个AN-B-029文档自定义配置文件(Document and示例文件中的两个文件和示例文件)可以在“已停止的应用程序笔记”中的“文档”选项卡中找到。在那个.zip文件中,sample128_create_db_req_handler()函数中的SDK3中的SDK3中的自定义配置文件示例您将能够找到有关如何创建128自定义配置文件的示例(所用命令基本相同命令堆栈收到您使用的命令时执行)。
由于MT_dialog
你好,
我在写上面的代码时引用了同样的方法。而且,在大多数地方,我看到一个设置服务权限到PERM(SVC,DISABLE)的调用。为什么需要这样做?我尝试使用ENABLE和DISABLE,但仍然没有运气。另外,在我的代码中,总大小的值和nb_att_uuid_*值是合适的,对吗?
此外,访问AN-B-029似乎受到限制。你能通过电子邮件发送。
谢谢,
hrishikesh.
嗨dhrishi,
xxx烫(SVC)是为了设置使用服务后的正确的创建(禁用它只是禁用服务当你无关的)当你连接应该启用此服务的烫(SVC,使)为了访问它从中央或设置安全级别(例如,为了服务需要安全访问)。是,您的服务的总大小是否正确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.