Android适配安卓6.0蓝牙通讯实现过程

版权声明:我是南七小僧,微信: to_my_love ,寻找人工智能相关工作,欢迎交流思想碰撞。 https://blog.csdn.net/qq_25439417/article/details/84255797

实现需要的权限:由于安卓4.x版以上的版本使用蓝牙,需要开启定位权限才能搜索到附近的蓝牙设备

1

2

3

4

<uses-permission android:name="android.permission.BLUETOOTH"/>

<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>

  

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

服务端

实现思路:
1,拿到本地蓝牙设备
.2,蓝牙之间的通讯需要一个唯一识别UUID来匹配正确的设备,使用UUID获取蓝牙的通讯Socket.3 ,开启获取数据的线程

1

2

3

4

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

三十

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

  

 BluetoothSocket BTSocket;

 BluetoothAdapter BTAdapter;

 Button bt_start;

 TextView tv_msg;

 StringBuilder sb;

  

 @Override

 protected void onCreate(Bundle savedInstanceState) {

 super.onCreate(savedInstanceState);

 setContentView(R.layout.activity_main);

 bt_start = (Button) findViewById(R.id.bt_start);

 tv_msg = (TextView) findViewById(R.id.tv_msg);

 bt_start.setOnClickListener(this);

 sb = new StringBuilder();

 //拿到本地蓝牙设备

 BTAdapter = BluetoothAdapter.getDefaultAdapter();

 }

  

 /**

 * UI文本输出

 *

 * @param msg

 */

 public void show(String msg) {

 sb.append(msg + "\n");

 runOnUiThread(new Runnable() {

 @Override

 public void run() {

 tv_msg.setText(sb.toString());

 }

 });

 }

  

 @Override

 public void onClick(View v) {

 //开启服务器

 ServerThread startServerThread = new ServerThread();

 startServerThread.start();

 }

  

 /**

 * 开启服务器

 */

 private class ServerThread extends Thread {

 public void run() {

 try {

 BluetoothServerSocket mserverSocket = BTAdapter.listenUsingRfcommWithServiceRecord("btspp",

  UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));

 show("服务端:等待连接");

  

 BTSocket = mserverSocket.accept();

 show("服务端:连接成功");

  

 readThread mreadThread = new readThread();

 mreadThread.start();

 show("服务端:启动接受数据");

 } catch (IOException e) {

 e.printStackTrace();

 }

 }

 }

  

 /**

 * 读取数据

 */

 private class readThread extends Thread {

 public void run() {

 byte[] buffer = new byte[1024];

 int bytes;

 InputStream mmInStream = null;

 try {

 mmInStream = BTSocket.getInputStream();

 show("服务端:获得输入流");

 } catch (IOException e1) {

 e1.printStackTrace();

 }

 while (true) {

 try {

  if ((bytes = mmInStream.read(buffer)) > 0) {

  byte[] buf_data = new byte[bytes];

  for (int i = 0; i < bytes; i++) {

  buf_data[i] = buffer[i];

  }

  String s = new String(buf_data);

  show("服务端:读取数据了~~" + s);

  }

 } catch (IOException e) {

  try {

  mmInStream.close();

  } catch (IOException e1) {

  e1.printStackTrace();

  }

  break;

 }

 }

 }

 }

  

}

客户端

实现思路:
1,检查是否开启蓝牙
2,注册一系列蓝牙的广播
。3,由于蓝牙每经过一个阶段都会发送一个广播,根据广播来实现对应的方法
4,蓝牙配对- >蓝牙连接- >发送消息(UUID必须相同)

1

2

3

4

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

三十

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

220

221

222

223

224

225

226

227

228

229

230

231

232

233

234

