关于BLE外设GATT DB的读写

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

你好,

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

谢谢,
hrishikesh.

设备:
MT_dialog
离线
最后看到:3个月1周前
工作人员
加入:2015-06-08 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年4个月前
加入:2017-02-10 09:56
我将尝试设置EXCLUDE_DLG

我将尝试将exclude_dlg_cust1设置为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
离线
最后看到:3个月1周前
工作人员
加入:2015-06-08 34
嗨dhrishi,

嗨dhrishi,

内核没有处理的所有消息都被传递给TASK_APP(如果TASK_APP是消息的目的地),因此,当您使用GATTM_ADD_SVC_REQ(结构的task_id成员,它被TASK_APP任务填充)创建了服务之后,所有关于这个数据库的消息都可以由user_catch_rest_hndl()函数处理。关于你可以处理的消息,来自GATTC的消息有目的地TASK_APP和GAPC, GAPM,消息可以处理,包括写的GATTC_WRITE_CMD_IND,关于读的MTU_EXCHANGE,我不认为你能得到这个消息,因为它目前只支持RW配置文件。

由于MT_dialog

dhrishi
离线
最后看到:3年4个月前
加入: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()中没有得到任何消息。那么我如何处理read呢?

MT_dialog
离线
最后看到:3个月1周前
工作人员
加入:2015-06-08 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参数,以确定完成的事件。这对于您获得的大多数消息都是有效的。

set permissions调用不是强制的,如果您没有在创建时禁用服务(如AN-B-029中的示例所做的),那么调用权限启用不是强制的。另一方面,如果你禁用了服务,而没有在连接时启用它,那么你将不能读取或写入特征。

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

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

由于MT_dialog

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

你好,

在每个服务的dg_register_task_for_read_request(TASK_APP)的帮助下,当我从某个中心设备进行写操作时,我在user_catch_rest_hndl()中获得ATTS_READ_REQ_IND。根据您上面的解释,我看到dg_atts_read_cfm()需要与适当的状态代码一起使用,并且实际的读取响应在内部发送。如果我想从应用程序本身发送数据,是否可能?
我的意思是,我没有在DA14580 GATT数据库中存储特征值。当我转发这个被接收的读请求时,我得到UART上的实际值作为控制器的响应。是否有一种机制/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之外捕获它。

你能给我一个使用上面的GATTC_CMP_EVT和GATTC_WRITE_CMD_IND在user_catch_rest_hndl()中读取或写入外设请求的示例吗?简而言之,就是在函数中使用GATTC_CMP_EVT。

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

嗨dhrishi,

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

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

对于0x11,检查命令作为源的任务,以便检查这个命令实际上是什么。关于MTU,请检查rw - able - 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