安卓藍牙技術Bluetooth使用流程(Bluetooth詳解)

来源:http://www.cnblogs.com/miaoqing/archive/2016/02/16/5191976.html
-Advertisement-
Play Games

一:藍牙設備之間的通訊首要包含了四個進程 設置藍牙設備 尋覓區域網內也許或許匹配的設備 銜接設備 設備之間的數據傳輸 二:詳細編程完結 1. 發動藍牙功用 首要經過調用靜態辦法getDefaultAdapter()獲取藍牙適配器BluetoothAdapter,假如回來為空,則無法繼續執行了。例如安


一:藍牙設備之間的通訊首要包含了四個進程

設置藍牙設備
尋覓區域網內也許或許匹配的設備
銜接設備
設備之間的數據傳輸

二:詳細編程完結

1. 發動藍牙功用

首要經過調用靜態辦法getDefaultAdapter()獲取藍牙適配器BluetoothAdapter,假如回來為空,則無法繼續執行了。例如安卓源碼

BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); if (mBluetoothAdapter == null) { // Device does not support Bluetooth }

其次,調用isEnabled()來查詢當時藍牙設備的狀況,假如回來為false,則表明藍牙設備沒有敞開,接下來你需求封裝一個ACTION_REQUEST_ENABLE懇求到intent裡面,調用startActivityForResult()辦法使能藍牙設備,例如:

if (!mBluetoothAdapter.isEnabled()) {
    Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
    startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
}

2. 查找設備

運用BluetoothAdapter類里的辦法,你能夠查找遠端設備(大約十米以內)或許查詢在你手機上現已匹配(或許說綁定)的別的設備了。當然需求斷定對方藍牙設備現已敞開或許現已敞開了“被髮現使能”功用(對方設備是能夠被髮現的是你能夠建議銜接的前提條件)。假如該設備是能夠被髮現的,會反饋回來一些對方的設備信息,比方姓名、MAC地址等,運用這些信息,你的設備就能夠挑選去向對方初始化一個銜接。 
假如你是首次與該設備銜接,那麼一個配對的懇求就會主動的顯示給用戶。當設備配對好今後,他的一些根本信息(首要是姓名和MAC)被保留下來並能夠運用藍牙的API來讀取。運用已知的MAC地址就能夠對遠端的藍牙設備建議銜接懇求。 
匹配好的設備和銜接上的設備的不同點:匹配好僅僅闡明對方設備發現了你的存在,並具有一個一起的識別碼,而且能夠銜接。銜接上:表明當時設備同享一個RFCOMM通道而且兩者之間能夠交換數據。也即是是說藍牙設備在樹立RFCOMM通道之前,有必要是現已配對好了的。

3. 查詢匹配好的設備

在樹立銜接之前你有必要先查詢配對好了的藍牙設備集以便挑選一個設備進行通訊,例如你能夠你能夠查詢一切配對的藍牙設備,並運用一個數組適配器將其列印顯示出來:

SetpairedDevices =mBluetoothAdapter.getBondedDevices(); // If there are paired devices
if (pairedDevices.size() > 0) {
    //Loop through paired devices
    for (BluetoothDevice device : pairedDevices) {
        // Add the name and address to an array adapter to show in a ListView
        mArrayAdapter.add(device.getName() + "\n" + device.getAddress()); }
}

樹立一個藍牙銜接只需求MAC地址就現已滿足。

4. 掃描設備

掃描設備,只需求調用startDiscovery()辦法,這個掃描的進程大約繼續是12秒,應用程式為了ACTION_FOUND動作需求註冊一個BroadcastReceiver來承受設備掃描到的信息。關於每一個設備,體系都會播送ACTION_FOUND動作。

// 用ACTION_FOUND為action註冊播送接收器 private final BroadcastReceiver mReceiver = new BroadcastReceiver() { public void onReceive(Context context, Intent intent) {
        String action = intent.getAction(); // 發現設備 if (BluetoothDevice.ACTION_FOUND.equals(action)) { // 從Intent中獲取藍牙設備 BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); // 增加姓名和地址到設備適配器中 mArrayAdapter.add(device.getName() + "\n" + device.getAddress());
        }
    }
}; //註冊播送接收器 IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
registerReceiver(mReceiver, filter); //在onDestroy時記住刊出播送接收器 

5. 使能被髮現

假如你想使你的設備能夠被別的設備發現,將ACTION_REQUEST_DISCOVERABLE動作封裝在intent中並調用startActivityForResult(Intent, int)辦法就能夠了。它將在不使你應用程式退出的情況下使你的設備能夠被髮現。預設情況下的使能時刻是120秒,當然你能夠能夠經過增加EXTRA_DISCOVERABLE_DURATION欄位來改動使能時刻(最大不超越300秒)例如:

Intent discoverableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE); discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300); startActivity(discoverableIntent); 

運轉該段代碼今後,體系會彈出一個對話框來提示你發動設備使能被髮現(此進程中假如你的藍牙功用沒有敞開,體系會幫你敞開),而且假如你預備對該遠端設備發現一個銜接,你不需求敞開設備被髮現功用,由於該功用僅僅在你的應用程式作為效勞器端的時分才需求。

6. 銜接設備

