你好,
我需要从外围应用程序向中心发送BLE通知,以防特征值发生变化。同样需要使用什么API ?有例子吗?
此外,如何处理写在CCC描述符启用或禁用指示(GATT_CCC_START_IND, GATT_CCC_STOP_NTFIND)在应用程序本身。
谢谢,hrishikesh.
嗨Dhrishi,
您可以检查BLE_APP_PERIANTAL示例以检查如何发送通知。该示例使用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数据库。简而言之,我没有使用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是当前连接的连接指数。大多数这些信息在启用cust1配置文件时填充结构。在你的例子中,你可以从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-> req_type = gattc_indicate;req-> handle = handle;ke_msg_send(要求的);
上面的代码中需要哪些更改以发送零长度指示?
首先,指示是从外围设备而不是中心设备发起的(就像通知一样,但在值到达外围设备时使用应用程序确认),外围设备只能向中心设备发送指示,而不是向中心设备发送指示,为了从外设你只需要发送一个信号从您的应用程序发送消息,中央不读indicatable价值,它只是表明价值中心的外围,中央就确认他收到了从外围消息发送。
GATTC_SEND_EVT_CMD消息当指示发送一个指示,你将有填写属性的句柄,你想发送,如果特征的值是零长度,我不认为在发送的任何问题。
我做了以下测试,我在ble_app_peripheral中设置了“指示”特性,使其大小为0,并创建了一个定时器回调,定期发送CUSTS1_VAL_IND_REQ,除了我保持项目不变之外,因此,每当我启用的指示,我可以看到在嗅探器上的指示离开设备正确和中央发送回正确的确认。
谢谢你的回复。我已经修好了而且我完全按照你说的方法做了。在发送指示之前,我将相应的特征值长度设置为零。因此,发送一个零长度指示,它工作正常。谢谢你的帮助。
嗨Dhrishi,
您可以检查BLE_APP_PERIANTAL示例以检查如何发送通知。该示例使用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数据库。简而言之,我没有使用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是当前连接的连接指数。大多数这些信息在启用cust1配置文件时填充结构。在你的例子中,你可以从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-> req_type = gattc_indicate;
req-> handle = handle;
ke_msg_send(要求的);
上面的代码中需要哪些更改以发送零长度指示?
嗨Dhrishi,
首先,指示是从外围设备而不是中心设备发起的(就像通知一样,但在值到达外围设备时使用应用程序确认),外围设备只能向中心设备发送指示,而不是向中心设备发送指示,为了从外设你只需要发送一个信号从您的应用程序发送消息,中央不读indicatable价值,它只是表明价值中心的外围,中央就确认他收到了从外围消息发送。
GATTC_SEND_EVT_CMD消息当指示发送一个指示,你将有填写属性的句柄,你想发送,如果特征的值是零长度,我不认为在发送的任何问题。
我做了以下测试,我在ble_app_peripheral中设置了“指示”特性,使其大小为0,并创建了一个定时器回调,定期发送CUSTS1_VAL_IND_REQ,除了我保持项目不变之外,因此,每当我启用的指示,我可以看到在嗅探器上的指示离开设备正确和中央发送回正确的确认。
谢谢mt_dialog.
你好,
谢谢你的回复。我已经修好了而且我完全按照你说的方法做了。在发送指示之前,我将相应的特征值长度设置为零。因此,发送一个零长度指示,它工作正常。谢谢你的帮助。
谢谢,
hrishikesh.