SDL中文论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz

蓝牙(Ble)

查看数: 6545 | 评论数: 4 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2016-5-10 20:45

正文摘要:

回调函数时机did_discover_peripheral扫描到新外设did_release_peripheral释放了一外设。意外断开时会强制执行释放注1did_connect_peripheral连接了一外设did_disconnect_peripheral断开外设。包括1)应用要求断开; ...

回复

ancientcc 发表于 2016-5-10 20:50:05

自动重连

本帖最后由 ancientcc 于 2016-8-7 10:43 编辑

自动重连的条件
  1. void tble::did_discover_peripheral(SDL_BlePeripheral& peripheral)
  2. {
  3.         if (!connecting_peripheral_ && !peripheral_ && connector_->match(peripheral)) {
  4.                 connect_peripheral(peripheral);
  5.         }
  6.         app_discover_peripheral(peripheral);
  7. }
复制代码

1、当前没有正在连接(!connecting_peripheral_)或已连接(!peripheral_)。
2、匹配当前的连接适配器(connector_->match(peripheral))。

tble::disable_reconnect_
当前想禁止自动重连时,把它设为true,一旦可允许重连,设为false,并随后要调用start_scan,以允许重连。

考虑这么个场景:一个连续测温度的app,它想处理文件中的温度数据,但由于蓝牙会定时把读到的温度写入文件,为避免文件不同步它需要断掉蓝牙。这意味着它必须暂时关掉蓝牙,等处理完后再打开,接下就让深入这过程,为方便描述以下把处理文件中数据称为B任务。断开连接过程中会触发tble::did_disconnect_peripheral,一旦disable_reconnect_是false,它要调用start_scan,这时会出现1)有平台(Windows)是会同步调起tble::did_discover_peripheral,2)执行B任务过程中有可能调用SDL_PumpEvent,如果旁边有设备恰好发来广播包,这时会调起tble::did_discover_peripheral(start_scan发现了蓝牙设备)。不管哪一种都会导致调用tble::did_discover_peripheral,该函数将引起自动重连,而这时B任务还未开始执行或没执行,结果是程序混乱。

为消除这混乱引入disable_reconnect_,当它是true时,tble::did_disconnect_peripheral不会调用start_scan。

disable_reconnect_和start_scan密切相关,当它是true时不要让执行start_scan!于是tpersist_scan_lock的析构函数就要判断这变量。

App如何设置disable_reconnect_?当前想禁止重连时,把它设为true,一旦可允许重连,设为false,并随后要调用start_scan。为方便,建议App使用封装了这过程的tdisable_reconnect_lock。
ancientcc 发表于 2016-5-10 20:47:03
本帖最后由 ancientcc 于 2016-5-10 20:52 编辑

SDL_BleScanPeripherals
  • 功能是扫描正在广播的设备。
  • 在扫描状态下再调用SDL_BleScanPeripherals,会从全新状态开始扫描。
  • 在一次扫描过程中,同一个设备只能被发现(Discover)一次。也就是说,一设备被发现了,然后把这设备断电,接下再上电,扫描过程发现不了此次上电。但依据2,再次SDL_BleScanPeripherals会发现该设备。
ancientcc 发表于 2016-5-10 20:46:43
本帖最后由 ancientcc 于 2016-5-10 20:48 编辑

GAP、GATT设置
一、至少要设一个Service UUID。原因:iOS在后台的断开后重连需要uuid值。
二、不要让一个特征同时具有notify、indicate属性。原因:iOS设置notify、indicate用的是一个函数,当属性只有这们中一个时,它会正确设置,如果同时存在,它只会设置indicate。indicate和notify的主要区别:indicate时,center发数据给peripheral,peripheral收到数据后,需再发应答给center;notify时,center发数据给peripheral,peripheral不必给center任何应答。在Android系统,设置indicate、notify是不同常量,ENABLE_NOTIFICATION_VALUE/ENABLE_INDICATION_VALUE,gatt.writeDescriptor必需按要求设置,否则会导致出随机错误,像断开连接。Windows类似Android,用的也是不同值。

Archiver|手机版|小黑屋|丽谷软件|libsdl.cn

GMT+8, 2025-6-28 08:24 , Processed in 0.056420 second(s), 25 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表