Search code examples
androidkotlinbluetoothbluetooth-lowenergyandroid-jetpack

Send data from my App to Stm32 bluetooth Device - Kotlin


i have an application, and my application can connect to a bluetooth device. After that, i want to send message (Int) to my Blutooth Low Energy device. I have this code, but i can't figure it out what is the problem. If you want i have : Characteristic UUID, Service UUID.

Really, i need your help...

I've edited the question :

My code :

val filter = IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED)
lateinit var bluetoothAdapter: BluetoothAdapter
val bluetoothManager = context.getSystemService(Context.BLUETOOTH_SERVICE) as BluetoothManager
bluetoothAdapter = bluetoothManager.adapter

settingViewModel.bluetooth(bluetoothAdapter = bluetoothAdapter)

val mReceiver: BroadcastReceiver = object : BroadcastReceiver() {
    override fun onReceive(context: Context?, intent: Intent) {
        val action = intent.action
        if (action == BluetoothAdapter.ACTION_STATE_CHANGED) {
            val state = intent.getIntExtra(
                BluetoothAdapter.EXTRA_STATE,
                BluetoothAdapter.ERROR
            )
            when (state) {
                BluetoothAdapter.STATE_OFF -> {
                    settingViewModel.setIsConnected(false)
                    //settingViewModel.stopScan()
                    settingViewModel.setListDevices(null)
                }
                BluetoothAdapter.STATE_ON -> {
                    settingViewModel.setIsConnected(true)
                    //scan()
                    settingViewModel.setListDevices(bluetoothAdapter.bondedDevices)
                    context!!.unregisterReceiver(this)
                }
            }
        }
    }
}
context.registerReceiver(mReceiver, filter)

val SERVICE_UUID = "00000000-0001-11e1-9ab4-0002a5d5c51c"
        val ConfigCharacteristic = descriptorOf(
            service = SERVICE_UUID,
            characteristic = "00E00000-0001-11e1-ac36-0002a5d5c51b",
            descriptor = "00000000-0000-0000-0000-000000000000",
        )

Button(
            onClick = {
                if (settingViewModel.isConnected.value == true) {
                    coroutine.launch(Dispatchers.IO) {
                        try {
                            settingViewModel.peripheral.write(ConfigCharacteristic, byteArrayOf(1))
                        } catch (e: Exception) {
                            Toast.makeText(context, e.message, Toast.LENGTH_SHORT).show()
                        }
                    }
                }
//                    try {
//                    val Service =
//                        settingViewModel.deviceSocket.value.get .getService(UUID.fromString("0000ffe0-0000-1000-8000-00805f9b34fb"))
//                    val charac: BluetoothGattCharacteristic =
//                        Service.getCharacteristic(UUID.fromString("00E00000-0001-11e1-ac36-0002a5d5c51b"))
//                        settingViewModel.deviceSocket.value!!.outputStream.write("1".toByteArray())
//                    } catch (e: Exception) {
//                        Toast.makeText(context, e.message.toString(), Toast.LENGTH_LONG).show()
//                    }
            }
        ) {
            Text(text = "HelloWorld")
        }

I Already have the mac adress, the caracteristic and the service UUID of the device i want to connect to.

Again, i really need your help


Solution

  • First of all:
    When developing an app for a BLE device it is best to first use a generic BLE scanner app to test the connection and to find out which commands need to be sent. If you confirm that the BLE device works as expected you can continue with your own custom app. I would recommend nRF Connect for this task.

    Regarding your problem: There are still many things missing from your sourcecode. You said you can connect to the device but have problems sending a message. Your code does not contain anything related to a BLE connection so I can only assume that you connected to the device using the Bluetooth settings of your phone. This would be correct for Bluetooth Classic but BLE requires you to connect through your own custom app.

    The Ultimate Guide to Android Bluetooth Low Energy explains all steps necessary for a successful BLE connection. These steps are:

    1. Setting the correct permissions
    2. Scan for nearby BLE devices
    3. Connect to a BLE device of your choosing
    4. Scan for Services
    5. Read and Write a characteristic of your choosing

    All these steps are explained in the Guide using Kotlin as programming language.