當前位置:首頁 » 安卓系統 » bluezandroid

bluezandroid

發布時間: 2023-07-08 05:32:07

⑴ 谷歌把藍牙協議棧開源了嗎

你好,谷歌把藍牙協議棧開源了嗎?是的。Android 4.2之前,Google一直使用的是linux官方藍牙協議棧,即知名老牌開源項目BlueZ。BlueZ實際上是由高通公司在2001年5月基於GPL協議發布的一個開源項目,該項目僅發布一個月後就被Linux之父Linux Torvalds納入了Linux內核,並做為Linux 2.4.6內核的官方藍牙協議棧。隨著Android設備的流行,BlueZ也得到了極大的完善和擴展。例如Android 4.1中BlueZ的版本升級為4.93,它支持藍牙核心規范4.0,並實現了絕大部分的Profiles。BlueZ現在正處於其巔峰時期,但好景不長。從Android 4.2即Jelly Bean開始,Google便在Android源碼中推出了它和博通公司一起開發的BlueDroid以替代BlueZ。雖然因為時間及成熟度的原因,大部分手機廠商在Android 4.2中仍繼續使用BlueZ。但據筆者了解,BlueZ的創始者,高通公司也將在基於其晶元的Android參考設計中去除BlueZ,並僅支持BlueDroid。BlueZ的未來如何筆者姑且不論。不過,能讓高通改弦易轍,BlueDroid自有其合理之處。相比BlueZ,BlueDroid最值得稱道的地方就是其框架結構變得更為簡潔和清晰。請參考!

⑵ Android如何讓藍牙設備持續維持可見狀態

試試看注釋掉 discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);會不會屏蔽掉用戶通知,可以話再循環切換。
不行的話就去找300s 這個時間參數,改大點。

⑶ android bluedroid什麼意思

android bluedroid什麼意思寫回答

android bluedroid什麼意思
寫回答有獎勵 共1個回答
1條回答

心愛淺紫色
2016-06-21 TA獲得超過6040個贊

關注
Android 4.2之前,Google一直使用的是Linux官方藍牙協議棧BlueZ。BlueZ實際上是由高通公司在2001年5月基於GPL協議發布的一個開源項目,做為Linux 2.4.6內核的官方藍牙協議棧。隨著Android設備的流行,BlueZ也得到了極大的完善和擴展。例如Android 4.1中BlueZ的版本升級為4.93,它支持藍牙核心規范4.0,並實現了絕大部分的Profiles。
從Android 4.2開始,Google便在Android源碼中推出了它和博通公司一起開發的BlueDroid以替代BlueZ。BlueZ的創始者,高通公司也將在基於其晶元的Android參考設計中去除BlueZ,支持BlueDroid。
相比BlueZ,BlueDroid最值得稱道的地方就是其框架結構變得更為簡潔和清晰。對我們工程師來說這也是個不錯的福利,清晰、簡潔的架構使我們在debug過程中思路更清晰;

⑷ android 藍牙 怎麼入門

入手一個新的模塊或應用,當然首先要知道它都有什麼了,與它相關的代碼在那裡,所以先一起看下藍牙代碼分布吧。


1. 代碼分布:

packages/apps/Bluetooth/

看這路徑肯定是藍牙應用方面的代碼了,主要是關於藍牙應用協議的表現代碼,包括opp、hfp、hdp、a2dp、pan等等,這些名詞後面再解釋。

frameworks/base/core/java/android/server/

4.2以後這個目錄雖然還有了,但裡面代碼已經轉移到應用層了,就是前面那個目錄,所以4.2.2上的藍牙這里可以忽略。

framework/base/core/java/android/bluetooth

這個目錄里的代碼更像一個橋梁,裡面有供java層使用一些類,也有對應的aidl文件聯系C、C++部分的代碼,還是挺重要的。

kerneldriversluetoothBluetooth

具體協議實現。包括hci,hid,rfcomm,sco,SDP等協議

kernel etluetooth Linux kernel

對各種介面的Bluetoothdevice的驅動。例如:USB介面,串口等,上面kernel這兩個目錄有可能看不到的,但一定會有的。

externalluetoothluedroid BlueZ (應用空間協議),官方藍牙協議棧。

systemluetoothBluetooth 適配層代碼,和framework那個作用類似,是串聯framework與blueZ的工具。

大致代碼分布就是這些,初步查看後讓我們再來看下藍牙的整體結構。


