2014-04-22 13 views
6

मैं एंड्रॉइड एप्लिकेशन पर काम कर रहा हूं। मेरी परियोजना में मैं ब्लूटूथ स्कैनिंग डिवाइस, मैक पता, ब्लूटूथ सिग्नल शक्ति और दो एंड्रॉइड डिवाइस के बीच दूरी दिखाना चाहता हूं।ब्लूटूथ सिग्नल शक्ति का उपयोग कर दो एंड्रॉइड डिवाइस के बीच दूरी की गणना कैसे करें?

मैंने 3 आवश्यकताएं की हैं लेकिन मुझे नहीं पता कि सिग्नल शक्ति का उपयोग करके दूरी कैसे प्राप्त करें।

package com.example.bluetoothdemo; 
import java.util.ArrayList; 
import java.util.List; 
import java.util.Set; 
import android.content.Context; 
import android.content.Intent; 
import android.content.IntentFilter; 
import android.net.wifi.WifiInfo; 
import android.net.wifi.WifiManager; 
import android.os.Bundle; 
import android.app.Activity; 
import android.bluetooth.BluetoothAdapter; 
import android.bluetooth.BluetoothDevice; 
import android.content.Intent; 
import android.view.Menu; 
import android.view.View; 
import android.widget.ArrayAdapter; 
import android.widget.Button; 
import android.widget.ListAdapter; 
import android.widget.ListView; 
import android.widget.TextView; 
import android.widget.Toast; 
import android.content.BroadcastReceiver; 

public class MainActivity extends Activity { 
private BluetoothAdapter BTAdapter = BluetoothAdapter.getDefaultAdapter(); 
private static final int REQUEST_ENABLE_BT = 1; 

ListView listDevicesFound; 
Button btnScanDevice; 
TextView stateBluetooth; 
BluetoothAdapter bluetoothAdapter; 

ArrayAdapter<String> btArrayAdapter; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    btnScanDevice = (Button)findViewById(R.id.scan_device); 

    stateBluetooth = (TextView)findViewById(R.id.textView1); 
    bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); 

    listDevicesFound = (ListView)findViewById(R.id.listView1); 

    btArrayAdapter = new ArrayAdapter<String>(MainActivity.this, 

    android.R.layout.simple_list_item_1); 
    listDevicesFound.setAdapter(btArrayAdapter); 

    CheckBlueToothState(); 

    btnScanDevice.setOnClickListener(btnScanDeviceOnClickListener); 

    registerReceiver(ActionFoundReceiver, new IntentFilter(BluetoothDevice.ACTION_FOUND)); 
    registerReceiver(receiver, new IntentFilter(BluetoothDevice.ACTION_FOUND)); 
    } 


     @Override 

    protected void onDestroy() { 
// TODO Auto-generated method stub 
    super.onDestroy(); 
unregisterReceiver(ActionFoundReceiver); 
} 

     private void CheckBlueToothState(){ 
    if (bluetoothAdapter == null){ 
    stateBluetooth.setText("Bluetooth NOT support"); 
    }else{ 
    if (bluetoothAdapter.isEnabled()){ 
    if(bluetoothAdapter.isDiscovering()){ 
    stateBluetooth.setText("Bluetooth is currently in device discovery process."); 
    }else{ 
    stateBluetooth.setText("Bluetooth is Enabled."); 
    btnScanDevice.setEnabled(true); 
    } 
    }else{ 
    stateBluetooth.setText("Bluetooth is NOT Enabled!"); 
    Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); 
     startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT); 
    } 
    } 
} 

    private Button.OnClickListener btnScanDeviceOnClickListener = new Button.OnClickListener(){ 


     @Override 
    public void onClick(View arg0) { 
    // TODO Auto-generated method stub 
    btArrayAdapter.clear(); 
    bluetoothAdapter.startDiscovery(); 
     }}; 

     @Override 
     protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     // TODO Auto-generated method stub 
     if(requestCode == REQUEST_ENABLE_BT){ 
     CheckBlueToothState(); 
    } 
} 

    private final BroadcastReceiver ActionFoundReceiver = new BroadcastReceiver(){ 

    @Override 
     public void onReceive(Context context, Intent intent) { 
    // TODO Auto-generated method stub 
     String action = intent.getAction(); 
    if(BluetoothDevice.ACTION_FOUND.equals(action)) { 
     BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 
     btArrayAdapter.add(device.getName() + "\n" + device.getAddress()+ "   
\n "+intent.getShortExtra(BluetoothDevice.EXTRA_RSSI,Short.MIN_VALUE)); 
     btArrayAdapter.notifyDataSetChanged(); 
    } 
    }}; 
    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
getMenuInflater().inflate(R.menu.main, menu); 
return true; 
} 

    private final BroadcastReceiver receiver = new BroadcastReceiver(){ 
    @Override 
    public void onReceive(Context context, Intent intent) { 

    String action = intent.getAction(); 
    if(BluetoothDevice.ACTION_FOUND.equals(action)) { 
     int rssi = intent.getShortExtra(BluetoothDevice.EXTRA_RSSI,Short.MIN_VALUE); 
     String name = intent.getStringExtra(BluetoothDevice.EXTRA_NAME); 
     TextView rssi_msg = (TextView) findViewById(R.id.listView1); 

     Toast.makeText(getApplicationContext()," RSSI: " + rssi + "dBm",  
    Toast.LENGTH_SHORT).show(); 
    } 
} 
    }; 
} 

