android实现蓝牙app代码

时间:2021-12-23 23:42:30

本文实例为大家分享了android实现蓝牙app的具体代码,供大家参考,具体内容如下

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
private BluetoothGatt bluetoothGatt;
private BluetoothGattService gattService;
private BluetoothGattCharacteristic gattCharacteristic;
private BluetoothManager bluetoothManager;
private BluetoothAdapter bluetoothAdapter;
private List<BluetoothDevice> devices = new ArrayList<>();
 
private UUID serviceUUID;  //不同设备 不同uuid
private UUID characteristicUUID;   //不同设备 不同uuid
private final UUID service4UUID= UUID.fromString("0000fff0-0000-1000-8000-00805f9b34fb"); 
private final UUID charAUUID = UUID.fromString("0000fffa-0000-1000-8000-00805f9b34fb");
 
private LightReceiver lightReceiver;
private ScanReceiver scanReceiver;
private ListView listView;
private TextView tvrefresh;
private String lightAction;
 
@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  Log.i("tag", "MainActivity  onCreate()");
  //
  listView = (ListView) findViewById(R.id.lv_bluetooth);
  tvrefresh = (TextView) findViewById(R.id.tv_refresh_bluetooth);
  tvrefresh.setOnClickListener(this);
  openBluetooth();
  registeLigthReceiver();
  registeScanReceiver();
 
}
 
@Override
protected void onStart() {
  super.onStart();
  Log.i("tag", "MainActivity  onStart()");
  bluetoothScan();
}
 
//返回
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
  Log.i("tag", "MainActivity  onKeyUp()");
  this.finish();
  return super.onKeyUp(keyCode, event);
}
 
//重新扫描蓝牙
@Override
public void onClick(View view) {
  switch (view.getId()) {
    case R.id.tv_refresh_bluetooth:
      //蓝牙扫描
      bluetoothScan();
      break;
    default:
      break;
  }
}
 
//打开本地蓝牙
private void openBluetooth() {
  Log.i("tag", "openLocalBluetooth()");
  //检查手机是否支持蓝牙4.0
  if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) {
    Toast.makeText(this, "手机不支持蓝牙4.0", Toast.LENGTH_SHORT).show();
    finish();
  }
  //调用系统服务的方式,请求开启蓝牙
  bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
  bluetoothAdapter = bluetoothManager.getAdapter();
  //开启蓝牙
  if (!bluetoothAdapter.isEnabled()) {
    bluetoothAdapter.enable();
  }
}
 
//开始蓝牙扫描  扫描到一个添加一个
private void bluetoothScan() {
  Log.i("tag", "bluetoothScan()");
  if (bluetoothAdapter == null) {
    openBluetooth();
  }
  if (!bluetoothAdapter.isDiscovering()) {
    bluetoothAdapter.startDiscovery();  //回调
  } else {
    Toast.makeText(this, "扫描中..", Toast.LENGTH_SHORT).show();
  }
}
 
//更新蓝牙列表中的数据
private void updateUi() {
  Log.i("tag", "updateUi()");
  if (devices != null && devices.size() > 0) {
    BlueAdapter adapter = new BlueAdapter(this, devices);
    listView.setAdapter(adapter);
    adapter.notifyDataSetChanged();
  } else {
    Toast.makeText(this, "附近没有蓝牙", Toast.LENGTH_SHORT).show();
  }
}
 
//取得gatt 对应的service
private BluetoothGattService getGattService(BluetoothGatt gatt, UUID serviceUUID) {
  List<BluetoothGattService> gattServices = gatt.getServices();
  for (BluetoothGattService gattService : gattServices) {
    if (gattService.getUuid().equals(serviceUUID)) {
      return gattService;
    }
  }
  return null;
}
 
//取得service对应的characteristic
private BluetoothGattCharacteristic getGattCharacteristic(BluetoothGattService gattService, UUID characteristicUUID) {
  List<BluetoothGattCharacteristic> gattCharacteristics = gattService.getCharacteristics();
  for (BluetoothGattCharacteristic gattCharacteristic : gattCharacteristics) {
    if (gattCharacteristic.getUuid().equals(characteristicUUID)) {
      return gattCharacteristic;
    }
  }
  return null;
}
 
//注册蓝牙扫描监听
private void registeScanReceiver() {
  Log.i("tag", "registeScanReceiver()");
  scanReceiver = new ScanReceiver();
  IntentFilter filter = new IntentFilter();
  filter.addAction(BluetoothDevice.ACTION_FOUND);
  filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
  registerReceiver(scanReceiver, filter);
}
 
//定义蓝牙扫描监听类 添加device , 更新界面
class ScanReceiver extends BroadcastReceiver {
 
