刚学Android时,自己写过一个基于蓝牙的五子棋联机对战APP。
分享地址:https://github.com/fcp12138/BlueChess
界面如下:
以上都是扯淡 = =
最近我重写了原来里面的蓝牙通讯逻辑,将整个逻辑通讯层进行优化封装起来,以备以后再次利用。重写构思的框架结构如下
地址分享在https://github.com/fcp12138/FreeBlue
蓝牙基础
蓝牙是一种10米内信息通讯的技术。一般分为一个服务端和一个客户端。程序执行上,
1、先服务端启动后等待连接
2、客户端根据已匹配的设备地址中,选择正在等待的服务器地址。
3、获得连接的接口,从中就可以获得数据流
服务端建立核心代码
// 要建立一个ServerSocket对象,需要使用adapter.listenUsingRfcommWithServiceRecord方法
serverSocket = bluetoothAdapter.listenUsingRfcommWithServiceRecord("myServerSocket", uuid);
socket = serverSocket.accept(10000);//超时限10s
//获得通道
outputStream = socket.getOutputStream();
inputStream = socket.getInputStream();
服务端建立连接
//远程蓝牙设备
BluetoothDevice bluetoothDevice = bluetoothAdapter.getRemoteDevice(address);
socket = bluetoothDevice.createRfcommSocketToServiceRecord(uuid);
socket.connect();
//获得通道
outputStream = socket.getOutputStream();
inputStream = socket.getInputStream();
使用这个框架
这个框架还是挺简单的,旨在分享自己的思路
在获得连接设备的地址(通过获取默认蓝牙适配器得到所有已配陪的设备)的基础上。创建BlueBuilder
public BlueBuilder(BlueCreator mBlueCreator,BlueData<T> blueData) {
this.mBlueData = blueData;
this.mBlueCreator = mBlueCreator;
}
构造方法中,前者通过是BlueToothClient还是BlueToothServer来创建客户端还是服务端。第二个参数是要传输的类型,目前写了字符型和文件型。
之后添加必要的监听器并执行mBlueBuilder.create();
等待创建完成的回调就行。
/**
* 初始化蓝牙连接
*/
private void initView() {
//判别类型
Intent intent = getIntent();
mBlueData = new BlueStringData();//字符通讯
if (intent.getExtras().getInt("type") == CREATE_CLIENT) {
String address = intent.getExtras().getString(ADDRESS);
mBlueBuilder = new BlueBuilder<String>(new BlueToothClient(address),mBlueData);//创建客户端
} else if (intent.getExtras().getInt("type") == CREATE_SERVER) {
mBlueBuilder = new BlueBuilder<String>(new BlueToothServer(),mBlueData);//创建服务端
mBlueBuilder.enableBlueTooth();
} else {
finish();
return;
}
mBlueBuilder.setOnCreateListener(new OnCreateListener() {
@Override
public void onCreateSuccess() {
mBlueBuilder.receive();
mBlueBuilder.launchQueue();
Toast.makeText(LinkActivity.this,"onCreateSuccess",Toast.LENGTH_SHORT).show();
((BlueStringData)(mBlueData)).setDataListener(LinkActivity.this);
}
@Override
public void onCreateFail(Exception cause) {
Toast.makeText(LinkActivity.this,"onCreateFail",Toast.LENGTH_SHORT).show();
finish();
}
});
mBlueBuilder.create();
}
发送数据只需执行mBlueBuilder.send(str);
即可。其他例子demo中有。
发送数据实际是放入到PriorityBlockingQueue中等待执行发送,等排在第一个时就执行正真的发送操作。具体的发送和接受操作,交由BlueData类来执行。