<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

基于Mobile SDK V4版固件開發大疆無人機手機端遙控器(1)

jf_Vqngj70R ? 來源:美男子玩編程 ? 作者:美男子玩編程 ? 2023-06-07 09:53 ? 次閱讀

剛剛結束了項目交付,趁熱打鐵分享一下這次遇到的新東西。首先了解一下大疆無人機,它大致可以分為三級。

入門級:適合新手,沒事干在野外飛一飛拍拍風景啥的。操作也簡單,基本上看飛行教程都能懂,也不需要太高的專業性,飛機也相對較小安全系數相對較高。如:御2系列的一些飛機。

消費級:形體上會比入門級的大一點,但是飛機搭載了一些高精度的東西,比如RTK、高精度攝像頭、紅外鏡頭等。這類飛機則需要飛手具備一定的專業知識,并且需要考取大疆的初級飛手證書才能上手飛行。如:精靈系列、悟系列的一些飛機。

專業級:形體上更大,操作不當會出現一些嚴重后果。它的優勢在于高續航、高精度定位、熱成像鏡頭、搭載第三方喊話器等。一般用于大型工程作業,使用這個級別的飛機則需要考取大疆專業飛手證書,一般這個會在你購買專業級飛機的時候贈送你培訓課程,一般全部聽完就能考過。這類飛機的典型代表有:M30系列、M300系列。

1SDK開發包

大疆的SDK開發包目前分為兩個大版本:

v4版

Mobile SDK是一款軟件開發套件,旨在讓開發者能夠訪問DJI無人機和手持相機產品的豐富功能。該SDK通過兼顧更底層的功能,諸如飛行穩定,電池管理,信號傳輸和通信等,簡化了應用程序開發的過程。這樣,開發者就不需要具備豐富的機器人嵌入式系統背景知識,而可以專注于DJI產品相關的行業應用開發。

該SDK包括:

可導入AndroidiOS應用程序的庫/框架,用于訪問DJI產品的功能。

飛行模擬器和可視化工具。

適用于iOS的調試工具和遠程logger。

示例代碼和教程。

開發者指南和API文檔。

功能概述

開發者可以通過SDK訪問許多DJI產品的功能。開發者可以實現自主飛行,控制相機和云臺,接收實時視頻圖傳和傳感器數據,下載保存好的媒體文件,以及監聽其他組件的狀態。

飛行控制

Mobile SDK提供三種控制無人機飛行的方式:

手動操控: 用戶使用遙控器操控無人機,而SDK支持監控實時視頻流和傳感器數據。虛擬搖桿命令: SDK支持產生模擬遙控器搖桿的控制指令。

智能任務: 方便,易于實現無人機的高級控制。例如,可以通過航點任務,讓無人機按預定義的飛行路徑飛行。

虛擬搖桿命令和智能任務允許對DJI無人機進行簡單而功能強大的自主飛行控制。

相機

相機和云臺的功能都支持編程調用, 例如:

相機模式: 視頻和靜態圖像拍攝。

曝光: 快門,ISO,光圈和曝光補償均支持定制,以實現最大的靈活性。

圖像參數: 屏幕長寬比,對比度,色相,清晰度,飽和度和濾鏡。

視頻參數: 分辨率和幀頻。

方向: 使用云臺時,相機的朝向和運動可以自動控制。

實時視頻流

開發者可以通過Mobile SDK獲取無人機主攝像頭的實時視頻流。即使攝像頭正在將圖像或視頻捕獲到存儲介質中,也可以獲取實時視頻流。

傳感器數據

開發者可以通過SDK獲得豐富的傳感器數據。GPS位置,指南針,氣壓計,飛行速度和海拔高度都是通過Mobile SDK獲取的一些傳感器數據,頻率最高可達10 Hz。

下載媒體文件

開發者通過Mobile SDK可以查看和下載保存在相機存儲介質(SD卡或固態硬盤)中的照片和視頻。預覽圖和完整的圖像數據都可以被訪問。

遙控器,電池和無線鏈路

