Android蓝牙——自定义通讯框架FreeBlue

来源:互联网 发布:python股票交易策略 编辑:程序博客网 时间:2024/06/04 19:52

刚学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类来执行。

0 0