将BLE设备连接到Android发送数据(nUART)

时间:2017-01-23 08:05:22

标签: android bluetooth-lowenergy

我试图将BLE设备(Adafruit Feather M0 Bluefruit LE)连接到Android应用程序。羽毛有一个传感器,可以发送有关特殊传感器事件的UART文本。

我想

  • 连接到设备(静态MAC地址)
  • 连接到nordic-UART-service
  • 接收羽毛的文字
  • 实施连接监视

现在我试图了解BLE的工作原理。我理解它只要连接到设备,但在那之后我就不知道了。

  1. 如何连接服务或自动连接服务?
    1. 获取传入数据的数据或通知需要什么?
  2. 这是现在的代码。现在有支票,所以当有些事情没有按计划发生时它会崩溃。但我试图理解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);
    
        }
    
    }
    }
    

    此代码是否适用于智能手机接收的内容?如何连接到特定服务或是否自动完成,因为设备仅提供一项服务?

1 个答案:

答案 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");
        }