遙控器,電池和無線鏈路都可以通過SDK進行訪問。通常,這些組件會提供相關的狀態信息,但開發者也可以對它們進行一些控制。

連接應用程序和產品

下圖說明了Mobile SDK如何與移動應用程序進行融合以及如何與DJI飛行器進行連接。548a82da-046b-11ee-90ce-dac502259ad0.png對于手持攝像機產品,遙控器已替換為手持控制器,并且沒有飛行器或其他無線鏈路。

移動應用程序由Mobile SDK,平臺SDK(iOS或Android)構建而成,并在移動設備(Apple iPhone,iPad,Nexus手機,Nexus平板電腦等)上運行。

移動設備可以通過WiFi無線連接到DJI產品上,也可以通過USB線纜連接到DJI產品上。

v5版

v5版現在只適用于M30、M300系列,目前還在持續更新,因為是新版的SDK,大疆的工程師也是在不斷地再完善里面的內容,這里就不詳細說了,之后的文章會詳細說這個v5版的SDK。

2V4版SDK 二次開發

多的不說少的不嘮,上主菜?!肮び破涫?必先利其器”,首先準備好開發軟件,因為我們使用的是Android版的SDK所以開發軟件我們使用Android Studio,本人使用的是Android Studio Fox版,版本之間感覺都一樣沒有什么開發上的區別。準備好工具之后,先去大疆無人機的開發者官網注冊一個開發者賬號,并且注冊好自己的應用,拿到sdk的專用Key值,申請的方法大疆官網有我就不贅述了。給大家個地址【大疆開發者官網】自己看吧,挺簡單的。

注冊成為DJI開發者

在注冊過程中,需要您提供電子郵件信息和信用卡或手機號碼用于注冊驗證。您所提供的任何信用卡信息將僅用于驗證,不會收取任何費用。

本指南假定您使用 Xcode 7.3 以及 Android Studio 2.1.1 以上版本。

生成 App Key

每個應用程序都需要一個唯一的應用程序密鑰(App Key)來初始化SDK。

要創建一個應用程序App Key:

請訪問DJI開發者網站的 開發者中心

選擇左側欄的 "應用 "。

選擇右側的 “創建應用” 按鈕。

輸入應用程序的名稱, 開發平臺, Package Name,分類和描述信息。

會收到一封應用程序激活郵件,以完成App Key的生成。

可以在開發者中心中找到AppKey,復制粘貼到應用程序配置中。

Android 示例代碼配置

下載或者克隆Github上的Android示例代碼工程。

在Android Studio中打開項目工程,將生成的App Key字符串粘貼到 "AndroidManifest.xml" 文件中 "com.dji.sdk.API_KEY" meda-data element下的 android:value。

 

3Android Studio項目集成

本節中的屏幕截圖是使用Android Studio 4.1生成的。

創建一個新的應用

可以使用一個新的應用程序來演示如何將DJI SDK集成到Android Studio項目中。

打開Android Studio,然后在初始屏幕上選擇Start a new Android Studio project。

549d4a14-046b-11ee-90ce-dac502259ad0.png

在 New Project 界面:

設置 Application name 為 "ImportSDKDemo"。

設置 Company Domain 和Package name 為 "com.dji.ImportSDKDemo"。

54c93aac-046b-11ee-90ce-dac502259ad0.png

注意:Package name是 生成App Key 所需的標識字符串。在這個工程中Package name為“com.dji.ImportSDKDemo”

54f365b6-046b-11ee-90ce-dac502259ad0.png

在 Target Android Devices 界面:

選擇 Phone and Tablet 尺寸。

選擇API 23:Android 6.0 (Marshmallow)。

在 Add an Activity to Mobile 界面選擇 Empty Activity。

551fdf74-046b-11ee-90ce-dac502259ad0.png

在Configure Activity 界面:

設置 Activity Name: 為 "MainActivity"。

確認勾選Generate Layout File 。

設置Layout Name: 為"activity_main"。

點擊Finish 。555dd8ec-046b-11ee-90ce-dac502259ad0.png

配置Gradle 腳本

