你好,
在我的应用程序中,使用从控制器上发送的命令创建GATT DB。我绝不使用标准配置文件或甚至是对话框SDK提供的自定义服务/特征。我现在已经完成了填充GATT数据库并开始广告。我可以在NRF应用程序中看到附件,并能够连接到它。
Now, I want to catch read, write and all other events/requests (mtu info, connection, disconnection, indication) so that I can act on them. Can I do that in user_catch_rest_hndl()
如果是,我需要处理的确切事件是什么?我尝试使用gattc_write_cmd_ind,gattc_read_ind,gattc_read_cmd_ind,但控制没有到达那里(增加了检查要检查的断点)
If not, then what is the right way of doing this?
Thanks,
Hrishikesh
设备:
嗨Dhrishi,
您指的指示要引用GATTC_WRITE_CMD_IND等,是从BLE堆栈发送的命令,然后传达给应用程序以达到CATCH_REST_HANDLER函数。雷竞技安卓下载由于您正在实现完全自定义的内容,因此您不会使用SDK提供自定义配置文件的Fina菊库。我不确定您究竟是如何创建数据库,或者在哪些任务上,您已分配了所创建的配置文件。所以我只能承担你没有迹象的原因。如果您有BLE_CUSTOM1_SERVER定义,则为要创建的自定义任务,但您仍然使用SDK提供的CUSTS_PROFILE的基本实现,那么您可以通过自定义配置文件的现有实现和处理邮件,并且为什么没有在catch_rest函数中获取任何内容。尝试设置为1 exclude_dlg_custs1定义并检查catch_function是否已执行。
谢谢mt_dialog.
我会尝试将complude_dlg_custs1设置为1并执行。
我已将配置文件分配给task_app,我没有ble_custom1_server。
Commands used for GATT database creation:
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()中捕获,或者是否有其他方法。
嗨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.
所以,如果我创造了一个custom database sending kernel messages using TASK_APP and not using any of the standard profiles, then how do I handle the read message.
Also, after populating the database and starting the advertisement, when the central (nRF app on a smartphone) connects what I see is:
我收到msgid 0x11中的ysgid 0x11中的邮件,在user_catch_rest_hndl()中。当我检查SDK时,它映射到Gattm_Destroy_DB_RSP。这里有什么不对吗?我们什么时候收到这条消息?
此外,对于相同的值0x11,我看到它映射到gattc_write_cmd_cfm。那么,将被考虑哪一个。
简而言之,我看到一个值的多条消息。通过我用于我的GATT数据库配置的任务,可以让我知道我需要考虑哪些消息(从哪些文件中的文件)
我没有得到mtu的信息。如何获得当前MTU的沟通价值?
是下面的呼叫强制性吗?或者这可以有效果吗?
attmdb_svc_set_permission(svc_hdl,perm(svc,启用));
我没有在beginni残疾人服务ng nor enabled it. Is it required even in case of a custom database population? Can not using the above call lead to the problem above?
当我从中央设备写入时,我得到消息0x0e,它是gattc_write_cmd_ind(我想)。这是正确的吗?
当我从中央设备读取时,我在user_catch_rest_hndl()中没有Mesage。我如何处理阅读?
嗨Dhrishi,
关于阅读作为上面提到的读数是不可能的,您不会在user_catch_rest_hndl()函数中获取gattc_read_ind,消息未传达给应用程序。在SDK5.0.4中在SDK5.0.4中完成了什么,以获取读取命令是添加了新消息(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()函数响应该消息(如果您不响应这将导致断开连接)。
您获得0x11的消息对应于gattm_destroy_db_rsp,这意味着在您连接时的某些时候可能会调用gattm_destroy_db_req,因为这是您得到的响应,但它不仅是您必须要检查的消息,但它也必须检查的消息消息来自。如果您不调用Destroy数据库,我不认为数据库销毁确认就是您所看到的。
关于您没有在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.
你好,
在每个服务的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。
About 0x11 event, I see that when any central connects to my device which is a peripheral, I get 0x11 event almost 2-3 times. What can this be then? I am not invoking GATTM_DESTROY_DB_REQ from my code.
此外,为MTU交换收到的明确事件是什么。我无法在活动中找到它。我基本上希望协商的MTU值为要发送到控制器的当前连接。
我无法理解你的以下声明:
如果从中央设备编写,则应获得的正确消息是Gattc_Write_cmd_ind,您应该能够在GattC_cmp_evt之外捕获它。
您能否在user_catch_rest_hndl()中使用上面的gattc_cmp_evt和gattc_write_cmd_ind给我一个样本示例。简而言之,在函数中使用gattc_cmp_evt。
嗨Dhrishi,
The dg_register_task_for_read_request, is function that it is used in order to have an indication to your application when a central reads the characteristic and not when it writes it. Regarding your second question, if it is possible to send data along with the confirmation when the device reads the database, this is not possible, as i ve mentioned this is a patch and data send to the central are taken from the database of the device and not provided from the application.
如果您向特性发送无效长度的值,则堆栈将直接在中央返回错误,它不会到达应用程序级别,以便您处理这种情况,它只通知中央发送无效属性值长度消息。
关于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然后检查操作,万一你正在做的东西,只需使用switch()gattc_write_cmd_ind。
谢谢mt_dialog.