解决安卓无法CSR8670 BLE的方法
最新调试CSR8670 BLE的时间发现IOS设备可以连接,但是安卓设备无法连接。同事在调试几天后发现安卓端连接改成自动连接就可以与BLE连接并且发现服务。
因为安卓调试软件也可以连接其他的BLE设备,肯定与设备的配置也有关系,我这边也一直在研究CSR8670这边的问题。
调试是基于官方sink程序
为了发现程序跑到哪一步我将BLE的调试打开在xIDE 下的DEBUG输出发现了问题点,IOS在连接和配置成自动连接的安卓程序在讲求时请求ID都是
GATT_INIT_CFM
而用BLE调试软件发现却是
GATT: Unhandled MSG
很明显是android发了一个消息请求而sink程序没有处理,通过ADK库中的gatt.h文件查找到0x5802对应的消息是GATT_CONNECT_IND,
其对应的结构体是GATT_CONNECT_IND_T,它的注释:
/*!
\brief GATT Connection Indication
This message is received when a remote device tries to make a GATT
connection. This will be sent to the task which initiated the GATT library.
The GattConnectResponse() function must be called to accept or decline the
connection. Only after this is done, can the connection be used.
*/也就是远程设备在请求GATT连接,而且必须使用GattConnectResponse()函数去应答。
因此在gatt_message_handler函数里面添加上处理它的代码
void gatt_message_handler( Task task, MessageId id, Message message )之后编译运行,发现BLE调试助手可以连接成功了,但是服务没有出来,然后我断开BLE调试助手再连接,这下服务也跟着出来了,读写也都没问题。
但是在用其他BLE软件调试还是有问题,大概找对方向了,之后再找原因吧。如果有大神知道也请告知!
void gatt_message_handler( Task task, MessageId id, Message message )
{
GATT_DEBUG(("gatt_message_handler id=[%x]\n", id));
switch(id)
{
case GATT_CONNECT_IND:
{
GATT_CONNECT_IND_T *gci;
GATT_DEBUG(("GATT_CONNECT_IND flag:[%x]\n", ((GATT_CONNECT_IND_T*)message)->flags));
gci = (GATT_CONNECT_IND_T*)message;
GattConnectResponse(&theSink.rundata->gatt.task, gci->cid, gci->flags, TRUE);
}
break;
gatt_message_handler那段代码没出来,重新发出来
表示关注,我也遇到同样的问题。
安卓端设置成自动连接就可以与8670 的 BLE连接且能发现服务了?
多連幾次,應該又不能連了。
一下正常,一下又不行了。
GeorgeChang 发表于 2015-11-25 23:32
多連幾次,應該又不能連了。
一下正常,一下又不行了。
我也是这样的,还是有其他问题,也在找原因。
不过比起之前一直连不上还是好一些了。
xmxqiyan 发表于 2015-11-26 11:02
我也是这样的,还是有其他问题,也在找原因。
不过比起之前一直连不上还是好一些了。
你不是说安卓端设置成自动连接就可以连接了?
hyf200888 发表于 2015-11-26 14:33
你不是说安卓端设置成自动连接就可以连接了?
我对安卓app开发不是很熟悉,那是我同事说的,也可能是我没描述好,反正是里面的一个参数改一下就OK,今天我又调试了CSR的程序,你参考一下:
http://www.52bluetooth.com/thread-6344-1-1.html
努力学习中,MARK
安卓BLE的方式与IOS的BLE方式是不同的,要想连接到安卓的BLE,需要发送SDP的BLE数据。
安卓手机无法连接的解决,不错ble学习资料
页:
[1]
2