关于BLE外设GATT DB的读写

8个帖子/ 0新
最后发表
Dhrishi.
离线
最后看到:3年3个月前
加入:2017-02-10 09:56
关于BLE外设GATT DB的读写

你好,

在我的应用程序中,使用从控制器上发送的命令创建GATT DB。我绝不使用标准配置文件或甚至是对话框SDK提供的自定义服务/特征。我现在已经完成了填充GATT数据库并开始广告。我可以在NRF应用程序中看到附件,并能够连接到它。
现在,我想抓住阅读,写和所有其他事件/请求(MTU信息,连接,断开,指示),以便我可以执行它们。我可以在user_catch_rest_hndl()中这样做吗?
如果是,我需要处理的具体事件是什么?我尝试使用GATTC_WRITE_CMD_IND, GATTC_READ_IND, GATTC_READ_CMD_IND,但是控件没有到达那里(添加了断点来检查)
如果没有,那么这样做的正确方法是什么?

谢谢,
hrishikesh.

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

嗨dhrishi,

指向GATTC_WRITE_CMD_IND等的指示是从BLE堆栈发送的命令,然后传递给应用程序,以便到达catch_rest_handler函数。亚博国际官网平台网址因为你正在实现一些完全自定义的东西,你不能使用SDK为自定义配置文件提供的基础设施。我不确定您究竟是如何创建数据库的,或者您在哪些任务上分配了创建的配置文件。所以我只能推测你不了解症状的原因。如果你有BLE_CUSTOM1_SERVER定义为了创建自定义任务但你仍在使用的基本实现custs_profile SDK提供的那么也许消息服务和处理的现有实现定制的概要文件,这就是为什么你不得到任何catch_rest函数。尝试将exclude_dlg_cust1定义设置为1,并检查是否执行了catch_function。

由于MT_dialog

Dhrishi.
离线
最后看到:3年3个月前
加入:2017-02-10 09:56
我会尝试设置complude_dlg

我会尝试将complude_dlg_custs1设置为1并执行。
我已经把配置文件分配给TASK_APP,我没有BLE_CUSTOM1_SERVER。
用于GATT数据库创建的命令:
struct gattm_add_svc_req * req = ke_msg_alloc(gattm_add_svc_req,task_attm,task_app,
gattm_add_svc_req);

struct gattm_add_attribute_req *req = KE_MSG_ALLOC(gattm_add_attribute_req,
TASK_ATTM、TASK_APP gattm_add_attribute_req);

struct gattm_att_set_value_req * req = ke_msg_alloc(gattm_att_set_value_req,task_attm,task_app,
gattm_att_set_value_req);

在这种情况下,堆栈将提供给读/写/指示/ mtu协商的应用程序的事件是什么?
它们是否可以在user_catch_rest_hndl()中被捕获,或者是否有其他相同的方法。

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

嗨dhrishi,

内核未处理的所有消息都将传达给Task_App(如果是消息的目标),因此如果您使用Gattm_add_svc_req创建服务时,它已将其填充与task_app的结构的task_id成员任务然后可以由user_catch_rest_hndl()函数处理关于该数据库的所有消息。关于您可以处理哪些消息,从TAFT_APP和GAPC,GAPM,邮件中的GATTC中的消息可以被处理,包括GATTC_WRITE_CMD_IND以及关于阅读的MTU_EXCHANGE,我不认为您将是能够获得该消息,自目前仅由RW配置文件支持。

由于MT_dialog

Dhrishi.
离线
最后看到:3年3个月前
加入:2017-02-10 09:56
如果我创建了a

因此,如果我创建了使用task_app发送内核邮件的自定义数据库,而不是使用任何标准配置文件,那么我如何处理读取消息。
此外,在填充数据库并启动广告后,当中央(智能手机上的NRF应用程序)连接我所看到的是:
我在user_catch_rest_hndl()中得到一个带有msgid 0x11的消息。当我检查SDK时,它映射到GATTM_DESTROY_DB_RSP。这里有什么问题吗?我们什么时候收到这个消息?
此外,对于相同的值0x11,我看到它映射到gattc_write_cmd_cfm。那么,将被考虑哪一个。
简而言之,我看到一个值有多个消息。与我使用的任务,我的GATT数据库配置,你可以让我知道哪些消息(从哪些文件在SDK)我需要考虑

我没有得到MTU信息消息。我如何得到当前通信MTU的值?

是下面的呼叫强制性吗?或者这可以有效果吗?
attmdb_svc_set_permission (svc_hdl烫(SVC,使));
我既没有禁用一开始也不启用它。甚至在自定义数据库人口的情况下是必要的吗?不能使用上面的呼叫导致上面的问题?

当我从中心设备写入时,我得到消息0x0e,它是GATTC_WRITE_CMD_IND(我认为)。是正确的吗?
当我从中央设备读取时,我在user_catch_rest_hndl()中没有Mesage。我如何处理阅读?

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

嗨dhrishi,