2.整體結構:

這部分直接上圖了,看著直觀些。圖中把JNI部分雖然在目前4.2的代碼中在packages層,這里還是畫在Framework層了,說明下希望

不要引起理解的誤會。從圖上可以感覺到整體流程和以前變化不大,所以流程方面的文章看4.1或更早的應該問題也不大。

PS:上圖關於藍牙協議棧的說明有誤,4.2里已經不再是bluez了,在些更正一下,當然協議棧這一部分還是要有的,新的協議棧看下面英文:


Android 4.2 introces a new Bluetooth stack optimized for use with Android devices. The new Bluetooth stack developed in

collaboration between Google and Broadcom replaces the stack based on BlueZ and provides improved compatibility and reliability.

google和broadcom合作開發了一個新藍牙協議棧,老版本的兼容性問題在所難免了。在此感謝網友andger032的提醒。


3.常用類和名詞解釋:

luetooth 目錄下

BluetoothEnabler.java 界面上藍牙開啟、關閉的開關就是它了,

BluetoothSettings.java 主界面,用於管理配對和連接設備

LocalBluetoothManager.java 提供了藍牙API上的簡單調用介面,這里只是開始。

CachedBluetoothDevice.java 描述藍牙設備的類,對BluetoothDevice的再封裝

BluetoothPairingDialog.java 那個配對提示的對話框


/packages/apps/Phone/src/com/android/phone/

BluetoothPhoneService.java 在phone的目錄肯定和電話相關了,藍牙接聽掛斷電話會用到這個


/packages/apps/Bluetooth/src/com/android/bluetooth/btservice/

AdapterService.java 4.2後才有的代碼,藍牙打開、關閉、掃描、配對都會走到這里,其實更准確的說它替代了4.1之前的BluetoothService.java,原來的工作就由這個類來完成了。說到這里不能不說4.2藍牙的目錄變了,在4.1及以前的代碼中packages層的代碼只有opp協議相關應用的代碼,也就是文件傳輸那部分,而4.2的代碼應用層的代碼則豐富了許多,按具體的藍牙應用協議來區別,分為以下文件夾(這里一並對藍牙一些名詞作個簡單解釋):

a2dp 藍牙立體聲,和藍牙耳機聽歌有關那些,另還有個avrcp--音頻/視頻遠程式控制制配置文件,是用來聽歌時暫停,上下歌曲選擇的。

btservice 這個前面AdapterService.java的描述大家應該能猜到一些,關於藍牙基本操作的目錄,一切由此開始。

hdp 藍牙關於醫療方面的應用 Bluetooth Health Device Profile

hfp 和電話相關,藍牙接聽、掛斷電話 Hands-free Profile

hid 人機交互介面,藍牙滑鼠鍵盤什麼的就是這個了

opp 不多解釋,以前就有。

pan 描述了兩個或更多個 Bluetooth 設備如何構成一個即時網路,和網路有關的還有串列埠功能(SPP),撥號網路功能(DUN)

pbap 電話號碼簿訪問協議(Phonebook Access Profile)

android 4.2的藍牙應用層部分代碼更豐富了,雖然有些目錄還沒具體代碼,不過說不準哪個版本更新就有了,就像4.0添加了hdp醫療那部分一樣。

另外原本在framework的JNI代碼也被移到packages/apps/bluetooth當中。

/frameworks/base/core/java/android/bluetooth/目錄下


BluetoothA2dp.java A2DP的功能實現

BluetoothAdapter.java 藍牙action的定義,虛擬設備屬性以及操作方法

BluetoothAudioGateway.java 藍牙語音網關

BluetoothClass.java 藍牙設備類型的定義

BluetoothDevice.java 藍牙設備屬性

BluetoothDevicePicker.java 定義遠程藍牙設備的特性,比如需要認證,設備類型

BluetoothHeadset.java 定義藍牙headset功能的屬性以及介面

BluetoothInputStream.java 藍牙流介面的實現(輸入流)

BluetoothOutputStream.java 藍牙流介面的實現(輸出流)

BluetoothServerSocket.java 藍牙socket服務端具備的方法

BluetoothSocket.java 藍牙socket的封裝

BluetoothUuid.java 藍牙uuid的定義以及uuid的解析

以上java文件在使用具體功能會用到,現在只是簡單描述下,至於具體使用在後續文章用到時再給出。同時代碼說明部分也就寫這些了

