Android藍芽開發

來源:互聯網
上載者:User

標籤:

一、配置許可權

AndroidManifest.xml裡加入許可權

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

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

二、相關API

Android所有關於藍芽開發的類都在android.bluetooth包下:

1.BluetoothAdapter類

描述:

藍芽適配器,代表本地的藍芽適配器裝置。BluetoothAdapter類讓使用者能執行基本的藍芽任務。例如: 初始化裝置的搜尋,查詢可匹配的裝置集,使用一個已知的MAC地址來初始化一個BluetoothDevice類,建立一個 BluetoothServerSocket類以監聽其它裝置對原生串連請求等。

為了得到這個代表本地藍芽適配器的 BluetoothAdapter類,調用getDefaultAdapter()這一靜態方法。這是所有藍芽動作使用的第一步。當擁有本地適配器以後, 使用者可以獲得一系列的BluetoothDevice對象,這些對象代表所有擁有getBondedDevice()方法的已經匹配的裝置;用 startDiscovery()方法來開始裝置的搜尋;或者建立一個BluetoothServerSocket類,通過 listenUsingRfcommWithServiceRecord(String, UUID)方法來監聽新來的串連請求。

方法:

1)cancelDiscovery() 

  根據字面意思,是取消發現,也就是說當我們正在搜尋裝置的時候調用這個方法將不再繼續搜尋

2)disable()關閉藍芽

3)enable()開啟藍芽

  這個方法開啟藍芽不會彈出提示,更多的時候我們需要問下使用者是否開啟,一下這兩行代碼同樣是開啟藍芽,不過會提示使用者:

  Intemtenabler=new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);

  startActivityForResult(enabler,reCode);//同startActivity(enabler);

4)getAddress()擷取本地藍芽地址

5)getDefaultAdapter()擷取預設BluetoothAdapter,實際上,也只有這一種方法擷取BluetoothAdapter

6)getName()擷取本地藍芽名稱

7)getRemoteDevice(String address)根據藍芽地址擷取遠程藍牙裝置

8)getState()擷取本地藍芽適配器目前狀態(感覺可能調試的時候更需要)

9)isDiscovering()判斷當前是否正在尋找裝置,是返回true

10)isEnabled()判斷藍芽是否開啟,已開啟返回true,否則,返回false

11)listenUsingRfcommWithServiceRecord(String name,UUID uuid)根據名稱,UUID建立並返回BluetoothServerSocket,這是建立BluetoothSocket伺服器端的第一步

12)startDiscovery()開始搜尋,這是搜尋的第一步

2.BluetoothDevice類

描述

代表一個遠程藍牙裝置。讓你建立一個帶有各自裝置的BluetoothDevice或者查詢其皆如名稱、地址、類和串連狀態等資訊。

對於藍芽硬體地址而言,這個類僅僅是一個瘦封裝器。這個類的對象是不可改變的。這個類上的操作會使用這個用來建立BluetoothDevice類的BluetoothAdapter類執行在遠程藍芽硬體上。

為了獲得BluetoothDevice,類,使用BluetoothAdapter.getRemoteDevice(String)方法去建立一個表示 已知MAC地址的裝置(使用者可以通過帶有BluetoothAdapter類來完成對裝置的尋找)或者從一個通過 BluetoothAdapter.getBondedDevices()得到傳回值的有聯絡的裝置集合來得到該裝置。

方法

1)createRfcommSocketToServiceRecord(UUIDuuid)根據UUID建立並返回一個BluetoothSocket

這個方法也是我們擷取BluetoothDevice的目的——建立BluetoothSocket

2)getAddress()同BluetoothAdapter

3)getName()同BluetoothAdapter

3.BluetoothServerSocket

描述

一個藍芽監聽連接埠。 藍芽連接埠監聽介面和TCP連接埠類似:Socket和ServerSocket類。在伺服器端,使用BluetoothServerSocket類來建立一個 監聽服務連接埠。當一個串連被BluetoothServerSocket所接受,它會返回一個新的BluetoothSocket來管理該串連。在客戶 端,使用一個單獨的BluetoothSocket類去初始化一個外接串連和管理該串連。

最通常使用的藍芽連接埠是RFCOMM,它是被Android API支援的類型。RFCOMM是一個連線導向,通過藍芽模組進行的資料流傳輸方式,它也被稱為序列埠規範(Serial Port Profile,SPP)。

為了建立一個對準備好的新來的串連去進行監聽BluetoothServerSocket類,使用 BluetoothAdapter.listenUsingRfcommWithServiceRecord()方法。然後調用accept()方法去監 聽該連結的請求。在串連建立之前,該調用會被阻斷,也就是說,它將返回一個BluetoothSocket類去管理該串連。每次獲得該類之後,如果不再需 要接受串連,最好調用在BluetoothServerSocket類下的close()方法。關閉BluetoothServerSocket類不會關 閉這個已經返回的BluetoothSocket類。

