1. 程式人生 > >Android藍芽-實現主動發起連線

Android藍芽-實現主動發起連線

Android藍芽操作-主動發起連線

上次Android開發中用到了藍芽裝置,用於主動連線stm32控制的藍芽模組,這裡把它的使用方式總結出來:

目錄:

  • 前言
  • 操作步驟
  • Android藍芽控制程式碼
  • 總結

一、前言

開發環境相關引數如下:

//AndroidSdudio2.2.2
compileSdkVersion 26
buildToolsVersion "26.0.0"
minSdkVersion 19
targetSdkVersion 19

當然,高於這個版本的理論上都是沒問題的,因為沒有用到一些高版本安卓的新特性,所以老版本的也可以試試。

二、操作步驟

其實藍芽相關的基礎知識網上一搜一大把,我就不在這裡copy了,主要講講主動發起連線的相關用途與操作步驟。

用途:兩個藍芽連線後進行透明傳輸(可以理解為相當於一根資料線直接連線兩個裝置從而進行資料傳輸,忽略了藍芽裝置存在的事實以及相關實現細節)。
步驟1: 檢測當前手機藍芽是否開啟,若沒有則開啟。
步驟2:對周圍環境的藍芽進行搜尋,發現裝置則記錄起來。
步驟3:使用者選擇一個藍芽裝置進行連線。
步驟4:開始配對併發起連線。
步驟5:傳輸資料。

三、Android藍芽控制程式碼

1、檢測藍芽是否開啟:

private BluetoothAdapter mBTAdapter = null
; mBTAdapter = BluetoothAdapter.getDefaultAdapter(); //得到一個系統預設可用的藍芽裝置物件,可以用來進行大部分藍芽操作了 if (!mBTAdapter.isEnabled()) { //如果藍芽裝置沒有開啟 mBTAdapter.enable();//申請開啟藍芽 }

2、發起搜尋

