Android Bluetooth模塊學習筆記

一、藍牙基礎知識

1.藍牙( Bluetooth )是一種無線技術標準,可實現固定設備、移動設備和樓宇個人域網之間的短距離數據交換。藍牙基于設備低成本的收發器芯片,傳輸距離近、低功耗。

?

2.微波頻段:使用2.402GGHz到2.480GHz(包含防護頻帶)的ISM波段的UHF無線電波

?

3.藍牙使用跳頻技術。將傳輸的數據切割成數據包,通過79個指定的藍牙頻道分別數據傳輸包。

每一個頻道的頻寬為1MHz。

?

4.藍牙是基于數據包、有著主從架構的協議。

一個主設備至多可和同一微微網中的七個從設備通訊。全部設備共享主設備的時鐘。

?

5.藍牙機器作為主設備的時候最多可與七個從設備連接。

從設備一般僅僅與一個主設備連接。設備之間能夠通過協議轉換角色。

?

6. 功率射程

?

類別

最大功率容量

射程范圍

(m)

(mW)

(dBm)

1

100

20

~100

2

2.5

4

~10

3

1

0

~1

?

7.數據吞吐量

?

版本號

數據率

最大應用吞吐量

1.2

1Mbit/s

>80 kbit/s

2.0 + EDR

3 Mbit/s

>80 kbit/s

3.0 + HS

24 Mbit/s

請參考3.0 + HS

4.0

24 Mbit/s

請參考4.0 LE

?

7.關于射程:多數藍牙應用是為室內環境而設計的,因為墻的衰減和信號反射造成的信號衰落會使得射程遠小于藍牙產品規定的射程范圍。兩個敏感度和發射功率都較高的1類設備相連接,射程可遠高于一般水平的100m,取決于應用所須要的吞吐量。有些設備在開放的環境中的射程可以高達1km甚至更高。

?

8.最新版本號:藍牙4.2,公布于2014年12月2日(截止2016年3月22日)

?

9.每一個設備都有一個唯一的48-位的地址。

然而這些地址并不會顯示于連接請求中。

可是用戶可自行為他的藍牙設備命名(藍牙設備名稱),這一名稱就可以顯示在其它設備的掃描結果和配對設備列表中。

?

10.藍牙框架

?

?

?

11.藍牙核心系統包含主機和控制器兩部分。當中控制器包含主控制器和次控制器。

?

?

12.藍牙基本規范

在藍牙作用有四種基本規范(Profile),這些規范會被其他的規范使用。

它們是:

(1)GAP Profile: Generic Access Profile。該Profile保證不同的Bluetooth產品能夠互相發現對方并建立連接。

(2)SDAP Profile: Service Discovery Application Profile,通過該Profile,一個Bluetooth設備能夠找到其他Bluetooth設備提供的服務。以及查詢相關的信息。
(3)SPP Profile: Serial Port Profile。模擬串口通訊
(4)GOEP Profile: Generic Object Exchange Profile,通用對象交換。

這個Profile的名字有些費解。它定義的是數據的傳輸,包含同步,文件傳輸。或者推送其他的數據。能夠理解為內容無關的傳輸層協議。能夠被不論什么應用用來傳輸自定義的數據對象。

?

13.藍牙應用規范

???BR/EDR profile(Android支持)

(1)A2DP(Advanced Audio Distribution Profile)

高級音頻、立體聲規范,包含A2DP Sink和A2DP Source;

(2)AVRCP(Audio/Video Remote Control Profile)

音視頻遠程控制規范。音樂播放、暫停等。

(3)HFP(Hands-Free Profile)

免提規范,用于藍牙通話;

(4)HSP(Headset Profile)

耳機規范。用于藍牙耳機;

(5)HID(Human Interface Device Profile)

人體接口設備規范,分為HID Host和HID Device;

(6)OPP(Object Push Profile)

對象推送規范。用于傳輸文件;

(7)PAN(Personal Area Networking Profile)

個人局域網規范,藍牙網絡共享。

(8)PBAP(Phone Book Access Profile)

電話號碼簿訪問規范;

(9)MAP(Message Access Profile)

信息訪問規范;

(10)HDP(Health Device Profile)

健康設備規范,和一些健康設備進行通信;

(11)BLP(Blood Pressure Profile)

血壓規范;

(12)FMP(Find Me Profile)

找我規范;

(13)HRP(Heart Rate Profile)

心率規范;

(14)HOGP(HID Over GATT Profile)

基于GATT的HID規范。

(15)TIP(Time Profile)