BluetoothSocket類安全執行緒。特別的,close()方法總會馬上放棄外界操作並關閉伺服器連接埠。

方法

1)accept()

  阻塞直到一個串連已經建立。(譯者註:預設逾時時間設定為-1,見源碼)

     在一個成功建立的串連上返回一個已串連的BluetoothSocket類。

     每當該調用返回的時候,它可以在此調用去接收以後新來的串連。

2)accept(inttimeout)

  阻塞直到逾時時間內的串連建立。

      在一個成功建立的串連上返回一個已串連的BluetoothSocket類。

      每當該調用返回的時候,它可以在此調用去接收以後新來的串連。

3)close()

  用來放棄從另一線程來的調用。

  馬上關閉連接埠,並釋放所有相關的資源。

  在其他線程的該連接埠中引起阻塞,從而使系統馬上拋出一個IO異常。

  關閉BluetoothServerSocket不會關閉接受自accept()的任意BluetoothSocket。

4.BluetoothSocket

描述

已串連或串連到藍芽通訊端(socket)。

藍芽連接埠監聽介面和TCP連接埠類似:Socket和ServerSocket類。在伺服器端,使用BluetoothServerSocket類來建立一個 監聽服務連接埠。當一個串連被BluetoothServerSocket所接受,它會返回一個新的BluetoothSocket來管理該串連。在客戶 端,使用一個單獨的BluetoothSocket類去初始化一個外接串連和管理該串連。

最通常使用的藍芽連接埠是RFCOMM,它是被Android API支援的類型。RFCOMM是一個連線導向,通過藍芽模組進行的資料流傳輸方式,它也被稱為序列埠規範(Serial Port Profile,SPP)。

為了建立一個BluetoothSocket去串連到一個已知裝置,使用方法 BluetoothDevice.createRfcommSocketToServiceRecord()。然後調用connect()方法去嘗試一個 面向遠程裝置的串連。這個調用將被阻塞指導一個串連已經建立或者該連結失效。

為了建立一個BluetoothSocket作為服務端(或者“主機”),查看BluetoothServerSocket文檔。

每當該連接埠串連成功,無論它初始化為用戶端,或者被接受作為伺服器端,通過getInputStream()和getOutputStream()來開啟IO流,從而獲得各自的InputStream和OutputStream對象

BluetoothSocket類安全執行緒。特別的,close()方法總會馬上放棄外界操作並關閉伺服器連接埠。

方法

1)close() 關閉

2)connect() 串連

3)getInptuStream() 擷取輸入資料流

4)getOutputStream() 擷取輸出資料流

5)getRemoteDevice() 擷取遠程裝置,這裡指的是擷取bluetoothSocket指定串連的那個遠程藍牙裝置

三、操作

1、擷取本地藍芽適配器     

BluetoothAdapter mAdapter= BluetoothAdapter.getDefaultAdapter();

2、開啟藍芽

if(!mAdapter.isEnabled()){//彈出對話方塊提示使用者是後開啟Intent enabler = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);startActivityForResult(enabler, REQUEST_ENABLE);//不做提示,強行開啟// mAdapter.enable();}

3、搜尋裝置

BroadcastReceiver mReceiver = new BroadcastReceiver() {  public void onReceive(Context context, Intent intent) {    String action = intent.getAction();      //找到裝置    if (BluetoothDevice.ACTION_FOUND.equals(action)) {      BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);      if (device.getBondState() != BluetoothDevice.BOND_BONDED) {        Log.v(TAG, "find device:" + device.getName() + device.getAddress());      }    }     //搜尋完成    else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {      setTitle("搜尋完成");      if (mNewDevicesAdapter.getCount() == 0) {        Log.v(TAG,"find over");      }    }  //執行更新列表的代碼  }};

onCreate()中代碼

 

IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);registerReceiver(mReceiver, filter);filter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);registerReceiver(mReceiver, filter);

 

4、建立串連

首先Android sdk(2.0以上版本)支援的藍芽串連是通過BluetoothSocket建立串連(說的不對請高人指正),伺服器端(BluetoothServerSocket)和用戶端(BluetoothSocket)需指定同樣的UUID,才能建立串連,因為建立串連的方法會阻塞線程,所以伺服器端和用戶端都應啟動新線程串連

1)伺服器端:

 

//UUID格式一般是"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"可到        //http://www.uuidgenerator.com 申請BluetoothServerSocket serverSocket = mAdapter. listenUsingRfcommWithServiceRecord(serverSocketName,UUID);serverSocket.accept();

 

2)用戶端:

 

BluetoothSocket clienSocket=dcvice. createRfcommSocketToServiceRecord(UUID);clienSocket.connect();

 

5、資料傳遞,通過以上操作,就已經建立的BluetoothSocket串連了,資料傳遞無非是通過流的形式

1)擷取流

 

inputStream = socket.getInputStream();outputStream = socket.getOutputStream();

 

2)寫出、讀入

 

Android藍芽開發

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.