赞
踩
转自:http://blog.csdn.net/jason0539/article/details/17782035
最近在做蓝牙开锁的小项目,手机去连接单片机总是出现问题,和手机的连接也不稳定,看了不少蓝牙方面的文档,做了个关于蓝牙连接的小结。
在做android蓝牙串口连接的时候一般会使用
然后是tmp赋给BluetoothSocket,接着调用connect方法进行蓝牙设备的连接。
可是 BluetoothSocket 的connect方法本身就会报很多异常错误。
以下根据对蓝牙开发的一点研究可通过以下方法解决:
方法1.先进行蓝牙自动配对,配对成功,通过UUID获得BluetoothSocket,然后执行connect()方法。
方法2.通过UUID获得BluetoothSocket,然后先根据mDevice.getBondState()进行判断是否需要配对,最后执行connnect()方法。
接下来是调用的连接设备方法connectDevice():
方法3.利用反射通过端口获得BluetoothSocket,然后执行connect()方法。
接下来是初始化并得到BluetoothSocket的方法
要点:1.蓝牙配对和连接是两回事,不可混为一谈。
2.蓝牙串口连接可通过端口 (1-30)和UUID两种方法进行操作。
3.通过UUID进行蓝牙连接最好先进行配对操作。
说明:在连接蓝牙过程中总是不稳定,先配对后,情况明显好转。
另外装载作者的另外一个补充,详细过程还没有试验
http://www.aiseminar.cn/bbs/forum.php?mod=viewthread&tid=2369&fromuid=3
如前文“第二个Activity中onStop设置Service为第一个Activity的handler为什么不起作用?”所描述的问题,开始以为是handle出了问题:“蓝牙使用UUID进行连接,第一设备之间可以正常连接。而socket关闭后,后续连接都会出现service discovery failed错误”。
后来查阅资料发现,这是Android蓝牙连接经常遇到的问题。有人怀疑是Android系统的bug,而且提出使用反射方法解决此问题。经过AIS蓝牙对讲机的使用测试结果表明:使用Reflect方法进行蓝牙连接,可以重复连接任意多次,不会再出现上述问题。
所谓使用反射方式,就是通过java的反射机制,取出Bluetooth的监听和创建连接socket的方法,使用反射的方法进行操作,而再使用listenUsingRfcommWithServiceRecord和createRfcommSocketToServiceRecord这样的问题函数。实现时,同样如同这样连个函数,需要将反射操作配对使用。如下:
替换listenUsingRfcommWithServiceRecord的反射操作:
[4] android开发之蓝牙配对连接的方法. http://blog.csdn.net/jason0539/article/details/17782035
另外两篇关于蓝牙的文章:
蓝牙开发:http://www.cnblogs.com/wenjiang/p/3200138.html
蓝牙连接建立分析:http://blog.csdn.net/android_huber/article/details/7720657
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。