時間規范。

?

?

二、硬件部分知識

1.基礎處理器

(1)AP:ApplicationProcessor應用處理器

???????? 採用ARM架構的CPU,通常負責執行OS和一些特定設置和加載開機預設。比方一個沒有電話功能的平板電腦,僅僅跑android或者win8的系統。僅僅要AP就能夠。

(2)BP:BasebandProcessor 基帶處理器

???????? 架構相對于AP簡單。處理電話、信息之類的功能。

(3)CP:coprocessor? Processor 協處理器

???????? 基帶芯片加協處理器(CP,一般是多媒體加速器),?用來通過處理主cpu的一些工作負荷來使操作提速的輔助處理器。

(4)RF:Radio Frequency射頻部分

?? ? ? ?無線信號的發射部分,如電話、藍牙、WIFI信號發射、接收。

?

2.簡單平板電腦結構框圖

?

??? AP芯片+外設+Android系統

?

3.藍牙硬件接口框圖(以UART接口芯片為例)


????????

???????? ???????? (1)UART部分:串口。主要負責傳輸數據;
???????? ???????? (2)PCM 部分:語音接口,用于通話時語音傳輸數據;
???????? ???????? (3)Power部分:電源控制。

三、軟件部分知識

1.Android Bluetooth Architecture藍牙代碼架構

?

1.1 串口驅動

Linux的內核的藍牙驅動程、Linux的內核的藍牙協議的層

?

1.2BlueZ的適配器

????????

(1)內核代碼:由驅動程序和BlueZ核心協議組成

驅動程序:實如今內核源碼kernel/driver/bluetooth中(包括Linuxkernel對各種接口的)包括:USBdriver、USB driver and Otherdriver。

Bluetooth協議:實如今內核源碼 kernel/net/bluetooth中。

包含:hci、l2cap、hid、rfcomm、sco、SDP、BNEP等協議的實現。

(2)用戶態程序及工具集:

???????? 包含應用程序接口和BlueZ工具集。

BlueZ提供函數庫以及應用程序接口。便于程序猿開發bluetooth應用程序。BlueZ utils是主要工具集,實現對bluetooth設備的初始化和控制。

1.3 藍牙相關的應用程序接口

???????? Android.buletooth包中的各個Class(藍牙在框架層的內容)

類名

作用

BluetoothAdapter

本地藍牙設備的適配類,全部的藍牙操作都要通過該類完畢

BluetoothClass

用于描寫敘述遠端設備的類型,特點等信息

BluetoothDevice

藍牙設備類。代表了藍牙通訊過程中的遠端設備

BluetoothServerSocket

藍牙設備服務端,類似ServerSocket

BluetoothSocket

藍牙設備client,類似Socket

BluetoothClass.Device

藍牙關于設備信息

BluetoothClass.Device.Major

藍牙設備管理

BluetoothClass.Service

藍牙相關服務

?

附:Google官方提供的藍牙代碼框架圖

?

2.Hciattach:建立串口和藍牙協議層的數據連接通道

?

3.傳輸數據流程

(1) uart口取得藍牙模塊的數據;
(2) uart口通過ldisc傳給hci_uart;
(3) hci_uart傳給在其上的h4;
(4) h4傳給hci層;
(5) hci層傳給l2cap層;
(6) l2cap層再傳給rfcomm。

?

4.BluetoothAdapter:藍牙適配器

??? 直到我們建立bluetoothSocket連接之前。都要不斷操作它。
BluetoothAdapter中的動作常量

ACTION_DISCOVERY_FINISHED

已完畢藍牙搜索

ACTION_DISCOVERY_STARTED

已經開始搜索藍牙設備

ACTION_LOCAL_NAME_CHANGED

更改藍牙的名字

ACTION_REQUEST_DISCOVERABLE

請求可以被搜索

ACTION_REQUEST_ENABLE

請求啟動藍牙

ACTION_SCAN_MODE_CHANGED

掃描模式已經改變

ACTION_STATE_CHANGED

狀態已改變

ACTION_CONNECTION_STATE_CHANGED

?

?

?

5.常量介紹

?

(1)開關狀態值

藍牙關閉?: int STATE_OFF?, 值為10, 藍牙模塊處于關閉狀態;

藍牙打開中?: int STATE_TURNING_ON?, 值為11, 藍牙模塊正在打開;

藍牙開啟?: int STATE_ON?, 值為12, 藍牙模塊處于開啟狀態;

藍牙開啟中?: int STATE_TURNING_OFF?, 值為13, 藍牙模塊正在關閉;

