[Źródło: www.kotlinlang.org]
Program:
W tym przypadku interesują nas dwa główne zdarzenia. Jedna ma za zadanie uruchomić Bluetooth w telefonie jeśli jest on wyłączony. Następne odpowiada za przesłanie wiadomości do układu bądź ich odbieranie.
Na samym początku należy wprowadzić dane do Android Manifest.
Powyższe instrukcje uzyskają automatycznie dostęp do Bluetooth urządzenia. Gdy będzie ono wyłączone to będzie następowało wymuszenie uruchomienia tego układu.
Cały projekt można podzielić na dwa etapy, wyszukanie i wybranie urządzenia, następnie wykonanie połączenia oraz przesłanie danych.
Kolejnym istotnym elementem jest zestawienie wszystkich potrzebnych bibliotek:
Teraz przechodzimy do programu głównego.
Na początku sprawdzamy czy układ wspiera bluetooth, jeśli tak to go uruchamiamy, gdy nie wyświetlamy informację i wyłączamy wykonywanie kolejnych elementów.
Następnie wyświetlane sparowane urządzenia, według jego nazwy:
Na samym początku przeglądamy listę sparowanych urządzeń, gdy odpowiada adresowi układu HC-05 to dodajemy do go listy. Po czym ustawiamy oczekiwanie na kliknięcie jednego z adresów w celu wybrania urządzenia.
Gdy już urządzenie zostało wybrane to przechodzimy do osobnego okna które pozwoli na wykonanie połączenia z układem oraz przesłania danych.
Dla układu HC-05 należy ustawić następujący kod UUID:
Wykonanie połączenia odbywa się w głównej aktywności przesyłającej informacje do układu:
Tutaj sprawdzamy czy połączenie zostało nawiązane i przypisujemy nowy adres usługi do urządzenia.
Utworzenie okna pozwalającego na komunikację z układem bluetooth:
Przypisujemy adres z głównego okna programu, dalej wykonujemy połączenie i tworzymy ciąg znaków do wysłania. Następnie przypisujemy wywołania do przycisków. Połączenie z układem bluetooth utrzymuję maksymalnie 10 sekund. Po tym czasie automatycznie rozłączam układ.
Obsługa przesłania danych do układu HC-05:
Tutaj po poprawnym przesłaniu danych rozłączam się z urządzeniem Bluetooth po to aby nie trzymać połączenia z układem.
Zamknięcie komunikacji i przejście do głównego okna programu:
Na samym początku należy wprowadzić dane do Android Manifest.
- <uses-permission android:name="android.permission.BLUETOOTH" />
- <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
Powyższe instrukcje uzyskają automatycznie dostęp do Bluetooth urządzenia. Gdy będzie ono wyłączone to będzie następowało wymuszenie uruchomienia tego układu.
Cały projekt można podzielić na dwa etapy, wyszukanie i wybranie urządzenia, następnie wykonanie połączenia oraz przesłanie danych.
Kolejnym istotnym elementem jest zestawienie wszystkich potrzebnych bibliotek:
- dependencies {
- implementation fileTree(dir: 'libs', include: ['*.jar'])
- implementation "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
- implementation 'com.android.support:appcompat-v7:26.1.0'
- implementation 'com.android.support.constraint:constraint-layout:1.1.2'
- testImplementation 'junit:junit:4.12'
- androidTestImplementation 'com.android.support.test:runner:1.0.2'
- androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
- implementation "org.jetbrains.anko:anko-common:0.8.3"
- }
Teraz przechodzimy do programu głównego.
Na początku sprawdzamy czy układ wspiera bluetooth, jeśli tak to go uruchamiamy, gdy nie wyświetlamy informację i wyłączamy wykonywanie kolejnych elementów.
- m_bluetoothAdapter = BluetoothAdapter.getDefaultAdapter()
- if(m_bluetoothAdapter == null){
- toast("Urządzenie nie wspiera Bluetooth")
- return
- }
- else
- {
- if(!m_bluetoothAdapter!!.isEnabled)
- {
- val enableBluetoothIntent = Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE)
- startActivityForResult(enableBluetoothIntent, REQUEST_ENABLE_BLUETOOTH)
- }
- }
Następnie wyświetlane sparowane urządzenia, według jego nazwy:
- private fun displayPairedDeviceList(){
- m_pairedDevices = m_bluetoothAdapter!!.bondedDevices
- val list : ArrayList<BluetoothDevice> = ArrayList()
- val listDevName : ArrayList<String> = ArrayList()
- if(!m_pairedDevices.isEmpty()){
- for(device: BluetoothDevice in m_pairedDevices){
- test = device.address.substring(0, 9)
- if(test.equals("20:16:03:", true)) {
- listDevName.add(device.name)
- list.add(device)
- }
- Log.i("device", "" + device)
- }
- }
- else
- {
- toast("Nie znaleziono sparowanych urządzeń")
- }
- if(listDevName.isEmpty()) {
- toast("Nie znaleziono sparowanych urządzeń")
- }
- val adapter2 = ArrayAdapter(this, android.R.layout.simple_list_item_1, listDevName)
- select_device_list.adapter = adapter2
- select_device_list.onItemClickListener = AdapterView.OnItemClickListener { _, _, position, _ ->
- val device: BluetoothDevice = list[position]
- val address: String = device.address
- val intent = Intent(this, ControlActivity::class.java)
- intent.putExtra(EXTRA_ADDRESS, address)
- startActivity(intent) }
- }
Na samym początku przeglądamy listę sparowanych urządzeń, gdy odpowiada adresowi układu HC-05 to dodajemy do go listy. Po czym ustawiamy oczekiwanie na kliknięcie jednego z adresów w celu wybrania urządzenia.
Gdy już urządzenie zostało wybrane to przechodzimy do osobnego okna które pozwoli na wykonanie połączenia z układem oraz przesłania danych.
Dla układu HC-05 należy ustawić następujący kod UUID:
- var m_myUUID: UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB")
Wykonanie połączenia odbywa się w głównej aktywności przesyłającej informacje do układu:
- override fun doInBackground(vararg p0: Void?): String? {
- try{
- if (m_bluetoothSocket == null || !m_isConnected){
- m_bluetoothAdapter = BluetoothAdapter.getDefaultAdapter()
- val device: BluetoothDevice = m_bluetoothAdapter.getRemoteDevice(m_address)
- m_bluetoothSocket = device.createInsecureRfcommSocketToServiceRecord(m_myUUID)
- BluetoothAdapter.getDefaultAdapter().cancelDiscovery()
- m_bluetoothSocket!!.connect()
- }
- }catch (e:IOException){
- connectSuccess = false
- e.printStackTrace()
- }
- return null
- }
Tutaj sprawdzamy czy połączenie zostało nawiązane i przypisujemy nowy adres usługi do urządzenia.
Utworzenie okna pozwalającego na komunikację z układem bluetooth:
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
- setContentView(R.layout.control_layout)
- m_address = intent.getStringExtra(MainActivity.EXTRA_ADDRESS)
- ConnectToDevice(this).execute() //Połączenie z układem
- //przygotowanie wiadomości tekstowej, to można pobrać z pola tekstowego
- var dataToSend: String = "Command:" + cardToOpenDoor + "en;"
- image_open_door_btn.setOnClickListener{sendCommand(dataToSend)}
- disconnect_from_bluetooth_btn.setOnClickListener{disconnect()}
- //Czas na utrzymywanie połączenia
- timer.schedule(10000) {
- disconnect()
- }
- }
Przypisujemy adres z głównego okna programu, dalej wykonujemy połączenie i tworzymy ciąg znaków do wysłania. Następnie przypisujemy wywołania do przycisków. Połączenie z układem bluetooth utrzymuję maksymalnie 10 sekund. Po tym czasie automatycznie rozłączam układ.
Obsługa przesłania danych do układu HC-05:
- private fun sendCommand(input: String){
- if(m_bluetoothSocket != null){
- try{
- m_bluetoothSocket!!.outputStream.write(input.toByteArray())
- toast("Polecenie otwarcia wysłane")
- disconnect()
- }
- catch(e: IOException){
- e.printStackTrace()
- toast("Błąd podczas przesyłania danych")
- }
- }
- }
Tutaj po poprawnym przesłaniu danych rozłączam się z urządzeniem Bluetooth po to aby nie trzymać połączenia z układem.
Zamknięcie komunikacji i przejście do głównego okna programu:
- private fun disconnect(){
- if(m_bluetoothSocket != null) {
- try {
- m_bluetoothSocket!!.close()
- m_bluetoothSocket = null
- m_isConnected = false
- }
- catch (e: IOException){
- e.printStackTrace()
- }
- }
- timer.cancel()
- timer.purge()
- finish()
- }