//開始搜尋裝置
private void doDiscovery(){
    if(BTAdapter.isDiscovering()){
        BTAdapter.cancelDiscovery();//取消搜尋
} BTAdapter.startDiscovery();//開始搜尋 }

3、記錄裝置

//定義兩個string型別的陣列介面卡
ArrayAdapter<String> pairedListAdapter = new ArrayAdapter<String>(this.R.layout.device_name);//定義一個已連線過的裝置列表介面卡
newDeviceAdapter  = new ArrayAdapter<String>(this, R.layout.device_name);//定義一個新裝置列表的介面卡

//下面三行是已連線裝置的更新與點選
ListView pairedList = (ListView)findViewById(R.id.lv_paired);
pairedList.setAdapter(pairedListAdapter);//setAdapter,執行後都會到getView方法中,用來重新整理新資料
pairedList.setOnItemClickListener(connectDeviceListener);//給已經配對了的裝置列表的每一項註冊監聽事件

//下面三行是新裝置的更新與點選
ListView newDeviceList = (ListView)findViewById(R.id.lv_newdevices);
newDeviceList.setAdapter(newDeviceAdapter);
newDeviceList.setOnItemClickListener(connectDeviceListener);

//接收系統發出的的發現新裝置廣播
IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
this.registerReceiver(BTReceiver,filter);//註冊廣播器監聽

//接收系統的搜尋結束了的廣播
filter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
this.registerReceiver(BTReceiver,filter);
BTAdapter = BluetoothAdapter.getDefaultAdapter();//獲取一個BluetoothAdapter物件昂

//以下這句話加下面的if判斷句聯合實現了一個功能:獲取已配對的藍芽list並展示在pairedList裡
Set<BluetoothDevice> pairedDeviceSet = BTAdapter.getBondedDevices() ;//取得已經綁定了的藍芽裝置集合,藍芽關閉時返回值為null
    if(pairedDeviceSet.size()>0){//若已經繫結過的藍芽裝置不為空
        for(BluetoothDevice device:pairedDeviceSet){
            String s = device.getName().toString();
            pairedListAdapter.add(device.getName() + "\n" + device.getAddress());//新增入列表
        }
    }else{
        String noDevice = "沒發現任何裝置".toString();
        pairedListAdapter.add(noDevice);
    }

4、選擇一個藍芽並連線

if (mBTAdapter.getState() == BluetoothAdapter.STATE_ON) {//若不加這個判斷語句,使用者拒絕開啟藍芽時會閃退
    String address = destinationBluetoothAddress;
    BluetoothDevice decive = mBTAdapter.getRemoteDevice(address);
    mChatServer.connect(decive);
}

//注意:這裡是從另一個類擷取的上面的mChatServer.connect(decive)的具體實現:
    public synchronized void connect(BluetoothDevice device) {
        //取消正在連線的執行緒

        if (mState == STATE_CONNECTING) {
            if (mConnectThread != null) {
                mConnectThread.cancel();//關閉套接字
                mConnectThread = null;
            }
        }

        // Cancel any thread currently running a connection
        if (mConnectedThread != null) {
            mConnectedThread.cancel();
            mConnectedThread = null;
        }

         // Start the thread to connect with the given device
         mConnectThread = new ConnectThread(device);
         mConnectThread.start();

    }

**注意:**destinationBluetoothAddress必須是一個藍芽的MAC地址字串,可以從藍芽列表獲得。

5、傳送資料

    //獲得message的內容轉化為字元陣列,使用輸出流傳遞出去
    private void sendMessage(String message){
        if(mChatServer.getState()!= ChatServer.STATE_CONNECTED){//getstate():獲取當前藍芽的狀態:已經開啟,開啟中,已經關閉,關閉中
            //sendMsgtoUI("未連線");
            reConnect.setImageResource(R.drawable.top_bulutooth_unconnect2);
            title.setText("藍芽燈:未連線");
            return;
        }
        byte[] send = message.getBytes();
        mChatServer.write(send);

//注意:這裡貼上mChatServer.write(send)的具體實現:
    public void write(byte[] out) {
            // Create temporary object
            ConnectedThread r;
            // Synchronize a copy of the ConnectedThread
            synchronized (this) {
               if (mState != STATE_CONNECTED) return;
                r = mConnectedThread;
            }

            // Perform the write unsynchronized
            r.write(out);
        }

//注意:這裡將貼上 r.write(out)的具體實現:
        public void write(byte[] buffer) {//將資料寫入輸出流的buffer
            try {
                mmOutStream.write(buffer);//mmOutStream是一個private final OutputStream mmOutStream;
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

四、總結

其實程式碼只是一個簡單的思路提供,由於幾部分程式碼都封裝成了類,不同功能程式碼是放在不同的類裡面的,所以僅僅是直接複製那五步的,肯定是不能用的。但是我相信如果理解了,一定會收穫很多。
而且因為專案的目標裝置是STM32控制的藍芽模組,所以這裡直接解析為byte進行傳輸是有必要的(當然也是因為outputstream的特性)。
貼個圖:
藍芽列表

相關推薦

Android-實現主動發起連線

Android藍芽操作-主動發起連線 上次Android開發中用到了藍芽裝置,用於主動連線stm32控制的藍芽模組,這裡把它的使用方式總結出來: 目錄: 前言 操作步驟 Android藍芽控制程式碼 總結 一、前言 開發環境相關引數如

Android實現裝置間資料傳輸

這篇文章總結通過藍芽實現兩臺pad間資料傳輸 文章基於傳統藍芽,而不是BLE。 藍芽應該是移動裝置經常用到的功能模組,Android Bluetooth API 是Android提供的用來實現點到點和多點無線功能。 使用 Bluetooth API

樹莓派2model B 通過實現A2DP協議連線手機播放音樂

使用樹莓派,開啟他的A2DP功能,實現用手機藍芽控制樹莓派播放歌曲。主要操作過程參考http://wangye.org/blog/archives/921/以及英文部落格http://www.instructables.com/id/Turn-your-Raspberry-

android串列埠連線固定Mac地址,省略搜尋過程的實現

/* 開啟多執行緒實現藍芽連線的耗時操作 */ private class ConnectThread implements Runnable { @Override public void run() { Message message = new Mes

Android中如何實現的配對與連線

7. 連線 繫結(配對)和連線是兩個不同的過程,繫結是指兩個裝置發現了對方的存在,可以獲取到對方的名稱、地址等資訊,有能力建立起連線;連線是指兩個裝置共享了一個RFCOMM通道,有能力進行資料互傳。確認繫結上了之後,才能開始連線。可以試試藍芽音箱的連線過程,就是先點選一次,開始配對,配對成功後出現在已繫

Androidsocket實現視訊實時傳輸,以及圖片和文字傳輸

目標 兩臺手機裝置之間能夠正常進行藍芽配對(藍芽模組兒和硬體掛鉤,所以需要兩臺真機) socket實現藍芽文字傳輸 實現圖片傳輸 實現實時視訊傳輸 程式碼下載:https://download.csdn.net/download/m0_37781149/10434336

Android搜尋連線通訊

  藍芽( Bluetooth® ):是一種無線技術標準,可實現固定裝置、移動裝置和樓宇個人域網之間的短距離資料交換(使用2.4—2.485GHz的ISM波段的UHF無線電波)。藍芽技術最初由電信巨頭愛立信公司於1994年創制,當時是作為RS232資料線的替代方案。

Android 連線之 A2dp

      A2DPProfile  定義了高質量音訊資料傳輸的協議和過程,包括立體聲和單聲道資料的傳輸。這裡的高質量音訊指的是單聲道(Mono)和立體聲(Sterco)  的音訊,主要區別於藍牙  SCO  鏈路上傳輸的普通語音。A2DP  的典型應用是將音樂播放器的音訊資

【更多原創參見個人小站:http://www.softlifelogging.com/】android分析_leetcode實現每週一題_基礎知識

部落格公告 本部落格所有文章均為原創,歡迎交流,歡迎轉載;轉載請勿篡改內容,並且註明出處,禁止用於商業目的,謝謝! 歡迎訪問個人小站: 隨手記生活:http://xdyang.azurewebsites.net/

[Android]三步實現聊天APP

先看下結構目錄   ChatService.java —— 藍芽連線 DeviceList.java   —— 裝置顯示 MainActivity.java—— 主介面 1.許可權 要獲取藍芽功能,先在AndroidManifest.x

Android 開發之搜尋、配對、連線、通訊大全

        藍芽( Bluetooth®):是一種無線技術標準,可實現固定裝置、移動裝置和樓宇個人域網之間的短距離資料交換(使用2.4—2.485GHz的ISM波段的UHF無線電波)。藍芽裝置最多可以同時和7個其它藍芽裝置建立連線,進行通訊,當然並不是每一個藍芽都可以達到

Android高階操作(多連線

最近一直在做與bluetooth相關的應用。主要涉及Android手機藍芽的多連線問題。網上幾乎沒有與藍芽多連線相關的具體實現資料,所以我開始從android的官方文件入手,大半夜的一個人坐下面看那英文文件,真TMD不是滋味,現在回想下當年做的英語閱讀理解真似一坨sh

android 通訊實現手機的開啟,並掃描附近可見的裝置

藍芽是一種重要的短距離無線通訊協議,廣泛應用於各種裝置(手機,醫療,汽車等)。藍芽是比較常用的無線通訊裝置,早研究成為手機的標配。現在的安卓手機基本上都有藍芽,所有通過藍芽對資料有很好的硬體基礎 在Android中,與藍芽有關的類和介面在android.bluetooth包

Android4.0 關閉重開無法根據地址連線問題

在藍芽專案的末尾,在個別手機上出來,手動關閉手機藍芽,和再次啟動,開啟app發現無法連線上,經過檢視log最後確定錯誤是: onClientConnectionState()- status=133 clientIf=5 device=地址 133的一個錯誤,前面試過很

Android 獲得連線裝置的Mac地址和名稱

adapter = BluetoothAdapter.getDefaultAdapter(); int a2dp = adapter.getProfileConnectionState(BluetoothProfile.A2DP); int headset = adap

Android 4.0實現,自動匹配裝置

        今天開始寫部落格來記錄我的工作學習成長,作為一個初學者,近期的一個工作是通過Android藍芽4.0來實現與藍芽裝置的資料交換,下面就通過程式碼和文字來解釋一下整個過程。         首先我要說明的是,我再專案中使用了一個開源庫,我覺得不錯,所有程式碼都

Android開發【六】hfp連線

本文主要內容是藍芽手機音訊的連線、斷開流程分析,對應藍芽HFP profile。 該文章是基於Android原始碼4.3的 1 hfp簡單介紹 HFP (Hands-free Profile),讓藍芽裝置(如藍芽耳機)可以控制電話,如接聽、結束通話、拒接、語音撥號等,

Android 技術 帶你實現終端間資料傳輸

藍芽技術在智慧硬體方面有很多用武之地,今天我就為大家分享一下藍芽在Android系統下的使用方法技巧,並實現一下兩個終端間資料的傳輸。 藍芽(Bluetooth)是一種短距離的無線通訊技術標準,藍芽協議分為4層,即核心協議層、電纜替代協議層、電話控制協議層和採納的其它

Android手機通過模組HC-06連線Arduino串列埠輸出

通過手機進行通訊是可以實現很多遙控功能,雖然距離是比較短,一般是10米,但對於我這種新手做測試,比起買一個幾百塊的多通道遙控器成本要低很多。實驗目的:用Android實現藍芽連線通過Arduino串列埠輸出資訊這次使用的是藍芽HC-06從模組,就是從機模組,這都因為買之前沒有

Android-經典(BT)-建立長連線傳輸短訊息和檔案

一.藍芽模組簡介 從藍芽4.0開始包含兩個藍芽晶片模組:傳統/經典藍芽模組(Classic Bluetooth,簡稱BT)和低功耗藍芽(Bluetooth Low Energy,簡稱BLE) 經典藍芽是在之前的藍芽1.0,1.2,2.0+E