對於C、C++部分的代碼一方面沒看那麼多,另一方面根據android JNI的命名習慣,大家找起來也很容易。


4.後續分析:

前面從整體上描述藍牙的基本知識,落實在具體的代碼分析上,我們按幾個主線功能來走,藍牙的開關、搜索配對、藍牙耳機與電話和文件傳輸,

這幾個也算是藍牙的常用必備功能了,所以在後續文章中將按著這個順序來跟一下它們代碼調用流程。希望可以讓你快速的了解藍牙,當然如果有失誤

轉載

⑸ Android開發之藍牙(Bluetooth)

在上一篇中有介紹了Wifi與網路連接處理
Android開發之WiFi與網路連接處理
下面,來繼續說說Android中藍牙的基本使用。

Bluetooth是目前使用的最廣泛的無線通訊協議之一,主要針對短距離設備通訊(10米),常用於連接耳機、滑鼠和移動通訊設備等。

值得一提的是:
android4.2新增了部分新功能,但是對於Bluetooth熟悉的人或許開始頭疼了,那就是Android4.2引入了一個新的藍牙協議棧針BLE。谷歌和Broadcom之間的合作,開發新的藍牙協議棧,取代了基於堆棧的Bluez。因此市場上出現了老設備的兼容問題,很多藍牙設備在android4.2手機上不能正常使用。

BluetoothAdapter簡單點來說就是代表了本設備(手機、電腦等)的藍牙適配器對象。

first:we need permission
要操作藍牙,先要在AndroidManifest.xml里加入許可權

**下面來看看如何使用藍牙。 **↓↓↓****
Demo已就緒:

返回值:如果設備具備藍牙功能,返回BluetoothAdapter 實例;否則,返回null對象。

打開藍牙設備的方式:
1.直接調用函數enable()去打開藍牙設備 ;
2.系統API去打開藍牙設備,該方式會彈出一個對話框樣式的Activity供用戶選擇是否打開藍牙設備。

注意: 1.如果藍牙已經開啟,不會彈出該Activity界面。2.在目前大多數Android手機中,是不支持在飛行模式下開啟藍牙的。如果藍牙已經開啟,那麼藍牙的開關 ,狀態會隨著飛行模式的狀態而發生改變。

1. 搜索藍牙設備
使用BluetoothAdapter的startDiscovery()方法來搜索藍牙設備
startDiscovery()方法是一個非同步方法,調用後會立即返回。該方法會進行對其他藍牙設備的搜索,該過程會持續12秒。該方法調用後,搜索過程實際上是在一個System Service中進行的,所以可以調用cancelDiscovery()方法來停止搜索(該方法可以在未執行discovery請求時調用)。

系統開始搜索藍牙設備
^( *  ̄(oo) ̄ ) ^ 系統會發送以下三個廣播:

2.掃描設備

3.定義廣播接收器接收搜索結果

4.注冊廣播

獲取附近的藍牙設備

第一步建立連接:首先Android sdk(2.0以上版本)支持的藍牙連接是通過BluetoothSocket建立連接,服務端BluetoothServerSocket和客戶端(BluetoothSocket)需指定同樣的UUID,才能建立連接,因為建立連接的方法會阻塞線程,所以伺服器端和客戶端都應啟動新線程連接。

(這里的服務端和客戶端是相對來說的)
兩個藍牙設備之間的連接,則必須實現服務端與客戶端的機制。
當兩個設備在同一個RFCOMM channel下分別擁有一個連接的BluetoothSocket,這兩個設備才可以說是建立了連接。

服務端設備與客戶端設備獲取BluetoothSocket的途徑是不同的。
1,服務端設備是通過accepted一個incoming connection來獲取的,
2,客戶端設備則是通過打開一個到服務端的RFCOMM channel來獲取的。

服務端
通過調用BluetoothAdapter的(String, UUID)方法來獲取BluetoothServerSocket(UUID用於客戶端與服務端之間的配對)

客戶端
調用BluetoothService的(UUID)方法獲取BluetoothSocket(該UUID應該同於服務端的UUID)。
調用BluetoothSocket的connect()方法(該方法為block方法),如果UUID同服務端的UUID匹配,並且連接被服務端accept,則connect()方法返回。

數據傳遞,通過以上操作,就已經建立的BluetoothSocket連接了,數據傳遞無非是通過流的形式
獲取流

