本帖最后由 ancientcc 于 2016-8-7 10:43 编辑 自动重连的条件
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:52 编辑 SDL_BleScanPeripherals
|
本帖最后由 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,用的也是不同值。 |