GithubHelp home page GithubHelp logo

bluetoothscanner's Introduction

BluetoothScanner

bluetooth_screenshot2

Formula

Distance = 10 ^ ((Measured Power โ€“ RSSI)/(10 * N))

RSSI to Distance (Meter)

    fun rssiToDistance(rssi: Int,signalStrength:Int): Double {
        return 10.0.pow((1.0 * (signalStrength - rssi)) / (10 * 2)).format(2)
    }

   private fun Double.format(fracDigits: Int): Double {
        val df = DecimalFormat()
        df.maximumFractionDigits = fracDigits
        return df.format(this).toDouble()
    }

BTDevice - Bluetooth Device Model Class

data class BTDevice(
    val name:String = "",
    val id:String,
    var distance: Double
)

BTScanner - Bluetooth Scanner Class

@SuppressLint("MissingPermission")
data class BTScanner(
    private val activity: ComponentActivity,
    private val scanTime : Long,
    private val signalStrength: Int,
    private val viewModel:DevicesViewModel = DevicesViewModel(),

    ) {
    private  var bluetoothAdapter:BluetoothAdapter = BluetoothAdapter.getDefaultAdapter()

    var isScanning: Boolean = false
         get() = field
         private set

    init {
        val bluetoothManager :BluetoothManager = this.activity
            .getSystemService(Context.BLUETOOTH_SERVICE) as BluetoothManager
        bluetoothAdapter = bluetoothManager.adapter
        bluetoothAdapter.enable()
    }

    fun start(){
        if(BTUtils.checkBluetooth(bluetoothAdapter)){
            scan(true)
        }
        else{
            Log.d("Scanner", "No Bluetooth!!")
        }
    }


    @OptIn(DelicateCoroutinesApi::class)
    @SuppressLint("MissingPermission")
    private fun scan(enable:Boolean){
        if(enable && !isScanning) {
            Log.d("Scanner", "Starting Scanning...")
             GlobalScope.launch(Dispatchers.Default) {
                delay(scanTime)
                isScanning = false
                bluetoothAdapter.stopLeScan(scanCallback)
            }
            isScanning = true
            bluetoothAdapter.startLeScan(scanCallback)
        }
    }


    @SuppressLint("MissingPermission")
    private val scanCallback = BluetoothAdapter.LeScanCallback { device, rssi, scanRecord ->

        val distance = BTUtils.rssiToDistance(rssi,signalStrength)
        val name = if (device.name != null){ device.name } else{ "NoName" }
        val address = device.address

        val btDevice = BTDevice(
            name = name,
            distance = distance,
            id = address
        )

        viewModel.addDevice(btDevice)

    }

}

bluetoothscanner's People

Contributors

yonigofman avatar

Watchers

 avatar

bluetoothscanner's Issues

Crash on Scan started

2022-09-20 22:21:30.632 25741-25741/com.yonigofman.bluetoothscannerapp E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.yonigofman.bluetoothscannerapp, PID: 25741
java.lang.NumberFormatException: For input string: "0,28"
at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:2043)
at sun.misc.FloatingDecimal.parseDouble(FloatingDecimal.java:110)
at java.lang.Double.parseDouble(Double.java:538)
at com.yonigofman.bluetoothscannerapp.Utils.BTUtils.format(BTUtils.kt:28)
at com.yonigofman.bluetoothscannerapp.Utils.BTUtils.rssiToDistance(BTUtils.kt:22)
at com.yonigofman.bluetoothscannerapp.Other.BTScanner.scanCallback$lambda-0(BTScanner.kt:74)
at com.yonigofman.bluetoothscannerapp.Other.BTScanner.$r8$lambda$sIQvKBc_h8sY_AjP8zdTo6mG2gE(Unknown Source:0)
at com.yonigofman.bluetoothscannerapp.Other.BTScanner$$ExternalSyntheticLambda0.onLeScan(Unknown Source:2)
at android.bluetooth.BluetoothAdapter$3.onScanResult(BluetoothAdapter.java:3310)
at android.bluetooth.le.BluetoothLeScanner$BleScanCallbackWrapper$1.run(BluetoothLeScanner.java:498)
at android.os.Handler.handleCallback(Handler.java:883)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7615)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:964)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.