本文介紹如何使用無影雲手機的Windows SDK C++版。
1. 快速開始
1.1 擷取SDK和DEMO
Integration Environment要求
Windows X64 release
引入SDK
Visual Studio 2019樣本:
開啟專案屬性頁面->配置屬性->VC++目錄,在包含目錄添加asp-client-sdk的include目錄
開啟專案屬性頁面->配置屬性->VC++目錄,在庫目錄添加asp-client-sdk的lib目錄
開啟專案屬性頁面->配置屬性->連結器->常規,在附加庫目錄添加asp-client-sdk的lib目錄
開啟專案屬性頁面->配置屬性->連結器->輸入,在附加依賴項添加asp-client-sdk.lib、asp-engine.lib、glog.lib
qt creator樣本:
專案pro檔案添加
INCLUDEPATH+=$$PWD/asp-client-sdk/include \
LIBS+=$$PWD/asp-client-sdk/lib/asp-client-sdk.lib \
$$PWD/asp-client-sdk/lib/asp-engine.lib \
$$PWD/asp-client-sdk/lib/glog.lib \快速使用Demo
下載Windows_Demo_Release,解壓縮得到 server 和 client 兩個目錄,分別是服務端和用戶端的DEMO。
啟動服務端
修改配置
{
"httpPort": "8328",
"accessKeyId": "AK",
"accessKeySecret": "SK",
"androidRegionId": "cn-hangzhou"
}修改其中的 AK 和 SK 即可,androidRegionId填寫為執行個體的RegionId
運行其中的 server/run_server.bat , 會提示
2024-11-01T13:48:27.002Z Server is running on http://127.0.0.1:8328/listAic服務端啟動完成
運行用戶端
{
"CLOUD_SCREENSIZE_HEIGHT": 100,
"CLOUD_SCREENSIZE_WIDTH": 100,
"DEBUG_MODE": 2,
"DISPLAY_COL": 11,
"DISPLAY_GROUP": 20,
"GROUPIDS": [
"ag-1jknz4zyznleim503"
],
"GROUP_SCREENSIZE_HEIGHT": 100,
"GROUP_SCREENSIZE_WIDTH": 100,
"LOCAL_SCREENSIZE_HEIGHT": 720,
"LOCAL_SCREENSIZE_WIDTH": 480,
"DISPLAY_SCALE": 1,
"GROUP_SCALE": 8,
"MAX_PHONE_NUM": 0,
"PROXY_CONN_TYPE": 0,
"QUIC_OPTION": false,
"PHONE_URL": "http://127.0.0.1",
"PORT": 8328,
"AUDIO_ENABLE": false,
"USE_DUMP": false,
"USE_OPENGL": true
}
GROUPIDS 修改為需要控制的雲手機執行個體組 ID ag-開頭, 可以支援多個 GROUPID, 修改為您建立的 ag 開頭的雲手機執行個體組 ID,儲存。
配置參數說明:
CLOUD_SCREENSIZE_HEIGHT: 初始化雲端解析度高
CLOUD_SCREENSIZE_WIDTH: 初始化雲端解析度寬
DEBUG_MODE: 記錄層級 0-無日誌 1-debug 2-info
DISPLAY_COL: 10 展示最大列
GROUPIDS: 分組,支援列表
GROUP_SCREENSIZE_HEIGHT: 初始化本地縮圖視窗高
GROUP_SCREENSIZE_WIDTH: 初始化本地縮圖視窗寬
LOCAL_SCREENSIZE_HEIGHT: 初始化本地主控視窗高
LOCAL_SCREENSIZE_WIDTH: 初始化本地主控視窗寬
DISPLAY_SCALE: 主控縮放比例
GROUP_SCALE: 縮圖縮放比例
MAX_PHONE_NUM: 最多串連數量
PROXY_CONN_TYPE: 連線類型,固定
QUIC_OPTION: 是否使用quick 固定
PHONE_URL: 服務端地址,
PORT: 服務端連接埠
AUDIO_ENABLE: 是否啟用音頻
EndUserId: 協同流使用者名稱
IS_COO: 是否協同流
SALE_MODE: 是否CPS
SHOW_INSTENCE_NAME: 顯示名稱還是ID
USE_OPENGL: 是否啟用opengl渲染運行 client/WuyingDemo.exe
1.2 對接流程
1.3 最佳實務
方案詳見無影雲手機快速整合最佳實務。 雲手機整合的總體方案如下圖所示
有多種登入方式,擷取整合SDK所需要的串連雲手機Ticket憑證,流程圖為:
具體代碼可以參考生命週期介面的參考代碼。
2. 生命週期介面
2.1 建立縮圖串連
函數原型: static AspClient* create(AspTicket& ticket, wuying::asp::shared_ptr<IAspClientCallback> callback);
參數說明:
參數名稱 | 參數類型 | 描述 |
ticket | AspTicket | AspTicket包含了是否為縮列圖、執行個體資訊和串連憑證,參見4.1 AspTicket。 |
callback | IAspClientCallback | 串連回調,參見2.5.1 串連回調代理IAspClientCallback。 |
功能描述:該介面建立與雲手機縮圖串連。
程式碼範例:
AspTicket ticket;
// 設定ticket
ticket.ticket = "";
// 設定AppInstanceId
ticket.id = "";//AppInstanceId;
// 設定user
ticket.user = "";//雲手機名稱
//uuid與後端uuid相同
ticket.uuid = "wyClient";
//固定Windows
ticket.systemType = "Windows";
//固定0
ticket.partner = 0;
//是否縮圖 固定為true
ticket.isThumbnailEnable = true;
//添加串連回調,具體見後文
shared_ptr<AspClientCbImpl> iClient(new AspClientCbImpl(cert.Id));
AspClient *client=AspClient::create(ticket, iClient);
//剪貼簿回調,具體見後文
shared_ptr<AspClipboardlmpl> clipboardCallback(new AspClipboardlmpl());
client->setClipboardCallback(clipboardCallback);
//添加Shell命令回調,具體見後文
shared_ptr<AspShellCmdlmpl> shellCmdCallBack(new AspShellCmdlmpl());
client->setShellCmdCallback(shellCmdCallBack);
//設定縮圖視窗大小 with:寬 int height:高 int 1:fps int
client->setThumbnailDisplay(with, height, 1);
//設定連線類型 固定為socket和false
client->setProxyConnType(ASP_CONN_SOCKET);
client->setQuicOption(false);
//設定視窗回調
shared_ptr<IAspDisplayCallback> iDisplay(nullptr);
auto display = client->addDisplay(iDisplay);
//串連手機
client->open();2.2 建立主控串連
函數原型: static AspClient* create(AspTicket& ticket, wuying::asp::shared_ptr<IAspClientCallback> callback);
參數說明:
參數名稱 | 參數類型 | 描述 |
ticket | AspTicket | AspTicket包含了執行個體資訊和串連憑證,參見4.1 AspTicket。 |
callback | IAspClientCallback | 串連回調,參見2.5.1 串連回調代理IAspClientCallback。 |
功能描述:該介面建立與雲手機主控串連
程式碼範例:
AspTicket ticket;
// 設定ticket
ticket.ticket = "";
// 設定AppInstanceId
ticket.id = "";//AppInstanceId;
// 設定user
ticket.user = "";//雲手機名稱
//uuid與後端uuid相同
ticket.uuid = "wyClient";
//固定Windows
ticket.systemType = "Windows";
//固定0
ticket.partner = 0;
//是否縮圖 固定為true
ticket.isThumbnailEnable = true;
//添加串連回調,具體見後文
shared_ptr<AspClientCbImpl> iClient(new AspClientCbImpl(cert.Id));
AspClient *client=AspClient::create(ticket, iClient);
//剪貼簿回調,具體見後文
shared_ptr<AspClipboardlmpl> clipboardCallback(new AspClipboardlmpl());
client->setClipboardCallback(clipboardCallback);
//添加Shell命令回調,具體見後文
shared_ptr<AspShellCmdlmpl> shellCmdCallBack(new AspShellCmdlmpl());
client->setShellCmdCallback(shellCmdCallBack);
//設定縮圖視窗大小 with:寬 int height:高 int 1:fps int
client->setThumbnailDisplay(with, height, 1);
//設定連線類型 固定為socket和false
client->setProxyConnType(ASP_CONN_SOCKET);
client->setQuicOption(false);
//設定視窗回調
shared_ptr<IAspDisplayCallback> iDisplay(nullptr);
auto display = client->addDisplay(iDisplay);
//串連雲手機
client->open();2.3 reopen
函數原型:void reopen(std::string& ticket)
功能描述:重新開啟串連,或斷聯後重連,僅close(false)有效。
參數說明:
參數名稱 | 參數類型 | 描述 |
ticket | std::string | ticket為串連憑證,有效期間一般10分鐘。 |
程式碼範例:
client->reopen(ticket);2.4 close
函數原型:void close(bool destroyClient = false)
功能描述:關閉串連
參數說明:
參數名稱 | 參數類型 | 描述 |
destroyClient | bool | 是否清理資源,預設false |
程式碼範例:
client->close(false)2.5 回調說明
2.5.1 串連回調代理IAspClientCallback
代理介面說明:
介面 | 描述 |
void onThumbnailUpdate(void* buffer, uint32_t width, uint32_t height, AspImageFormat format) | 串連雲手機成功縮圖的回調,format參見5.2 AspImageFormat |
void onConnectEvent(ConnectEvent& event) | 串連雲手機狀態事件的回調,event參見4.2 ConnectEvent |
程式碼範例:
class AspClientCbImpl : public IAspClientCallback
{
public:
AspClientCbImpl() {}
//縮圖回調
void onThumbnailUpdate(void* buffer, uint32_t width, uint32_t height, AspImageFormat format) override {
}
//串連事件
void onConnectEvent(ConnectEvent& event) override {
switch(event.type) {
case ConnectEventType::EVENT_CONNECT_SUCCESS:
break;
case ConnectEventType::EVENT_CONNECT_FAILED:
break;
case ConnectEventType::EVENT_DISCONNECT_SUCCESS:
break;
case ConnectEventType::EVENT_RECONNECT_START:
break;
case ConnectEventType::EVENT_RECONNECT_FAILED:
break;
default:
break;
}
}
};2.5.2 主控流回調代理IAspDisplayCallback
代理介面說明:
介面 | 描述 |
void onImageFrameReady(AspImageFrame& frame) | 串連雲手機成功後主控流的回調,frame參見4.3 AspImageFrame |
程式碼範例:
class AspDisplayCbImpl : public IAspDisplayCallback
{
public:
void onImageFrameReady(AspImageFrame& frame) override {
//主控的映像byte數組指標,長度為長*寬*4
uint8_t* ptr = static_cast<uint8_t*>(frame.buffer);
//映像的寬
int width = frame.width;
//映像的高
int height = frame.height;
//必須手動釋放
frame.releaseBuffer();
}
};2.5.3 音頻回調代理AspAudio
代理介面說明:
介面 | 描述 |
void onAudioFrameRender(AspAudioFrame &frame) | 無需實現, frame參見4.4 AspAudioFrame,目前音頻渲染包含在SDK中。 |
void onAudioVolumeUpdate(uint32_t volume) | 無需實現,目前音頻渲染包含在SDK中。 |
void onAudioMuteUpdate(bool isMute) | 無需實現,目前音頻渲染包含在SDK中。 |
void onAudioPlaybackUpdate(AspAudioPlayback &playback) | 無需實現,playback參見4.5 AspAudioPlayback,目前音頻渲染包含在SDK中。 |
void onAudioPlaybackStart() | 無需實現,目前音頻渲染包含在SDK中。 |
void onAudioPlaybackStop() | 無需實現,目前音頻渲染包含在SDK中。 |
程式碼範例:
class AspAudioImpl : public AspAudio
{
public:
void onAudioFrameRender(AspAudioFrame &frame) override{
}
void onAudioVolumeUpdate(uint32_t volume) override{
}
void onAudioMuteUpdate(bool isMute) override{
}
void onAudioPlaybackUpdate(AspAudioPlayback &playback) override{
}
void onAudioPlaybackStart() override{
}
void onAudioPlaybackStop() override{
}
};3. 業務介面
3.1 日誌介面
3.1.1 初始化
功能描述:該介面可以列印SDK內部日誌,用於定位問題。
程式碼範例:
//初始化日誌,AspLogSinkImpl為日誌回調
auto logSinkImpl = std::make_shared<AspLogSinkImpl>();
AspLogSink::setLogSink(logSinkImpl.get());3.1.2 回調代理AspLogSink
代理介面說明:
介面 | 描述 |
void debug(const std::string& tag, const std::string& msg) | SDK debug日誌回調 |
void info(const std::string& tag, const std::string& msg) | SDK info日誌回調 |
void warning(const std::string& tag, const std::string& msg) | SDK warning日誌回調 |
void fatal(const std::string& tag, const std::string& msg) | SDK fatal日誌回調 |
void error(const std::string& tag, const std::string& msg) | SDK error日誌回調 |
程式碼範例:
#include "AspLogSink.h"
using namespace wuying::asp;
class AspLogSinkImpl : public AspLogSink
{
public:
AspLogSinkImpl() {
}
void debug(const std::string& tag, const std::string& msg) override {
//列印debug日誌
}
void info(const std::string& tag, const std::string& msg) override {
//列印info日誌
}
void warning(const std::string& tag, const std::string& msg) override {
//列印warning日誌
}
void fatal(const std::string& tag, const std::string& msg) override {
//列印fatal日誌
}
void error(const std::string& tag, const std::string& msg) override {
//列印error日誌
}
};3.2 縮圖業務介面
3.2.1 suspendThumbnailDisplay
函數原型:void suspendThumbnailDisplay()
功能描述:掛起縮圖的映像,不推流
程式碼範例:
client->suspendThumbnailDisplay();3.2.2 resumeThumbnailDisplay
函數原型:void resumeThumbnailDisplay()
功能描述:恢複縮圖的推流,可以強制推一幀
程式碼範例:
client->resumeThumbnailDisplay();3.3 主控其他功能
3.3.1 setOutputImageFormat
函數原型:void setOutputImageFormat(AspImageFormat format)
功能描述:設定主控回調框架格式
參數說明:
參數名稱 | 參數類型 | 描述 |
format | AspImageFormat | 主控回調框架格式,具體參見5.2 AspImageFormat |
程式碼範例:
client->setOutputImageFormat(AspImageFormat::BGRA);3.3.2 requestGraphicsKeyFrame
函數原型:void requestGraphicsKeyFrame(AspDisplay* display) = 0;
功能描述:推一幀主控的主要畫面格,參數AspDisplay
參數說明:
參數名稱 | 參數類型 | 描述 |
display | AspDisplay* | 顯示類指標 |
程式碼範例:
client->requestGraphicsKeyFrame(display);3.3.3 setGraphicsQuality
函數原型:void setGraphicsQuality(AspImageQuality quality) = 0;
功能描述:設定畫質,畫質跟解析度有關係,一般設定為AUTO,詳細參數參見結構體
參數說明:
參數名稱 | 參數類型 | 描述 |
quality | AspImageQuality | 映像品質參見5.4 AspImageQuality |
client->setGraphicsQuality(ASP_IMAGE_QUALITY_AUTO)3.3.4 setGraphicsFps
函數原型:void setGraphicsFps(int fps) = 0;
功能描述:設定fps
參數說明:
參數名稱 | 參數類型 | 描述 |
fps | int | 幀率 |
程式碼範例:
client->setGraphicsFps(30)3.3.5 setGraphicsBitrate
函數原型:void setGraphicsBitrate(int32_t bps) = 0;
功能描述:設定碼率,碼率影響圖片的大小
參數說明:
參數名稱 | 參數類型 | 描述 |
bps | int32_t | 碼率 |
以下碼率僅供參考:
畫質 | 碼率 |
低畫質 | 1*1024 |
中畫質 | 5*1024 |
高畫質 | 10*1024 |
不失真 | 50*1024 |
程式碼範例:
client->setGraphicsBitrate(1*1024)3.4 滑鼠
3.4.1 sendMouseClick
函數原型:void sendMouseClick(AspAction action, uint32_t button, uint32_t buttonState) = 0;
功能描述:滑鼠點擊
參數說明:
參數名稱 | 參數類型 | 描述 |
action | AspAction | |
button | uint32_t | |
buttonState | uint32_t |
程式碼範例:
//滑鼠左鍵按下
display->sendMouseClick(AspAction::ACTION_DOWN, ASP_MOUSE_BUTTON_MASK_L, ASP_MOUSE_BUTTON_LEFT);
//滑鼠左鍵彈起
display->sendMouseClick(AspAction::ACTION_UP, ASP_MOUSE_BUTTON_MASK_L, ASP_MOUSE_BUTTON_LEFT);3.4.2 sendMouseMove
函數原型:virtual void sendMouseMove(uint32_t x, uint32_t y, uint32_t buttonState) = 0;
功能描述:滑鼠移動
參數說明:
參數名稱 | 參數類型 | 描述 |
x | uint32_t | 雲手機橫座標 |
y | uint32_t | 雲手機縱座標 |
buttonState | uint32_t |
程式碼範例:
//x y 為雲機的x y座標
sendMouseMove(x, y, ASP_MOUSE_BUTTON_MASK_L)3.5 鍵盤
3.5.1 sendKeyEvent
函數原型:virtual void sendKeyEvent(AspAction action, int scancode) = 0;
功能描述:鍵盤事件
參數說明:
參數名稱 | 參數類型 | 描述 |
action | AspAction | 操作類型參見5.5 AspAction |
scancode | int | 按鍵掃描碼 |
程式碼範例:
//鍵盤按下
display->sendKeyEvent(AspAction::ACTION_DOWN,scanCode);
//鍵盤彈起
display->sendKeyEvent(AspAction::ACTION_UP,scanCode);3.6 剪貼簿
本地到雲
雲到本地
3.6.1 setClipBoardTypes
函數原型:virtual void setClipBoardTypes(std::vector<AspClipboardType> types) = 0;
功能描述:發送剪貼簿類型,一般在Ctrl+V調用或寫入剪貼簿時調用,目前僅支援文本。
參數說明:
參數名稱 | 參數類型 | 描述 |
types | std::vector<AspClipboardType> | 剪貼簿類型數組,參見5.8 AspClipboardType |
程式碼範例:
std::vector<AspClipboardType> types;
types.push_back(AspClipboardType::CLIPBOARD_UTF8_TEXT);
client->setClipBoardTypes(types);3.6.2 notifyClipboardReadComplete
函數原型:virtual void notifyClipboardReadComplete(AspClipboardType type, uint8_t* buf, size_t len) = 0;
功能描述:將內容傳到雲機在onClipboardRead(uint8_t selection, AspClipboardType type)觸發時調用
參數說明:
參數名稱 | 參數類型 | 描述 |
type | AspClipboardType | 剪貼簿類型目前只支援文本 |
buf | uint8_t* | 剪貼簿內容的位元組數組指標 |
len | size_t | buf大小 |
程式碼範例:
void onClipboardRead(uint8_t selection, AspClipboardType type) override {
//本地到雲機,通過client->setClipBoardTypes(types)觸發
//觸發onClipboardRead,將剪貼簿內容寫入notifyClipboardReadComplete
client->notifyClipboardReadComplete(type, reinterpret_cast<uint8_t *>(utf8Data.data()), utf8Data.size());
}3.6.3 回調代理IClipboardCallback
代理介面說明:
介面 | 描述 |
void onClipboardRead(uint8_t selection, AspClipboardType type) | 本地到雲機,通過setClipBoardTypes(types)觸發,觸發時調用notifyClipboardReadComplete將剪貼簿內容寫入,type參見5.8 AspClipboardType |
void onClipboardWrite(std::vector<AspClipboardData> dataV) | 雲機到本地,觸發時將內容寫入剪貼簿,data參見4.6 AspClipboardData |
程式碼範例:
class AspClipboardlmpl :public IClipboardCallback
{
public:
AspClipboardlmpl() {};
void onClipboardRead(uint8_t selection, AspClipboardType type) override {
//本地到雲機,通過client->setClipBoardTypes(types)觸發
//觸發onClipboardRead,將剪貼簿內容寫入notifyClipboardReadComplete
//client->notifyClipboardReadComplete(type, reinterpret_cast<uint8_t *>(utf8Data.data()), utf8Data.size());
}
void onClipboardWrite(std::vector<AspClipboardData> dataV) override {
//雲機到本地剪貼簿,將dataV資料寫入剪貼簿
}
};3.7 Shell命令通道
3.7.1 sendStringDataToShell
函數原型:virtual bool sendStringDataToShell(const std::string& val) = 0;
功能描述:發送Shell命令
參數說明:
參數名稱 | 參數類型 | 描述 |
val | std::string | 發送的ADB Shell命令格式:{"id":"","cmd":""} |
程式碼範例:
client->sendStringDataToShell(jsonString)常用ADB命令:
功能 | 命令 |
返回鍵 | input keyevent KEYCODE_BACK |
Home鍵 | input keyevent KEYCODE_HOME |
切換鍵 | input keyevent KEYCODE_APP_SWITCH |
靜音 | input keyevent 164 |
音量增大 | input keyevent KEYCODE_VOLUME_UP |
音量減小 | input keyevent KEYCODE_VOLUME_DOWN |
隱藏導覽列 | setprop persist.wy.hasnavibar false; killall com.android.systemui |
顯示導覽列 | setprop persist.wy.hasnavibar true; killall com.android.systemui |
截圖 | screencap -p /sdcard/Download/abc.png |
3.7.2 回調代理IShellCmdCallback
代理介面說明:
介面 | 描述 |
void onReceiveStringData(const std::string& val) | 接收字元流Shell命令回執 |
void onReceiveRawData(const std::vector<uint8_t> val) | 接收位元組流Shell命令回執 |
程式碼範例:
class AspShellCmdlmpl :public IShellCmdCallback
{
public:
AspShellCmdlmpl() {};
void onReceiveStringData(const std::string& val) override {
//發送字元的回調
}
void onReceiveRawData(const std::vector<uint8_t> val) override {
//發送位元組的回調
}
};4. 參數詳細說明
4.1 AspTicket
struct AspTicket {
std::string ticket; //擷取雲手機的ticket字串
std::string id; //案頭id
std::string user; //使用者名稱
std::string uuid; //本機uuid,請求ticket的時候使用的uuid
std::string systemType; //作業系統類型
uint8_t partner; //合作方
bool isThumbnailEnable = false; //是否是縮圖模式
};4.2 ConnectEvent
struct ConnectEvent {
ConnectEventType type; //串連成功、串連失敗等事件類型
int reason; //事件觸發的原因
};4.3 AspImageFrame
struct AspImageFrame {
uint32_t frameId;
void* buffer;
uint32_t width;
uint32_t height;
AspImageFormat format;
ReleaseBuffer releaseBuffer;
};4.4 AspAudioFrame
struct AspAudioFrame {
int sample; //採樣率
int channels; //通道
int size; //資料大小
uint8_t *data; //資料地址
ReleaseBuffer releaseBuffer; //data釋放函數,在data使用完之後必須調用
};4.5 AspAudioPlayback
struct AspAudioPlayback {
AspAudioReadType readType; //音頻資料擷取方式,包括PUSH和PULL兩種方式
AspAudioMode mode; //PCM or OPUS
uint32_t channels; //通道數
uint32_t frequency; //採樣率
AspAudioFormat format; //RAW or OPUS
AudioReader audioReader; //PULL讀取方式時,資料讀取的函數,請參照demo的實現
};4.6 AspClipboardData
struct AspClipboardData {
AspClipboardType type;
uint8_t* data;
uint32_t size;
};5. 枚舉類型
5.1 AspConnType
enum AspConnType {
ASP_CONN_SOCKET = 0,
ASP_CONN_SOCKPAIR = 1,
ASP_CONN_PIPE = 2,
ASP_CONN_SOCKET_UNIX = 3,
ASP_CONN_END = ASP_CONN_PIPE,
};5.2 AspImageFormat
enum class AspImageFormat {
YUV420P,
YUV422P,
YUV444P,
RGB24,
RGBA,
BGRA,
ARGB,
ABGR,
NV12
};5.3 ConnectEventType
enum ConnectEventType {
EVENT_CONNECT_SUCCESS,
EVENT_CONNECT_FAILED,
EVENT_DISCONNECT_SUCCESS,
EVENT_RECONNECT_START,
EVENT_RECONNECT_FAILED
};5.4 AspImageQuality
enum AspImageQuality {
ASP_IMAGE_QUALITY_LOSSLESS = 0,
ASP_IMAGE_QUALITY_HIGH = 1,
ASP_IMAGE_QUALITY_MEDIUM = 2,
ASP_IMAGE_QUALITY_LOW = 3,
ASP_IMAGE_QUALITY_AUTO = 4,
};5.5 AspAction
enum AspAction {
ACTION_UP,
ACTION_DOWN
};5.6 AspMouseButtonMask
enum AspMouseButtonMask {
ASP_MOUSE_BUTTON_MASK_L = (1 << 0),
ASP_MOUSE_BUTTON_MASK_M = (1 << 1),
ASP_MOUSE_BUTTON_MASK_R = (1 << 2),
ASP_MOUSE_BUTTON_MASK_F = (1 << 3),
ASP_MOUSE_BUTTON_MASK_B = (1 << 4),
ASP_MOUSE_BUTTON_MASK = 0x1f
};5.7 AspMouseButton
enum AspMouseButton {
ASP_MOUSE_BUTTON_INVALID,
ASP_MOUSE_BUTTON_LEFT,
ASP_MOUSE_BUTTON_MIDDLE,
ASP_MOUSE_BUTTON_RIGHT,
ASP_MOUSE_BUTTON_UP,
ASP_MOUSE_BUTTON_DOWN,
ASP_MOUSE_BUTTON_SIDE_FORWARD,
ASP_MOUSE_BUTTON_SIDE_BACK,
ASP_MOUSE_BUTTON_ENUM_END
};5.8 AspClipboardType
enum AspClipboardType {
CLIPBOARD_NONE = 0,
CLIPBOARD_UTF8_TEXT,
CLIPBOARD_IMAGE_PNG, /* All clients with image support should support this one */
CLIPBOARD_IMAGE_BMP, /* optional */
CLIPBOARD_IMAGE_TIFF, /* optional */
CLIPBOARD_IMAGE_JPG, /* optional */
CLIPBOARD_FILE, /* optional, single file */
CLIPBOARD_DIRECTORY, /* optional, support directory recrusive */
CLIPBOARD_HTML,
CLIPBOARD_RTF,
CLIPBOARD_XML_SPREAD_SHEET,
};6. 錯誤碼
錯誤碼 | 錯誤訊息( | 定義模組 | 原因 |
2~26主要是網路相關問題 | |||
2 | 串連%s失敗 | ASP SDK | 無效MAGIC |
3 | 串連%s失敗 | ASP SDK | 資料有誤 |
4 | 用戶端與服務端版本不匹配 | ASP SDK | 版本不匹配 |
5 | 串連需要 TLS | ASP SDK | 需要TLS |
6 | 串連不需要 TLS | ASP SDK | 不需要TLS而實際使用了TLS |
7 | 您沒有許可權串連當前%s | ASP SDK | 許可權問題 |
8 | ASP SDK | 遷移過程中client ID無效 | |
9 | 串連%s失敗 | ASP SDK | channel不存在 |
20 | 串連ASP伺服器失敗。 | ASP SDK | channel 串連錯誤 |
21 | TLS認證出錯了 | ASP SDK | TLS 認證錯誤 |
22 | 串連%s失敗 | ASP SDK | channel link 錯誤 |
23 | 串連%s失敗 | ASP SDK | 串連認證錯誤 |
24 | 串連%s失敗 | ASP SDK | 串連IO錯誤 |
25 | 串連%s失敗 | ASP SDK | Ticket校正失敗。使用者串連被斷開後,若使用同一個Ticket再次請求建連,也將觸發此錯誤。 |
26 | ASP SDK | xquic 握手失敗 | |
1206 | 一個ticket 可以重複使用,但是每次只能串連一個。如果雲手機處於串連中,再建立串連就會報此錯。 | ASP SDK | |
1207 | 執行個體發生重啟,導致Ticket失效了 | ASP SDK | |
sdk流協同錯誤碼 | |||
1000 | token empty | ASP SDK | 只會出現在流協同的時候,client與server進行二次校正失敗 |
1001 | user empty | ASP SDK | |
1200 | token invalid | ASP SDK | |
1201 | vm invalid | ASP SDK | |
1202 | ADMIN internal error | ASP SDK | |
1203 | user invalid | ASP SDK | |
1204 | token experied | ASP SDK | |
1500 | server internal error | ASP SDK | |
1501 | server net work error | ASP SDK | |
串連中斷開或遇到某些錯誤的情況 | |||
2000 | 擷取%s資料逾時,與服務端中斷連線 | ASP SDK | 正常斷開 |
2001 | %s已與服務端中斷連線。可能是因為%s進程已被強制終止。 | ASP SDK | 一般是端上應用被終止進程了,如Android應用使用者通過按下Home鍵終止 |
2002 | 已有使用者從其他終端串連當前%s。請稍後重試。 | ASP SDK | 其他人搶佔了端 |
2003 | %s正在關機或重啟,一般由管理員操作,請稍後重試。 | ASP SDK | 雲手機被關機或重啟,一般是管理員操作 |
2004 | 目前使用者串連被斷開。 | ASP SDK | 用戶端發起斷流,或服務端發起踢人或斷流 |
2005 | %s已逾時中斷連線,因為已達到管理員設定的使用時間長度限制。 | ASP SDK | 管理員設定使用時間長度被關 |
2006 | 管理員已回收了你使用該雲手機的許可權,即將登出並斷開雲手機的串連。 | ASP SDK | 管理員取消了使用者授權 |
2010 | 串連%s失敗 | ASP SDK | Vdagent串連失敗 |
2011 | 串連參數傳遞錯誤。 | ASP SDK | 串連server參數傳遞錯誤 |
2027 | 拉流模式已切換。 | ASP SDK | 拉流模式由搶佔模式切換為協同模式,或由協同模式切換為搶佔模式 |
2100 | 剪下板許可權,禁止從%s到本地 | ASP SDK | 剪貼簿許可權,禁止從VM到本地 |
2101 | 剪下板許可權,禁止從本地到%s | ASP SDK | 剪貼簿許可權,禁止從本地到 VM |
2200 | %s正在嘗試重連... | ASP SDK | 因為網路問題斷開了,ASP SDK正在重連 |
2201 | 您的裝置出現網路異常,導致%s已中斷連線。 | ASP SDK | 因為網路問題斷開了,ASP SDK因為鏡像原因不支援重連,應用側開始重連 |
2202 | %s重連逾時,請檢查裝置網路後重試。 | ASP SDK | ASP SDK重連逾時 |
2210 | 終端裝置休眠時斷開了本網,導致雲手機中斷連線 | ASP SDK | |
2212 | 檢測到您的本網出現異常,導致雲手機中斷連線。 | ASP SDK | |
2220 | 檢測到您的本網出現異常,導致雲手機中斷連線。 | ASP SDK | |
2240 | 由於Ticket中的Token失效,導致重連失敗。 | ||
2300 | 應用側傳參出現異常導致串連失敗。 | ||
2501 | 用戶端串連流網關異常,網路不可達。 | ||
2502 | 用戶端串連流網關異常,TCP串連流網關IP逾時, connect *3次 (共15s)。 | ||
2503 | 用戶端串連流網關異常,未知網路錯誤。 | ||
2504 | 用戶端串連流網關異常,軟體原因串連中斷。 | ||
2505 | 用戶端串連流網關異常,串連被拒絕。 | ||
2506 | Ticket失效,網關解析token失敗。 | ||
2507 | Ticket失效,到期。 | ||
2508 | Ticket失效,uuid不匹配。 | ||
2509 | 流網關探測asp-server 失敗 | ||
2510 | 探測server被拒絕: | ||
2511 | 探測server失敗,timeout和refuse 之外的其他錯誤 | ||
2512 | 流網關token校正失敗 管控token中帶的vpcId和流網關本身所在的vpcId 不一致 | ||
2513 | 用戶端和網關sayhello 過程中tcp收到異常reset | ||
2520 | 用戶端串連失敗,自主診斷出來是網路異常導致的 | ||
2521 | 用戶端再和流網關tls握手階段重連3次三次都異常斷開 | ||
2522 | vpn環境下串連出錯 | ||
2523 | 用戶端正在使用國密協議串連。請確認服務端設定或選擇相容的串連方式。 | ||
2701 | 端側網路問題,建議對比手機5g熱點試試能否串連上。 | ||
2702 | 用戶端到流網關SSL握手逾時 | ||
2703 | 用戶端到流網關SayHello逾時 | ||
2704 | ASP Server回複建鏈訊息逾時 可能原因: asp-server卡死;網路異常;鏡像卡死;mem/cpu high | ||
2705 | Asp Client 等待第一幀逾時 可能原因: asp-server卡死;截屏或者gpu驅動異常沒有幀產生;網路異常;mem/cpu high | ||
2706 | 檢測到用戶端本地的CPU、記憶體使用量率過高可能會導致串連失敗。 | ||
2707 | AspServer 從Guest擷取第一幀截屏資料逾時 | ||
2708 | sdk線程卡住導致串連失敗 | ||
端側邏輯錯誤 | |||
5100 | %s串連ASP Server逾時,請稍後重試。 | 應用側 | 端側在一段時間內未接收到connected事件 |
5102 | 擷取%s資料逾時,請稍後重試。 | 應用側 | 端側在一段時間內接收到了connected但未接收到display事件 |
5004 | 用戶端出現錯誤,請重新開啟 | 應用側 | 傳入端側啟動參數有誤,一般出現在開發階段 |
5200 | 用戶端重連逾時,請稍後重試。 | 應用側 | |
7. 常見問題
怎麼重啟雲手機
調用管控重啟API 重啟執行個體進行重啟,調用重啟API後,端側串連的雲手機會斷開,重啟完成後,端側再串連雲手機。
縮圖和主控切換
縮圖切換主控,需要先關閉(縮圖),然後等待關閉完成再切換到(主控)。
主控切換縮圖,需要先關閉(主控),然後等待關閉完成再重新開啟(縮圖)。
sequenceDiagram
participant App
participant Sdk
App->>Sdk: close(true)
Sdk-->>App: onConnectEvent EVENT_DISCONNECT_SUCCESS
App->>Sdk: reopen(Ticket)