在Gradle Scripts 中雙擊 build.gradle (Module: app)5587e844-046b-11ee-90ce-dac502259ad0.png

使用以下內容進行更新:

applyplugin:'com.android.application'

android{

...
defaultConfig{
...
}

...

packagingOptions{
doNotStrip"*/*/libdjivideo.so"
doNotStrip"*/*/libSDKRelativeJNI.so"
doNotStrip"*/*/libFlyForbid.so"
doNotStrip"*/*/libduml_vision_bokeh.so"
doNotStrip"*/*/libyuv2.so"
doNotStrip"*/*/libGroudStation.so"
doNotStrip"*/*/libFRCorkscrew.so"
doNotStrip"*/*/libUpgradeVerify.so"
doNotStrip"*/*/libFR.so"
doNotStrip"*/*/libDJIFlySafeCore.so"
doNotStrip"*/*/libdjifs_jni.so"
doNotStrip"*/*/libsfjni.so"
exclude'META-INF/rxjava.properties'
}
}

dependencies{
...
implementation('com.dji4.15',{

excludemodule:'library-anti-distortion'

})
compileOnly'com.dji4.15
}

主要變更為:

添加 packagingOptions以防止應用程序意外崩潰。

添加compile和provided依賴項以導入最新的DJIAndroid SDK Maven依賴項。

559e65ce-046b-11ee-90ce-dac502259ad0.png

選擇 Tools -> Android -> Sync Project with Gradle Files 然后等待Gradle項目同步完成。

再次確認 Maven 依賴

在Android Studio菜單中選擇File->Project Structure,以打開"Project Structure"界面。然后選擇“app”模塊,然后單擊Dependencies選項卡。55def08a-046b-11ee-90ce-dac502259ad0.png

實現應用注冊和SDK回調

右鍵單擊com.dji.importSDKDemo,然后選擇 New->Java Class以創建一個新的Java類,并將其命名為“MApplication”。

55f89b48-046b-11ee-90ce-dac502259ad0.png

打開MApplication.java文件,并將內容替換為以下內容:

packagecom.dji.importSDKDemo;

importandroid.app.Application;
importandroid.content.Context;

importcom.secneo.sdk.Helper;

publicclassMApplicationextendsApplication{

@Override
protectedvoidattachBaseContext(ContextparamContext){
super.attachBaseContext(paramContext);
Helper.install(MApplication.this);
}
}

在這里,重寫了attachBaseContext()方法,添加了Helper.install(MApplication.this);代碼。

注意:由于某些SDK類現在需要在使用之前進行加載,因此加載過程由Helper.install()完成。開發人員需要在使用任何SDK功能之前調用此方法, 否則可能會導致意外崩潰。

561c9c96-046b-11ee-90ce-dac502259ad0.png

修改完成后需要在AndroidManifest中 配置 Application name。56370874-046b-11ee-90ce-dac502259ad0.png

雙擊app模塊中的MainActivity.java。56585b46-046b-11ee-90ce-dac502259ad0.png

MainActivity類需要注冊應用程序以獲得使用Mobile SDK的授權。它還需要實現SDK回調方法。

首先將MainActivity類修改為包括幾個類變量,其中包括mProduct,它是代表連接到移動設備的DJI產品的對象。

另外,onCreate方法將被修改以調用checkAndRequestPermissions方法來檢查和請求運行時權限。同樣,checkAndRequestPermissions方法將有助于調用startSDKRegistration()方法來注冊應用程序。此外,重寫onRequestPermissionsResult方法將有助于檢查應用程序是否具有足夠的權限,如果有,請調用startSDKRegistration()方法來注冊應用程序。

最后,將MainActivity類替換為:

