注意:说明:
注意:动态设备仅支持手机端(安卓、iOS、HarmonyOS)。
一、1. 新建应用
注意:说明:
通过 SDK 集成接入的客户需要进行签名操作,分为 Java、Objective-C 和 Go 语言版本,请参照下方介绍。
记录控制台展示出的应用 ID 与应用密钥,以助后续按应用创建的设备 Sign 签名的生成与鉴权。
生成按应用创建的设备 Sign 签名
按应用创建的设备 Sign 签名的生成需要两个参数:客户自定义业务控制设备唯一标识即 deviceName;上图中创建成功后返回的应用密钥。利用两个参数启动脚本,完成按应用创建的设备 Sign 签名生成。
·Java 语言
package com.android.tencentvpn.util;import io.jsonwebtoken.Jwts;import io.jsonwebtoken.SignatureAlgorithm;import java.security.Key;import java.util.Date;import javax.crypto.spec.SecretKeySpec;public class SignGenerate { private static final long EXPIRE_TIME = 72 * 60 * 60 * 1000; // 过期时间, 单位毫秒 /** * @param deviceName 业务自己控制设备唯一标识 * @param SecretKey 云api返回的 应用密钥 * @return 多网sdk 需要传入的签名字符串 最终通过setSign 调用 * */ public static String generateSign(String deviceName, String SecretKey) { try { Date now = new Date(); Date expireDate = new Date(now.getTime() + EXPIRE_TIME); Key key = new SecretKeySpec(SecretKey.getBytes(), SignatureAlgorithm.HS256.getJcaName()); return Jwts.builder() .claim("deviceName", deviceName) .expiration(expireDate) .signWith(key) .compact(); } catch (Exception e) { e.printStackTrace(); } return ""; }}
·Objective-C 语言
//podfile中添加pod 'JWT',集成JWT库 // .h文件:@interface SignGenerator : NSObject/*** @deviceName 业务自己控制设备唯一标识* @param SecretKey 云api返回的 应用密钥* @return 多网sdk 需要传入的签名字符串 最终通过setSign 调用*/ + (NSString *)generateSignWithDeviceName:(NSString *)deviceName secretKey:(NSString *)secretKey;@end// .m文件#import "SignGenerator.h"#import <JWT/JWT.h>@implementation SignGenerator+ (NSString *)generateSignWithDeviceName:(NSString *)deviceName secretKey:(NSString *)secretKey { // 1. 设置过期时间(72小时后) NSDate *currentDate = [NSDate date]; NSDate *expireDate = [currentDate dateByAddingTimeInterval:72 * 60 * 60]; // 2. 构建 Claims(负载) NSDictionary *claims = @{ @"deviceName": deviceName, @"exp": @((long)[expireDate timeIntervalSince1970]) // Expiration }; NSData *keyData = [secretKey dataUsingEncoding:NSUTF8StringEncoding]; // 3. 使用 HS256 算法和密钥签名 JWTBuilder *builder = [JWTBuilder encodePayload:claims] .secretData(keyData) .algorithmName(@"HS256"); //算法名 NSString *jwt = builder.encode; // 4. 错误处理 if (builder.jwtError) { NSLog(@"JWT 生成失败: %@", builder.jwtError); return @""; } return jwt;}@end
·Go 语言
package mainimport ( "fmt" "github.com/dgrijalva/jwt-go/v4" "time")func main() { sign, expireTime, err := GenerateSign("tencent-test") if err != nil { panic(err) } println(sign, expireTime)}// SignClaims JwtCustomClaimstype SignClaims struct { jwt.StandardClaims DeviceName string `json:"deviceName"`}var ( ExpireTime = 72 // 过期时间, 单位小时 SecretKey = []byte("shCrVLKq/Hp6UdtVpw8lBqu6ZDcLwOABf2Az67e/pjI=") // APP密钥)// GenerateSign 生成签名func GenerateSign(deviceName string) (string, int64, error) { expireTime := time.Now().Add(time.Duration(ExpireTime) * time.Hour) claims := &SignClaims{ StandardClaims: jwt.StandardClaims{ NotBefore: jwt.Now(), ExpiresAt: jwt.At(expireTime), }, DeviceName: deviceName, } println(fmt.Sprintf("%#v", claims)) token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) sign, err := token.SignedString(SecretKey) if err != nil { return "", 0, err } return sign, expireTime.Unix(), nil}
·ArkTS 语言
// 依赖 @ohos/jsonwebtoken 库用于生成 JWT 签名// "dependencies": {// "@ohos/jsonwebtoken": "1.0.2"// },import jwt from '@ohos/jsonwebtoken';import { JwtPayload } from '@ohos/jsonwebtoken';const SIGN_EXPIRE_TIME = 72 * 60 * 60 * 1000; // 过期时间,72小时,单位毫秒function generateSign(deviceName: string, secretKey: string): string { try { let exp = Math.floor((Date.now() + SIGN_EXPIRE_TIME) / 1000); let payload: JwtPayload = { deviceName: deviceName, exp: exp }; let token: string = jwt.sign(payload, secretKey); hilog.info(DOMAIN, TAG, "generateSign success, jwt=%{public}s", token); return token; } catch (e) { hilog.error(DOMAIN, TAG, "generateSign error: %{public}s", JSON.stringify(e)); return ""; }}
设置应用签名鉴权
调用接口 setSign,传入创建应用时记录的 appId 即应用 ID 和 sign 即签名字符串,完成按应用创建的设备,设置应用签名鉴权。
注意:1. 签名建议在服务端生成下发到终端,不建议把应用 ID,应用密钥等在设备端暴露和存储,避免安全风险。
注意:2. 设备名称 deviceName 请严格保持每个物理设备和 deviceName 一一对应。按应用鉴权方式下,设备用量监控/流量统计需要以 deviceName 作为索引获取。多设备混用 deviceName 或者一个设备使用多个 deviceName 会导致查询异常。
注意:3. 过期时间可以不加入计算。如果不加入,则该签名没有失效时间。
注意:4. 如果过期时间加入计算。则超过过期时间的签名会实现,无法完成加速鉴权。
二、2. 查看动态设备/应用详情
单击查看详情,进入该设备/应用的详情页面。
详情页面展示设备信息和设备相关的网络情况,展示聚合服务器节点和上下行速率统计,同时展示流量包列表。
进入设备管理 > 网络信息,单击查看实时监控,将跳转至该设备的实时流量监控页面。
三、3. 修改动态设备/应用信息
在应用详情页面基本信息卡片中,单击修改,即可修改设备名称和备注字段。
四、4. 删除应用
你可以在管理设备页面删除你的设备/应用,删除操作支持单选设备和多选设备。
选中需要删除的设备前方的勾选框,在列表上方,单击删除设备,弹出二次确认弹窗,单击确认后删除设备。
注意:设备/应用删除后,该设备的密钥将会失效,已经产生的 License 授权费用和流量费用不会减免,将按照正常的出账周期进行结算。
五、5.1 Android SDK
注意:说明:
注意:SDK 下载和详细文档请参考 API 概览,此处只列举这篇相关功能对应的特定接口。
六、setSign
设置应用签名鉴权,用于按应用创建的设备。
public static void setSign(String appId, String sign)
参数说明:
| 参数 | 类型 | 描述 |
| appId | String | 应用 appId |
| sign | String | 签名字符串 |
七、5.2 iOS SDK
注意:说明:
注意:SDK 下载和详细文档请参考 API 概览,此处只列举这篇相关功能对应的特定接口。
八、setSign
设置应用签名鉴权。
func setSign(appId: String, sign: String)
| 参数 | 描述 |
| appId | 应用 ID |
| sign | 签名 |
九、5.3 HarmonyOS SDK
注意:说明:
注意:SDK 下载和详细文档请参考 API 概览,此处只列举这篇相关功能对应的特定接口。
十、setSign
用户按应用创建的设备,设置应用签名鉴权。
static setSign(appId: string, sign: string)
| 参数 | 描述 |
| appId | 应用 appId |
| sign | 签名字符串 |
十一、5.4 Windows SDK
注意:说明:
注意:SDK 下载和详细文档请参考 API 概览,此处只列举这篇相关功能对应的特定接口。
十二、配置加速参数
在启动加速进程前,vendor 厂商需要收集必选参数,在启动 sdk 加速时需要作为参数携带。
·appId 和 appSign:app 模式注册,在控制台获取。
·scheduleMode:默认工作模式为 rtc。
调用如下接口配置加速的各项参数(仅配置参数不启动加速):
curl -X POST "http://127.0.0.1:9801/api/v2/client/mp-speeder" ^-H "accept: */*" ^-H "Content-Type: application/json" ^-d "{\\"serviceMode\\": 0,\\"appId\\":\\"app-0eoo3vpctx\\",\\"appSign\\":\\"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkZXZpY2VOYW1lIjoiamFja3ktdGVzdC0yMC0xIn0.TleKYrzBL1dyp2i8WTBgs8Y8UvBJQv-n2A2BRMT1xuQ\\",\\"scheduleMode\\":\\"rtc\\"}"
本接口传入 Client 实体,定义如下:
| 名称 | 类型 | 说明 |
| appId | string | app 模式注册下使用。 |
| appSign | string | app 模式注册下使用。 |
| scheduleMode | string | 可选:Windows 默认加速模式 "rtc"。 |