我试图将BLE设备(Adafruit Feather M0 Bluefruit LE)连接到Android应用程序。羽毛有一个传感器,可以发送有关特殊传感器事件的UART文本。
我想
现在我试图了解BLE的工作原理。我理解它只要连接到设备,但在那之后我就不知道了。
这是现在的代码。现在有支票,所以当有些事情没有按计划发生时它会崩溃。但我试图理解BLE的事情。它也不是服务,只是一个活动。我无法测试它,因为智能手机不会在本周结束前提供。
package de.example.bluetoothletest;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothGatt;
import android.bluetooth.BluetoothGattCallback;
import android.bluetooth.BluetoothGattCharacteristic;
import android.bluetooth.BluetoothManager;
import android.bluetooth.BluetoothProfile;
import android.content.Context;
import android.content.Intent;
import android.support.v4.content.LocalBroadcastManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import java.util.UUID;
public class MainActivity extends AppCompatActivity {
private BluetoothAdapter mBluetoothAdapter;
private BluetoothGatt mBluetoothGatt;
private String deviceaddress=("FC:57:1A:B7:22:AD");
public final static String ACTION_DATA_AVAILABLE = "de.example.BluetoothLETest.ACTION_DATA_AVAILABLE";
public static final UUID RX_SERVICE_UUID = UUID.fromString("6e400001-b5a3-f393-e0a9-e50e24dcca9e");
public static final UUID RX_CHAR_UUID = UUID.fromString("6e400002-b5a3-f393-e0a9-e50e24dcca9e");
public static final UUID TX_CHAR_UUID = UUID.fromString("6e400003-b5a3-f393-e0a9-e50e24dcca9e");
public static String EXTRA_DATA="de.example.BluetoothLETest.EXTRA_DATA";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//get the BluetoothAdapter
final BluetoothManager mbluetoothManager=(BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
mBluetoothAdapter=mbluetoothManager.getAdapter();
}
public void connect(){
//connect to the given deviceaddress
BluetoothDevice device=mBluetoothAdapter.getRemoteDevice(deviceaddress);
mBluetoothGatt=device.connectGatt(this, false, mGattCallback);
//now we get callbacks on mGattCallback
}
//get callbacks when something changes
private final BluetoothGattCallback mGattCallback=new BluetoothGattCallback() {
@Override
public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
if (newState== BluetoothProfile.STATE_CONNECTED){
//device connected
}
}
@Override
public void onServicesDiscovered(BluetoothGatt gatt, int status) {
if (status==BluetoothGatt.GATT_SUCCESS){
//all Services have been discovered
}
}
@Override
public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
//we are still connected to the service
if (status==BluetoothGatt.GATT_SUCCESS){
//send the characteristic to broadcastupdate
broadcastupdate(ACTION_DATA_AVAILABLE, characteristic);
}
}
@Override
public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) {
//send the characteristic to broadcastupdate
broadcastupdate(ACTION_DATA_AVAILABLE, characteristic);
}
};
//Get the 'real' data out of characteristic
private void broadcastupdate(final String action,final BluetoothGattCharacteristic characteristic){
final Intent intent= new Intent(action);
//only when it is the right characteristic?/service?
if (TX_CHAR_UUID.equals(characteristic.getUuid())){
//get the 'real' data from the stream
intent.putExtra(EXTRA_DATA, characteristic.getValue());
//send the extracted data via LocalBroadcastManager
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
}
}
}
此代码是否适用于智能手机接收的内容?如何连接到特定服务或是否自动完成,因为设备仅提供一项服务?
答案 0 :(得分:0)
将您的连接方法更改为:
if (newState == BluetoothProfile.STATE_CONNECTED) {
intentAction = ACTION_GATT_CONNECTED;
broadcastUpdate(intentAction);
gatt.discoverServices();
}
和serviceDiscoverd
@Override
public void onServicesDiscovered(BluetoothGatt gatt, int status) {
super.onServicesDiscovered(gatt, status);
List<BluetoothGattService> services = gatt.getServices();
gatt.readCharacteristic(services.get(1).getCharacteristics().get(0));
String uuid;
List<BluetoothGattCharacteristic> gattCharacteristics;
ArrayList<BluetoothGattCharacteristic> charas;
for (BluetoothGattService gattService : services) {
gattCharacteristics =
gattService.getCharacteristics();
charas = new ArrayList<>();
for (BluetoothGattCharacteristic gattCharacteristic : gattCharacteristics) {
charas.add(gattCharacteristic);
uuid = gattCharacteristic.getUuid().toString();
if (uuid.equals("0000fff4-0000-1000-8000-00805f9b34fb")) {
final int charaProp = gattCharacteristic.getProperties();
if ((charaProp | BluetoothGattCharacteristic.PROPERTY_NOTIFY) > 0) {
BluetoothGattCharacteristic mNotifyCharacteristic = gattCharacteristic;
setCharacteristicNotification(
gattCharacteristic, true);
}
}
}
}
}
public void setCharacteristicNotification(final BluetoothGattCharacteristic characteristic,
boolean enabled) {
if (mBluetoothAdapter == null || mGatt == null) {
return;
}
mGatt.setCharacteristicNotification(characteristic, enabled);
Log.e("uuid service", characteristic.getUuid() + "");
String uuid = "0000fff2-0000-1000-8000-00805f9b34fb";
if (uuid.equals(characteristic.getUuid().toString())) {
Log.e("uuid service2", characteristic.getUuid() + "");
BluetoothGattDescriptor descriptor = characteristic.getDescriptor(
UUID.fromString(SampleGattAttributes.CLIENT_CHARACTERISTIC_CONFIG));
if (descriptor != null) {
descriptor.setValue(enabled ? BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE : new byte[]{0x00, 0x00});
mGatt.writeDescriptor(descriptor);
}
}
}
现在终于你读卡了:
@Override
public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
super.onCharacteristicRead(gatt, characteristic, status);
updateStatus(characteristic);
Log.e("gatt", "readChar");
}
@Override
public void onCharacteristicWrite(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
super.onCharacteristicWrite(gatt, characteristic, status);
updateStatus(characteristic);
Log.e("gatt", "writeChar");
}
@Override
public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) {
super.onCharacteristicChanged(gatt, characteristic);
updateStatus(characteristic);
Log.e("gatt", "changeChar");
}