publicclassMainActivityextendsAppCompatActivity{

privatestaticfinalStringTAG=MainActivity.class.getName();
publicstaticfinalStringFLAG_CONNECTION_CHANGE="dji_sdk_connection_change";
privatestaticBaseProductmProduct;
privateHandlermHandler;

privatestaticfinalString[]REQUIRED_PERMISSION_LIST=newString[]{
Manifest.permission.VIBRATE,
Manifest.permission.INTERNET,
Manifest.permission.ACCESS_WIFI_STATE,
Manifest.permission.WAKE_LOCK,
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_NETWORK_STATE,
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.CHANGE_WIFI_STATE,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.BLUETOOTH,
Manifest.permission.BLUETOOTH_ADMIN,
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.READ_PHONE_STATE,
};
privateListmissingPermission=newArrayList<>();
privateAtomicBooleanisRegistrationInProgress=newAtomicBoolean(false);
privatestaticfinalintREQUEST_PERMISSION_CODE=12345;

@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);

//Whenthecompileandtargetversionishigherthan22,pleaserequestthefollowingpermissionatruntimetoensuretheSDKworkswell.
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.M){
checkAndRequestPermissions();
}

setContentView(R.layout.activity_main);

//InitializeDJISDKManager
mHandler=newHandler(Looper.getMainLooper());

}

/**
*Checksifthereisanymissingpermissions,and
*requestsruntimepermissionifneeded.
*/
privatevoidcheckAndRequestPermissions(){
//Checkforpermissions
for(StringeachPermission:REQUIRED_PERMISSION_LIST){
if(ContextCompat.checkSelfPermission(this,eachPermission)!=PackageManager.PERMISSION_GRANTED){
missingPermission.add(eachPermission);
}
}
//Requestformissingpermissions
if(missingPermission.isEmpty()){
startSDKRegistration();
}elseif(Build.VERSION.SDK_INT>=Build.VERSION_CODES.M){
showToast("Needtograntthepermissions!");
ActivityCompat.requestPermissions(this,
missingPermission.toArray(newString[missingPermission.size()]),
REQUEST_PERMISSION_CODE);
}

}

/**
*Resultofruntimepermissionrequest
*/
@Override
publicvoidonRequestPermissionsResult(intrequestCode,
@NonNullString[]permissions,
@NonNullint[]grantResults){
super.onRequestPermissionsResult(requestCode,permissions,grantResults);
//Checkforgrantedpermissionandremovefrommissinglist
if(requestCode==REQUEST_PERMISSION_CODE){
for(inti=grantResults.length-1;i>=0;i--){
if(grantResults[i]==PackageManager.PERMISSION_GRANTED){
missingPermission.remove(permissions[i]);
}
}
}
//Ifthereisenoughpermission,wewillstarttheregistration
if(missingPermission.isEmpty()){
startSDKRegistration();
}else{
showToast("Missingpermissions!!!");
}
}
}

DJISDKManager的registerApp()方法具有一個回調,該回調需要處理兩種方法:一、用于處理應用程序注冊結果。二、用于通知硬件產品和移動設備的連接變更。

繼續添加如下所示的 startSDKRegistration() 方法,并實現 onRegister(), onProductDisconnect(), onProductConnect(), onComponentChange(), onInitProcess() and onDatabaseDownloadProgress() 和SDKManagerCallback方法:

privatevoidstartSDKRegistration(){
if(isRegistrationInProgress.compareAndSet(false,true)){
AsyncTask.execute(newRunnable(){
@Override
publicvoidrun(){
showToast("registering,plswait...");
DJISDKManager.getInstance().registerApp(MainActivity.this.getApplicationContext(),newDJISDKManager.SDKManagerCallback(){
@Override
publicvoidonRegister(DJIErrordjiError){
if(djiError==DJISDKError.REGISTRATION_SUCCESS){
showToast("RegisterSuccess");
DJISDKManager.getInstance().startConnectionToProduct();
}else{
showToast("Registersdkfails,pleasecheckthebundleidandnetworkconnection!");
}
Log.v(TAG,djiError.getDescription());
}

@Override
publicvoidonProductDisconnect(){
Log.d(TAG,"onProductDisconnect");
showToast("ProductDisconnected");
notifyStatusChange();

}
@Override
publicvoidonProductConnect(BaseProductbaseProduct){
Log.d(TAG,String.format("onProductConnectnewProduct:%s",baseProduct));
showToast("ProductConnected");
notifyStatusChange();

}
@Override
publicvoidonComponentChange(BaseProduct.ComponentKeycomponentKey,BaseComponentoldComponent,
BaseComponentnewComponent){

if(newComponent!=null){
newComponent.setComponentListener(newBaseComponent.ComponentListener(){

@Override
publicvoidonConnectivityChange(booleanisConnected){
Log.d(TAG,"onComponentConnectivityChanged:"+isConnected);
notifyStatusChange();
}
});
}
Log.d(TAG,
String.format("onComponentChangekey:%s,oldComponent:%s,newComponent:%s",
componentKey,
oldComponent,
newComponent));

}
@Override
publicvoidonInitProcess(DJISDKInitEventdjisdkInitEvent,inti){

}

@Override
publicvoidonDatabaseDownloadProgress(longl,longl1){

}
});
}
});
}
}