उत्तर

1

केवल ब्लूटूथ सिग्नल शक्ति के आधार पर दूरी की गणना करना संभव नहीं है। हालांकि आप दो उपकरणों के बीच की दूरी प्राप्त करने के लिए त्रिभुज तकनीक का उपयोग कर सकते हैं या दूरी को खोजने के लिए पूरी तरह से जीपीएस अवधारणा का उपयोग कर सकते हैं। केवल ब्लूटूथ का उपयोग करके, दूरी ढूंढना संभव नहीं है। भले ही आप सिग्नल की शक्ति को आसानी से समझने योग्य तरीके से इंगित करने के लिए ऐसा कुछ कर सकें।

https://play.google.com/store/apps/details?id=com.bluetoothFinder

इस लिंक को देख।

+0

मैं यह संभव कम ऊर्जा ब्लूटूथ के साथ देखा था, iBeacons कि दूरी का अनुमान है के लिए की तरह। – shkschneider

+0

हम बीकन जैसे एंड्रॉइड डिवाइस का उपयोग कैसे कर सकते हैं? – atasoyh

+1

@ akash89 पुराना उत्तर, लेकिन क्या आप इस बात पर ध्यान देंगे कि यह व्यावहारिक रूप से असंभव क्यों है? क्या ऐसा इसलिए है क्योंकि सिग्नल के लिए अन्य सामग्रियों से उछाल या अवशोषित होने की संभावना है? – moonman239

2

कई ब्लूटूथ LE उपकरणों से संकेतों को देखने के लिए, Google Play Store से "बी और एल ब्लूटूथ ली स्कैनर" ऐप का उपयोग करने का प्रयास करें। आपको तुरंत पता चलेगा कि आरएसएसआई सिग्नल शक्तियां "शोर" हैं जब कई डिवाइस मौजूद हैं। दीवारों, धातु के घटकों के साथ फर्नीचर, और वाई-फाई स्रोत सिग्नल विविधता भी पैदा करेंगे। सबसे अच्छा समाधान आपके दूरी के रीडिंग के लिए "जोन्स" बनाना है ... कुछ ऐसा: दूर, बंद, अगली-टू, आदि

+0

यह एक अच्छा ऐप है! – the0ther

-1

आप txPower का उपयोग कर दूरी की गणना कर सकते हैं। इसकी गणना करने के लिए नीचे गणितीय तरीका है।

double getDistance(int rssi, int txPower) { 
     return Math.pow(10d, ((double) txPower - rssi)/(10 * 2)); 
} 
+1

और मुझे सरल ब्लूटूथ (बीएलई नहीं) के लिए टीएक्सपावर का मूल्य कहां मिल सकता है? –

संबंधित मुद्दे