1. 程式人生 > >Android --- Bluetooth(基礎藍芽)

Android --- Bluetooth(基礎藍芽)

藍芽簡介

藍芽(Bluetooth)是一種短距離的無線通訊技術標準。這個名子來源於10世紀丹麥國王
Harald Blatand,英文名子是Harold Bluetooth。在無線行業協會組織人員的討論後,有人
認為用Blatand國王的名字命名這種無線技術是再好不過了,這是因為Blatand國王將挪威、瑞
典和丹麥統一起來,這就如同這項技術將統一無線通訊領域一樣。至此,藍芽的名字也就這樣
定了下來。
藍芽協議分為4層,即核心協議層、電纜替代協議層、電話控制協議層和採納的其它協議層。
這4種協議中最重要的是核心協議。藍芽的核心協議包括基帶、鏈路管理、邏輯鏈路控制和適
應協議四部分。其中鏈路管理(LMP)負責藍芽元件間連線的建立。邏輯鏈路控制與適應協議
(L2CAP)位於基帶協議層上,屬於資料鏈路層,是一個為高層傳輸和應用層協議遮蔽基帶協
議的適配協議。

Android提供藍芽API來執行這些不同的操作。
1. 開關藍芽
2. 掃描其他藍芽裝置
3. 獲取配對裝置列表
4. 連線到通過服務發現其他裝置

藍芽管理

private BluetoothAdapter bluetoothAdapter;
//獲取管理器
bluetoothAdapter= BluetoothAdapter.getDefaultAdapter();

//開啟藍芽
bluetoothAdapter.enable();

//關閉藍芽
bluetoothAdapter.disable();

//需要的許可權
<uses-permission android:name=
"android.permission.BLUETOOTH"/> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/> //掃描裝置 bluetoothAdapter.startDiscovery();

掃描的裝置資訊會通過廣播的形式發上來,所以需要攔截 BluetoothDevice.ACTION_FOUND

class BluetoothReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        // 從 Intent 中獲取搜尋到的裝置物件
BluetoothDevice dev = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); Log.e("m_tag","receiv:"+dev.getName()); adapter.addDev(dev); } } protected void onResume() { super.onResume(); receiver = new BluetoothReceiver(); IntentFilter filter = new IntentFilter(); // 當搜尋發現裝置時傳送的 action filter.addAction(BluetoothDevice.ACTION_FOUND); registerReceiver(receiver, filter); Log.e("m_tag","regist"); }

取消搜尋

bluetoothAdapter.cancelDiscovery();

藍芽搜尋問題

基本許可權

<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
Android6.0之後需要新增android.permission.ACCESSCOARSELOCATION模糊位置許可權, 並且該許可權需要動態申請
//搜尋方法
if (bluetoothAdapter.isEnabled()) {
    if (Build.VERSION.SDK_INT >= 23) {
        //檢測許可權
        int code = ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION);
        if (code != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, REQUEST_LOCATION_PERMISSION);
        }else{
            bluetoothAdapter.startDiscovery();
        }
    } else {
        bluetoothAdapter.startDiscovery();
    }
}

通訊過程

服務端:

//基於通訊序列號建立ServerSocket
BluetoothServerSocket serverSocket = bluetoothAdapter.listenUsingRfcommWithServiceRecord("btspp", uuid);
BluetoothSocket socket = serverSocket.accept();
//輸入輸出
socket.getInputStream();
socket.getOutputStream();

客戶端:

BluetoothSocket socket = device.createInsecureRfcommSocketToServiceRecord(uuid);
//連線
socket.connect();
輸入輸出
socket.getInputStream();
socket.getOutputStream();