最后需要實現 notifyStatusChange, Runnable 和 showToast 方法:

privatevoidnotifyStatusChange(){
mHandler.removeCallbacks(updateRunnable);
mHandler.postDelayed(updateRunnable,500);
}

privateRunnableupdateRunnable=newRunnable(){

@Override
publicvoidrun(){
Intentintent=newIntent(FLAG_CONNECTION_CHANGE);
sendBroadcast(intent);
}
};

privatevoidshowToast(finalStringtoastMsg){

Handlerhandler=newHandler(Looper.getMainLooper());
handler.post(newRunnable(){
@Override
publicvoidrun(){
Toast.makeText(getApplicationContext(),toastMsg,Toast.LENGTH_LONG).show();
}
});

}

必須授予應用程序權限,DJI SDK才能運行。

雙擊 app 模塊中的 AndroidManifest.xml 。

56996190-046b-11ee-90ce-dac502259ad0.png

在 package=com.dji.ImportSDKDemo 后,

 

在 application 元素的開發添加 android:name=".MApplication" :


在 android:theme="@style/AppTheme"> 之后,之前插入如下代碼:

 




如下所示,在activity元素中插入android:configChanges ="orientation"和android:screenOrientation ="portrait",以防止在屏幕方向變更時重啟activity,并將activity的屏幕方向設置為縱向模式 :






生成App Key, 然后用App Key 字符串替換AndroidManifest.xml文件內Please enter your App Key here. 字段。

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Android
    +關注

    關注

    12

    文章

    3882

    瀏覽量

    126010
  • Mobile
    +關注

    關注

    0

    文章

    516

    瀏覽量

    26387
  • 遙控器
    +關注

    關注

    18

    文章

    817

    瀏覽量

    64532
  • SDK
    SDK
    +關注

    關注

    3

    文章

    980

    瀏覽量

    45001
  • 大疆無人機
    +關注

    關注

    13

    文章

    108

    瀏覽量

    29927

原文標題:基于Mobile SDK V4版固件開發大疆無人機手機端遙控器(1)