該類就是關於遠程藍牙設備的一個描述。通過它可以和本地藍牙設備---BluetoothAdapter連接通信。

好多東西我也不知道怎麼描述,下面給出Demo:
剛好有剛學習的小夥伴問我ListView怎麼用,那我就用ListView。

源碼:
RairDemo
GitHub: https://github.com/Rairmmd/android-demo
Coding: https://coding.net/u/Rair/p/RairDemo/git

⑹ android bluetooth hid協議的開發求助

Android Bluetooth HID實現詳解


Android 關於藍牙的部分使用的是BlueZ協議棧。但是直到目前2.3.3都沒有擴展HID的profile,只是實現了最基本的Handset和d2dp的profile,所以我們的工作涉及到從應用到jni三層的修改,具體修改文件如圖所示,綠色表示新建的類,橙色表示修改的類。

一. 本地層


路徑:framework/base/core/jni/

參照android_server_BluetoothA2dpService.cpp新建android_server_bluetoothHidServer.cpp。該類中主要是通過dbus對bluez協議棧的訪問,dbus 的通用方法都在android_bluetooth_common.cpp中實現,我們做的僅僅是通過dbus_func_args_async調用到bluez提供的input介面。

主要實現以下兩個方法函數:

static jboolean connectSinkNative(JNIEnv *env, jobject object, jstring path) {


#ifdef HAVE_BLUETOOTH


LOGV(__FUNCTION__);


if (nat) {


const char *c_path = env->GetStringUTFChars(path, NULL);



bool ret = dbus_func_args_async(env, nat->conn, -1, NULL, NULL, nat,


c_path, "org.bluez.Input", "Connect",


DBUS_TYPE_INVALID);



env->ReleaseStringUTFChars(path, c_path);


return ret ? JNI_TRUE : JNI_FALSE;


}


#endif


return JNI_FALSE;


}



static jboolean disconnectSinkNative(JNIEnv *env, jobject object,


jstring path) {


#ifdef HAVE_BLUETOOTH


LOGV(__FUNCTION__);


if (nat) {


const char *c_path = env->GetStringUTFChars(path, NULL);



bool ret = dbus_func_args_async(env, nat->conn, -1, NULL, NULL, nat,


c_path, "org.bluez.Input", "Disconnect",


DBUS_TYPE_INVALID);



env->ReleaseStringUTFChars(path, c_path);


return ret ? JNI_TRUE : JNI_FALSE;


}


#endif


return JNI_FALSE;


}

這里要注意將該文件添加到AndroidRuntime.cpp和Android.mk中,否則不會編譯到動態庫中。

此部分編譯後最終生成libandroid_runtime.so並替換到system/libs下

二.Framework的java部分

路徑framework/base/java/android/server/中添加BluetoothHidService.java文件

路徑framework/base/java/android/bluetooth/中添加BluetoothHid.java和IBluetoothHid.aidl文件。


interface IBluetoothHid {


boolean connect(in BluetoothDevice device);


boolean disconnect(in BluetoothDevice device);


int getState(in BluetoothDevice device);


boolean setPriority(in BluetoothDevice device, int priority);


int getPriority(in BluetoothDevice device);


}

BluetoothHid.java中主要的兩個方法connect和disconnect間接地通過aidl訪問BluetoothHidService。這里主要是實現跨進程並為上層提供可直接訪問的方法。

由此framework的主要部分打包生成framework.Jar並最終部署到system/framework里。

三.應用(Settings.apk)

最後需要修改應用部分,應用部分的修改點比較分散,不想框架層那樣整塊模仿A2DP的樣子那麼方便,但也不是說jni部分有多麼容易。反而對於我這種對C語言不熟悉的人來說,修改jni是最頭疼得事了。好在藍牙HID這部分框架層的修改都是整塊進行的,理解上還算比價容易。

總的來說在Settings.apk中要修改的文件主要是這么幾個:

LocalBluetoothProfileManager.java這里主要提供一個HID的profile以便應用層訪問。建一個HIDProfile的class調用framework中的BluetoothHID。實際上就是通過bender機制調用了BluetoothHidService。

CashedBluetoothDevice中添加顯示藍牙鍵盤的圖標,BluetoothPairingDialog中則需要添加一段藍牙配對驗證處理的代碼,我是參照i9000中先彈出一個隨機數,然後在鍵盤中敲入相同的隨機數即配對成功,具體實現如下:


// HID