藍牙開關狀態順序?: STATE_OFF --> STATE_TURNING_ON --> STATE_ON -->STATE_TURNING_OFF --> STATE_OFF;

?

(2)掃描狀態值

無功能狀態?: int SCAN_MODE_NONE?, 值為20, 查詢掃描和頁面掃描都失效, 該狀態下藍牙模塊既不能掃描其他設備, 也不可見;

掃描狀態?: int SCAN_MODE_CONNECTABLE?, 值為21, 查詢掃描失效, 頁面掃描有效, 該狀態下藍牙模塊能夠掃描其他設備, 從可見性來說僅僅對已配對的藍牙設備可見, 僅僅有配對的設備才干主動連接本設備;

可見狀態?: int SCAN_MODE_CONNECTABLE_DISCOVERABLE, 值為23, 查詢掃描和頁面掃描都有效;

?

查詢掃描功能?: 其他設備能夠掃描到本設備 , 指的是可見性可見;

頁面掃描功能?: 能夠主動掃描其他設備;

?

(3)藍牙操作接收的廣播

開始搜索廣播?: String ACTION_DISCOVERY_STARTED, 藍牙適配器開始搜索遠程設備, 值為"android.bluetooth.action.DISCOVERY_START",藍牙適配器開始搜索之后, 會先有12秒的查詢掃描(12s內可見), 查詢掃描后進行頁面掃描(主動搜索), 須要BLUETOOTH權限;

假設搜索到藍牙設備, 就會收到BluetoothDevice.ACTION_FOUND廣播, 能夠從Intent中獲取存放在當中的BluetoothDevice對象,intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);

設備查找很消耗資源, 在查找的過程中, 不能連接遠程的藍牙設備, 已經存在的連接也要限制帶寬, 假設想要運行除查找外的其他操作, 之前最好調用cancelDiscovery();

?

搜索完畢廣播?: String ACTION_DISCOVERY_FINISHED,藍牙S適配器完畢搜索發出的廣播,?

值為"android.bluetooth.adapter.action.DISCOVERY_FINISHED", 須要BLUETOOTH權限;

?

藍牙名稱改變廣播?: String ACTION_LOCAL_NAME_CHANGED, 本地的藍牙適配器改變了自己的名稱, 值為"android.bluetooth.adapter.action.LOCAL_NAME_CHANGED",注意改變的是本設備名稱, 不是遠程設備的.這個廣播包括一個EXTRA_LOCAL_NAME附加域, 須要BLUETOOTH權限;

?

掃描模式變化廣播?: String ACTION_SCAN_MODE_CHANGED, 藍牙模塊掃描模式發生了變化, 值為"android.bluetooth.adapter.action.SCAN_MODE_CHANGED",該Intent對象包括了EXTRA_SCAN_MODE和EXTRA_PREVIOUS_SCAN_MODE,兩個附加域各自是新的和舊的掃描模式, 這里能夠依據前后掃描模式的不同做出不同的操作, 須要BLUETOOTH權限;

?

開關模式變化廣播?: String ACTION_STATE_CHANGED, 藍牙模塊被打開或者關閉, 值為"android.bluetooth.adapter.action.STATE_CHANGED",該廣播的Intent中包括EXTRA_STATE和EXTRA_PREVIOUS_STATE兩個附加域, 須要BLUETOOTH權限;

?

(4)藍牙操作請求的廣播

開啟藍牙?: String ACTION_REQUEST_ENABLE, 打開藍牙, 值為"android.bluetooth.adapter.action.REQUEST_ENABLE",

Intentintent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);

startActivityForResult(intent,requestCode);

能夠在Activity中的onActivityResult()方法中處理結果, 假設藍牙模塊打開成功, 則返回結果嗎RESULT_OK; 假設藍牙模塊打開失敗, 則返回結果碼RESULT_CANCELED;

打開和關閉藍牙模塊, 都能夠通過ACTION_STATE_CHANGED廣播來監聽;

?

藍牙可見?: String ACTION_REQUEST_DISCOVERABLE, 使藍牙可見, 值為"android.bluetooth.adapter.action.REQUEST_DISCOVERABLE",默認的可見時間為120s, 能夠在廣播中加入附加域, 設置隨意的可見時間, 附加域為EXTRA_DISCOVERABLE_DURATION, 須要BLUETOOTH權限;
能夠在Activity中的onActivityResult()方法中處理結果, 假設藍牙模塊設置可見成功, 則返回結果嗎RESULT_OK; 假設藍牙模塊設置可見失敗, 則返回結果碼RESULT_CANCELED;

IntentdiscoverableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);

discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION,0);

startActivityForResult(discoverableIntent,resultCode)

?

(5)附加域

附加域是放在Intent中的, 使用Intent.putExtra(附加域,附加值)方法加入附加域;

掃描模式附加域?: 這兩個附加域的值是掃描模式, 能夠為SCAN_MODE_NONE, SCAN_MODE_CONNECTABLE,SCAN_MODE_CONNECTABLE_DISCOVERABLE;

String?EXTRA_SCAN_MODE?:值為"android.bluetooth.adapter.extra.SCAN_MODE";

String?EXTRA_PREVIOUS_SCAN_MODE?:值為"android.bluetooth.adapter.extra.PREVIOUS_SCAN_MODE";

?

開關狀態附加域?: 這兩個附加域的值是開關狀態, 能夠為STATE_OFF, STATE_ON, STATE_TURNING_OFF, STATE_TURNING_ON;

String?EXTRA_STATE?:值為"android.bluetooth.adapter.extra.STATE";

String?EXTRA_PREVIOUS_STATE?:值為"android.bluetooth.adapter.extra.PREVIOUS_STATE";

?

藍牙名稱附加域?: String EXTRA_LOCAL_NAME?, 存放ACTION_LOCAL_NAME_CHANGED附加域的附加值 , 值為"android.bluetooth.adapter.extra.LOCAL_NAME";

?

可見時間附加域?: String EXTRA_DISCOVERABLE_DURATION, 存放的是ACTION_REQUEST_DISCOVERABLE廣播的可見時長, 值為"android.bluetooth.adapter.extra.DISCOVERABLE_DURATION";

?

(6)錯誤碼

int?ERROR?,這個值用來標記錯誤 , 方便自己使用的 , 沒有實際意義。

?

6.A2DP連接的建立

A2DP_CONNECT上層代碼流程表


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/280884.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/280884.shtml
英文地址,請注明出處:http://en.pswp.cn/news/280884.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

sql刪除無人借閱的書_查找,下載,借閱,租賃和購買電子書的最佳網站

sql刪除無人借閱的書So, you’ve got yourself an eBook reader, smartphone, tablet, or other portable device and you want to put some eBooks on it to take with you. There are many options for obtaining free eBooks as well as purchasing, borrowing, or even ren…

django05:ORM示例--person 增刪改查

建立數據庫連接后,演示代碼 見我的資源 https://download.csdn.net/my

C#如何用正則表達式截取https和帶端口的域名

如題。現有代碼如下。只能截取 http://www.baidu.com的 www.baidu.com當域名為https://www.baidu.com 或者為 http://www.baidu.com:8080 時 則無法正確讀取。。求高手給去能截取這樣格式的代碼 Thanks!string p "http://[^\.]*\.(?<domain>[^\.]*)";Regex r…

推薦一個開源的 .NET 二維碼生成庫

你好&#xff0c;這里是 Dotnet 工具箱&#xff0c;定期分享 Dotnet 有趣&#xff0c;實用的工具和組件&#xff0c;希望對您有用&#xff01;介紹QrCodeGenerator 是開源的 .NET 二維碼生成庫&#xff0c;它支持從文本字符串和字節數組生成二維碼圖片。這個庫是基于 .NET Stan…

vue循環中的v-show

v-show如果使用循環對象的屬性來時控制, 這個屬性必須是加載時就存在的 <div class"list-group col-sm-12" v-for"(issue,index) in issue_list"><a click"switch_comments(issue, index)" style"background-color:#5cb85c;font-w…

C# 圖片畫矩形,添加文字

1.初始設置字體與筆 Pen pen new Pen(Color.FromArgb(220, Color.Green), 5);Font font new Font("微軟雅黑", fontSize, FontStyle.Bold); // 定義字體Brush whiteBrush new SolidBrush(Color.FromArgb(220, Color.Red)); // 畫文字用 2.初始設置圖片和Graphics …

全量更新和增量更新_增量BIOS更新或直接更新到最新版本哪個更好?

全量更新和增量更新There are few things as irritating as a Blue Screen of Death, but sometimes there is an easy fix for it like updating the BIOS for instance. If multiple updates are available though, do you do incremental updates or can you just use the l…

BZOJ4590: [Shoi2015]自動刷題機

