Este tópico descreve como usar a edição C++ do Windows SDK para o Cloud Phone.
1. Primeiros passos
1,1 Obter o SDK e a demonstração
Requisitos do ambiente de integração
Windows x64 release
Importar o SDK
Exemplo no Visual Studio 2019:
Abra Project Properties > Configuration Properties > VC++ Directories. Adicione o diretório include do asp-client-sdk em Include Directories.
Abra Project Properties > Configuration Properties > VC++ Directories. Adicione o diretório lib do asp-client-sdk em Library Directories.
Abra Project Properties > Configuration Properties > Linker > General. Adicione o diretório lib do asp-client-sdk em Additional Library Directories.
Abra Project Properties > Configuration Properties > Linker > Input. Adicione asp-client-sdk.lib, asp-engine.lib e glog.lib em Additional Dependencies.
Exemplo no Qt Creator:
Adicione as linhas abaixo ao arquivo .pro do seu projeto:
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 \
Executar rapidamente a demonstração
Baixe o Windows_Demo_Release e descompacte-o para obter dois diretórios: server e client. Esses diretórios contêm, respectivamente, as demonstrações do lado do servidor e do lado do cliente.
Iniciar o servidor
Modifique o arquivo de configuração:
{
"httpPort": "8328",
"accessKeyId": "AK",
"accessKeySecret": "SK",
"androidRegionId": "cn-hangzhou"
}
Substitua AK e SK pelos seus valores reais de AccessKey ID e AccessKey Secret. Defina androidRegionId com o id da região da sua instância.
Execute server/run_server.bat. A seguinte mensagem será exibida:
2024-11-01T13:48:27.002Z Server is running on http://127.0.0.1:8328/listAic
O servidor foi iniciado com sucesso.
Executar o cliente
{
"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
}
Substitua GROUPIDS pelo id do grupo de instâncias do Cloud Phone que você deseja controlar. O id deve começar com ag-. É possível especificar vários ids de grupo. Salve o arquivo após atualizá-lo com o id do grupo de instâncias do Cloud Phone prefixado com ag-.
Descrição dos parâmetros de configuração:
CLOUD_SCREENSIZE_HEIGHT: Initial cloud screen height
CLOUD_SCREENSIZE_WIDTH: Initial cloud screen width
DEBUG_MODE: Log level (0 = no logs, 1 = debug, 2 = info)
DISPLAY_COL: Maximum number of columns displayed (10)
GROUPIDS: Instance groups (supports a list)
GROUP_SCREENSIZE_HEIGHT: Initial local thumbnail window height
GROUP_SCREENSIZE_WIDTH: Initial local thumbnail window width
LOCAL_SCREENSIZE_HEIGHT: Initial local main control window height
LOCAL_SCREENSIZE_WIDTH: Initial local main control window width
DISPLAY_SCALE: Main control scaling ratio
GROUP_SCALE: Thumbnail scaling ratio
MAX_PHONE_NUM: Maximum number of connections
PROXY_CONN_TYPE: Connection type (fixed value)
QUIC_OPTION: Whether to use QUIC (fixed value)
PHONE_URL: Server address
PORT: Server port
AUDIO_ENABLE: Whether to enable audio
EndUserId: Collaborative streaming username
IS_COO: Whether collaborative streaming is enabled
SALE_MODE: Whether CPS is enabled
SHOW_INSTENCE_NAME: Whether to display the instance name or ID
USE_OPENGL: Whether to enable OpenGL rendering
Execute client/WuyingDemo.exe.
1,2 Fluxo de integração
1,3 Melhores práticas
Para orientações detalhadas sobre integração, consulte Melhores práticas para integrar rapidamente o Cloud Phone. O diagrama a seguir ilustra a arquitetura geral de integração do Cloud Phone:
Existem diversos métodos de logon disponíveis para obter o ticket necessário à integração do SDK. O fluxograma abaixo apresenta esse processo:
Para detalhes específicos de implementação, consulte o código de exemplo na seção Interfaces de ciclo de vida.
2. Interfaces de ciclo de vida
2,1 Criar uma conexão de miniatura
Protótipo da função: static AspClient* create(AspTicket& ticket, wuying::asp::shared_ptr<IAspClientCallback> callback);
Descrição dos parâmetros:
|
Nome do parâmetro |
Tipo do parâmetro |
Descrição |
|
ticket |
AspTicket |
O AspTicket contém informações sobre se é uma miniatura, detalhes da instância e credenciais de conexão. Para mais informações, consulte 4,1 AspTicket. |
|
callback |
IAspClientCallback |
Callback de conexão. Para mais informações, consulte 2.5.1 Proxy de callback de conexão IAspClientCallback. |
Descrição da função: Esta interface estabelece uma conexão de miniatura com um Cloud Phone.
Exemplo de código:
AspTicket ticket;
// Set ticket
ticket.ticket = "";
// Set AppInstanceId
ticket.id = "";//AppInstanceId;
// Set user
ticket.user = "";//Cloud Phone name
// uuid must match the backend uuid
ticket.uuid = "wyClient";
// Fixed for Windows
ticket.systemType = "Windows";
// Fixed to 0
ticket.partner = 0;
// Whether thumbnail mode is enabled. Fixed to true.
ticket.isThumbnailEnable = true;
// Add connection callback. See below for details.
shared_ptr<AspClientCbImpl> iClient(new AspClientCbImpl(cert.Id));
AspClient *client=AspClient::create(ticket, iClient);
// Clipboard callback. See below for details.
shared_ptr<AspClipboardlmpl> clipboardCallback(new AspClipboardlmpl());
client->setClipboardCallback(clipboardCallback);
// Shell command callback. See below for details.
shared_ptr<AspShellCmdlmpl> shellCmdCallBack(new AspShellCmdlmpl());
client->setShellCmdCallback(shellCmdCallBack);
// Set thumbnail display size: width (int), height (int), fps (int)
client->setThumbnailDisplay(with, height, 1);
// Set connection type. Fixed to socket and false.
client->setProxyConnType(ASP_CONN_SOCKET);
client->setQuicOption(false);
// Set display callback
shared_ptr<IAspDisplayCallback> iDisplay(nullptr);
auto display = client->addDisplay(iDisplay);
// Connect to the phone
client->open();
2,2 Criar uma conexão de controle principal
Protótipo da função: static AspClient* create(AspTicket& ticket, wuying::asp::shared_ptr<IAspClientCallback> callback);
Descrição dos parâmetros:
|
Nome do parâmetro |
Tipo do parâmetro |
Descrição |
|
ticket |
AspTicket |
O AspTicket contém informações da instância e credenciais de conexão. Para mais informações, consulte 4,1 AspTicket. |
|
callback |
IAspClientCallback |
Callback de conexão. Para mais informações, consulte 2.5.1 Proxy de callback de conexão IAspClientCallback. |
Descrição da função: Esta interface estabelece uma conexão de controle principal com um Cloud Phone.
Exemplo de código:
AspTicket ticket;
// Set the ticket.
ticket.ticket = "";
// Set the AppInstanceId.
ticket.id = "";//AppInstanceId;
// Set the user.
ticket.user = "";// The name of the cloud phone.
// The UUID must be the same as the one on the backend.
ticket.uuid = "wyClient";
// Set to a fixed value: Windows.
ticket.systemType = "Windows";
// Set to a fixed value: 0.
ticket.partner = 0;
// Enable the thumbnail feature. Set to a fixed value: true.
ticket.isThumbnailEnable = true;
// Add a connection callback. For more information, see the subsequent sections.
shared_ptr<AspClientCbImpl> iClient(new AspClientCbImpl(cert.Id));
AspClient *client=AspClient::create(ticket, iClient);
// Clipboard callback. For more information, see the subsequent sections.
shared_ptr<AspClipboardlmpl> clipboardCallback(new AspClipboardlmpl());
client->setClipboardCallback(clipboardCallback);
// Add a Shell command callback. For more information, see the subsequent sections.
shared_ptr<AspShellCmdlmpl> shellCmdCallBack(new AspShellCmdlmpl());
client->setShellCmdCallback(shellCmdCallBack);
// Set the thumbnail window size. Parameters: width (int), height (int), and fps (int).
client->setThumbnailDisplay(with, height, 1);
// Set the connection type. The type is fixed to socket and the QUIC option is set to false.
client->setProxyConnType(ASP_CONN_SOCKET);
client->setQuicOption(false);
// Set the window callback.
shared_ptr<IAspDisplayCallback> iDisplay(nullptr);
auto display = client->addDisplay(iDisplay);
// Connect to the cloud phone.
client->open();
2,3 reopen
Protótipo da função: void reopen(std::string& ticket)
Descrição da função: Reabre uma conexão ou reconecta após uma desconexão. Válido apenas após chamar close(false).
Descrição dos parâmetros:
|
Nome do parâmetro |
Tipo do parâmetro |
Descrição |
|
ticket |
std::string |
O ticket é a credencial de conexão. Geralmente, possui validade de 10 minutos. |
Exemplo de código:
client->reopen(ticket);
2,4 close
Protótipo da função: void close(bool destroyClient = false)
Descrição da função: Fecha a conexão.
Descrição dos parâmetros:
|
Nome do parâmetro |
Tipo do parâmetro |
Descrição |
|
destroyClient |
bool |
Indica se os recursos devem ser limpos. O valor padrão é false. |
Exemplo de código:
client->close(false)
2,5 Descrições de callbacks
2.5.1 Proxy de callback de conexão IAspClientCallback
Descrições das interfaces de proxy:
|
Interface |
Descrição |
|
void onThumbnailUpdate(void* buffer, uint32_t width, uint32_t height, AspImageFormat format) |
Chamado quando uma miniatura é atualizada com sucesso em uma conexão do Cloud Phone. Para detalhes do formato, consulte 5,2 AspImageFormat. |
|
void onConnectEvent(ConnectEvent& event) |
Chamado quando ocorre um evento de conexão. Para detalhes do evento, consulte 4,2 ConnectEvent. |
Exemplo de código:
class AspClientCbImpl : public IAspClientCallback
{
public:
AspClientCbImpl() {}
// Thumbnail update callback
void onThumbnailUpdate(void* buffer, uint32_t width, uint32_t height, AspImageFormat format) override {
}
// Connection event callback
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 Proxy de callback de fluxo de controle principal IAspDisplayCallback
Descrições das interfaces de proxy:
|
Interface |
Descrição |
|
void onImageFrameReady(AspImageFrame& frame) |
Chamado quando o fluxo de controle principal está pronto após uma conexão bem-sucedida com o Cloud Phone. Para detalhes do frame, consulte 4,3 AspImageFrame. |
Exemplo de código:
class AspDisplayCbImpl : public IAspDisplayCallback
{
public:
void onImageFrameReady(AspImageFrame& frame) override {
// Pointer to the main control image byte array (length = width × height × 4)
uint8_t* ptr = static_cast<uint8_t*>(frame.buffer);
// Image width
int width = frame.width;
// Image height
int height = frame.height;
// Must manually release
frame.releaseBuffer();
}
};
2.5.3 Proxy de callback de áudio AspAudio
Descrições das interfaces de proxy:
|
Interface |
Descrição |
|
void onAudioFrameRender(AspAudioFrame &frame) |
Não requer implementação. Para detalhes do frame, consulte 4,4 AspAudioFrame. O SDK gerencia a renderização de áudio internamente. |
|
void onAudioVolumeUpdate(uint32_t volume) |
Não requer implementação. O SDK gerencia a renderização de áudio internamente. |
|
void onAudioMuteUpdate(bool isMute) |
Não requer implementação. O SDK gerencia a renderização de áudio internamente. |
|
void onAudioPlaybackUpdate(AspAudioPlayback &playback) |
Não requer implementação. Para detalhes da reprodução, consulte 4,5 AspAudioPlayback. O SDK gerencia a renderização de áudio internamente. |
|
void onAudioPlaybackStart() |
Não requer implementação. O SDK gerencia a renderização de áudio internamente. |
|
void onAudioPlaybackStop() |
Não requer implementação. O SDK gerencia a renderização de áudio internamente. |
Exemplo de código:
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. Interfaces de negócio
3,1 Interfaces de log
3.1.1 Inicialização
Descrição da função: Esta interface imprime logs internos do SDK para solução de problemas.
Exemplo de código:
// Initialize logging. AspLogSinkImpl is the log callback.
auto logSinkImpl = std::make_shared<AspLogSinkImpl>();
AspLogSink::setLogSink(logSinkImpl.get());
3.1.2 Proxy de callback AspLogSink
Descrições das interfaces de proxy:
|
Interface |
Descrição |
|
void debug(const std::string& tag, const std::string& msg) |
Callback de log de depuração do SDK |
|
void info(const std::string& tag, const std::string& msg) |
Callback de log informativo do SDK |
|
void warning(const std::string& tag, const std::string& msg) |
Callback de log de aviso do SDK |
|
void fatal(const std::string& tag, const std::string& msg) |
Callback de log fatal do SDK |
|
void error(const std::string& tag, const std::string& msg) |
Callback de log de erro do SDK |
Exemplo de código:
#include "AspLogSink.h"
using namespace wuying::asp;
class AspLogSinkImpl : public AspLogSink
{
public:
AspLogSinkImpl() {
}
void debug(const std::string& tag, const std::string& msg) override {
// Print debug log
}
void info(const std::string& tag, const std::string& msg) override {
// Print info log
}
void warning(const std::string& tag, const std::string& msg) override {
// Print warning log
}
void fatal(const std::string& tag, const std::string& msg) override {
// Print fatal log
}
void error(const std::string& tag, const std::string& msg) override {
// Print error log
}
};
3,2 Interfaces de negócio de miniatura
3.2.1 suspendThumbnailDisplay
Protótipo da função: void suspendThumbnailDisplay()
Descrição da função: Suspende o streaming de imagens de miniatura.
Exemplo de código:
client->suspendThumbnailDisplay();
3.2.2 resumeThumbnailDisplay
Protótipo da função: void resumeThumbnailDisplay()
Descrição da função: Retoma o streaming de miniaturas e pode forçar o envio de um único frame.
Exemplo de código:
client->resumeThumbnailDisplay();
3,3 Recursos adicionais de controle principal
3.3.1 setOutputImageFormat
Protótipo da função: void setOutputImageFormat(AspImageFormat format)
Descrição da função: Define o formato do frame de callback do controle principal.
Descrição dos parâmetros:
|
Nome do parâmetro |
Tipo do parâmetro |
Descrição |
|
format |
AspImageFormat |
Formato do frame de callback do controle principal. Para detalhes, consulte 5,2 AspImageFormat. |
Exemplo de código:
client->setOutputImageFormat(AspImageFormat::BGRA);
3.3.2 requestGraphicsKeyFrame
Protótipo da função: void requestGraphicsKeyFrame(AspDisplay* display) = 0;
Descrição da função: Envia um único keyframe para o fluxo de controle principal. O parâmetro é AspDisplay.
Descrição dos parâmetros:
|
Nome do parâmetro |
Tipo do parâmetro |
Descrição |
|
display |
AspDisplay* |
Ponteiro para a classe Display |
Exemplo de código:
client->requestGraphicsKeyFrame(display);
3.3.3 setGraphicsQuality
Protótipo da função: void setGraphicsQuality(AspImageQuality quality) = 0;
Descrição da função: Define a qualidade da imagem. A qualidade depende da resolução. Geralmente, defina este parâmetro como AUTO. Para parâmetros detalhados, consulte a definição da struct.
Descrição dos parâmetros:
|
Nome do parâmetro |
Tipo do parâmetro |
Descrição |
|
quality |
AspImageQuality |
Qualidade da imagem. Para detalhes, consulte 5,4 AspImageQuality. |
client->setGraphicsQuality(ASP_IMAGE_QUALITY_AUTO)
3.3.4 setGraphicsFps
Protótipo da função: void setGraphicsFps(int fps) = 0;
Descrição da função: Define os quadros por segundo (FPS).
Descrição dos parâmetros:
|
Nome do parâmetro |
Tipo do parâmetro |
Descrição |
|
fps |
int |
Taxa de quadros |
Exemplo de código:
client->setGraphicsFps(30)
3.3.5 setGraphicsBitrate
Protótipo da função: void setGraphicsBitrate(int32_t bps) = 0;
Descrição da função: Define a taxa de bits, o que afeta o tamanho da imagem.
Descrição dos parâmetros:
|
Nome do parâmetro |
Tipo do parâmetro |
Descrição |
|
bps |
int32_t |
Taxa de bits |
As taxas de bits a seguir servem apenas como referência:
|
Qualidade da imagem |
Taxa de bits |
|
Baixa qualidade |
1×1024 |
|
Média |
5×1024 |
|
Alta qualidade |
10×1024 |
|
Sem perdas |
50×1024 |
Exemplo de código:
client->setGraphicsBitrate(1*1024)
3,4 Mouse
3.4.1 sendMouseClick
Protótipo da função: void sendMouseClick(AspAction action, uint32_t button, uint32_t buttonState) = 0;
Descrição da função: Envia um evento de clique do mouse.
Descrição dos parâmetros:
|
Nome do parâmetro |
Tipo do parâmetro |
Descrição |
|
action |
AspAction |
Para detalhes, consulte 5,5 AspAction. |
|
button |
uint32_t |
Para detalhes, consulte 5,6 AspMouseButtonMask. |
|
buttonState |
uint32_t |
Para detalhes, consulte 5,7 AspMouseButton. |
Exemplo de código:
// Mouse left button press
display->sendMouseClick(AspAction::ACTION_DOWN, ASP_MOUSE_BUTTON_MASK_L, ASP_MOUSE_BUTTON_LEFT);
// Mouse left button release
display->sendMouseClick(AspAction::ACTION_UP, ASP_MOUSE_BUTTON_MASK_L, ASP_MOUSE_BUTTON_LEFT);
3.4.2 sendMouseMove
Protótipo da função: virtual void sendMouseMove(uint32_t x, uint32_t y, uint32_t buttonState) = 0;
Descrição da função: Envia um evento de movimento do mouse.
Descrição dos parâmetros:
|
Nome do parâmetro |
Tipo do parâmetro |
Descrição |
|
x |
uint32_t |
Coordenada horizontal do Cloud Phone |
|
y |
uint32_t |
Coordenada vertical do Cloud Phone |
|
buttonState |
uint32_t |
Para detalhes, consulte 5,6 AspMouseButtonMask. |
Exemplo de código:
// x and y are the Cloud Phone coordinates
sendMouseMove(x, y, ASP_MOUSE_BUTTON_MASK_L)
3,5 Teclado
3.5.1 sendKeyEvent
Protótipo da função: virtual void sendKeyEvent(AspAction action, int scancode) = 0;
Esta funcionalidade descreve eventos de teclado.
Descrição dos parâmetros:
|
Nome do parâmetro |
Tipo do parâmetro |
Descrição |
|
action |
AspAction |
Tipo de ação. Para detalhes, consulte 5,5 AspAction. |
|
scancode |
int |
Código de varredura da tecla |
Exemplo de código:
// Key press
display->sendKeyEvent(AspAction::ACTION_DOWN,scanCode);
// Key release
display->sendKeyEvent(AspAction::ACTION_UP,scanCode);
3,6 Área de transferência
Do ambiente local para a nuvem
Da nuvem para o ambiente local
3.6.1 setClipBoardTypes
Protótipo da função: virtual void setClipBoardTypes(std::vector<AspClipboardType> types) = 0;
Envia o formato de dados do conteúdo da área de transferência ao copiar para a área de transferência ou colar pressionando Ctrl+V. Apenas texto é suportado.
Descrição dos parâmetros:
|
Nome do parâmetro |
Tipo do parâmetro |
Descrição |
|
types |
std::vector<AspClipboardType> |
Array de tipos de área de transferência. Para detalhes, consulte 5,8 AspClipboardType. |
Exemplo de código:
std::vector<AspClipboardType> types;
types.push_back(AspClipboardType::CLIPBOARD_UTF8_TEXT);
client->setClipBoardTypes(types);
3.6.2 notifyClipboardReadComplete
Protótipo da função: virtual void notifyClipboardReadComplete(AspClipboardType type, uint8_t* buf, size_t len) = 0;
Descrição da função: Envia conteúdo para o Cloud Phone. Esta função é chamada quando onClipboardRead(uint8_t selection, AspClipboardType type) é acionado.
Descrição dos parâmetros:
|
Nome do parâmetro |
Tipo do parâmetro |
Descrição |
|
type |
AspClipboardType |
Tipo de área de transferência. Atualmente suporta apenas texto. |
|
buf |
uint8_t* |
Ponteiro para o array de bytes do conteúdo da área de transferência |
|
len |
size_t |
Tamanho de buf |
Exemplo de código:
void onClipboardRead(uint8_t selection, AspClipboardType type) override {
// Triggered when copying from local to Cloud Phone via client->setClipBoardTypes(types)
// Call notifyClipboardReadComplete to send clipboard content
client->notifyClipboardReadComplete(type, reinterpret_cast<uint8_t *>(utf8Data.data()), utf8Data.size());
}
3.6.3 Proxy de callback IClipboardCallback
Descrições das interfaces de proxy:
|
Interface |
Descrição |
|
void onClipboardRead(uint8_t selection, AspClipboardType type) |
Acionado ao copiar do ambiente local para o Cloud Phone via setClipBoardTypes(types). Chame notifyClipboardReadComplete para enviar o conteúdo da área de transferência. Para detalhes do tipo, consulte 5,8 AspClipboardType. |
|
void onClipboardWrite(std::vector<AspClipboardData> dataV) |
Acionado ao copiar do Cloud Phone para o ambiente local. Escreva dataV na área de transferência local. Para detalhes dos dados, consulte 4,6 AspClipboardData. |
Exemplo de código:
class AspClipboardlmpl :public IClipboardCallback
{
public:
AspClipboardlmpl() {};
void onClipboardRead(uint8_t selection, AspClipboardType type) override {
// Triggered when copying from local to Cloud Phone via client->setClipBoardTypes(types)
// Call notifyClipboardReadComplete to send clipboard content
//client->notifyClipboardReadComplete(type, reinterpret_cast<uint8_t *>(utf8Data.data()), utf8Data.size());
}
void onClipboardWrite(std::vector<AspClipboardData> dataV) override {
// Write dataV to the local clipboard when copying from Cloud Phone
}
};
3,7 Canal de comandos Shell
3.7.1 sendStringDataToShell
Protótipo da função: virtual bool sendStringDataToShell(const std::string& val) = 0;
Descrição da função: Envia um comando Shell.
Descrição dos parâmetros:
|
Nome do parâmetro |
Tipo do parâmetro |
Descrição |
|
val |
std::string |
Comando ADB Shell no formato JSON: {"id":"","cmd":""} |
Exemplo de código:
client->sendStringDataToShell(jsonString)
Comandos ADB comuns:
|
Função |
Comando |
|
Voltar |
input keyevent KEYCODE_BACK |
|
Início |
input keyevent KEYCODE_HOME |
|
Tecla de alternância |
input keyevent KEYCODE_APP_SWITCH |
|
Silenciar |
input keyevent 164 |
|
Aumentar volume |
input keyevent KEYCODE_VOLUME_UP |
|
Diminuir volume |
input keyevent KEYCODE_VOLUME_DOWN |
|
Ocultar barra de navegação |
setprop persist.wy.hasnavibar false; killall com.android.systemui |
|
Mostrar barra de navegação |
setprop persist.wy.hasnavibar true; killall com.android.systemui |
|
Captura de tela |
screencap -p /sdcard/Download/abc.png |
3.7.2 Proxy de callback IShellCmdCallback
Descrições das interfaces de proxy:
|
Interface |
Descrição |
|
void onReceiveStringData(const std::string& val) |
Recebe respostas de comandos Shell baseadas em string |
|
void onReceiveRawData(const std::vector<uint8_t> val) |
Recebe respostas de comandos Shell baseadas em bytes brutos |
Exemplo de código:
class AspShellCmdlmpl :public IShellCmdCallback
{
public:
AspShellCmdlmpl() {};
void onReceiveStringData(const std::string& val) override {
// Callback for string responses
}
void onReceiveRawData(const std::vector<uint8_t> val) override {
// Callback for raw byte responses
}
};
4. Detalhes dos parâmetros
4,1 AspTicket
struct AspTicket {
std::string ticket; // Ticket string for accessing a Cloud Phone
std::string id; // Desktop ID
std::string user; // Username
std::string uuid; // Local UUID (must match the UUID used when requesting the ticket)
std::string systemType; // Operating system type
uint8_t partner; // Partner ID
bool isThumbnailEnable = false; // Whether thumbnail mode is enabled
};
4,2 ConnectEvent
struct ConnectEvent {
ConnectEventType type; // Event type such as connection success or failure
int reason; // Reason for the event trigger
};
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; // Sample rate
int channels; // Channels
int size; // Data size
uint8_t *data; // Data address
ReleaseBuffer releaseBuffer; // Function to release data. Must be called after using data.
};
4,5 AspAudioPlayback
struct AspAudioPlayback {
AspAudioReadType readType; // Audio data retrieval method: PUSH or PULL
AspAudioMode mode; // PCM or OPUS
uint32_t channels; // Number of channels
uint32_t frequency; // Sample rate
AspAudioFormat format; // RAW or OPUS
AudioReader audioReader; // Function for data reading in PULL mode. Refer to the demo implementation.
};
4,6 AspClipboardData
struct AspClipboardData {
AspClipboardType type;
uint8_t* data;
uint32_t size;
};
5. Enumerações
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 recursive */
CLIPBOARD_HTML,
CLIPBOARD_RTF,
CLIPBOARD_XML_SPREAD_SHEET,
};
6. Códigos de erro
Código de erro | Mensagem de erro ( | Módulo | Causa |
Os códigos de erro de 2 a 26 estão principalmente relacionados a problemas de rede. | |||
2 | Falha ao conectar a %s. | ASP SDK | Valor MAGIC inválido. |
3 | Falha ao conectar a %s. | ASP SDK | Dados inválidos. |
4 | As versões do cliente e do servidor não correspondem. | ASP SDK | Incompatibilidade de versão. |
5 | É necessária uma conexão TLS. | ASP SDK | O servidor exige uma conexão TLS, mas o cliente não iniciou uma. |
6 | Conexão TLS inesperada. | ASP SDK | A conexão não exige TLS, mas ele foi utilizado. |
7 | Permissão negada para conectar a %s. | ASP SDK | Permissões insuficientes. |
8 | id de cliente inválido durante a migração. | ASP SDK | id de cliente inválido durante a migração. |
9 | Falha ao conectar a %s. | ASP SDK | O canal não existe. |
20 | Falha ao conectar ao servidor ASP. | ASP SDK | Erro de conexão do canal. |
21 | Ocorreu um erro de autenticação TLS. | ASP SDK | Erro de autenticação TLS. |
22 | Falha ao conectar a %s. | ASP SDK | Erro de link do canal. |
23 | Falha ao conectar a %s. | ASP SDK | Erro de autenticação de conexão. |
24 | Falha ao conectar a %s. | ASP SDK | Erro de I/O de conexão. |
25 | Falha ao conectar a %s. | ASP SDK | Falha na validação do ticket. Este erro também ocorre ao reutilizar um ticket de uma sessão encerrada. |
26 | Falha no handshake xquic. | ASP SDK | Falha no handshake xquic. |
1206 | O ticket já está em uso. | ASP SDK | Um ticket pode ser reutilizado, mas apenas para uma conexão por vez. Este erro ocorre se você tentar estabelecer uma nova conexão enquanto o Cloud Phone já está em uso. |
1207 | Ticket invalidado pela reinicialização da instância. | ASP SDK | A instância foi reiniciada, o que invalidou o ticket. |
Códigos de erro do SDK para modo colaborativo | |||
1000 | O token está vazio. | ASP SDK | Esses erros ocorrem apenas no modo colaborativo quando a validação secundária entre o cliente e o servidor falha. |
1001 | O usuário está vazio. | ASP SDK | |
1200 | O token é inválido. | ASP SDK | |
1201 | A VM é inválida. | ASP SDK | |
1202 | Ocorreu um erro interno do administrador. | ASP SDK | |
1203 | O usuário é inválido. | ASP SDK | |
1204 | O token expirou. | ASP SDK | |
1500 | Ocorreu um erro interno do servidor. | ASP SDK | |
1501 | Ocorreu um erro de rede no servidor. | ASP SDK | |
Interrupções de conexão e outros erros | |||
2000 | Desconectado do servidor porque a busca de dados de %s atingiu o tempo limite. | ASP SDK | Tempo limite na busca de dados. |
2001 | %s desconectou do servidor, possivelmente porque seu processo foi encerrado. | ASP SDK | Isso geralmente ocorre quando o processo no lado do cliente é encerrado. Por exemplo, um aplicativo Android é fechado pelo usuário ao pressionar o botão Início. |
2002 | Outro usuário conectou-se ao %s atual a partir de um terminal diferente. | ASP SDK | A sessão foi assumida por outro usuário no modo preemptivo. |
2003 | %s está desligando ou reiniciando. Geralmente, trata-se de uma ação iniciada pelo administrador. | ASP SDK | O Cloud Phone foi desligado ou reiniciado, normalmente por um administrador. |
2004 | A conexão do usuário atual foi encerrada. | ASP SDK | O cliente iniciou a desconexão ou o servidor acionou uma ação de expulsão ou desconexão. |
2005 | Sessão desconectada: limite de tempo de uso atingido. | ASP SDK | A sessão foi encerrada porque atingiu o limite de duração de uso definido pelo administrador. |
2006 | Sua permissão para usar este Cloud Phone foi revogada pelo administrador. Você será desconectado. | ASP SDK | A autorização do usuário foi revogada por um administrador. |
2010 | Falha ao conectar a %s. | ASP SDK | Falha ao conectar ao Vdagent. |
2011 | Ocorreu um erro ao passar os parâmetros de conexão. | ASP SDK | Um parâmetro inválido foi passado ao conectar ao servidor. |
2027 | O modo de pull de fluxo foi alternado. | ASP SDK | O modo de pull de fluxo foi alternado de preemptivo para colaborativo, ou de colaborativo para preemptivo. |
2100 | Permissão de área de transferência negada para copiar de %s para o dispositivo local. | ASP SDK | O acesso à área de transferência da instância remota para o cliente local foi negado pela política. |
2101 | Permissão de área de transferência negada para copiar do dispositivo local para %s. | ASP SDK | O acesso à área de transferência do cliente local para a instância remota foi negado pela política. |
2200 | %s está tentando reconectar... | ASP SDK | A conexão foi perdida devido a um problema de rede e o ASP SDK está tentando reconectar. |
2201 | Seu dispositivo encontrou uma anomalia de rede, causando a desconexão de %s. | ASP SDK | A conexão foi perdida devido a um problema de rede. O ASP SDK não suporta reconexão devido a restrições de imagem; o lado do aplicativo deve iniciar a reconexão. |
2202 | Tempo limite na reconexão a %s. | ASP SDK | A tentativa de reconexão do ASP SDK atingiu o tempo limite. |
2210 | Conexão perdida enquanto o dispositivo cliente estava em suspensão. | ASP SDK | A rede local foi desconectada enquanto o dispositivo cliente estava em suspensão, o que causou a perda da conexão com o Cloud Phone. |
2212 | Conexão perdida devido a uma anomalia na rede local. | ASP SDK | Uma anomalia na rede local foi detectada, o que causou a desconexão do Cloud Phone. |
2220 | Conexão perdida devido a uma anomalia na rede local. | ASP SDK | Uma anomalia na rede local foi detectada, o que causou a desconexão do Cloud Phone. |
2240 | A reconexão falhou porque o token no ticket é inválido. | ASP SDK | |
2300 | A conexão falhou devido a um parâmetro inválido do lado do aplicativo. | app-side | |
2501 | O cliente falhou ao conectar ao gateway de fluxo. A rede está inacessível. | stream gateway | |
2502 | O cliente falhou ao conectar ao gateway de fluxo. A conexão TCP com o endereço IP do gateway de fluxo atingiu o tempo limite após três tentativas (15 segundos no total). | stream gateway | |
2503 | O cliente falhou ao conectar ao gateway de fluxo devido a um erro de rede desconhecido. | stream gateway | |
2504 | O cliente falhou ao conectar ao gateway de fluxo. A conexão foi abortada pelo software. | stream gateway | |
2505 | O cliente falhou ao conectar ao gateway de fluxo. A conexão foi recusada. | stream gateway | |
2506 | O ticket é inválido. O gateway falhou ao analisar o token. | stream gateway | |
2507 | O ticket é inválido porque expirou. | stream gateway | |
2508 | O ticket é inválido devido a uma incompatibilidade de UUID. | stream gateway | |
2509 | O gateway de fluxo falhou ao sondar o servidor ASP. | stream gateway | |
2510 | A sonda para o servidor foi rejeitada. Solução: Certifique-se de que o servidor esteja escutando na porta 5912. | stream gateway | |
2511 | A sonda para o servidor falhou devido a um erro diferente de tempo limite ou recusa. | stream gateway | |
2512 | A validação do token do gateway de fluxo falhou. O id da VPC no token de gerenciamento não corresponde ao id da VPC do gateway de fluxo. | stream gateway | |
2513 | A conexão TCP foi redefinida durante o handshake "SayHello" entre o cliente e o gateway de fluxo. | stream gateway | |
2520 | A conexão do cliente falhou; uma verificação de autodiagnóstico indica uma anomalia de rede. | ASP SDK | |
2521 | O cliente foi desconectado após três tentativas de reconexão falharem durante a fase de handshake TLS com o gateway de fluxo. | ASP SDK | |
2522 | Ocorreu um erro de conexão em um ambiente VPN. | ASP SDK | |
2523 | O cliente está tentando conectar usando o conjunto de protocolos GM/T. Verifique a configuração do servidor ou selecione um método de conexão compatível. | ASP SDK | |
2701 | Ocorreu um problema de rede no lado do cliente. | ASP SDK | |
2702 | O handshake SSL entre o cliente e o gateway de fluxo atingiu o tempo limite. | ASP SDK | |
2703 | O handshake "SayHello" entre o cliente e o gateway de fluxo atingiu o tempo limite. | ASP SDK | |
2704 | A resposta do servidor ASP à solicitação de estabelecimento de conexão atingiu o tempo limite. Possíveis causas: O servidor ASP não responde, anomalia de rede, instância congelada ou alto uso de memória/CPU. | ASP SDK | |
2705 | O cliente ASP atingiu o tempo limite enquanto aguardava o primeiro frame. Possíveis causas: O servidor ASP não responde, nenhum frame está sendo gerado devido a um problema de captura de tela ou driver de GPU, anomalia de rede ou alto uso de memória/CPU. | ASP SDK | |
2706 | Alto uso local de CPU ou memória no cliente pode causar falhas de conexão. | ASP SDK | |
2707 | O servidor ASP atingiu o tempo limite ao recuperar o primeiro frame de captura de tela do SO convidado. | ASP SDK | |
2708 | A conexão falhou porque uma thread do SDK está travada. | ASP SDK | |
Erros de lógica do lado do cliente | |||
5100 | A conexão de %s com o servidor ASP atingiu o tempo limite. | app-side | O lado do cliente não recebeu um evento "connected" dentro do período de tempo especificado. |
5102 | A busca de dados de %s atingiu o tempo limite. | app-side | O lado do cliente recebeu um evento "connected", mas não recebeu um evento "display" dentro do período de tempo especificado. |
5004 | Parâmetros de inicialização inválidos. | app-side | Parâmetros de inicialização inválidos foram passados para o lado do cliente. Isso geralmente ocorre durante o desenvolvimento. |
5200 | Tempo limite na reconexão do cliente. | app-side | |
7. Perguntas frequentes
Como reiniciar um Cloud Phone?
Chame a API de gerenciamento Reiniciar instância para reiniciar o Cloud Phone. Após chamar essa API, a conexão do lado do cliente com o Cloud Phone é interrompida. Reconecte-se após a conclusão da reinicialização.
Alternar entre miniatura e controle principal
Para alternar da miniatura para o controle principal, primeiro feche a conexão da miniatura e aguarde a conclusão da desconexão antes de abrir a conexão de controle principal.
Para alternar do controle principal para a miniatura, primeiro feche a conexão de controle principal e aguarde a conclusão da desconexão antes de reabrir a conexão da miniatura.
sequenceDiagram
participant App
participant Sdk
App->>Sdk: close(true)
Sdk-->>App: onConnectEvent EVENT_DISCONNECT_SUCCESS
App->>Sdk: reopen(Ticket)