if (isDeviceKeyboard(mDevice)) {


String pin = String.format("%06d", Long.valueOf(Math


.abs(new Random().nextLong() % 1000000L)));


mPairingView.setVisibility(View.GONE);


messageView.setText(getString(


R.string.bluetooth_enter_keyboard_pin_msg, pin, name));



byte[] bytePin = BluetoothDevice.convertPinToBytes(pin);


if (bytePin != null) {


mDevice.setPin(bytePin);


}


}


……


}

轉載

⑺ 怎樣著手研究 Android 源代碼

不需要全部了解,閱讀你感興趣或者與你工作相關的部分就可以了。比如:

頂層目錄:
.
|– bionic (bionic庫,Android的基礎庫)
|– bootable (bootloader, recovery等,ROM移植相關)
|– build (編譯和配置所需的腳本和工具)
|– dalvik (dalvik的Java虛擬機)
|– development (開發應用程序所需的模板和工具)
|– external (由其他平台移植過來的項目,對於移植工作是非常好的參考)
|– frameworks (應用程序框架層,請仔細閱讀此部分代碼,對於開發App會有很大幫助)
|– hardware (與硬體相關的庫,驅動開發相關)
|– kernel (linux內核)
|– out (編譯後生成的目錄,包含構建文件系統所需的文件)
|– packages (Android的原生應用程序,App開發者需要重點關注)
|– prebuilt (Android在各平台下編譯的預置腳本)
|– system (Android的底層庫)
`– vendor / device (設備相關的代碼,AOSP里不會有太多涉及,但是CM中卻是重點)

external目錄:
.
|– aes (ASE加密
|– apache-http (網頁伺服器)
|– bison (自動生成語法分析器,將無關文法轉換為C,C++)
|– bluez (Linux下的藍牙工具)
|– bsdiff (diff工具)
|– bzip2 (壓縮工具)
|– clearsilver (html模板系統)
|– dbus (低延時,低開銷,高可用性的IPC機制)
|– dhcpcd (DHCP服務)
|– dosfstools (DOS文件系統工具)
|– dropbear (SSH2的伺服器/客戶端)
|– e2fsprogs (EXT2文件系統工具)
|– elf (ELF復制工具)
|– elfutils (ELF工具)
|– embunit
|– emma (Java代碼覆蓋率統計工具)
|– esd (將多種音頻流混合在一個設備上播放)
|– expat
|– fdlibm
|– freetype (字體)
|– gdata (google的無線數據)
|– genext2fs
|– giflib (gif庫)
|– googleclient (google用戶庫)
|– grub
|– icu4c
|– iptables (防火牆)
|– jdiff
|– jhead (jpeg頭部信息工具)
|– jpeg (jpeg庫)
|– libffi
|– libpcap (網路數據包捕獲函數)
|– libpng (png庫)
|– libxml2 (xml解析庫)
|– netperf (網路性能測試工具)
|– opencore (多媒體框架,最讓人詬病的模塊,Andoird 4.0中已被 stagefright 取代)
|– openssl (SSL模塊,需要注意的是一定要靜態編譯此模塊,否則會出現兼容問題)
|– qemu (Android 模擬器,Android 4.0之前只支持 arm-eabi,現在已支持 arm-v7)
|– skia (SKIA圖像引擎)
|– sqlite (資料庫
|– strace (調試跟蹤工具)
|– tcpmp (TCP抓包軟體)
|– webkit (瀏覽器核心)
|– wpa_supplicant (無線網卡管理)
|– yaffs2 (yaffs文件系統)

熱點內容
資料庫測試數據 發布:2025-02-06 11:31:05 瀏覽:820
球頭軸編程 發布:2025-02-06 11:29:36 瀏覽:279
為什麼安卓系統不能收縮許可權 發布:2025-02-06 11:27:58 瀏覽:730
演算法4視頻 發布:2025-02-06 11:19:20 瀏覽:933
51內置音效卡需要什麼主機配置 發布:2025-02-06 11:18:33 瀏覽:838
防針刺傷的物品配置有哪些 發布:2025-02-06 11:11:25 瀏覽:670
游戲數據反編譯 發布:2025-02-06 11:05:30 瀏覽:400
逍遙安卓在哪裡下載的視頻 發布:2025-02-06 10:50:42 瀏覽:877
上編程序 發布:2025-02-06 10:49:08 瀏覽:796
會議源碼 發布:2025-02-06 10:47:09 瀏覽:93