【傳送門&#xff1a;BZOJ4590】 簡要題意&#xff1a; 有l秒時間&#xff0c;AC了k道題&#xff0c;給出每秒寫的代碼行數&#xff08;行數>0表示寫&#xff0c;<0表示刪除&#xff0c;如果剩下的行數不夠刪&#xff0c;則為0&#xff09;&#xff0c;假設行數>n時能…

[Office 2010 易寶典]什么是Office Web App?如何在線查看Office文檔?

什么是Office Web App&#xff1f; Office Web App使得Microsoft Office能擴展到網絡瀏覽器上。用戶可以直接在通過瀏覽器在線查看和編輯保存在網站上的文檔。 如何上傳Office文檔&#xff1f; 在Microsoft Word 2010里面&#xff0c;您可以把Word文檔保存到Windows Live SkyDr…

Pipy:保護 Kubernetes 上的應用程序免受 SQL 注入和 XSS 攻擊

注入攻擊在 OWASP Web 應用 10 大安全風險[1] 排名 2021 年下滑至第 3 位&#xff0c;多年來一直位居前十。SQL 注入 (SQLi) 是一種用于攻擊網站和 Web 應用程序的常見注入技術。沒有將用戶輸入與數據庫命令完全分開的應用程序面臨著將惡意輸入作為 SQL 命令執行的風險。成功的…

docker 開啟命令\退出容器

開啟 docker load -i test.tar docker imagesdocker run -it -p 8000:80 test //8000為訪問ip 的端口 80 為test設置的端口 docker rename 原容器名 新容器名訪問IP 為 localhost:8000 退出容器 如果要正常退出不關閉容器&#xff0c; 請按CtrlPQ進行退出容器

如何阻止YouTube在iOS,Android和Web上自動播放視頻

Over at YouTube, they love it when you watch more YouTube. If you’re sick of YouTube automatically queuing up more videos for you, however, it’s easy enough to turn the autoplay feature off and go back to watching your videos at your own pace. 在YouTube上…

(php)thinkphp3.2配置sql_server

(php)thinkphp3.2配置sql_server 標簽&#xff1a; php thinkphp sql_server2016年12月16日 15:20:19631人閱讀 評論(0) 收藏 舉報分類&#xff1a;php&#xff08;18&#xff09; 最近要整一個crm和erp的對接&#xff0c;最坑的是&#xff0c;erp的是用.net寫的&#xff0c;數…

viewData

viewdata[alert]"alert(你好)"<script>viewdata[alert]</script> 在Controller存儲數據 在 界面得到 關于 ViewData和ViewMode 點擊這里 http://wanshiqian1221.blog.163.com/blog/static/6872130420095242016546/

Blog.Core 第四季度開源更新說明書

B/C/V/PAn open-source organization based on .NET/Core and Vue (React/NG) to quickly build MVC & SPA and microservice application.開源貢獻NETCORE架構設計BCVP開發組成員說&#xff1a;BCVP是以Blog.Core為核心框架設計的一整套前后端分離、RBAC與數據鑒權、統一C…

關于HibernateDaoSupport中的getHibernateTemplate().execute及executeFind方法

轉自&#xff1a;https://blog.csdn.net/angus_17/article/details/8501668 1. 這兩個方法都是為了Spring在接管Hibernate之后&#xff0c;可以對HibernateDaoSupport進行靈活的擴展而用的。 二者的主要區別在于&#xff0c;execute返回的是一個Object&#xff0c;而executeFin…

bootstrap筆記

1.整體排版 <div class"container"><div class"row"><div class"col-md-offset-3 col-md-6"><div class"panel panel-primary"><div class"panel-heading"><h3 class"panel-title&q…

如何將聯系人導入Windows聯系人文件夾和從中導出聯系人

In Windows 7 and 8, there is a Contacts folder in your user directory. This folder can be useful if you have your contacts in a single .vcf file and want to move them into a .csv file for importing into programs like Outlook 2013. 在Windows 7和8中&#xff…

【vue】跟著老馬學習vue-數據雙向綁定

學習了node.js教程&#xff0c;只能說是有了一定的了解&#xff0c;之前也了解了webpack和es6的核心內容&#xff0c;也看過vue2.0的官網教程&#xff0c;并結合視頻看過項目&#xff0c;但是理解和運用仍然存在很多問題&#xff0c;接下來的一段時間&#xff0c;跟著老馬學習v…

位運算符2

class TestExer1{public static void main(String[] args){int m 12;int n 5;System.out.println("m:" m " n:" n);//方法一&#xff1a;提供一個臨時變量。//int temp m;// m n;// n temp;//System.out.println("m:" m &…