  @Override
  public void onReceive(Context context, Intent intent) {
    Log.i("tag", " BluetoothReceiver / ScanReceiver onReceive()  action=" + intent.getAction());
    String scanAction = intent.getAction();
    if (scanAction.equals(BluetoothDevice.ACTION_FOUND)) {
      BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
      if (!devices.contains(device)) {
        devices.add(device);
        if (CacheUtils.getBlueDeviceString(MainActivity1.this, device.getAddress()).equals("")) {
          CacheUtils.putBlueDeviceString(MainActivity1.this, device.getAddress(), device.getName());
        }
        updateUi();
      }
    } else if (scanAction.equals(BluetoothAdapter.ACTION_DISCOVERY_FINISHED)) {
      if (devices == null || devices.size() == 0) {
        Toast.makeText(MainActivity1.this, "附近没有发现蓝牙设备", Toast.LENGTH_SHORT).show();
      }
    }
  }
}
 
//注册灯光监听
private void registeLigthReceiver() {
  Log.i("tag", "registeReceiver()");
  lightReceiver = new LightReceiver();
  IntentFilter filter = new IntentFilter();
  filter.addAction("openLight");
  filter.addAction("closeLight");
  registerReceiver(lightReceiver, filter);
}
 
//定义灯控监听类
class LightReceiver extends BroadcastReceiver {
 
  @Override
  public void onReceive(Context context, Intent intent) {
 
    Log.i("tag", " BluetoothReceiver  /LightReceiver onReceive()  action=" + intent.getAction());
    //
    String address = intent.getStringExtra("bluetoothAddress");  //从adapter取得的数据
    lightAction = intent.getAction();
    // if()   不同设备  不同serviceUUID,不同的characteristicUUID 自己确定
    serviceUUID=service4UUID;
    characteristicUUID=charAUUID;
 
    if (bluetoothAdapter == null) {
      openBluetooth();
    }
    BluetoothDevice device = bluetoothAdapter.getRemoteDevice(address); 
    MyBluetoothGattCallback gattCallback = new MyBluetoothGattCallback();
    bluetoothGatt = device.connectGatt(MainActivity1.this, false, gattCallback);  //回调
 
  }
}
 
//蓝牙连接/通信回调
class MyBluetoothGattCallback extends android.bluetooth.BluetoothGattCallback {
  @Override
  public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
    super.onConnectionStateChange(gatt, status, newState);
    Log.i("tag", "MyBluetoothGattCallback  onConnectionStateChange()  newState=" + newState);
    if (newState == BluetoothProfile.STATE_CONNECTED) {
      gatt.discoverServices();       //连接成功,开始搜索服务,一定要调用此方法,否则获取不到服务
      Log.i("tag", "MyBluetoothGattCallback  STATE_CONNECTED  ");
    } else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
      Log.i("tag", "MyBluetoothGattCallback  STATE_DISCONNECTED");
    }
  }
 
  @Override
  public void onServicesDiscovered(BluetoothGatt gatt, int status) {
    super.onServicesDiscovered(gatt, status);
    Log.i("tag", "MyBluetoothGattCallback  onServicesDiscovered() status=" + status);
 
    if (lightAction.equals("openLight") || lightAction.equals("closeLight")) {  //避免 不停更新
      if (gattService == null || gattCharacteristic == null || !serviceUUID.equals(service4UUID) || !characteristicUUID.equals(charAUUID)) {
        gattService = getGattService(gatt, serviceUUID);
        if (gattService != null) {
          gattCharacteristic = getGattCharacteristic(gattService, characteristicUUID);
          if (gattCharacteristic != null) {
            gatt.setCharacteristicNotification(gattCharacteristic, true);
            gatt.connect();
          }
        }
      }
      if (lightAction.equals("openLight")) {
        gattCharacteristic.setValue("openLight"); //这里自己设置 蓝牙模组需要的数据
        gatt.writeCharacteristic(gattCharacteristic);
      } else if (lightAction.equals("closeLight")) {
        gattCharacteristic.setValue("closeLight"); //这里自己设置 蓝牙模组需要的数据
        gatt.writeCharacteristic(gattCharacteristic);
      }
      lightAction = "";
      gatt.readRemoteRssi();
    }
  }
}
 
@Override
protected void onDestroy() {
  super.onDestroy();
  Log.i("tag", "onDestroy()");
  if (bluetoothAdapter != null) {
    bluetoothAdapter.disable();
    bluetoothAdapter = null;
  }
  if (bluetoothGatt != null) {
    bluetoothGatt.disconnect();
    bluetoothGatt.close();
    bluetoothGatt = null;
  }
 
  if (lightReceiver != null) {
    unregisterReceiver(lightReceiver);
    lightReceiver = null;
  }
  if (scanReceiver != null) {
    unregisterReceiver(scanReceiver);
    scanReceiver = null;
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://blog.csdn.net/tangzheng828/article/details/52672345