文章出處:【微信號:美男子玩編程,微信公眾號:美男子玩編程】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    【Aworks申請】開放式無人機地面基站

    申請理由:我們是在校大學生EDA興趣團隊,正在設計制作無人機項目。我們發現,現在無人機只能通過遙控器或者電腦上位機控制飛行。所以,我們試圖開發一個通用式地面基站,開放API和視頻數據流
    發表于 06-27 08:59

    【云智易申請】智能無人機通信

    申請理由:本次項目是基于STM32做無人機,主要用WiFi實現無人機遙控器之間通信,無人機的電機我們可以用云智易開發板上面的電機進行調試,
    發表于 08-07 11:02

    【MiCOKit申請】開放式無人機地面基站

    申請理由:我們是在校大學生EDA興趣團隊,正在設計制作無人機項目。我們發現,現在無人機只能通過遙控器或者電腦上位機控制飛行。所以,我們試圖開發一個通用式地面基站,開放API和視頻數據流
    發表于 08-10 13:04

    無人機遙控方向控制問題

    前段時間我弟弟買了個遙控無人機玩具,但是我發現一個問題。該無人機方向控制有問題,假設無人機有四個電機,分別為A,B,C,D,遙控器四個按鍵
    發表于 05-10 11:26

    stm32四軸無人機遙控器資料

    stm32四軸無人機遙控器資料
    發表于 06-09 23:16

    無人機怎么懸停

    `  誰能闡述下大無人機怎么懸停?`
    發表于 08-27 15:13

    DJI大創新推出首款農業無人機

    全球飛行影像系統的開拓者和領導者DJI大創新今日宣布推出一款智能農業噴灑防治無人機——大MG-1農業植保機,標志著大創新正式進入農業
    發表于 05-12 07:22

    【飛控教程1】開源編隊無人機-開機測試

    OLED 左上角的頻道開始遞增時,即可松手,此時進入自動對頻,對頻成功后,OLED 左上角的“X”消失,變成信號格。連接上無人機后,可以查看飛機的傳感是否運行正常,查看方法為:1)在遙控器
    發表于 04-20 11:48

    【快速上手教程6】瘋殼·開源編隊無人機-遙控器固件燒寫

    COCOFLY 教程——瘋殼·無人機·系列遙控器固件燒寫 圖1 一、遙控器固件燒寫 這里的
    發表于 05-25 11:49

    【快速上手教程6】瘋殼·開源編隊無人機-遙控器固件燒寫

    COCOFLY 教程——瘋殼·無人機·系列遙控器固件燒寫 圖1 一、遙控器固件燒寫 這里的
    發表于 07-07 10:05

    【瘋殼·無人機教程1】開源編隊無人機-開機測試

    ,此時進入自動對頻,對頻成功后,OLED 左上角的“X”消失,變成信號格。連接上無人機后,可以查看飛機的傳感是否運行正常,查看方法為:1)在遙控器主界面按下右搖桿的按鍵進入到“菜單選
    發表于 08-19 16:57

    【瘋殼·無人機教程6】開源編隊無人機-遙控器固件燒寫

    COCOFLY 教程——瘋殼·無人機·系列遙控器固件燒寫圖1 一、遙控器固件燒寫 這里的
    發表于 08-23 17:49

    基于Mobile SDK V4固件開發大疆無人機手機遙控器(2)

    上一篇文章(基于Mobile SDK V4固件開發大疆無人機手機
    的頭像 發表于 06-09 11:33 ?687次閱讀
    基于<b class='flag-5'>Mobile</b> <b class='flag-5'>SDK</b> <b class='flag-5'>V4</b>版<b class='flag-5'>固件</b><b class='flag-5'>開發</b>大疆<b class='flag-5'>無人機手機</b>端<b class='flag-5'>遙控器</b>(2)

    基于Mobile SDK V4固件開發大疆無人機手機遙控器(3)

    第三篇文章準備單獨拿出來寫,因為在大疆為人機的所有功能中,航線規劃的功能最為復雜,也相當的繁瑣,這里需要說仔細一點,可能會將代碼進行多步分解。
    的頭像 發表于 06-15 12:22 ?1035次閱讀
    基于<b class='flag-5'>Mobile</b> <b class='flag-5'>SDK</b> <b class='flag-5'>V4</b>版<b class='flag-5'>固件</b><b class='flag-5'>開發</b>大疆<b class='flag-5'>無人機手機</b>端<b class='flag-5'>遙控器</b>(3)

    基于Mobile SDK V5版固件開發大疆無人機手機遙控器(4)

    相較與V4版本開發,V5版本有了更方便簡介的方式。V5不僅再功能上與V4增加更多的功能,而且在功能的使用及API的調用也做了優化。雖然V5現在很新也在不斷地迭代,但是不免會出現對一些飛行或者
    的頭像 發表于 06-25 12:24 ?1555次閱讀
    基于<b class='flag-5'>Mobile</b> <b class='flag-5'>SDK</b> V5版<b class='flag-5'>固件</b><b class='flag-5'>開發</b>大疆<b class='flag-5'>無人機手機</b>端<b class='flag-5'>遙控器</b>(4)
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>