手機藍牙檢測藍牙設備信號強度(RSSI)


藍牙( Bluetooth® ):是一種無線技術標准,可實現固定設備、移動設備和樓宇個人域網之間的短距離數據交換(使用2.4—2.485GHz的ISM波段的UHF無線電波)。藍牙技術最初由電信巨頭愛立信公司於1994年創制,當時是作為RS232數據線的替代方案。藍牙可連接多個設備,克服了數據同步的難題。

RSSI:Received Signal Strength Indication接收的信號強度指示,無線發送層的可選部分,用來判定鏈接質量,以及是否增大廣播發送強度。通過接收到的信號強弱測定信號點與接收點的距離,進而根據相應數據進行定位計算的一種定位技術。

本例是通過手機藍牙對周圍藍牙設備進行搜索,顯示出域用戶輸入的藍牙設備名稱相匹配的遠程藍牙設備的信號強度(RSSI)。

所需權限:

    <uses-permission android:name="android.permission.BLUETOOTH"/>
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
    <uses-permission android:name="android.permission.BLUETOOTH_PRIVILEGED"/>

 

布局文件activity_main.xml:

    <TextView
        android:id="@+id/showRssi"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="hello_man" />

    <Button
        android:id="@+id/open"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/showRssi"
        android:layout_below="@+id/showRssi"
        android:layout_marginTop="24dp"
        android:onClick="open"
        android:text="打開藍牙" />

    <Button
        android:id="@+id/close"
        android:onClick="close"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/open"
        android:layout_alignBottom="@+id/open"
        android:layout_centerHorizontal="true"
        android:text="關閉藍牙" />

    <EditText
        android:id="@+id/bluetoothName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/open"
        android:layout_marginTop="31dp"
        android:ems="10"
        android:hint="請輸入藍牙名稱" >

        <requestFocus />
    </EditText>

    <Button
        android:id="@+id/show"
        android:onClick="show"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/close"
        android:layout_alignBottom="@+id/close"
        android:layout_alignParentRight="true"
        android:text="信號強度" />

 

布局圖:

布局為三個按鈕,一個textview,一個editview。

第一個按鈕功能為打開藍牙,第二個按鈕為關閉藍牙,第三個按鈕為搜索藍牙設備,textview用於顯示藍牙設備名稱以及信號強度,editview用於輸入用戶希望檢測信號強度的藍牙設備名稱。


MainActivity.java:

public class MainActivity extends Activity {
    BluetoothAdapter bAdapter;//聲明藍牙適配器
    EditText nameView;//聲明edittext
    String blueName;//聲明用戶輸入的藍牙設備名稱變量
    TextView showRssi;//聲明textview用於顯示信號強度信息
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        bAdapter = BluetoothAdapter.getDefaultAdapter();//獲取藍牙適配器
        //設置過濾器,過濾因遠程藍牙設備被找到而發送的廣播 BluetoothDevice.ACTION_FOUND
        IntentFilter iFilter=new IntentFilter();
        iFilter.addAction(BluetoothDevice.ACTION_FOUND);
        //設置廣播接收器和安裝過濾器
        registerReceiver(new foundReceiver(), iFilter);
        //獲取控件對象
        nameView = (EditText) findViewById(R.id.bluetoothName);
        showRssi = (TextView) findViewById(R.id.showRssi);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
    
    /**
     * 打開藍牙
     * @param v
     */
    public void open(View v) {
        if(!bAdapter.isEnabled()){
            bAdapter.enable();
            Toast.makeText(getApplicationContext(), "藍牙打開成功", 0).show();
        }else{
            Toast.makeText(getApplicationContext(), "藍牙已經打開", 0).show();
        }
    }
    
    /**
     * 關閉藍牙
     * @param v
     */
    public void close(View v) {
        if(bAdapter.isEnabled()){
            bAdapter.disable();
            Toast.makeText(getApplicationContext(), "藍牙關閉成功", 0).show();
        }else{
            Toast.makeText(getApplicationContext(), "藍牙已經關閉", 0).show();
        }
    }

    /**
     * 搜索遠程藍牙設備,獲取editview的值
     * @param v
     */
    public void show(View v) {
        if(bAdapter.isEnabled()){
            blueName = nameView.getText().toString().trim();
            bAdapter.startDiscovery();
        }else{
            Toast.makeText(getApplicationContext(), "藍牙未打開", 0).show();;
        }
    }
    
    /**
     * 內部類:當找到一個遠程藍牙設備時執行的廣播接收者
     * @author Administrator
     *
     */
    class foundReceiver extends BroadcastReceiver{

        @Override
        public void onReceive(Context context, Intent intent) {
            // TODO Auto-generated method stub
            BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);//獲取此時找到的遠程設備對象
            if(blueName.equals(device.getName())){//判斷遠程設備是否與用戶目標設備相同
                short rssi=intent.getExtras().getShort(BluetoothDevice.EXTRA_RSSI);//獲取額外rssi值
                showRssi.setText(device.getName()+":"+rssi);//顯示rssi到控件上
                bAdapter.cancelDiscovery();//關閉搜索
            }else{
                showRssi.setText("未發現設備“"+blueName+"”");
            }
        }
        
    }

 

Activity的代碼總體分成兩部分:①按鈕功能的實現  ②獲取設備rssi值並顯示

1、獲取本地藍牙適配器

BluetoothAdapter  bAdapter = BluetoothAdapter.getDefaultAdapter();//獲取藍牙適配器

 

2、使用藍牙適配器操作藍牙

bAdapter.isEnabled()//判斷藍牙是否打開
bAdapter.enable();//打開藍牙
bAdapter.disenable();//關閉藍牙
bAdapter.startDiscovery();//搜索遠程藍牙設備(需要消耗大量資源,不建議頻繁開關)
bAdapter.cancelDiscovery();//關閉搜索

 

 

 3、動態配置廣播接收

        //設置過濾器,過濾因遠程藍牙設備被找到而發送的廣播 BluetoothDevice.ACTION_FOUND
        IntentFilter iFilter=new IntentFilter();
        iFilter.addAction(BluetoothDevice.ACTION_FOUND);
        //設置廣播接收器和安裝過濾器
        registerReceiver(new foundReceiver(), iFilter);

 

BluetoothDevice.ACTION_FOUND 是配置廣播時的一個字符串常量,意思是當有藍牙設備被發現(未綁定)時發送廣播,使用意圖過濾器(IntentFilter)過濾。

 4、獲取rssi

short rssi=intent.getExtras().getShort(BluetoothDevice.EXTRA_RSSI);//獲取額外rssi值

 

5、廣播中獲取遠程藍牙設備對象(device)

BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);//獲取此時找到的遠程設備對象

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM