大家都知道蓝牙模块作为从机和手机APP连接时,可以发送通讯间隔参数请求APP更新为自己设置的参数,这个是可以实现毋庸置疑!
但是我现在想实现,刚与APP连接上之后,前面2秒 是以 20ms给APP发送数据,发送完数据后 我想讲通讯间隔从 20ms改为1s,
这个该怎么实现?即在连接的状态下怎么更改通讯间隔??
PS:我试过,转完数据后将 蓝牙模块和APP自动断开,然后在重新广播再重新连接APP,可以更改过来,但是这样感觉有点不合适。
也试过:在连接状态下,再次发送请求更新通讯间隔参数,但是没反应!!
我的问题:能不能在不断开重新连接的状态下(连接状态下)就能直接更改通讯间隔呢?? 如果在连接状态下更改,是APP端来实现还是蓝牙模块(下位机)
来请求更新呢?
Barbara Wu:
调用接口
bStatus_t GAPRole_SendUpdateParam( uint16 minConnInterval, uint16 maxConnInterval, uint16 latency, uint16 connTimeout, uint8 handleFailure )
发送参数更新请求
haidong wang:
回复 Barbara Wu:
WBJ,您好:
谢谢你的回复,我刚试了 调用GAPRole_SendUpdateParam(80,800,0,1000,1);这个函数,设置为 通讯间隔为1s,但是未成功!
可能你没看我的条件,我这个是 在连接的状态下更改通讯间隔的 ,我程序的开始时使能了更新请求的,开机后连接APP是按照我设置的值运行的!
#define DEFAULT_ENABLE_UPDATE_REQUEST TRUE
uint8 enable_update_request = DEFAULT_ENABLE_UPDATE_REQUEST;
GAPRole_SetParameter( GAPROLE_PARAM_UPDATE_ENABLE, sizeof( uint8 ), &enable_update_request );
GAPRole_SetParameter( GAPROLE_PARAM_UPDATE_ENABLE, sizeof( uint8 ), &enable_update_request ); GAPRole_SetParameter( GAPROLE_MIN_CONN_INTERVAL, sizeof( uint16 ), &desired_min_interval ); GAPRole_SetParameter( GAPROLE_MAX_CONN_INTERVAL, sizeof( uint16 ), &desired_max_interval ); GAPRole_SetParameter( GAPROLE_SLAVE_LATENCY, sizeof( uint16 ), &desired_slave_latency ); GAPRole_SetParameter( GAPROLE_TIMEOUT_MULTIPLIER, sizeof( uint16 ), &desired_conn_timeout );
但是,在蓝牙模块 和APP 连接的状态下,发送更新请求是不起作用的,你说的GAPRole_SendUpdateParam这个函数的功能应该和我上面调用的是
同一个功能,还有没有其他的办法?
还有一个我想确认的是, 连接状态 是不是只有主机才能更改了?连接状态下,主机是不是不接收从机的 更新请求了?
Barbara Wu:
回复 haidong wang:
在连接中也可以调用这个函数修改
一调用这个函数就应该会有connection parameter update request发出来, 如果主机这边接收,就能更新了
建议您用抓包的工具看一下1.是否这个命令发出来了 2.如果发出来了,主机那边是否接收了
这个过程在sniffer的包里面应该都能体现的
如果主机是iOS设备,连接参数需要满足其要求,主机才能够接收的,所以请确认您需要更新的参数是多少
haidong wang:
回复 Barbara Wu:
WBJ,您好:
谢谢,现在确定连接中也可以发送更新请求了!
我现在手上没有sniffer抓包工具,APP是找别人帮忙写的,但是我设置断点时,是可以执行到GAPRole_SendUpdateParam(80,800,0,1000,1);这个函数,
按道理来说应该是发送请求了!
还有个问题想跟您确认一下,假设我的请求已经发出去了,我使用的是安卓系统下的APP, APP那端接收到 请求以后需要做什么处理吗?? 还是说 安卓
底层自会处理?? 首次连接APP发出的请求 和 连接状态下发出的更新请求 有什么区别?
Barbara Wu:
回复 haidong wang:
APP应该不用处理,应该是底层自己处理的
首次发是协议栈自动帮你发的,从协议栈角度来说发的命令都是一样的,区别在于一个是在连接刚刚建立的时候发的,一个是在你调用的时候发的。
haidong wang:
回复 Barbara Wu:
也就是说要蓝牙模块(下位机)发送更新请求,APP开发人员不用做处理,安卓蓝牙底层就会自动调用更新通讯间隔参数了。
这个函数这样调用GAPRole_SendUpdateParam(80,800,0,1000,1)有问题吗? 我这边已经确认程序可以执行到这个函数,按道理应该是发了
请求了,我设置GAPROLE_MIN_CONN_INTERVAL=80,GAPROLE_MAX_CONN_INTERVAL=800,GAPROLE_SLAVE_LATENCY=0,
GAPROLE_TIMEOUT_MULTIPLIER = 1000,这个参数值应该是对的啊!为什么我用示波器测 发送管脚 通讯间隔没有变化,还是20ms。
请问还有什么方法确认哪个环节出问题了吗??
我手上没有抓包工具,APP使用的是 TI 的 BLE Device Monitor。
haidong wang:
回复 Barbara Wu:
WBJ,您好:
我刚试了一下,连接状态下调用GAPRole_SendUpdateParam(80,800,0,1000,1)发送请求没反应,但是 重新断开 APP 然后在重新连接(重新连接APP不会再调用GAPRole_SendUpdateParam) 通讯间隔 就更改为
GAPRole_SendUpdateParam(80,800,0,1000,1)这个函数设置的参数了!
是不是连接状态下从机 发送请求 主机不允许更改你呢? 为什么要断开 重新连接才能更改过来??
haidong wang:
回复 haidong wang:
还有人 吗?? 我在初始化过程中 调用 GAPRole_SendUpdateParam(80,800,0,1000,1)这个函数都没有起作用!! 求助求助!!
是不是调用 GAPRole_SendUpdateParam(80,800,0,1000,1)之后要断开APP重新连接才生效?!!!
haidong wang:
回复 haidong wang:
自己顶上!求关注
haidong wang:
回复 haidong wang:
刚刚又发现 在simpleBLEperipheral.C下的peripheralStateNotificationCB()->case:GAPROLE_CONNECTED下或者
performPeriodicTask这个周期 函数里的第一句话 调用GAPRole_SendUpdateParam(80,400,0,1000,GAPROLE_NO_ACTION)
这个函数就能起作用,而 我在 连接状态下的 performPeriodicTask这个周期 函数里的中间 或者 末尾 调用 就不起作用呢!!??
已确认 程序是可以执行到GAPRole_SendUpdateParam这个函数的!感觉发送更新参数请求只能是在连接的第一时间做的第一件事情,
如果过了这个时间,连接状态下再怎么发送都不起作用力!现在的情况看来确实是如此!
但是我确实想在连接上运行一段时间后,再来更新连接间隔的参数呢!? 能不能实现!? 求TI员工出来解答解答!
坐等求解,谢谢!