在應用程式中,想樹立兩個藍牙設備之間的銜接,有必要完結客戶端和效勞器端的代碼(由於任何一個設備都有必要能夠作為效勞端或許客戶端)。一個敞開效勞來監聽,一個建議銜接懇求(運用效勞器端設備的MAC地址)。當他們都具有一個藍牙套接字在同一RFECOMM通道上的時分,能夠以為他們之間現已銜接上了。效勞端和客戶端經過不同的辦法或別的們的藍牙套接字。當一個銜接監聽到的時分,效勞端獲取到藍牙套接字。當客戶可翻開一個FRCOMM通道給效勞器端的時分,客戶端獲取到藍牙套接字。 
註意:在此進程中,假如兩個藍牙設備還沒有配對好的,android體系會經過一個通知或許對話框的方式來通知用戶。RFCOMM銜接懇求會在用戶挑選之前堵塞。

7. 效勞端的銜接

當你想要銜接兩台設備時,一個有必要作為效勞端(經過持有一個翻開的BluetoothServerSocket),目的是監聽外來銜接懇求,當監聽到今後提供一個銜接上的BluetoothSocket給客戶端,當客戶端從BluetoothServerSocket得到BluetoothSocket今後就能夠毀掉BluetoothServerSocket,除非你還想監聽更多的銜接懇求。 
樹立效勞套接字和監聽銜接的根本進程: 
首要經過調用listenUsingRfcommWithServiceRecord(String, UUID)辦法來獲取BluetoothServerSocket目標,參數String代表了該效勞的稱號,UUID代表了和客戶端銜接的一個標識(128位格局的字元串ID,相當於PIN碼),UUID有必要兩邊匹配才能夠樹立銜接。 
其次調用accept()辦法來監聽也許到來的銜接懇求,當監聽到今後,回來一個銜接上的藍牙套接字BluetoothSocket。 
最後,在監聽到一個銜接今後,需求調用close()辦法來封閉監聽程式。(通常藍牙設備之間是點對點的傳輸) 
註意:accept()辦法不應該放在主Acitvity裡面,由於它是一種堵塞調用(在沒有監聽到銜接懇求之前程式就一向停在那裡)。解決辦法是新建一個線程來辦理。例如:

8. 客戶端的銜接

為了初始化一個與遠端設備的銜接,需求先獲取代表該設備的一個BluetoothDevice目標。經過BluetoothDevice目標來獲取BluetoothSocket並初始化銜接,詳細進程: 
運用BluetoothDevice目標里的辦法createRfcommSocketToServiceRecord(UUID)來獲取BluetoothSocket。UUID即是匹配碼。然後,調用connect()辦法來。假如遠端設備接收了該銜接,他們將在通訊進程中同享RFFCOMM通道,而且connect回來。 
註意:conncet()辦法也是堵塞調用,通常樹立一個獨立的線程中來調用該辦法。在設備discover進程中不應該建議銜接connect(),這麼會顯著減慢速度以至於銜接失敗。且數據傳輸完結只要調用close()辦法來封閉銜接,這麼能夠節約體系內部資源。

9. 辦理銜接

當設備銜接上今後,每個設備都具有各自的BluetoothSocket。就能夠完結設備之間數據的同享了。 
首要經過調用getInputStream()和getOutputStream()辦法來獲取輸入輸出流。 
然後經過調用read(byte[]) 和write(byte[]).辦法來讀取或許寫數據。 
完結細節:以為讀取和寫操作都是堵塞調用,需求樹立一個專用線程來辦理。

10. 許可權設置

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

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 需求:在一個數組裡面,將在這個數組中的並且在另一個數組裡面的元素過濾掉。 即:在一個數組dataArray裡面,將在dataArray數組中的並且在filteredArray數組裡面的元素過濾掉。 //iOS-篩選數組內的元素 //在dataArray中裡面,將在dataArray中的並且在filt
  • 今天早上同事說咱們的證書無法使用了,顯示“此證書的簽發者無效”。一開始以為誰誤操作了證書,查看後發現所有證書都無效了。查了會才發下原來是Apple Worldwide Developer Relations Certification Authority Intermediate Certifica
  • 嗷嗚嗷嗚嗷嗚 1 // 將視圖作為屬性方便後面執行多個不同動畫 2 _myView = [[UIView alloc] init]; 3 _myView.layer.position = CGPointMake(100, 100); 4 _myView.layer.bounds = CGRectMa
  • 今天用Xcode打包IPA文件給同事,結果提示import時,提示證書missing,找了半天沒發現問題,後來打開鑰匙串,發現證書全失效了!!!嚇死寶寶了~~~~(>_<)~~~~ 然後,處理它。 1.打開鑰匙串 2.進行如下圖操作,打開證書信息雙擊或右鍵均可 3.再次去打包,成功 註意:分享轉載請
  • Moshi 是一個現代化的JSON庫針對Android和Java。它可以很容易地解析JSON成Java對象: String json = ...; Moshi moshi = new Moshi.Builder().build(); JsonAdapter<BlackjackHand> jsonAd
  • 自定義視圖,視圖控制器,視圖控制器指定視圖,loadView,viewDidLoad,MVC,屏幕旋轉,記憶體警告
  • 迴圈廣告我們在開發中已經是熟得不能再熟了,今天整理這篇scrollview三屏復用廣告 原理使用scrollview里的三個imageview分別去載入不同的圖片,用少量的資源來顯示大量或不確定的廣告數量,不然如果用普通方法實現廣告,難道10個廣告用12個scrollview的contentsize
  • 如下圖是側滑的效果圖 實現的功能主要是用ViewDragHelper,用ViewDragHelper來自定義一個側滑面板來實現側滑 如下是自定義的側滑面板 1 package com.demo.sb.widget; 2 3 import com.nineoldandroids.view.ViewHe
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...