Android附近:如何整合Android和Android的東西
本文將探討如何使用Android Nearby,展示如何整合Android和Android Things。我們可以使用幾種策略來整合Android和Android Things。Android Nearby技術就是其中之一。Android提供了一組API,可以簡化兩個不同裝置之間的資料交換。一個有趣的方面是Android Nearby也支援iOS作業系統。
• Android Nearby是一項支援三種不同策略來整合Android裝置的技術:
• Android Nearby Messages:這使用釋出者/訂閱者範例在兩個不同的Android裝置之間交換簡單的有效負載。
• Android Nearby Connections:它是一個點對點網路,使應用程式能夠在裝置之間發現,連線和交換資料。這種策略支援高頻寬,它可以在多種場景中使用(遊戲,檔案共享等)
Android附近通知:此技術使使用者可以使用應用或網站接收周圍的通知
本文介紹瞭如何使用Android Nearby Connections整合Android和Android Things裝置。主要目標是展示如何將資料從Android智慧手機發送到Android Things裝置,並使用連線到Android Things的LCD顯示屏顯示此資訊。
Android Nearby簡介
Android Nearby連線是一個點對點網路。該網路有兩個主要角色:
• 通告自己等待傳入連線的廣告商
• 尋找要連線的廣告商的Discoverer
一旦Discoverer找到了廣告商,他們就可以建立連線並交換資料。在Android引擎蓋下,Android Nearby API使用一組技術來建立不同裝置之間的連線。它可以是藍芽或Wi-Fi。API利用每種技術的優勢來保證可靠的連線。開發人員和使用者不必擔心它,它是完全透明的。
在本教程中,Android Things裝置扮演等待傳入Discoverer的廣告商角色。Android裝置是Discoverer,用於查詢要連線的廣告商。為了完成本教程,有必要實現兩個不同的應用程式:
Android Things應用程式,用於接收資料並處理LCD顯示
將資料傳送到Android Things的Android應用
此外,Android Nearby連線支援不同的發現和廣告策略。一般來說,這兩種策略是:
• P2P_Cluster:支援M-to-N網路拓撲,其中每個裝置都可以接受傳入連線並啟動與其他裝置的新連線
• P2P_STAR:這是一個經典的起始拓撲網路,其中一個裝置作為廣告商播放,其他裝置是發現的
在這個Android Things教程中,我們將使用P2P_STAR拓撲。讓我們開始實施廣告客戶。
使用Android Things的Android附近廣告商
第一步是使用Android Thing裝置實施廣告商。在這種情況下,我們將使用Raspberry Pi 3,但您可以使用與Android Things相容的其他原型板。
要實施Android Nearby Advertiser,我們必須遵循以下三個不同的步驟:
開始做廣告
接受傳入的連線
收聽傳入的有效負載
第四步是可選的,它正在管理連線到Android Things的LCD顯示器,以便Android Things應用程式將在LCD顯示器上顯示有效載荷內容。
使用Android Things開始廣告
第一件事是建立一個新類來處理所有Nearby連線細節。讓我們稱這個班 NearbyAdvManager。在建構函式中,Android Thing應用程式開始廣告:
私有 ConnectionsClient客戶端 ; .. 客戶 =附近。getConnectionsClient(ctx); 客戶。startAdvertising(“ AndroidThings ”, SERVICE_ID, connectionLifeCycleCB, 新 AdvertisingOptions(戰略。P2P_STAR)) 。addOnSuccessListener( newOnSuccessListener < Void >(){ @覆蓋 publicvoidonSuccess(VoidaVoid){ 記錄。我(TAG,“OnSuccess ......”); } } ) 。addOnFailureListener(newOnFailureListener(){ @覆蓋 publicvoidonFailure(@NonNullExceptione){ 記錄。e(TAG,“OnFailure 1”); e。printStackTrace(); } }); }
"Android Things"是暱稱,而SERVICE_ID我們的服務ID。通常,SERVICE_ID是我們的應用程式的包名稱。另一個引數connectionLifeCycleCB, 是回撥類。
請注意,Android Nearby有一組新的API。當我們建立廣告商時,我們不再需要使用它 GoogleApiClient了。
是時候實現連接回調,以便Android Things應用程式獲得有關連線的通知。為此,我們將此程式碼新增到管理器:
privateConnectionLifecycleCallbackconnectionLifeCycleCB= 新的 ConnectionLifecycleCallback(){ @覆蓋 publicvoidonConnectionInitiated(Strings, ConnectionInfoconnectionInfo){ 記錄。我(標籤,“連線發起。結束[” + s + “]”); //讓我們接受這種聯絡 } @覆蓋 publicvoidonConnectionResult(Strings, ConnectionResolutionconnectionResolution){ 記錄。i(標籤,“連線結果。結束[” + s + “]”); } @覆蓋 publicvoidonDisconnected(Strings){ 記錄。我(TAG,“Disconnected.Endpont [” + s + “]”); }; };
接受Android Things App中的傳入連線
一旦Android Things應用程式開始廣告,就必須處理傳入的連線。正如我們之前看到的,在連接回調介面中,我們有更改來處理連線。在onConnectionInitiated被稱為當發現者要開始對廣告客戶的新連線。在此方法中,新增以下行:
附近。getConnectionsClient(ctx) 。acceptConnection(s,payloadCallback);
使用此程式碼,Android Things應用程式可以接受所有傳入連線,而無需使用身份驗證機制。可以對客戶端進行身份驗證,以便我們可以應用某些安全策略。
最後一步是傳入,payloadCallback因此應用程式可以處理傳入的有效負載。
處理Android附近的有效負載
這是Android Nearby Advertiser的最後一步。Android Things應用程式必須實現PayloadCallback介面以讀取傳入的有效負載。
privatePayloadCallbackpayloadCallback=newPayloadCallback(){ @覆蓋 publicvoidonPayloadReceived(Strings,Payloadpayload){ 記錄。我(TAG,“收到有效負載”); byte [] b=有效載荷。asBytes(); Stringcontent=newString(b); 記錄。我(標籤,“內容[” + 內容+ “]”); } @覆蓋 publicvoidonPayloadTransferUpdate(Strings, PayloadTransferUpdatepayloadTransferUpdate){ 記錄。d(TAG,“有效載荷轉移更新[” + s + “]”); } };
在onPayloadReceived,我們將處理LCD顯示屏以顯示有效載荷內容。
實現附近的Android事物應用程式
經理準備好後,是時候實施Android Things Nearby應用了。讓我們建立MainActivity課程:
@覆蓋 protectedvoidonCreate(BundlesavedInstanceState){ 超。onCreate(savedInstanceState); 記錄。我(標籤,“啟動Android Things應用......”); NearbyAdvManageradvManager=newNearbyAdvManager(this); }
稍後,我們將處理連線到Android Things的LCD顯示器,以便它可以顯示有效載荷內容。
在銷燬應用程式時,不要忘記關閉連線並停止廣告
最後,我們可以要求許可權了 AndroidManifest.xml
< uses-permissionandroid:name = “android.permission.BLUETOOTH”/> < uses-permissionandroid:name = “android.permission.BLUETOOTH_ADMIN”/> < uses-permissionandroid:name = “android.permission.ACCESS_WIFI_STATE”/> < uses-permissionandroid:name = “android.permission.CHANGE_WIFI_STATE”/> < uses-permissionandroid:name = “android.permission.ACCESS_COARSE_LOCATION”/>
您已準備好啟動該應用。為此,您可以使用相容的Android Things裝置。在本教程中,我們將使用執行Android Things 1.0.3的Raspberry Pi 3。
啟動Android Things應用程式時,請確保這是第一個應用程式,否則您可能會遇到一些錯誤
使用Nearby實現Android應用程式
在本段中,我們將介紹如何實現播放Discoverer角色並將資料傳送到Android Things應用的Android應用。實現此應用程式的步驟與之前用於實現Android Things Nearyby應用程式的步驟幾乎相同。讓我們從建立一個名為的類開始NearbyDsvManager。本課程將管理所有詳細資訊,以便與Android Things應用程式一起發現,連線和交換資料。
將此建構函式新增到此類:
publicNearbyDsvManager(Contextctx,finalEventListenerlistener){ 這個。listener=listener ; 這個。ctx=ctx ; 記錄。我(TAG,“NearbyDsvManager”); 附近。getConnectionsClient(ctx) 。startDiscovery(SERVICE_ID, endpointDiscoveryCB, 新 DiscoveryOptions(戰略。P2P_STAR)) 。addOnSuccessListener( newOnSuccessListener < Void >(){ @覆蓋 publicvoidonSuccess(VoidaVoid){ 記錄。我(TAG,“OnSuccess ......”); 聽眾。startDiscovering(); } } ) 。addOnFailureListener(newOnFailureListener(){ @覆蓋 publicvoidonFailure(@NonNullExceptione){ 記錄。e(TAG,“OnFailure”,e); e。printStackTrace(); } }); }
這個類幾乎與前面描述的相同。它開始發現試圖找到準備交換資料的廣告商。此外,在此類中,定義了一個回撥介面,用於在發現和連線過程中通知呼叫者(MainActivity)有關事件的資訊。此回撥介面是:
publicinterfaceEventListener { publicvoidonDiscovered(); publicvoidstartDiscovering(); publicvoidonConnected(); }
此外,Nearby API使用另一個回撥介面來通知呼叫者有關發現狀態的資訊。在上面的程式碼中,列表是endpointDiscoveryCB:
privateEndpointDiscoveryCallbackendpointDiscoveryCB=newEndpointDiscoveryCallback(){ @覆蓋 publicvoidonEndpointFound(Strings,DiscoveredEndpointInfodiscoveredEndpointInfo){ 記錄。我(TAG,“Endpoint found [” + s + “]。Connecting ....”); 聽眾。onDiscovered(); getConnection(s); } @覆蓋 publicvoidonEndpointLost(Strings){ 記錄。e(TAG,“終點丟失[” + s + “]”); } };
將附
近的Discoverer連線到附近的廣告商
Discoverer找到有效端點(由廣告商提供)後,Discoverer會嘗試啟動連線getConnection(s),其中s是發現的端點:
privatevoidgetConnection(StringendpointId){ 附近。getConnectionsClient(ctx) 。requestConnection(endpointId,endpointId,connectionLifecycleCallback) 。addOnSuccessListener(newOnSuccessListener < Void >(){ @覆蓋 publicvoidonSuccess(VoidaVoid){ 記錄。d(TAG,“請求連線......”); } }) 。addOnFailureListener(newOnFailureListener(){ @覆蓋 publicvoidonFailure(@NonNullExceptione){ 記錄。e(TAG,“請求連線時出錯”,e); } }); }
在此方法中,Discoverer使用endpointId 上一步中發現的連線請求新連線 。此外,它還添加了一個新的回撥介面,以瞭解何時建立連線或出現錯誤。
privateConnectionLifecycleCallbackconnectionLifecycleCallback= 新的 ConnectionLifecycleCallback(){ @覆蓋 publicvoidonConnectionInitiated(Strings,ConnectionInfoconnectionInfo){ 記錄。i(標籤,“連線到端點[” + s + “]”); NearbyDsvManager。這個。currentEndpoint=s ; 附近。getConnectionsClient(ctx)。acceptConnection(s,payloadCallback); } @覆蓋 publicvoidonConnectionResult(Strings,ConnectionResolutionconnectionResolution){ 開關(connectionResolution。的getStatus()。getStatusCode()){ 大小寫 ConnectionsStatusCodes。STATUS_OK: 聽眾。onConnected(); 打破 ; 大小寫 ConnectionsStatusCodes。STATUS_CONNECTION_REJECTED: 記錄。我(標籤,“拒絕連線”); 打破 ; 大小寫 ConnectionsStatusCodes。STATUS_ERROR: 記錄。我(標籤,“連線錯誤”); 打破 ; } } @覆蓋 publicvoidonDisconnected(Strings){} };
建立連線並且雙方都接受了連線後,該過程結束並且應用程式已準備好傳送資料。這是將有效負載從Android應用程式傳送到Android Things應用程式的方法:
publicvoidsendData(Stringdata){ 記錄。i(TAG,“傳送資料[” + 資料+ “]”); 記錄。i(TAG,“Current endpoint [” + currentEndpoint + “]”); if(currentEndpoint!=null){ 記錄。d(TAG,“將資料傳送到[” + data + “]”); 有效 負載 =有效負載。fromBytes(資料。的getBytes()); 附近。getConnectionsClient(ctx)。sendPayload(currentEndpoint,payload); } }
就這樣。
實現Android App UI
最後一步實現Android應用程式UI,以便使用者可以插入有效負載並將其傳送到Android Things應用程式(Nearyby廣告商)。使用者介面非常簡單:
<?xmlversion =“1.0”encoding =“utf-8”?> < android.support.constraint.ConstraintLayout xmlns:android = “http://schemas.android.com/apk/res/android” xmlns:app = “http://schemas.android.com/apk/res-auto” xmlns:tools = “http://schemas.android.com/tools” android:layout_width = “match_parent” android:layout_height = “match_parent” tools:context = “。MainActivity” > < TextView android:layout_width = “wrap_content” android:layout_height = “wrap_content” android:text = “內容” app:layout_constraintLeft_toLeftOf = “parent” app:layout_constraintTop_toTopOf = “parent” android:layout_marginTop = “8dp” android:id = “@ + id / txt” /> < EditText android:layout_width = “wrap_content” android:layout_height = “wrap_content” android:提示 = “文字在這裡” android:maxLength = “40” android:id = “@ + id / ed” app:layout_constraintTop_toBottomOf = “@ id / txt” android:layout_marginTop = “8dp” /> < 按鈕 android:layout_width = “wrap_content” android:layout_height = “wrap_content” app:layout_constraintBottom_toBottomOf = “parent” app:layout_constraintLeft_toRightOf = “parent” app:layout_constraintRight_toLeftOf = “parent” android:id = “@ + id / btn” android:text = “傳送” /> </ android.support.constraint.ConstraintLayout >
最後:
@覆蓋 protectedvoidonCreate(BundlesavedInstanceState){ 超。onCreate(savedInstanceState); 的setContentView(ř。佈局。activity_main); BTN=findViewById(ř。ID。BTN); 等 =(的EditText)findViewById(ř。ID。編); btn。setOnClickListener(新 景觀。OnClickListener(){ @覆蓋 publicvoidonClick(檢視 v){ Stringtxt=et。getText()。toString(); 記錄。d(TAG,“Txt [” + txt + “]”); dsvManager。sendData(txt); } }); }
將LCD顯示器連線到Android Things
此步驟是可選的,因為它描述瞭如何將LCD顯示器連線到Android Things以顯示從Android應用程式傳送的內容有效負載。這個Android Things教程使用了Hd44780 LCD。更多細節,這款LCD基於HD44780晶片和PCF8574。有幾個版本具有不同的顯示尺寸,這個例子中的一個是20×4。這是一個I2C外設,使用四個不同的引腳連線到Android Things板:
• Vcc(+ 5V)
• GND
• SDA
• CLK
連線架構如下圖所示:

0000.png
要管理此LCD,必須匯入驅動程式。讓我們將此行新增到build.gradle:
實現 'com.leinardi.android.things:driver-hd44780:<version>'
此外,有必要建立一個新類來處理LCD連線細節和顯示資料的所有步驟。
公共 類 ManageLCD { 私人 Hd44780mLcd ; publicvoiddisplayString(data){ 嘗試 { 記錄。d(“LCd”,“寫作”); if(mLCD==null) MLCD=新 HD44780(“I2C1” ,0×27,HD44780。幾何圖形。LCD_20X4); mLcd。setBacklight(true); mLcd。cursorHome(); mLcd。clearDisplay(); mLcd。setText(data); } catch(例外 e){ e。printStackTrace(); } } }
MainActivity當收到新的有效負載時,您必須在Android Things應用程式中呼叫此類。
摘要
最後,本文展示瞭如何使用 Android Nearby 連線不同的Android裝置。本教程使用Android Nearby連線Android應用和Android Things應用,以便他們可以交換資料。此外, Android Things 使用連線到它的LCD來顯示來自Android應用程式的有效負載。希望您獲得有關如何使用Android Nearby Advertiser和Discoverer以及如何按照Android Nearby規範連線它們的知識。