为满足不同业务场景的需求,无影云手机提供抢占模式和协同模式这两种拉流模式。本文介绍在不同拉流模式下的拉流最佳实践。
什么是拉流
拉流指通过客户端获取云手机画面并进行查看和操作的过程。为满足不同业务场景的需求,无影云手机提供两种拉流模式。
拉流模式 | 说明 | 适用产品版本 |
抢占模式 | 同一时间只有一个客户端可以连接一台云手机的画面进行查看与操作。当第一个客户端已经在对云手机进行拉流,则第二个客户端发起连接请求后,第一个客户端断开连接,由第二个客户端接管连接与拉流。 |
|
协同模式 | 同一时间可以有多个客户端连接同一台云手机的画面进行查看或操作,目前同时连接的客户端数量上限是10个,如果超出该上限,则后续用户无法获取Ticket。由于每多推一路流都会多占用一些带宽,需要关注带宽占用情况并控制客户端连接数量。此模式通常适用于多端协同操作的场景。 |
|
指定拉流模式
实例版和矩阵版均支持通过参数 StreamMode 来指定拉流模式:
1:抢占模式(默认值)。2:协同模式。说明如果不传入任何值,则默认为抢占模式。
如果希望创建云手机矩阵时默认采用协同模式,可以提交工单来申请添加白名单。
可以在创建实例组与矩阵时直接指定拉流模式,或者修改已有实例组与矩阵的拉流模式。
创建时指定拉流模式
创建实例组时指定拉流模式
可以调用CreateAndroidInstanceGroup来创建实例组,并通过参数 StreamMode 的值来指定实例组的拉流模式。
请求参数
名称 | 类型 | 必填 | 描述 | 示例值 |
BizRegionId | string | 是 | 地域 ID。可以通过调用查询可用地域查询云手机支持购买的地域列表。 枚举值:
| cn-hangzhou |
InstanceGroupName | string | 否 | 实例组名称。 说明 实例组名称长度不超过 30 个字符;请以大/小写字母或中文开头,不能以 | 云手机A |
NumberOfInstances | integer | 否 | 实例组中的实例数量。最大值为 100。 | 1 |
ChargeType | string | 否 | 计费类型。 枚举值:
| PostPaid |
Period | integer | 否 | 购买资源的时长,单位由 PeriodUnit 指定。 | 1 |
PeriodUnit | string | 否 | 购买资源的时长单位。 枚举值:
| Month |
InstanceGroupSpec | string | 是 | 实例组规格。可以通过调用DescribeSpec查询云手机支持购买的规格。 枚举值:
| acp.basic.small |
AutoPay | boolean | 否 | 是否自动付费。默认为 false。 枚举值:
| false |
AutoRenew | boolean | 否 | 是否开启自动续费。默认为 false。 枚举值:
| false |
OfficeSiteId | string | 否 | 网络 ID。 | cn-hangzhou+dir-745976**** |
VSwitchId | string | 否 | 交换机 ID。可以通过调用 DescribeVSwitches 查询交换机列表。
| vsw-uf61uvzhz8ejaw776**** |
PolicyGroupId | string | 否 | 策略 ID。可以通过调用 ListPolicyGroups 查询策略列表。 | pg-b7bxrrwxkijjh**** |
ImageId | string | 是 | 镜像 ID。可以通过调用 DescribeImageList 查询云手机的镜像列表。 | imgc-06zyt9m93zwax**** |
Amount | integer | 否 | 实例组数量,默认值为 1,最大值为 100。 | 8 |
GpuAcceleration | boolean | 否 | 是否开启 GPU 加速。 枚举值:
| false |
KeyPairId | string | 否 | 密钥对 ID。创建实例组的时候,如果指定了合法的密钥对 ID,会在这次创建成功的实例上,都绑定该密钥对,不用再重新调用绑定接口。 说明 目前还不支持扩容的时候绑定密钥对。 | kp-7o9xywwfutc1l**** |
ClientToken | string | 否 | 用于保证请求的幂等性,防止重复提交请求。不超过 100 个字符。 | asadbuvwiabdbvchj**** |
EnableIpv6 | boolean | 否 | 说明 该参数暂未对外开放使用。 | null |
Ipv6Bandwidth | integer | 否 | 说明 该参数暂未对外开放使用。 | null |
| Tag | array<object> | 否 | 资源的标签。 | |
object | 否 | 资源的标签。 | ||
Value | string | 否 | 标签值。 | value |
Key | string | 否 | 标签键。 | key |
| NetworkInfo | object | 否 | ||
BandwidthPackageName | string | 否 | ||
CidrBlock | string | 否 | ||
LimitedBandwidth | integer | 否 | ||
InternetChargeType | string | 否 | ||
IpRatio | integer | 否 | ||
Isp | string | 否 | ||
PayType | string | 否 | ||
Period | integer | 否 | ||
PeriodUnit | string | 否 | ||
AutoPay | boolean | 否 | ||
AutoRenew | boolean | 否 | ||
VisibleType | string | 否 | ||
PromotionId | string | 否 | ||
PaidCallbackUrl | string | 否 | ||
BandwidthPackageType | string | 否 | ||
BandwidthPackageId | string | 否 | ||
NetworkType | string | 否 | ||
PromotionId | string | 否 | ||
StreamMode | integer | 否 | ||
PaidCallBackUrl | string | 否 | wya.wuying.aliyun.com/instanceGroup | |
SaleMode | string | 否 | ||
InstanceVersion | string | 否 |
返回参数
返回参数
|
名称 |
类型 |
描述 |
示例值 |
|
object |
返回参数。 |
||
| RequestId |
string |
请求 ID。 |
1A923337-44D9-5CAD-9A53-95084BD4**** |
| InstanceGroupInfos |
array<object> |
实例组信息。 |
|
|
object |
|||
| InstanceGroupId |
string |
实例组 ID。 |
ag-cuv4scs4obxch**** |
| InstanceIds |
array |
实例 ID 列表。 |
|
|
string |
实例 ID。 |
acp-g40b9at5nhjo9**** |
|
| OrderId |
string |
订单 ID。 |
22365781890**** |
| InstanceGroupIds |
array |
实例组 ID 列表。 |
|
|
string |
实例组 ID。 |
ag-cuv4scs4obxch**** |
|
| NetworkPackageOrderModel |
object |
||
| BandwidthPackageOrderId |
string |
||
| BandwidthPackageId |
string |
创建矩阵时指定拉流模式
可以调用CreateCloudPhoneNode来创建矩阵,并通过参数StreamMode的值来指定矩阵的拉流模式。
请求参数
|
名称 |
类型 |
必填 |
描述 |
示例值 |
| BizRegionId |
string |
是 |
地域 ID。 枚举值:
|
cn-hangzhou |
| NodeName |
string |
否 |
云手机矩阵名称。 |
node_name |
| ServerType |
string |
是 |
云手机矩阵规格。 枚举值:
|
cpm.gx7.10xlarge |
| InstanceType |
string |
否 |
实例规格。 说明
如需购买更多规格,您可以联系售前咨询。 枚举值:
|
ac.max |
| ChargeType |
string |
否 |
付费类型。当前仅支持包年包月类型。 枚举值:
|
PrePaid |
| PeriodUnit |
string |
否 |
购买资源的时长单位。 枚举值:
|
Month |
| Period |
integer |
否 |
购买资源的时长,单位由
|
1 |
| AutoPay |
boolean |
否 |
是否自动付费。 枚举值:
|
true |
| AutoRenew |
boolean |
否 |
是否开启自动续费。 枚举值:
|
true |
| ImageId |
string |
否 |
镜像 ID。 |
imgc-075cllfeuazh0**** |
| Count |
string |
否 |
云手机矩阵的购买数量。 |
1 |
| NetworkId |
string |
否 |
办公网络 ID。 |
cn-hangzhou+dir-5mwr9azebliva**** |
| VSwitchId |
string |
否 |
交换机 ID。 |
vsw-2zeekryyc1q3sm72l**** |
| Tag |
array<object> |
否 |
资源的标签。 |
|
|
object |
否 |
资源的标签。 |
||
| Key |
string |
否 |
标签键。 |
keyname |
| Value |
string |
否 |
标签值。 |
valuename |
| PhoneDataVolume |
integer |
否 |
独立机身存储的大小。单位:GiB。 |
10 |
| ServerShareDataVolume |
integer |
否 |
共享机身存储的大小。单位:GiB。 说明
共享机身存储最小值需大于矩阵下的实例开数乘以 10GiB。 |
200 |
| ResolutionHeight |
integer |
否 |
分辨率的高度。单位:像素。 |
1280 |
| ResolutionWidth |
integer |
否 |
分辨率的宽度。单位:像素。 |
720 |
| PhoneCount |
integer |
否 |
单个矩阵中创建云手机实例数量。 |
25 |
| DisplayConfig |
object |
否 |
显示设置。 |
|
| Dpi |
integer |
否 |
DPI。取值范围 72~600。 |
240 |
| Fps |
integer |
否 |
说明
该参数暂未对外开放使用。 |
null |
| LockResolution |
string |
否 |
是否锁定分辨率。 枚举值:
|
off |
| StreamMode |
integer |
否 |
云手机矩阵下实例的串流模式,该参数不传默认为抢占模式。 枚举值:
|
1 |
| NetworkType |
string |
否 |
实例的网络类型。 枚举值:
|
network_pro_ecd |
| NetworkInfo |
object |
否 |
实例网络映射信息。 |
|
| BandwidthPackageName |
string |
否 |
带宽包名称 |
inst-bandwidth-pkg-1 |
| CidrBlock |
string |
否 |
私网网段 |
10.10.13.0/24 |
| LimitedBandwidth |
integer |
否 |
带宽包限速峰值,单位 Mbps。使用该带宽包的所有实例(求和)受该带宽上限限制。 |
200 |
| InternetChargeType |
string |
否 |
带宽包的计费方式。取值:
枚举值:
|
PayByBandwidth |
| IpRatio |
integer |
否 |
IP 与实例比。 枚举值:
|
128 |
| Isp |
string |
否 |
线路类型。 枚举值:
|
ChinaTelecom |
| PayType |
string |
否 |
付费类型。 枚举值:
|
PostPaid |
| VisibleType |
string |
否 |
可见范围 |
CPS |
| PaidCallbackUrl |
string |
否 |
||
| BandwidthPackageType |
string |
否 |
带宽类型。 枚举值:
|
cbwp_ecd |
| BandwidthPackageId |
string |
否 |
共享带宽实例的 ID。 |
cbwp-uf6g3hgg*******8s3lxiob3 |
| UpBandwidthLimit |
integer |
否 |
上行带宽限速,单位 Mbps |
50 |
| DownBandwidthLimit |
integer |
否 |
下行带宽限速,单位 Mbps |
50 |
| UseTemplate |
string |
否 |
创建时是否使用模板。如果使用模版列表的随机模板,则取值为 |
Random |
| PromotionId |
string |
否 |
||
| PaidCallBackUrl |
string |
否 |
||
| SwapSize |
integer |
否 |
||
| IsSingleImgDisk |
boolean |
否 |
返回参数
|
名称 |
类型 |
描述 |
示例值 |
|
object |
请求信息。 |
||
| RequestId |
string |
请求 ID。 |
69BCBBE4-FCF2-59B8-AD9D-531EB422**** |
| OrderId |
string |
订单 ID。 |
223684716098**** |
| NodeInfos |
array<object> |
云手机矩阵信息。 |
|
|
object |
云手机矩阵信息。 |
||
| NodeId |
string |
云手机矩阵 ID。 |
cpn-e5kxgjyt8s1mb**** |
| InstanceIds |
array |
云手机实例 ID 列表。 |
|
|
string |
云手机实例 ID。 |
cpn-e5kxgjyt8s1mb**** |
|
| NetworkPackageOrderModel |
object |
带宽包订单信息 |
|
| BandwidthPackageOrderId |
string |
带宽包订单 ID |
25954415983***** |
| BandwidthPackageId |
string |
共享带宽的 ID。 |
cbwp-uf63gsv8j0ir53***** |
修改现有拉流模式
相关接口为异步接口,后台会有几秒钟的处理时间,请10秒钟后再确认修改结果。
如果在拉流期间调用此接口修改拉流模式,则当前拉流会断开,并向客户端返回错误码2027。为确保业务稳定性,建议不要频繁修改拉流模式,仅在必要时才这样做。关于错误码的详细信息,请参见客户端相关错误码。
修改现有实例组的拉流模式
对于现有实例组,可以调用 修改实例组信息来修改参数 StreamMode 的值,从而指定实例组内所有云手机实例的拉流模式。
请求参数
请求参数
|
名称 |
类型 |
必填 |
描述 |
示例值 |
| InstanceGroupId |
string |
否 |
实例组 ID。 |
ag-cuv4scs4obxhs**** |
| NewInstanceGroupName |
string |
否 |
实例组的新名称。 说明
|
newName |
| PolicyGroupId |
string |
否 |
策略 ID。 |
pg-2w97kp89gnsif**** |
| StreamMode |
integer |
否 |
实例组下实例的串流模式,该参数不传默认为抢占模式。 枚举值:
|
1 |
返回参数
返回参数
|
名称 |
类型 |
描述 |
示例值 |
|
object |
返回参数。 |
||
| RequestId |
string |
请求 ID。 |
6C83EBE3-F267-5F11-ABF8-4E7B90B**** |
修改现有矩阵的拉流模式
对于现有矩阵,可以调用ModifyCloudPhoneNode来修改参数StreamMode的值,从而指定矩阵内所有云手机实例的拉流模式。
请求参数
|
名称 |
类型 |
必填 |
描述 |
示例值 |
| NodeId |
string |
否 |
云手机矩阵 ID。 |
cpn-0ugbptfu473fy**** |
| NewNodeName |
string |
否 |
云手机矩阵的新名称。 |
node_name_new |
| StreamMode |
integer |
否 |
云手机矩阵下实例的串流模式,该参数不传默认为抢占模式。 枚举值:
|
1 |
返回参数
返回参数
|
名称 |
类型 |
描述 |
示例值 |
|
object |
请求信息。 |
||
| RequestId |
string |
请求 ID。 |
7B9EFA4F-4305-5968-BAEE-BD8B8DE5**** |
获取串流Ticket
调用BatchGetAcpConnectionTicket获取串流Ticket(连接凭证)。该接口在不同拉流模式下的作用和限制有所区别:
抢占模式:
同一时间只能有一个用户连接,如果有多个用户请求Ticket,则后续的请求会触发报错。
同一个用户可以多次请求Ticket,但只有最后一个Ticket生效。
允许抢占的情况下,请求Ticket的操作不会让正在连接的用户断连,只有连接实例时才会抢占前一个用户的连接。
协同模式:可通过传入不同的
EnduserId来为不同的用户同时获取Ticket并串流。每次调用只能传入 1 个EnduserId。说明用户的理论数量上限为10个,其中控制台和卡片模式会占用2个用户名额。在实际业务中,建议参与协同的用户数不超过5个。
请求参数
|
名称 |
类型 |
必填 |
描述 |
示例值 |
| InstanceGroupId |
string |
否 |
实例组 ID。 |
ag-25nt4kk9whjh**** |
| InstanceIds |
array |
否 |
云手机实例 ID 列表,可设置 1~100 个。 |
|
|
string |
否 |
实例 ID。 |
acp-bj9t2gmys**** |
|
| EndUserId |
string |
否 |
已分配的用户 ID,如果不传,则会使用后台分配的系统用户获取 Ticket。 本参数的使用方法因云手机产品版本和实例串流模式而异:
说明
实例串流模式可通过 |
user |
| ConnectionMode |
string |
否 |
建连模式。 |
custom |
| InstanceTasks |
array<object> |
否 |
实例连接任务。用于查询 Ticket 获取任务是否完成。 |
|
|
object |
否 |
实例连接任务。 |
||
| InstanceId |
string |
否 |
实例 ID。 |
acp-fkuit0cmyfvzz**** |
| TaskId |
string |
否 |
任务 ID。 |
cn-hangzhou@c9f5c2e8-f5c4-4b01-8602-000cae94**** |
| Ports |
array |
否 |
||
|
string |
否 |
返回参数
|
名称 |
类型 |
描述 |
示例值 |
|
object |
Schema of Response |
||
| RequestId |
string |
请求 ID。 |
7B9EFA4F-4305-5968-BAEE-BD8B8DE5**** |
| InstanceConnectionModels |
array<object> |
实例连接任务结果。 |
|
|
object |
实例连接任务结果。 |
||
| AppInstanceGroupId |
string |
交付组 ID。 |
aig-1uzb6heg797z3**** |
| InstanceId |
string |
实例 ID。 |
acp-ajxvwo1u0hqvd**** |
| TaskStatus |
string |
任务状态。状态为 FINISHED 代表可以从 Ticket 字段获取到 Ticket,否则仍需要使用 TaskId 调用本接口查询 Ticket 生成结果。 |
FINISHED |
| TaskId |
string |
任务 ID。 |
cn-hangzhou@c9f5c2e8-f5c4-4b01-8602-000cae94**** |
| Ticket |
string |
用于连接用户实例的 Ticket。 |
piVE58_AdmVSVW7SEW3*AE5*p8mmO5gvItsNOmv4S_f_cNpoU_BOTwChTBoNM1ZJeedfK9zxYnbN5hossqIZCr6t7SGxRigm2Cb4fGaCdBZWIzmgdHq6sXXZQg4KFWufyvpeV*0*Cm58slMT1tJw3**** |
| ErrorCode |
string |
错误原因。 |
InvalidResourceId.NotFound |
| PersistentAppInstanceId |
string |
持久会话 ID。 |
p-abdywvcksdb**** |
| AppInstanceId |
string |
物理实例 ID。 |
ai-0caoetkqi8kj**** |
| Port |
integer |
建连端口 |
10000 |
同一个Ticket的有效期为10分钟。
断开用户连接(踢流)
调用DisconnectAndroidInstance断开用户连接。该接口在不同拉流模式下的作用有所区别:
抢占模式:将正在串流的用户断开连接。
协同模式:将正在串流的用户断开连接,并令其Ticket失效。
请求参数
|
名称 |
类型 |
必填 |
描述 |
示例值 |
| InstanceIds |
array |
否 |
云手机实例 ID 列表,可设置 1~100 个。 |
|
|
string |
否 |
云手机实例 ID 列表。 |
acp-5hh4a31emkt6u**** |
|
| EndUserId |
string |
否 |
如果使用的是云手机矩阵版,并且实例串流模式为协同模式,则可以通过指定 |
user1 |
返回参数
|
名称 |
类型 |
描述 |
示例值 |
|
object |
Schema of Response |
||
| RequestId |
string |
请求 ID。 |
E5138F7E-46B5-526A-8C99-82DEAE6B**** |
客户端相关错误码
onDisconnected接收的断连错误消息如下表所示。
错误码 | 说明 |
2002 | 当前云手机被抢占。 |
2004 | 当前用户连接被断开。 |
2027 | 拉流模式已切换。 |
25 | Ticket校验失败。 说明 用户连接被断开后,用同一个Ticket再次请求建立连接也会触发此错误。 |