取消与外围设备的连接

4个职位/ 0个新
最后发表
quangng
离线
最后看到:10个月1周前
加入:2015-10-29 22:03
取消与外围设备的连接

大家好!

我正在制作一个应用程序,外设可以建立一个连接到中心设备(一个移动电话)。当有数据(例如,温度变化)时,外设将开始发布信息并与中心设备建立连接。由于外设由电池供电,我希望在与中心设备连接期间从外设实现连接超时。特别是,在建立连接并交换数据之后,外围设备可以在5秒内决定自己终止连接。你能告诉我如何在SDK5.0.4中完成这个程序吗?

谢谢你!

设备:
MT_dialog
离线
最后看到:3个月1天前
工作人员
加入:2015-06-08 34
嗨quangng,

嗨quangng,

首先,你不能从外设发送连接请求,只有中央可以发送连接请求。所以你可以让设备处于永久睡眠状态,并通过中断唤醒它,例如当传感器有数据时。之后,该设备应该开始发布广告,以便中央定位该设备。当中央跟踪设备和一个连接请求问题user_app_connection()将会被激发,这个函数你可以开始一个内核计时器,它将定义与外围连接将持续多久为了发送你的通知或做任何应用程序(以发送数据外围设备你将不得不使用通知,这意味着你将不得不从你的中心激活外围设备的通知)。当计时器结束时,将调用计时器的回调,从那时起,您可以调用app_easy_gap_disconnect(),它将终止与中央处理器的连接。断开连接之后,user_app_disconnect()将被调用,从那里您可以再次设置唤醒中断和回滚到睡眠。

由于MT_dialog

quangng
离线
最后看到:10个月1周前
加入:2015-10-29 22:03
嗨MT_dialog,

嗨MT_dialog,

今天我按照你的指示修好了。谢谢你!然而,仍有一件事需要改进。我的外围中心连接的超时时间是5秒。当中心在5秒内断开连接(如已建立连接的2秒后断开连接),连接可以成功完成。在断开连接大约3秒之后,内核计时器将触发我已经在user_app_connection()中设置的回调函数。嗯…这是可以预料的,因为我没有取消user_app_disconnect()中的内核计时器。如果我在计时器已经过期时使用app_easy_timer_cancel()取消内核计时器,应用程序将挂起app_easy_timer_cancel()中的ASSERT_WARNING(0) (SDK5.0.4中的第395行)。如果我理解正确,应用程序挂起在那里是因为我取消了一个非活动的内核计时器。 Then is there any API call to check if the kernel timer with timer id (e.g, conn_timeout_id) is active so that we can cancel it properly?

MT_dialog
离线
最后看到:3个月1天前
工作人员
加入:2015-06-08 34
嗨quangng,

嗨quangng,

在创建计时器时,app_easy_timer()返回一个timer_id,因此在断开连接回调中,如果在时间结束之前发生,您可以取消计时器。在回调计时器中,你不必取消计时器,因为计时器已经过期,计时器消息已经离开执行队列。

由于MT_dialog