最近在帮电气学院做一个通过android手机的蓝牙传输app。又要做界面,又要写传输,感觉身体被掏空了。
好了,言归正传,我们来了解下,我写的小程序。
一,蓝牙传输:
这个问题,刚开始,我也不熟悉,然后,就在网上各种找资料。了解android蓝牙传输的协议及其方式。下面总结下:(其实,在网上已经有很多人总结了。我就班门弄斧了。哈哈哈。。)
主要的类是:
BluetoothAdapter 类:指的就是本地蓝牙适配器,它是所有蓝牙交互的入口点。我们可以利用它去发现其他的蓝牙设备,获得其他蓝牙的MAC地址和建立一个BluetoothServerSocket(作为蓝牙服务端)来监听其他设备的连接。
BluetoothDevice类:代表一个远程的蓝牙设备,使用它请求蓝牙连接,名称,状态,。
Bluetoothsocket类:代表的了一个蓝牙套接字的接口,(类似与TCP中套接字),它是应用程序通过输入,输出流与其他蓝牙设备通信的连接点。
Bluetoothserversocket类,代表打开服务监听可能到来的连接请求(属于服务端),为了连接两个蓝牙设备必须有一个设备作为服务器返回一个服务套接字。当远端设备发起连接连接请求的时候,并且已经连接成功的时候,BluetoothServersSocket类返回一个bluetoothsocet.
二,具体的连接操作,大家还是百度去吧!我相信,大牛写的比我好多了
但是,我要提到的是,UUID号,对就是子啊
mBluetoothAdapter.listenUsingRfcommWithServiceRecord(SERVER_NAME, UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));
device.createRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));
就是这段代码。由于,我是连接蓝牙模块的,我这边就是手机端了,蓝牙模块就当成服务端。我之前在做基于蓝牙的聊天系统的时候,这个UUID号,我可以自己设置。但是服务端和客户端必须统一,否则连接不了。
让我发愁的是,蓝牙模块不在我这里。询问电气学院的那些人,没有知道UUID号是啥东西,还说什么,用手机蓝牙连为什么不用UUID号呢???让我自己去想!当时,我气得,我都想跳楼。。。。行外人没法交流。
然后,我就上网查下,一般的蓝牙模块的UUID都是"00001101-0000-1000-8000-00805F9B34FB",,当时我真的很担心那些坑货会不会买不一般的东西。当然事实证明,它们真的很一般。好了,这样就连上蓝牙模块了。
三,这是一个问题,我想了很久,由于我需要帮他们做界面的,所有我需要在界面上花费很多功夫,找了很多代码,终于弄了一个像样的界面了,大家看看,其实,个人觉得还行:哈哈。。。。
主要功能就是通过,方向盘的转动和按钮的事件把消息通过蓝牙传输给蓝牙模块,本来我想传输模块和聊天系统一样呗,所以就没多考虑。
但是,到最后,有问题了。消息发不出去,我都晕了。
如果在eclipse利用debug调试的话,就可以发出去。但是,一旦正常运行就发不出去了,我想了很久,终于在现在,我找到了。哈哈哈~~~原因,是我的蓝牙聊天系统需要在界面上显示聊天记录,所以,我用到了Handler去刷新listView,我对它进行改动了,在它每次刷新界面的时候,去发送消息,这是不可取的。消息根本发不出去了,Handler是对UI进行更新的。消息的发送需要在主线程里运行,不能在副线程里运行。比如Handler,大家请注意这个,隐含错误,很要命的。我可是想了很久,很久,才搞定的!
protected void sendMessageHandle(String msgText)
{
if (socket == null)
{
Toast.makeText(this, "没有连接", Toast.LENGTH_SHORT).show();
return;
}
try
{
OutputStream os = socket.getOutputStream();
os.write(msgText.getBytes());
} catch (Exception e)
{
e.printStackTrace();
}
msgList.add(msgText);
listView.setSelection(msgList.size() - 1);
mAdapter.notifyDataSetChanged();
}
谢谢,阅读。。。哈哈哈~~~~