处理外部应用程序的BLE指示

⚠️
大家好. .感谢来到论坛。令人兴奋的消息!我们现在正在转移到新的论坛平台的过程中,它将提供更好的功能,并包含在主对话网站。所有的帖子和账号已经迁移。我们现在只接受新论坛的流量-请发布任何新的帖子在//www.wsdof.com/support.我们会在接下来的几天修复bug /优化搜索和标记。
7个职位/ 0个新职位
最后发表
dhrishi
离线
最后看到:3年6个月前
加入:2017-02-10 09:56
处理外部应用程序的BLE指示

你好,

我需要从外围应用程序向中心发送BLE通知,以防特征值发生变化。需要使用什么API来实现相同的功能?有这样的例子吗?

另外,如何处理CCC描述符上的写操作,以在应用程序本身中启用或禁用指示(GATT_CCC_START_IND, GATT_CCC_STOP_NTFIND)。

谢谢,
Hrishikesh

设备:
MT_dialog
离线
最后看到:5个月2个星期前
工作人员
加入:2015-06-08 34
嗨dhrishi,

嗨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

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

你好,

谢谢你的回复。

注意:我已经在应用程序中使用来自外部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 ?

MT_dialog
离线
最后看到:5个月2个星期前
工作人员
加入:2015-06-08 34
嗨dhrishi,

嗨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

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

你好,

我尝试了以下代码,在本地更新特征值时发送一个零长度的指示(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(要求的);

在上述代码中需要什么改变才能发送零长度的指示?

MT_dialog
离线
最后看到:5个月2个星期前
工作人员
加入:2015-06-08 34
嗨dhrishi,

嗨dhrishi,

首先,指示是从外围设备(就像通知一样,但当值到达外围设备时应用程序会进行确认)而不是从中心设备开始的,外围设备只能向中心发送指示,而不是反过来,为了从外设你只需要发送一个信号从您的应用程序发送消息,中央不读indicatable价值,它只是表明价值中心的外围,中央就确认他收到了从外围消息发送。

GATTC_SEND_EVT_CMD消息,当指示发送一个指示,你将填充属性的句柄,你想要发送,如果特征的值是零长度,我不认为发送任何问题。

我做了下面的测试,我已经在ble_app_peripheral中设置了“Indicatable”特征,使其大小为0,并创建了一个计时器回调,周期性地发送CUSTS1_VAL_IND_REQ,而不是我离开项目时的状态,所以,每当我启用指示时,我可以在嗅探器上看到指示正确地离开了设备,中心发回了正确的确认。

由于MT_dialog

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

你好,

谢谢你的回复。我已经把它修好了,而且我用的方法和你说的完全一样。在发送指示之前,我将对应的特征值长度设为零。因此,发送一个零长度的指示,它工作正常。谢谢你的帮助。

谢谢,
Hrishikesh