android 蓝牙socket(spp)用法

1 综述

蓝牙socket连接必须实现服务器端和客户端的机制。一个设备必须打开一个Server Socket,而另一个必须发起连接(使用服务器端设备的MAC地址发起连接)。当服务器端和客户端在同一个RFCOMM信道上都有一个BluetoothSocket时,则两端就建立了连接。此刻,每个设备都能获得一个输入输出流,进行数据传输。下面分别介绍服务器端和客户端的实现。

 

2 服务器端

服务器端有两个线程,一个是accept线程负责监听来自client的连接请求,一个是connected线程负责与client 进行数据传输。
accept线程首先创建一个server socket,通过调用listenUsingRfcommWithServiceRecord(String, UUID)方法得到一个BluetoothServerSocket对象。[注: 用此方法listenUsingRfcommWithServiceRecord(String, UUID)创建的socket,需要双方进行配对确认,之后双方在一个加密且鉴权过的通信信道上通信。而用listenUsingInsecureRfcommWithServiceRecord(String, UUID)创建的socket不需要双方进行配对确认,通信信道上没有鉴权过的link key,容易受到MITM(Man-in-the-Middle Attack)攻击。Bluetooth 2.1之前的设备link key不被加密,Bluetooth 2.1之后的设备link key会被加密。server端创建的socket是否需要进行配对确认还需要client端创建与之对应的socket配对使用,如createRfcommSocketToServiceRecord(UUID)和 createInsecureRfcommSocketToServiceRecord(UUID) ]。字符串参数为服务的标识名称,名字是任意的,可以简单地是应用程序的名称。UUID用来标识服务,当客户端试图连接本设备时,它必须携带一个相同的UUID,连接才会被接受。

        public AcceptThread(boolean isAndroid) {
            BluetoothServerSocket tmp = null;
           // Create a new listening server socket
            try {
                if(isAndroid)
                    tmp = mAdapter.listenUsingRfcommWithServiceRecord(NAME_SECURE, UUID_ANDROID_DEVICE);
                else
                   tmp = mAdapter.listenUsingRfcommWithServiceRecord(NAME_SECURE, UUID_OTHER_DEVICE);
            } catch (IOException e) { }
            mmServerSocket = tmp;
        }

通过调用accept()来侦听连接请求。这是一个阻塞线程,直到接收一个连接或者产生异常才会返回。当客户端携带的UUID与侦听它Socket注册的UUID匹配,连接请求才会被接受。如果成功,accept()将返回一个BluetoothSocket对象。accept()调用不应该在主Activity UI线程中进行,因为它是个阻塞线程,会妨碍应用中其他的交互。

        public void run() {
            setName("AcceptThread" + mSocketType);
            BluetoothSocket socket = null;
            // Listen to the server socket if we're not connected
            while (mState != BluetoothState.STATE_CONNECTED && isRunning) {
                try {
                    // This is a blocking call and will only ret

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值