閱讀98 返回首頁    go iPhone_iPad_Mac_手機_平板_蘋果apple


Android 藍牙開發(十一)Pan藍牙共享網絡分析

轉載請注明出處:https://blog.csdn.net/vnanyesheshou/article/details/71106622

本文已授權微信公眾號 fanfan程序媛 獨家發布 掃一掃文章底部的二維碼或在微信搜索 fanfan程序媛 即可關注

本文主要分析Andorid藍牙共享網絡的使用、連接流程等。 
基於Android4.3源碼

Bluetooth PAN全稱:Bluetooth Personal Area Networking,藍牙個人區域網,是Bluetooth技術的一種重要應用,其核心思想就是用Bluetooth無線技術取代傳統的有線電纜,組建個人化信息網絡,實現個人範圍的資源和信息共享(也就是網絡共享)。 
主要應用場景:手機與手機、PC與PC、PC與手機之間的網絡共享。 
三種角色:

NAP(Network Access Point): 如果你的藍牙設備支持NAP,那麼你可以通過共享網絡連接來給別的PAN Network內的PC提供上網功能。 
GN(Group Ad-hoc Network): 使你可以在小局域網內給其它設備提供數據轉發的功能。 
PANU(PAN User):與NAP,GN相對的角色,使用NAP,GN提供的功能的設備。

Android上支持作為NAP和PANU角色。

NAP全稱NetworkAccessPoint(網絡接入點)。網絡接入點又稱為網絡訪問點,是帶有一個或多個藍牙射頻的裝置,作為LAN、GSM等網絡和藍牙網絡之間的網橋、代理或路由器的設備。網絡接入點為每個相連的藍牙設備提供了網絡服務,如LAN上共享的資源。 
要想藍牙共享網絡,首先設備需要連接wifi或者開啟流量。然後設置中開啟“藍牙共享網絡”。 
該界麵對應著TetherSettings。 
路徑:packages/apps/Settings/src/com/android/settings/TetherSettings.Java 
在其onCreate時,會獲取BluetoothPan代理對象。

getProfileProxy是異步的,獲取成功、失敗會回調mProfileServiceListener。代碼如下:

打開藍牙共享會調用到startTethering()。如果藍牙狀態為關閉,則先開啟藍牙。保證藍牙為開啟狀態,然後打開藍牙共享。

bluetoothPan.setBluetoothTethering(true)跳到Bluetooth應用中, 
代碼路徑:packages/apps/Bluetooth/src/com/android/bluetooth/pan/PanService.java 
先調用到內部類BluetoothPanBinder的setBluetoothTethering方法。

該方法中很明顯是去調用PanService的setBluetoothTethering方法。

該函數主要是將狀態值保存喜愛,然後將之前的連接都斷開。 
打開網絡共享後就可以進行連接互聯網共享了,當A設備打開網絡共享後,點擊互聯網訪問,連接B設備一直失敗,這樣是錯誤的,應該B設備主動連接該設備,而不是該設備連接其他設備。

當別的設備與NAP設備(該設備)連接成功,NAP會回調com_android_bluetooth_pan.cpp中的connection_state_callback(),然後回調PanService中的onConnectStateChanged(),然後跳到handlePanDeviceStateChange中,在該函數中由於遠端設備為PANU,本地設備為NAP,則會調用enableTethering,用來配置ip地址等相關信息(具體還不是很清楚)。handlePanDeviceStateChange會向為發送廣播,攜帶藍牙共享的相關狀態。

PANU Personal Area Networking user,個人區域網用戶。 
要想連接別的設備的藍牙共享網絡,首先需要配對,配對成功後,在已配對界麵點擊“互聯網訪問”來連接遠端設備, 
該操作經過一係列調用,跳到PanProfile中的connect方法中。具體如何跳到PanProfile中的connect方法,可以參考如下文章。 
https://blog.csdn.net/vnanyesheshou/article/details/71106622 
https://blog.csdn.net/vnanyesheshou/article/details/71811288 
PanProfile中的connect會跳到Bluetooth應用中的PanService中。 
在PanService的connect函數中判斷與該設備的連接狀態是否斷開,沒有斷開則返回false。斷開著向handler發送消息,返回true。handler中處理該消息如下:

調用connectPanNative進行pan的連接,返回false則表示失敗,向外發送廣播(CONNECTING、DISCONNECTED);返回true則表示該操作成功,等待連接狀態回調。 
connectPanNative函數中的參數,看出本地設備作為PANU角色,遠端作為NAP角色,所以上麵作為NAP時主動連接其他設備失敗。 
connectPanNative為native方法,其會跳到com_android_bluetooth_pan,然後向hardware層調用。

連接狀態回調與上相同。都會回調到handlePanDeviceStateChange中。

然後向外發送連接狀態的廣播。該廣播隻能判斷pan協議的連接狀態,並不能代表是否能正常共享網絡。因為NAP端設備可能沒有連接網絡,或者分配ip地址等沒有成功。

上述代碼可以判斷與NAP設備的網絡是否連接,但並不能保證可以上網,連接成功後,NAP設備不管可不可以上網,上述代碼都返回true。暫時還沒有找到其他方法。

  長沙皮膚病醫院哪家好https://www.xasgfk120.com/

  銀屑病俗稱牛皮癬https://www.xasgfk120.com/gfpfb/pfx/48.html

  長沙蕁麻疹預防https://www.xasgfk120.com/gfpfb/xmz/49.html

  銀屑病長沙醫院維護https://www.xasgfk120.com/gfpfb/pfx/50.html

  腋臭 除臭哪裏好https://www.xasgfk120.com/pfmrk/yc/51.html

  有腋臭怎麼辦https://www.xasgfk120.com/pfmrk/yc/52.html

  腋臭讓人非常的煩惱https://www.xasgfk120.com/pfmrk/yc/53.html

  身上有紅斑,像鱗屑是怎麼回事https://www.xasgfk120.com/gfpfb/pfx/54.html


最後更新:2017-07-07 17:40:14

  上一篇:go 小米就是個大忽悠
  下一篇:go 我終於弄來小米6的F碼,有誰需要嗎?