235

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

  

 private TextView tv_msg;

 private Button bt_search, bt_send;

 private BluetoothSocket BTSocket;

 private BluetoothAdapter BTAdapter;

 private BluetoothDevice device;

 private StringBuilder sb;

  

 @Override

 protected void onCreate(Bundle savedInstanceState) {

 super.onCreate(savedInstanceState);

 setContentView(R.layout.activity_main);

  

 bt_search = (Button) findViewById(R.id.bt_search);

 bt_send = (Button) findViewById(R.id.bt_send);

 tv_msg = (TextView) findViewById(R.id.tv_msg);

 bt_search.setOnClickListener(this);

 bt_send.setOnClickListener(this);

 sb = new StringBuilder();

  

 show("客户端:检查BT");

 checkBT(this);

 show("客户端:注册接收者");

 registerBTReceiver();

 }

  

 /**

 * UI文本输出

 *

 * @param msg

 */

 public void show(String msg) {

 sb.append(msg + "\n");

 runOnUiThread(new Runnable() {

 @Override

 public void run() {

 tv_msg.setText(sb.toString());

 }

 });

 }

  

 @Override

 public void onClick(View v) {

 switch (v.getId()) {

 case R.id.bt_search:

 show("客户端:开始寻找设备");

 BTAdapter.startDiscovery();

 break;

 case R.id.bt_send:

 sendMessage();

 break;

 }

 }

  

 /**

 * 检查蓝牙

 */

 public void checkBT(Context context) {

 BTAdapter = BluetoothAdapter.getDefaultAdapter();

 if (BTAdapter != null) {

 if (!BTAdapter.isEnabled()) {

 Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);

 // 设置蓝牙可见性,最多300秒

 intent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);

 context.startActivity(intent);

 }

 } else {

 System.out.println("本地设备驱动异常!");

 }

 }

  

 /**

 * 开启客户端

 */

 private class clientThread extends Thread {

 public void run() {

 try {

 //创建一个Socket连接:只需要服务器在注册时的UUID号

 BTSocket = device.createRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));

 //连接

 show("客户端:开始连接...");

 BTSocket.connect();

 show("客户端:连接成功");

 //启动接受数据

 show("客户端:启动接受数据");

 readThread mreadThread = new readThread();

 mreadThread.start();

 } catch (IOException e) {

 show("客户端:连接服务端异常!断开连接重新试一试");

 e.printStackTrace();

 }

 }

 }

  

 /**

 * 读取数据

 */

 private class readThread extends Thread {

 public void run() {

 byte[] buffer = new byte[1024];

 int bytes;

 InputStream is = null;

 try {

 is = BTSocket.getInputStream();

 show("客户端:获得输入流");

 } catch (IOException e1) {

 e1.printStackTrace();

 }

 while (true) {

 try {

  if ((bytes = is.read(buffer)) > 0) {

  byte[] buf_data = new byte[bytes];

  for (int i = 0; i < bytes; i++) {

  buf_data[i] = buffer[i];

  }

  String s = new String(buf_data);

  show("客户端:读取数据了" + s);

  }

 } catch (IOException e) {

  try {

  is.close();

  } catch (IOException e1) {

  e1.printStackTrace();

  }

  break;

 }

 }

 }

 }

  

 /**

 * 发送数据

 */

 public void sendMessage() {

 if (BTSocket == null) {

 Toast.makeText(this, "没有连接", Toast.LENGTH_SHORT).show();

 return;

 }

 try {

 OutputStream os = BTSocket.getOutputStream();

 os.write("我爱你dahsid132456@#%¥*".getBytes());

 os.flush();

 show("客户端:发送信息成功");

 } catch (IOException e) {

 e.printStackTrace();

 }

 }

  

 /**

 * 注册广播

 */

 public void registerBTReceiver() {

 // 设置广播信息过滤

 IntentFilter intentFilter = new IntentFilter();

 intentFilter.addAction(BluetoothDevice.ACTION_FOUND);

 intentFilter.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED);

 intentFilter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);

 intentFilter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);

 intentFilter.addAction(BluetoothDevice.ACTION_BOND_STATE_CHANGED);

 // 注册广播接收器,接收并处理搜索结果

 registerReceiver(BTReceive, intentFilter);

 }

  

 /**

 * 注销广播

 */

 public void unregisterBTReceiver() {

 unregisterReceiver(BTReceive);

 }

  

 @Override

 protected void onDestroy() {

 super.onDestroy();

 unregisterBTReceiver();

 }

  

 /**

 * 广播接收者

 */

 private BroadcastReceiver BTReceive = new BroadcastReceiver() {

 @Override

 public void onReceive(Context context, Intent intent) {

 String action = intent.getAction();

 if (BluetoothDevice.ACTION_FOUND.equals(action)) {

 device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);

 show("客户端:找到的BT名:" + device.getName());

 // 如果查找到的设备符合要连接的设备,处理

 if (device.getName().equalsIgnoreCase("xu")) {

  show("客户端:配对xu蓝牙:");

  // 搜索蓝牙设备的过程占用资源比较多,一旦找到需要连接的设备后需要及时关闭搜索

  BTAdapter.cancelDiscovery();

  // 获取蓝牙设备的连接状态

  int connectState = device.getBondState();

  switch (connectState) {

  // 未配对

  case BluetoothDevice.BOND_NONE:

  show("客户端:开始配对:");

  try {

  Method createBondMethod = BluetoothDevice.class.getMethod("createBond");

  createBondMethod.invoke(device);

  } catch (Exception e) {

  e.printStackTrace();

  }

  break;

  // 已配对

  case BluetoothDevice.BOND_BONDED:

  try {

  show("客户端:开始连接:");

  clientThread clientConnectThread = new clientThread();

  clientConnectThread.start();

  } catch (Exception e) {

  e.printStackTrace();

  }

  break;

  }

 }

 } else if (BluetoothDevice.ACTION_BOND_STATE_CHANGED.equals(action)) {

 // 获取蓝牙设备的连接状态

 int connectState = device.getBondState();

 // 已配对

 if (connectState == BluetoothDevice.BOND_BONDED) {

  try {

  show("客户端:开始连接:");

  clientThread clientConnectThread = new clientThread();

  clientConnectThread.start();

  } catch (Exception e) {

  e.printStackTrace();

  }

 }

 }

 show(action);

 }

 };

}

蓝牙广播内容:

ACTION_STATE_CHANGED当你蓝牙开启或者关闭的时候发送
ACTION_FOUND当你匹配到附近蓝牙设备时发送
ACTION_DISCOVERY_STARTED当你开始搜索附近蓝牙设备时发送
ACTION_DISCOVERY_FINISHED当你结束搜索附近蓝牙设备时发送
ACTION_BOND_STATE_CHANGED当你蓝牙设备匹配状态发生变化时发送

猜你喜欢

转载自blog.csdn.net/qq_25439417/article/details/84255797