以下是“Android实现蓝牙客户端与服务器端通信示例”的完整攻略:
1. 准备工作
在开始实现蓝牙客户端和服务器端通信之前,我们需要做以下准备工作:
- 确保安卓设备支持蓝牙功能
- 在AndroidManifest.xml文件中添加蓝牙权限
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<!-- 蓝牙设备需要定位权限 -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
- 在build.gradle文件中添加蓝牙依赖库
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support:design:28.0.0'
implementation 'com.android.support:support-v4:28.0.0'
implementation 'com.android.support:cardview-v7:28.0.0'
implementation 'com.android.support:recyclerview-v7:28.0.0'
2. 创建蓝牙客户端
2.1 初始化蓝牙适配器
创建蓝牙客户端前,我们需要先初始化蓝牙适配器,这样我们才能获取到蓝牙设备和实现蓝牙通信。通常来说,我们可以在Activity中使用以下代码初始化蓝牙适配器:
BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if (mBluetoothAdapter == null) {
// 设备不支持蓝牙
}
if (!mBluetoothAdapter.isEnabled()) {
// 蓝牙未开启,调用startActivityForResult开启蓝牙
}
2.2 搜索蓝牙设备
初始化蓝牙适配器后,我们需要搜索可用的蓝牙设备,以便进行连接。我们可以使用startDiscovery()方法开始搜索蓝牙设备,当搜索完成后,会发送一个广播通知。我们可以创建一个BroadcastReceiver接收该通知,这样我们就可以获取到周围可用的蓝牙设备,并且可以实现连接。
示例代码如下:
public void searchDevice(){
mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
// 获得扫描广播值
if (BluetoothDevice.ACTION_FOUND.equals(action)) {
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
Log.e("device",device.getName() + ":" + device.getAddress());
// 连接该蓝牙设备
}
}
};
// 注册广播接收器
IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
registerReceiver(mReceiver, filter);
// 蓝牙搜索
mBluetoothAdapter.startDiscovery();
}
2.3 连接蓝牙设备
搜索到蓝牙设备后,我们需要连接该设备才能开始进行通信。创建连接步骤如下:
- 停止蓝牙搜索
- 创建BluetoothSocket实例
- 调用connect()方法连接设备
- 可选:判断连接是否成功
示例代码如下:
// 蓝牙设备
BluetoothDevice mDevice;
// 蓝牙socket
BluetoothSocket mSocket;
public void connectDevice(BluetoothDevice device){
// 停止蓝牙搜索
mBluetoothAdapter.cancelDiscovery();
// 创建socket
try {
mSocket = device.createRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));
} catch (IOException e) {
Log.e("socket", e.getMessage());
return;
}
// 连接设备
try {
mSocket.connect();
} catch (IOException e) {
Log.e("connect", e.getMessage());
// 连接失败
try {
mSocket.close();
} catch (IOException ex) {
Log.e("close", ex.getMessage());
}
return;
}
// 连接成功
}
3. 创建蓝牙服务器端
3.1 初始化服务器端
在创建蓝牙服务器端之前,我们需要初始化BluetoothServerSocket,这样我们才能监听客户端的连接请求,从而实现服务器端的通信。
示例代码如下:
// 服务端socket
BluetoothServerSocket mServerSocket;
public void initServerSocket(){
try {
mServerSocket = mBluetoothAdapter.listenUsingRfcommWithServiceRecord("服务名称", UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));
} catch (IOException e) {
Log.e("listen", e.getMessage());
}
}
3.2 等待连接请求
初始化服务器端后,我们需要等待客户端的连接请求,这里我们会使用BluetoothServerSocket的accept()方法。该方法会阻塞当前线程,并等待连接请求。
示例代码如下:
public void waitClient(){
BluetoothSocket socket;
while (true) {
try {
socket = mServerSocket.accept();
} catch (IOException e) {
Log.e("accept", e.getMessage());
break;
}
if (socket != null) {
// 处理客户端请求
break;
}
}
}
4. 实现通信
在客户端和服务器端连接成功后,我们就可以开始实现通信了。在这里,我们需要使用BluetoothSocket的getInputStream()和getOutputStream()方法获取到输入流和输出流,从而实现数据的传递。
以下是客户端发送数据的示例代码:
OutputStream outputStream;
try {
outputStream = mSocket.getOutputStream();
String data = "hello world";
outputStream.write(data.getBytes());
} catch (IOException e) {
Log.e("write", e.getMessage());
}
以下是服务器端接收数据的示例代码:
InputStream inputStream;
try {
inputStream = socket.getInputStream();
byte[] buffer = new byte[1024];
int bytes = inputStream.read(buffer);
String data = new String(buffer, 0, bytes);
Log.e("data", data);
} catch (IOException e) {
Log.e("read", e.getMessage());
}
完整的Android实现蓝牙客户端与服务器端通信示例已经结束,该攻略提供了搜索蓝牙设备、连接蓝牙设备、创建蓝牙服务器端等操作的示例代码。其中客户端和服务器端的数据通信示例也已经提供,可以供开发者参考,实现更为复杂和完善的通讯应用。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Android实现蓝牙客户端与服务器端通信示例 - Python技术站