就像我上面提到的,读取是不可能的,你不能在user_catch_rest_hndl()函数中获得GATTC_READ_IND,消息不会传递给应用程序。在SDK5.0.4中,为了获得read命令,添加了一条新消息(ATTS_READ_REQ_IND)。因此,您可以做的是使用dg_register_task_for_read_request(TASK_APP);为该消息注册TASK_APP,通过这样做,您将能够在user_catch_rest_hndl()中捕获ATTS_READ_REQ_IND,并检查已读取的句柄。您还必须使用dg_atts_read_cfm()函数响应该消息(如果不响应,将导致断开连接)。

消息,你得到0 x11对应GATTM_DESTROY_DB_RSP这意味着在某种程度上可能当你连接调用GATTM_DESTROY_DB_REQ因为这是你得到的响应,但其不仅数量你需要检查的消息也任务消息来源。如果你不调用销毁数据库,我不认为数据库销毁确认是你看到的。

关于您没有在Task_App(MTU_EXCHANGE,GATTC_WRITE_CMD_IND)中获取任何消息的事实,在发送GATTM_ADD_SVC_REQ时是否将TASK_ID声明为TASK_APP?除此之外,我无法猜测任何其他原因都让人创造了数据库的创作(你得到了对数据库的响应的事实,如果这是你得到的话,那就太好了。关于它的一个gattc_write_cmd_cfm,这不是你在执行写的时候得到的指示,也是一个gattc_的确认,这意味着在收到gattc_cmp_evt时应发生这种情况(如果您发出的命令,则应完成您应该完成完成的命令),所以你首先要抓住gattc_cmp_evt的情况,然后可以检查req_type参数以确定完成的事件。这对您获得的大多数消息有效。

如果您在创建时未禁用服务(作为AN-B-029 DO的示例),则设置的权限调用不是强制性的,然后它不义务调用权限的启用。另一方面,如果您已禁用该服务并且在连接时启用它,则无法读取或写入该特性。

如果您从中心设备写入,您应该得到的正确消息是GATTC_WRITE_CMD_IND,并且您应该能够在GATTC_CMP_EVT之外捕获它。

关于特征的阅读,请在你问题的开头检查一下。

由于MT_dialog

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

你好,

在每个服务的DG_REGISTER_TASK_FOR_READ_REQUEST(TASS_APP)的帮助下,当我从某些中央设备写入时,我在user_catch_rest_hndl()中获取ATTS_READ_REQ_IND。通过上面的说明,我看到DG_atts_Read_cfm()需要与适当的状态代码一起使用,并且在内部发送实际的读取响应。如果我想从应用程序本身发送数据,是否可能?
我的意思是,我不会将特征值存储在DA14580 GATT数据库中。当我转发收到的读取请求时,我将实际值作为来自控制器的响应。是否有一个机制/ api,我可以用来完全通过自己发送读取响应(以及数据)。

关于写请求,如果我有uint8_t类型的特征,如果中央设备在它上写入2个字节(uint16_t),那么sdk会做什么?
我所看到的是,在这种情况下,我没有得到gattc_write_cmd_ind事件。在生成事件之前是否有关于数据类型和/或大小的检查?

对于GATT数据库,所有的服务、特征和描述符都添加了,其中dest_id为TASK_ATTM, src_id为TASK_APP。

大约0x11事件,我看到,当任何中央连接到我的设备时,我得到0x11事件差不多2-3次。那可以是什么?我不是从我的代码中调用gattm_destroy_db_req。
此外,为MTU交换收到的明确事件是什么。我无法在活动中找到它。我基本上希望协商的MTU值为要发送到控制器的当前连接。

我无法理解你的以下声明:
如果您从中心设备写入,您应该得到的正确消息是GATTC_WRITE_CMD_IND,并且您应该能够在GATTC_CMP_EVT之外捕获它。

您能否在user_catch_rest_hndl()中使用上面的gattc_cmp_evt和gattc_write_cmd_ind给我一个样本示例。简而言之,在函数中使用gattc_cmp_evt。

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

嗨dhrishi,

dg_register_task_for_read_request,它是它使用的函数,以便在中央读取特征时对应用程序指示,而不是在写它时。关于你的第二个问题,如果可以在设备读取数据库时可以向确认发送数据,这是不可能的,因为我提到的那样,这是一个修补程序和数据发送到中心的数据库而不是申请提供。

如果你发送的一个无效的长度值特征堆栈在中央直接将返回一个错误,你不会得到应用程序级别来处理这种情况下,它会通知中央,他已经发送一个无效的属性值的长度信息。

关于0x11检查命令作为源的任务,以检查此命令实际的是什么。关于MTU,请检查RW-BLE-GATT-IS.PDF MTU请求由GATT_EXC_MTU_REQ启动,并使用相应的操作使用GATTC_CMP_EVT发出完成。

关于GATTC_WRITE_CMD_IND我的意思是你只需要抓住它catch_rest_handler你没有赶上GATTC_CMP_EVT第一,然后检查操作,以防你在做这样的事,只是使用开关()GATTC_WRITE_CMD_IND。

由于MT_dialog