Android应用程序,通过微控制器通过UART发送的BLE模块接收数据

Android应用程序,通过微控制器通过UART发送的BLE模块接收数据,android,bluetooth-lowenergy,microcontroller,stm32,uart,Android,Bluetooth Lowenergy,Microcontroller,Stm32,Uart,我想创建一个android应用程序,它可以连接蓝牙低能模块,并可以接收数据。在我的系统中,微控制器通过UART向BT LE模块发送测量数据 我的问题是如何开始?我读了很多关于GATT和UART服务的书,但仍然不知道如何开始。请给我一些信息。您需要: 服务的UUID、特征和描述符 蓝牙的低能量 该计划必须: 可扫描设备 连接设备 设置回调的可恢复性 AndroidManifest.xml 注意事项: 在模块上设置的UUID必须相同 在您的程序中,必须有两个回调:ScanCallback和Ga

我想创建一个android应用程序,它可以连接蓝牙低能模块,并可以接收数据。在我的系统中,微控制器通过UART向BT LE模块发送测量数据

我的问题是如何开始?我读了很多关于
GATT
UART
服务的书,但仍然不知道如何开始。请给我一些信息。

您需要:

  • 服务的UUID、特征和描述符

  • 蓝牙的低能量

该计划必须:

  • 可扫描设备
  • 连接设备
  • 设置回调的可恢复性
  • AndroidManifest.xml

    注意事项:

    • 在模块上设置的UUID必须相同
    • 在您的程序中,必须有两个回调:ScanCallback和GattCallback。扫描回调用于管理扫描结果,GattCallback用于管理数据输入/输出
    • 这段代码是演示如何在Android上使用BLE的基本代码,对我来说很好
    • 您可以在此处生成UUID:

    您有服务和特色结构吗?我们使用一个叫做“BLE扫描器”的Andoid应用程序。此应用程序显示结构,您可以读取和写入特征中的值。是的,我使用了此程序并获得了UUID地址列表,您谈到了自定义服务重叠吗?下一步是什么,如何将特征与UART发送的数据相连接?您的BLE模块是什么,HM-10?Bolutek BLE CC41A创建一个具有读取+通知属性的自定义特征的自定义服务,然后每次测量更改时更新特征。我认为这个模块使用AT命令来创建和更新特征。andoid应用程序可以订阅这些特征,并且在您的设备每次更新时都会收到通知。请向我发送一份您导入的LIB列表,让我检查它是否正常工作。对于我来说,描述符是0x2902,我可以将其复制到描述符\UUID\u ID行吗?当然可以。但必须使用128位格式字符串的FULLUUID。我不记得哪个是,但你可以在
    BLE扫描仪中看到,我想那是:
    00002902-0000-1000-8000-00805F9B34FB
    。到UUID 0x2902。
    <uses-feature android:name="android.hardware.bluetooth_le" android:required="true"/>
    <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"/>
    
    // Bluetooth's variables
        BluetoothAdapter bluetoothAdapter;
        BluetoothLeScanner bluetoothLeScanner;
        BluetoothManager bluetoothManager;
        BluetoothScanCallback bluetoothScanCallback;
        BluetoothGatt gattClient;
    
        BluetoothGattCharacteristic characteristicID; // To get Value
    
    // UUID's (set yours)
    final UUID SERVICE_UUID = UUID.fromString("ab0828b1-198e-4351-b779-901fa0e0371e");
    final UUID CHARACTERISTIC_UUID_ID = UUID.fromString("1a220d0a-6b06-4767-8692-243153d94d85");
    final UUID DESCRIPTOR_UUID_ID = UUID.fromString("ec6e1003-884b-4a1c-850f-1cfce9cf6567");
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        // Bluetooth
        bluetoothManager = (BluetoothManager) getSystemService(BLUETOOTH_SERVICE);
        bluetoothAdapter = bluetoothManager.getAdapter();
        startScan();
    }
    
     // BLUETOOTH SCAN
    
    private void startScan(){
        Log.i(TAG,"startScan()");
        bluetoothScanCallback = new BluetoothScanCallback();
        bluetoothLeScanner = bluetoothAdapter.getBluetoothLeScanner();
        bluetoothLeScanner.startScan(bluetoothScanCallback);
    }
    
    // BLUETOOTH CONNECTION
    private void connectDevice(BluetoothDevice device) {
        if (device == null) Log.i(TAG,"Device is null");
        GattClientCallback gattClientCallback = new GattClientCallback();
        gattClient = device.connectGatt(this,false,gattClientCallback);
    }
    
    // BLE Scan Callbacks
    private class BluetoothScanCallback extends ScanCallback {
    
        @Override
        public void onScanResult(int callbackType, ScanResult result) {
            Log.i(TAG, "onScanResult");
            if (result.getDevice().getName() != null){
                if (result.getDevice().getName().equals(YOUR_DEVICE_NAME)) {
                    // When find your device, connect.
                    connectDevice(result.getDevice());
                    bluetoothLeScanner.stopScan(bluetoothScanCallback); // stop scan
                }
            }
        }
    
        @Override
        public void onBatchScanResults(List<ScanResult> results) {
            Log.i(TAG, "onBathScanResults");
        }
    
        @Override
        public void onScanFailed(int errorCode) {
            Log.i(TAG, "ErrorCode: " + errorCode);
        }            
    }
    
    // Bluetooth GATT Client Callback
    private class GattClientCallback extends BluetoothGattCallback {
        @Override
        public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
            super.onConnectionStateChange(gatt, status, newState);
            Log.i(TAG,"onConnectionStateChange");
    
            if (status == BluetoothGatt.GATT_FAILURE) {
                Log.i(TAG, "onConnectionStateChange GATT FAILURE");
                return;
            } else if (status != BluetoothGatt.GATT_SUCCESS) {
                Log.i(TAG, "onConnectionStateChange != GATT_SUCCESS");
                return;
            }
    
            if (newState == BluetoothProfile.STATE_CONNECTED) {
                Log.i(TAG, "onConnectionStateChange CONNECTED");
                gatt.discoverServices();
            } else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
                Log.i(TAG, "onConnectionStateChange DISCONNECTED");
            }
        }
    
        @Override
        public void onServicesDiscovered(BluetoothGatt gatt, int status) {
            super.onServicesDiscovered(gatt, status);
            Log.i(TAG,"onServicesDiscovered");
            if (status != BluetoothGatt.GATT_SUCCESS) return;
    
            // Reference your UUIDs
            characteristicID = gatt.getService(SERVICE_UUID).getCharacteristic(CHARACTERISTIC_UUID_ID);
            gatt.setCharacteristicNotification(characteristicID,true);
    
            BluetoothGattDescriptor descriptor = characteristicID.getDescriptor(DESCRIPTOR_UUID_ID);
            descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
            gatt.writeDescriptor(descriptor);
        }
    
        @Override
        public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
            super.onCharacteristicRead(gatt, characteristic, status);
            Log.i(TAG,"onCharacteristicRead");
        }
    
        @Override
        public void onCharacteristicWrite(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
            super.onCharacteristicWrite(gatt, characteristic, status);
            Log.i(TAG,"onCharacteristicWrite");
        }
    
        @Override
        public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) {
            super.onCharacteristicChanged(gatt, characteristic);
            Log.i(TAG,"onCharacteristicChanged");
            // Here you can read the characteristc's value
            // new String(characteristic.getValue();
        }
    
        @Override
        public void onDescriptorRead(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) {
            super.onDescriptorRead(gatt, descriptor, status);
            Log.i(TAG,"onDescriptorRead");
        }
    
        @Override
        public void onDescriptorWrite(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) {
            super.onDescriptorWrite(gatt, descriptor, status);
            Log.i(TAG,"onDescriptorWrite");
        }
    }
    
    import android.bluetooth.BluetoothAdapter;
    import android.bluetooth.BluetoothDevice;
    import android.bluetooth.BluetoothGatt;
    import android.bluetooth.BluetoothGattCallback;
    import android.bluetooth.BluetoothGattCharacteristic;
    import android.bluetooth.BluetoothGattDescriptor;
    import android.bluetooth.BluetoothManager;
    import android.bluetooth.BluetoothProfile;
    import android.bluetooth.le.BluetoothLeScanner;
    import android.bluetooth.le.ScanCallback;
    import android.bluetooth.le.ScanResult;