你好,
我需要从外围应用程序向中心发送BLE通知,以防特征值发生变化。需要使用什么API来实现相同的功能?有这样的例子吗?
另外,如何处理CCC描述符上的写操作,以在应用程序本身中启用或禁用指示(GATT_CCC_START_IND, GATT_CCC_STOP_NTFIND)。
谢谢,Hrishikesh
嗨dhrishi,
您可以通过ble_app_peripheral示例查看如何发送通知。该示例使用cust配置文件发送通知,但您可以查看配置文件的实际发送数据,并检查配置文件如何发送实际数据。该概要文件使用的命令是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
谢谢你的回复。
注意:我已经在应用程序中使用来自外部MCU的UART命令(使用KE_MSG_ALLOC命令(TASK_ATTM和TASK_APP)的数据创建了GATT数据库。简而言之,我没有使用Dialog 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, profile id是profile id命令的问题,在这种情况下是CUSTS1_TASK conidx是当前连接的连接指数。这些信息中的大多数在启用custs1配置文件后填充结构。在你的例子中,你可以从app_env结构中获得conidx,因为你没有配置文件层,你应该可以使用TASK_APP作为骄傲。
由于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(要求的);
在上述代码中需要什么改变才能发送零长度的指示?
首先,指示是从外围设备(就像通知一样,但当值到达外围设备时应用程序会进行确认)而不是从中心设备开始的,外围设备只能向中心发送指示,而不是反过来,为了从外设你只需要发送一个信号从您的应用程序发送消息,中央不读indicatable价值,它只是表明价值中心的外围,中央就确认他收到了从外围消息发送。
GATTC_SEND_EVT_CMD消息,当指示发送一个指示,你将填充属性的句柄,你想要发送,如果特征的值是零长度,我不认为发送任何问题。
我做了下面的测试,我已经在ble_app_peripheral中设置了“Indicatable”特征,使其大小为0,并创建了一个计时器回调,周期性地发送CUSTS1_VAL_IND_REQ,而不是我离开项目时的状态,所以,每当我启用指示时,我可以在嗅探器上看到指示正确地离开了设备,中心发回了正确的确认。
谢谢你的回复。我已经把它修好了,而且我用的方法和你说的完全一样。在发送指示之前,我将对应的特征值长度设为零。因此,发送一个零长度的指示,它工作正常。谢谢你的帮助。
嗨dhrishi,
您可以通过ble_app_peripheral示例查看如何发送通知。该示例使用cust配置文件发送通知,但您可以查看配置文件的实际发送数据,并检查配置文件如何发送实际数据。该概要文件使用的命令是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
你好,
谢谢你的回复。
注意:我已经在应用程序中使用来自外部MCU的UART命令(使用KE_MSG_ALLOC命令(TASK_ATTM和TASK_APP)的数据创建了GATT数据库。简而言之,我没有使用Dialog 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, profile id是profile id命令的问题,在这种情况下是CUSTS1_TASK conidx是当前连接的连接指数。这些信息中的大多数在启用custs1配置文件后填充结构。在你的例子中,你可以从app_env结构中获得conidx,因为你没有配置文件层,你应该可以使用TASK_APP作为骄傲。
由于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(要求的);
在上述代码中需要什么改变才能发送零长度的指示?
嗨dhrishi,
首先,指示是从外围设备(就像通知一样,但当值到达外围设备时应用程序会进行确认)而不是从中心设备开始的,外围设备只能向中心发送指示,而不是反过来,为了从外设你只需要发送一个信号从您的应用程序发送消息,中央不读indicatable价值,它只是表明价值中心的外围,中央就确认他收到了从外围消息发送。
GATTC_SEND_EVT_CMD消息,当指示发送一个指示,你将填充属性的句柄,你想要发送,如果特征的值是零长度,我不认为发送任何问题。
我做了下面的测试,我已经在ble_app_peripheral中设置了“Indicatable”特征,使其大小为0,并创建了一个计时器回调,周期性地发送CUSTS1_VAL_IND_REQ,而不是我离开项目时的状态,所以,每当我启用指示时,我可以在嗅探器上看到指示正确地离开了设备,中心发回了正确的确认。
由于MT_dialog
你好,
谢谢你的回复。我已经把它修好了,而且我用的方法和你说的完全一样。在发送指示之前,我将对应的特征值长度设为零。因此,发送一个零长度的指示,它工作正常。谢谢你的帮助。
谢谢,
Hrishikesh