关闭

关于蓝牙通信的问题

标签: androidsocket蓝牙通信
226人阅读 评论(0) 收藏 举报
分类:

最近和队友一起做蓝牙通信模块,中间遇到了不少问题。下面分别对遇到的一些问题做一个总结。至于android端蓝牙通信的实现,有需要的可以相互讨论下。

问题1:由于整个运用程序都需要用到蓝牙,并且界面不止一个,当蓝牙连接成功以后需要页面跳转,最开始尝试用Intent传对象,发现不方便,后来将BluetoothSocket设成了静态的,以便各处共用一个socket对象。如果有更好的方法,希望大家能提供建议。

问题2:接收的数据没规律,莫名其妙,是我们定义的数据帧的任意一部分。经过检查,当时以为是流没关闭,在程序的最后对流进行了关闭处理(后来发现问题不仅仅在这里,不过记得养成个关流的好习惯)。

问题3:我们知道蓝牙socket有个connect方法,必须先连接才能进行数据传输。关流以后,导致连接断开,需要重新连接,我重连的时候连接不上,可能是我的个例,也可能是蓝牙的通病,希望大家留意下。没办法,只好每传送一次数据后将BluetoothSocket断开,再通过BluetoothDevice重新连接,同样设成static即可。

问题4:蓝牙要连几次才能连上。能连上证明你的程序没有问题(像问题3又是另外一种情况),用手机蓝牙助手测试时每次连接都没问题,连蓝牙模块时各种连不上,后来换了一个很low的手机,每次都能顺利连接。所以遇到这种情况看一下蓝牙模块的型号,可能有兼容性的问题。最好让负责硬件的找个靠谱点的板子,可能版本太低。

问题5:用手机蓝牙助手测试一切正常开始连调时,发现数据接收又有了问题,不过这次每次开头都是一样的,只是接收不全,比如我们定的长度是18个,每次都只能接收5个,7个等等。结果是两边通过蓝牙助手都能通过。

byte[] buffer = new byte[1024];
						int bytes;
						StringBuffer buf = new StringBuffer();
   							ips=socket.getInputStream();
							bytes=ips.read(buffer);
							


经过调试发现当用debug模式一步步执行时,每次都能接收完整。

于是用log进行输出,发现bytes的长度每次都不够18个,于是加了一个线程暂停

byte[] buffer = new byte[1024];
                        int bytes;
                        StringBuffer buf = new StringBuffer();
                            ips=socket.getInputStream();
                            bytes=ips.read(buffer);
                            try {
                                Thread.sleep(3000);
                            } catch (InterruptedException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }
倒是能解决问题,说明发送的时候并没有一次发送,

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:7878次
    • 积分:287
    • 等级:
    • 排名:千里之外
    • 原创:21篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条