你好,
在特征值变化的情况下,我需要从外围应用程序向中央发送BLE通知。什么是需要使用的API?是否有任何地方可用的例子?
此外,如何处理CCC描述符的写入,以启用或禁用应用程序本身中的指示(GATT_CCC_START_IND,GATT_CCC_STOP_NTFIND)。
谢谢,Hrishikesh
嗨Dhrishi,
您可以检查ble_app_peripheral示例来检查如何发送通知。示例使用custs概要文件发送通知,但是您可以转到概要文件的实际发送数据,并检查概要文件是如何发送实际数据的。配置文件使用的命令是CUSTS1_VAL_NTF_REQ,触发的回调是custs1_val_ntf_req_handler()函数。发送通知的实际命令是prf_server_send_event()函数(该命令是在更改数据库中的值attmdb_att_set_value()之后调用的,因为它发送的是数据库中的值)。
关于你的第二个问题,我不确定我理解我认为如何捕获中央实际写入CCC特征的事件,在写入事件来临时触发的回调是Gattc_Write_cmd_ind回调和配置文件必须检查数据库中的值并将其写入数据库中,您可以检查配置文件如何处理GattC_Write_cmd_ind_handler()中的方式。
thaks mt_dialog
感谢您的回复。
注意:我在使用ke_msg_alloc命令(task_attm和task_app)中使用来自外部MCU的UART命令的数据在应用程序中创建了GATT数据库,请简单地,对话框SDK提供的任何标准配置文件或自定义配置文件。
我检查了prf_server_send_event()函数。第一个参数为:prf_env_struct * p_env我在这里输入什么?您希望我在本地创建一个prf_env_struct类型的变量并填充其成员吗?在这种情况下,什么将是值:appid: ? ?prfid: ? ?conidx:当前连接ID?
prf_server_send_event()函数基本上使用带有相应参数的gattc_send_evt_cmd。大多数参数都在持有用于配置文件的可用信息的结构中的示例中保持,App_ID是Task_App,配置文件ID是发出命令的配置文件ID,在这种情况下是Custs1_task和Conidx当前连接的连接索引。这些信息中的大多数信息在启用CUSTS1配置文件时填充该结构。在您的情况下,您可以从App_Env结构中获取Conidx,因为您没有配置文件层,您应该能够使用Task_App作为PRFID。
由于MT_dialog
当本地更新一个特征值时,我尝试使用以下代码发送一个零长度指示(BLE连接是活动的)。虽然,我没有看到中央/控制器发送读取请求来获取新值。这有什么错呢?默认情况下,表示请求也发送新值吗?如果是的话,我不想要那个。我想按中心侧的要求发送零长度指示。那可能吗?如果是,我们如何做到?
UINT16_T手柄;/ *手柄是该特性的句柄,其值已更改* /struct gattc_send_evt_cmd * req = ke_msg_alloc(gattc_send_evt_cmd,ke_build_id(task_gattc,app_connection_idx),task_app,gattc_send_evt_cmd);申请- > req_type = GATTC_INDICATE;申请- >处理=处理;KE_MSG_SEND(REQ);
上面的代码需要做什么改变才能发送零长度指示?
要从迹象开始,从外围设备启动(就像通知,而是使用应用程序确认,当值达到外围设备时)而不是中央,外围设备只能向中央发送指示而不是其他方式,所以为了从外设发送指示您只需从应用程序发送该消息,中央不会读取可指示值,它只是指示中央的值,中央的值只是确认他收到了消息发送从外围。
gattc_send_evt_cmd消息当指示发送指示时,您将填写要发送的属性的句柄,如果特征的值为零长度,则不会在发送该值时看到任何问题。
我做了以下测试,我在BLE_APP_PERITELAL中设置了“可指示的”特征,以具有0的大小,并创建了定时回调,而不是定期发送CUSTS1_VAL_IND_REQ,而不是我离开项目,因此每当我启用时我可以在嗅探器上看到的迹象表明指示正确地留下了设备,并且中央正在发送正确的确认。
感谢您的回复。我已经完成了它,我完全相同的方式。在发送指示之前,我将相应的特征值长度设置为零。结果,发送零长度指示,并且工作正常。谢谢你的帮助。
嗨Dhrishi,
您可以检查ble_app_peripheral示例来检查如何发送通知。示例使用custs概要文件发送通知,但是您可以转到概要文件的实际发送数据,并检查概要文件是如何发送实际数据的。配置文件使用的命令是CUSTS1_VAL_NTF_REQ,触发的回调是custs1_val_ntf_req_handler()函数。发送通知的实际命令是prf_server_send_event()函数(该命令是在更改数据库中的值attmdb_att_set_value()之后调用的,因为它发送的是数据库中的值)。
关于你的第二个问题,我不确定我理解我认为如何捕获中央实际写入CCC特征的事件,在写入事件来临时触发的回调是Gattc_Write_cmd_ind回调和配置文件必须检查数据库中的值并将其写入数据库中,您可以检查配置文件如何处理GattC_Write_cmd_ind_handler()中的方式。
thaks mt_dialog
你好,
感谢您的回复。
注意:我在使用ke_msg_alloc命令(task_attm和task_app)中使用来自外部MCU的UART命令的数据在应用程序中创建了GATT数据库,请简单地,对话框SDK提供的任何标准配置文件或自定义配置文件。
我检查了prf_server_send_event()函数。第一个参数为:prf_env_struct * p_env
我在这里输入什么?您希望我在本地创建一个prf_env_struct类型的变量并填充其成员吗?在这种情况下,什么将是值:
appid: ? ?
prfid: ? ?
conidx:当前连接ID?
嗨Dhrishi,
prf_server_send_event()函数基本上使用带有相应参数的gattc_send_evt_cmd。大多数参数都在持有用于配置文件的可用信息的结构中的示例中保持,App_ID是Task_App,配置文件ID是发出命令的配置文件ID,在这种情况下是Custs1_task和Conidx当前连接的连接索引。这些信息中的大多数信息在启用CUSTS1配置文件时填充该结构。在您的情况下,您可以从App_Env结构中获取Conidx,因为您没有配置文件层,您应该能够使用Task_App作为PRFID。
由于MT_dialog
你好,
当本地更新一个特征值时,我尝试使用以下代码发送一个零长度指示(BLE连接是活动的)。
虽然,我没有看到中央/控制器发送读取请求来获取新值。这有什么错呢?
默认情况下,表示请求也发送新值吗?如果是的话,我不想要那个。我想按中心侧的要求发送零长度指示。那可能吗?如果是,我们如何做到?
UINT16_T手柄;/ *手柄是该特性的句柄,其值已更改* /
struct gattc_send_evt_cmd * req = ke_msg_alloc(gattc_send_evt_cmd,
ke_build_id(task_gattc,app_connection_idx),task_app,gattc_send_evt_cmd);
申请- > req_type = GATTC_INDICATE;
申请- >处理=处理;
KE_MSG_SEND(REQ);
上面的代码需要做什么改变才能发送零长度指示?
嗨Dhrishi,
要从迹象开始,从外围设备启动(就像通知,而是使用应用程序确认,当值达到外围设备时)而不是中央,外围设备只能向中央发送指示而不是其他方式,所以为了从外设发送指示您只需从应用程序发送该消息,中央不会读取可指示值,它只是指示中央的值,中央的值只是确认他收到了消息发送从外围。
gattc_send_evt_cmd消息当指示发送指示时,您将填写要发送的属性的句柄,如果特征的值为零长度,则不会在发送该值时看到任何问题。
我做了以下测试,我在BLE_APP_PERITELAL中设置了“可指示的”特征,以具有0的大小,并创建了定时回调,而不是定期发送CUSTS1_VAL_IND_REQ,而不是我离开项目,因此每当我启用时我可以在嗅探器上看到的迹象表明指示正确地留下了设备,并且中央正在发送正确的确认。
由于MT_dialog
你好,
感谢您的回复。我已经完成了它,我完全相同的方式。在发送指示之前,我将相应的特征值长度设置为零。结果,发送零长度指示,并且工作正常。谢谢你的帮助。
谢谢,
Hrishikesh