不管是基于IOS,还是Android或者是小程序 ,蓝牙开发的过程都包含下面几个重要的步骤:
1.搜索设备
设备搜索是一个扫描程序,它会搜索本地附近启用了蓝牙的设备,并从这些设备上获取一些信息(这个过程有时简称为“发现中”、“查询中”或者“扫描中”)。然而,在本地区域范围内的蓝牙设备只有在它是允许被发现的模式下才会响应其它设备扫描发现的请求。如果一个设备是可被发现的状态模式,它会通过共享一些信息来响应搜索发现的请求,例如设备名字,设备类型和它的MAC地址。使用这些信息,执行扫描的设备才能创建一个连接连接上被发现的设备。
a.获取适配器:mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
b.打开适配器:Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableIntent, REQUEST_ENABLE_BT);
c.搜索蓝牙设备:
获取已配对设备:Set>BluetoothDevice< pairedDevices = mBtAdapter.getBondedDevices();
搜索周边设备:mBtAdapter.startDiscovery();
BluetoothDevice.ACTION_FOUND找到一个;
BluetoothAdapter.ACTION_DISCOVERY_FINISHED搜索结束。
2.连接到蓝牙ConnectThread:
服务端设备和客户端设备获取BluetoothSocket的方法不同。服务端设备将会在接受一个传入的连接请求时获得。客户端设备会在它打开与服务端设备的RFCOMM通道时获得。
一种解决方案是自动将每一台设备作为服务端,这样每一台设备都拥有一个server socket可以监听连接。之后,每一台设备都可以启动一个与其它设备的连接并变成客户端设备。另外,也可以明确一台设备作为服务端根据需要启动一个server socket,其它设备只要简单的建立连接。
a.根据地址获取设备:
BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address);
b.获取设备soceket:
device.createRfcommSocketToServiceRecord(MY_UUID_SECURE);
c.取消扫描设备,连接soceket:端口:
mAdapter.cancelDiscovery();
mmSocket.connect();
3.数据信息交互ConnectedThread:
首先,你需要为所有数据流的读写操作分派一个特定的线程。这是非常重要的,因为read(byte[])和write(byte[])方法都是会阻塞的方法。read(byte[])方法在从数据流中读取到数据之前会一直阻塞。write(byte[])方法不会经常阻塞,但是在远程设备没有及时调用read(byte[])方法并且中间缓冲区满的时候也会进行阻塞。因此,你的线程中的主循环应该专门用来从InputStream中读取数据。线程中再指定一个公共方法将数据写入到OutputStream中。
a.获取读写流
tmpIn = socket.getInputStream();
tmpOut = socket.getOutputStream();
b.阻塞方法读取:
bytes = mmInStream.read(buffer);
c.发送消息
mmOutStream.write(buffer);
d.通过handler将文本添加到listview,成为新的消息
mConversationArrayAdapter.add(\\\\\\\"Me: \\\\\\\" + writeMessage);