• 沒有找到結果。

设备控制类_IdeaHub_API参考_错误码_华为云

N/A
N/A
Protected

Academic year: 2022

Share "设备控制类_IdeaHub_API参考_错误码_华为云"

Copied!
484
0
0

加載中.... (立即查看全文)

全文

(1)

IdeaHub Pro, S, Enterprise HTTP API 编程参考

文档版本 01

发布日期 2020-11-20

(2)

非经本公司书面许可,任何单位和个人不得擅自摘抄、复制本文档内容的部分或全部,并不得以任何形式传 播。

商标声明

和其他华为商标均为华为技术有限公司的商标。

本文档提及的其他所有商标或注册商标,由各自的所有人拥有。

注意

您购买的产品、服务或特性等应受华为公司商业合同和条款的约束,本文档中描述的全部或部分产品、服务或 特性可能不在您的购买或使用范围之内。除非合同另有约定,华为公司对本文档内容不做任何明示或默示的声 明或保证。

由于产品版本升级或其他原因,本文档内容会不定期进行更新。除非另有约定,本文档仅作为使用指导,本文 档中的所有陈述、信息和建议不构成任何明示或暗示的担保。

华为技术有限公司

地址: 深圳市龙岗区坂田华为总部办公楼 邮编:518129

网址: https://e.huawei.com

(3)

目 录

1 简介...1

1.1 API 简介...1

1.2 相关背景知识... 1

1.3 版本配套说明... 1

2 开发指南...2

2.1 环境搭建...2

2.1.1 开发工具... 2

2.1.2 新建工程... 2

2.1.3 基本配置... 5

2.1.4 工程结构... 7

2.2 通用接口使用概述... 13

2.3 登录认证... 15

2.3.1 请求 SessionID...16

2.3.2 登录 Login... 17

2.3.3 更换 SessionID...18

2.4 呼叫... 19

2.5 取消呼叫... 21

2.6 查询基本信息...21

2.7 召集... 22

2.8 登出... 25

3 HTTP API 接口... 26

3.1 函数接口... 26

3.1.1 登录认证类... 26

3.1.1.1 请求会话 ID... 26

3.1.1.2 请求认证... 28

3.1.1.3 更换会话 ID... 29

3.1.1.4 请求邮箱数据...31

3.1.1.5 订阅邮箱状态数据... 37

3.1.1.6 取消订阅邮箱状态数据... 39

3.1.1.7 订阅邮箱消息数据... 41

3.1.1.8 取消订阅邮箱消息... 42

3.1.1.9 退出登录... 44

(4)

3.1.2 配置类... 45

3.1.2.1 配置导入密码校验... 45

3.1.2.2 配置导入... 46

3.1.2.3 生成配置文件...47

3.1.2.4 导出配置文件...48

3.1.2.5 读取配置项缺省值... 49

3.1.2.6 读取配置项当前值... 51

3.1.2.7 保存配置项参数... 53

3.1.2.8 获取某个配置项值的可选范围列表...55

3.1.2.9 读取 SNMP 配置项缺省值...56

3.1.2.10 读取 SNMP 配置项当前值... 59

3.1.2.11 保存 SNMP 配置项参数...62

3.1.3 通讯录类... 65

3.1.3.1 获取通讯录会场列表...65

3.1.3.2 新增一条会场记录... 73

3.1.3.3 修改会场记录...76

3.1.3.4 删除会场记录...79

3.1.3.5 获取群组列表...80

3.1.3.6 新增群组记录...82

3.1.3.7 修改群组记录...84

3.1.3.8 删除群组记录...85

3.1.3.9 获取记录本缺省名称...86

3.1.3.10 请求通讯录变化的 ID 列表... 88

3.1.3.11 搜索 LDAP 通讯录... 90

3.1.3.12 获取已搜索到的 LDAP 通讯录结果列表...91

3.1.3.13 保存 LDAP 通讯录... 97

3.1.3.14 通讯录导入到终端...98

3.1.3.15 通讯录导出... 100

3.1.3.16 通讯录导出文件请求... 101

3.1.4 会议、呼叫类...101

3.1.4.1 获取当前支持的线路类型...101

3.1.4.2 获取线路类型所支持的速率... 103

3.1.4.3 获取线路类型和呼叫带宽...105

3.1.4.4 点对点呼叫 1... 110

3.1.4.5 点对点呼叫 2... 113

3.1.4.6 召集会议... 115

3.1.4.7 获取会议模板列表...120

3.1.4.8 新增或修改预定义会议列表... 127

3.1.4.9 删除预定义会议列表... 128

3.1.4.10 获取即时消息历史记录列表...130

(5)

3.1.4.13 获取会议历史记录列表... 135

3.1.4.14 删除会议历史记录... 141

3.1.4.15 本地会场接听或挂断来电... 142

3.1.4.16 挂断呼叫... 143

3.1.4.17 本地会场取消呼叫... 145

3.1.4.18 获取点对点的呼叫记录... 146

3.1.4.19 查询预约会议列表... 150

3.1.4.20 Welink 华为云服务呼叫... 151

3.1.5 会议控制类... 152

3.1.5.1 查询会议信息(包含会场列表)...152

3.1.5.2 获取会议信息... 162

3.1.5.3 观看会场... 168

3.1.5.4 主席结束会议... 169

3.1.5.5 声控切换... 170

3.1.5.6 广播会场... 172

3.1.5.7 停止广播... 173

3.1.5.8 释放主席... 174

3.1.5.9 申请发言... 176

3.1.5.10 挂断会场... 177

3.1.5.11 主席开关 MIC... 178

3.1.5.12 主席开关扬声器... 180

3.1.5.13 主席添加通讯录会场入会... 181

3.1.5.14 主席呼叫未入会会场... 183

3.1.5.15 主席延长会议... 184

3.1.5.16 申请主席... 186

3.1.5.17 验证申请主席密码... 187

3.1.5.18 主席添加临时会场... 188

3.1.5.19 确认会控密码... 190

3.1.5.20 查看会场信息... 191

3.1.5.21 发送鉴权会议密码... 197

3.1.5.22 验证申请主席的密码... 198

3.1.5.23 录播... 199

3.1.5.24 查询当前正在观看的会场信息... 201

3.1.5.25 获取会议演示令牌状态... 203

3.1.5.26 主席删除会场... 204

3.1.6 图像与声音类...206

3.1.6.1 打开 MIC 开关... 206

3.1.6.2 关闭 MIC 开关... 207

3.1.6.3 音频输出设置... 208

3.1.6.4 查询是否接入演示输入源...210

3.1.6.5 查询当前是否正在发送演示... 211

3.1.6.6 启动发送演示... 213

(6)

3.1.6.7 停止发送演示... 214

3.1.6.8 查询是否正在接收远端演示... 215

3.1.6.9 查询单个无线演示客户端信息... 216

3.1.6.10 查询所有无线演示客户端信息... 218

3.1.6.11 是否允许无线演示连接... 220

3.1.6.12 当前是否连接无线演示... 222

3.1.6.13 断开无线演示... 223

3.1.6.14 读取组合画面/画中画模式... 224

3.1.6.15 设置组合画面/画中画模式... 227

3.1.6.16 开始暂隐图像... 228

3.1.6.17 停止暂隐图像... 229

3.1.6.18 设置扬声器音量... 230

3.1.6.19 开始音量检测... 232

3.1.6.20 获取音量指示参数... 233

3.1.6.21 获取音频参数... 234

3.1.6.22 设置音频参数... 236

3.1.6.23 设置本地音频输出... 237

3.1.6.24 查询接入视频源状态... 238

3.1.6.25 查询视频源... 240

3.1.6.26 设置主流和演示视频源... 242

3.1.6.27 远端摄像机预置位个数查询...243

3.1.6.28 摄像机预置位查询... 245

3.1.6.29 切换主流或演示视频源... 247

3.1.6.30 获取主流视频源... 248

3.1.6.31 获取演示视频源... 250

3.1.6.32 改变输出口显示内容... 251

3.1.6.33 改变其他输出口显示内容... 253

3.1.6.34 读取输出口显示内容... 254

3.1.6.35 设置演示屏画面内容... 257

3.1.6.36 进入摄像机控制界面... 258

3.1.6.37 启动视频监控... 259

3.1.6.38 获取监控图片... 261

3.1.6.39 停止视频监控... 262

3.1.6.40 图像抓拍... 264

3.1.6.41 摄像机控制... 265

3.1.6.42 摄像机画面显示与隐藏... 267

3.1.6.43 协作模式下获取组合画面信息... 269

3.1.6.44 设置组合画面模式... 274

3.1.6.45 设置组合画面内容... 276

3.1.6.46 设置全屏显示... 278

(7)

3.1.6.49 选看会场-多流... 283

3.1.6.50 本端会场显示状态-多流...284

3.1.6.51 本端会场显示-多流... 285

3.1.6.52 释放选看锁定-多流... 287

3.1.6.53 交换大小画面-多流... 288

3.1.6.54 设置 LCD 亮度... 289

3.1.6.55 单独设置扬声器音量... 291

3.1.6.56 信号通道切换... 292

3.1.7 版本与状态类...293

3.1.7.1 获取系统信息和终端规格...293

3.1.7.2 获取终端线路状态...297

3.1.7.3 获取视频输入口状态... 301

3.1.7.4 获取通话状态,包括会议中的实时信息... 305

3.1.7.5 获取多流会议中的通话状态... 311

3.1.7.6 获取当前会议参数...316

3.1.7.7 获取终端型号/版本信息... 322

3.1.7.8 获取外接摄像机版本信息...324

3.1.7.9 查询终端连接的外设序列号... 325

3.1.7.10 获取本地状态... 327

3.1.7.11 查询是否是 RP 型号... 329

3.1.7.12 更新 Touch 信息...331

3.1.8 日志类...332

3.1.8.1 查询日志记录... 332

3.1.8.2 日志导出记录... 334

3.1.9 诊断类...335

3.1.9.1 开启本地自环测试...335

3.1.9.2 开启远端环回测试...336

3.1.9.3 停止自环测试... 338

3.1.9.4 启动声音测试... 339

3.1.9.5 停止声音测试... 340

3.1.9.6 启动色条测试... 341

3.1.9.7 停止色条测试... 342

3.1.9.8 查询终端声音/色条测试状态...343

3.1.9.9 查询终端回环测试状态... 345

3.1.9.10 一键诊断... 347

3.1.10 终端控制类...349

3.1.10.1 查询休眠状态... 349

3.1.10.2 启动系统休眠... 350

3.1.10.3 唤醒休眠... 351

3.1.10.4 关机... 352

3.1.10.5 重启终端... 353

3.1.10.6 获取本地时间日期... 354

(8)

3.1.10.7 设置本地时间日期... 356

3.1.10.8 系统休眠... 358

3.1.10.9 设置界面编辑框... 359

3.1.11 巡检类... 360

3.1.11.1 巡检开始请求... 360

3.1.11.2 下发巡检项... 361

3.1.11.3 巡检状态查询... 363

3.1.11.4 巡检结果查询... 364

3.1.11.5 强制停止巡检请求... 366

3.1.11.6 获取音视频能力... 367

3.1.12 基础服务... 372

3.1.12.1 激活 SMC\SMC2.0...373

3.1.12.2 华为云激活... 374

3.1.12.3 激活码输入... 376

3.2 消息接口... 377

3.2.1 登录认证类... 377

3.2.2 配置类...378

3.2.3 通讯录类... 379

3.2.4 会议开始类... 380

3.2.5 会议控制类... 387

3.2.6 图像与声音类...399

3.2.7 版本与状态类...402

3.2.8 诊断类...403

3.2.9 终端控制类... 406

3.2.10 基础服务... 409

4 配置项... 410

4.1 基本信息... 410

4.2 图标显示... 412

4.3 网络配置... 413

4.4 GK\SIP...414

4.5 网络安全与服务... 415

4.6 会议参数... 419

4.7 视频输入... 423

4.8 视频输出... 425

4.9 音频参数... 426

4.10 通讯录...426

4.11 云服务...427

4.12 TR069... 428

4.13 uPortal... 429

4.14 AI 配置...429

(9)

6 枚举定义... 434

6.1 线路类型... 434

6.2 呼叫状态... 434

6.3 会议类型... 434

6.4 呼叫操作类型... 435

6.5 PSTN 状态... 435

6.6 呼叫带宽... 435

6.7 设备类型... 436

6.8 视频协议... 436

6.9 音频协议... 436

6.10 视频格式... 437

6.11 摄像机类型... 437

7 错误码... 439

7.1 登录类... 439

7.2 配置类... 439

7.3 会议控制类... 443

7.4 呼叫类... 443

7.5 设备控制类... 450

7.6 诊断类... 452

7.7 系统类... 452

7.8 通讯录类... 452

7.9 服务器异常... 453

7.10 其他... 454

8 数据定义... 455

8.1 SNMP 结构体... 455

8.2 通讯录会场结构... 455

8.3 会议列表结构... 458

8.4 音频参数结构... 460

8.5 音量指示数据... 461

8.6 终端规格... 461

8.7 线路状态数据... 462

8.8 预定义会议/历史会议结构...463

9 附录... 465

9.1 国家或者地区选项枚举值... 465

9.2 时区选项枚举值...468

9.3 获取国家和时区可选范围列表的示例...471

9.4 颜色矩阵... 474

(10)

1 简介

1.1 API 简介

本文档描述的HTTP API(Application Programming Interface)接口,为用户提供了 控制设备的操作入口,包括:登录认证、会议控制、修改系统配置、查询各种状态参 数等功能。通过这些接口,用户可以根据自身需求和场景,自由实现控制设备的目 的。

1.2 相关背景知识

超文本传输协议(HTTP)是应用层协议,由于其简捷、快速的方式,适用于分布式和 合作式超媒体信息系统。自1990年起, HTTP就已经被应用于WWW全球信息服务系 统。

HTTP允许使用自由答复的方法表明请求目的,它建立在统一资源识别器(URI)提供 的参考原则下,作为一个地址(URL)或名字(URN),用以标志采用哪种方法,它 用类似于网络邮件和多用途网际邮件扩充协议(MIME)的格式传递消息。

1.3 版本配套说明

本文档主要描述HUAWEI IdeaHub Pro、IdeaHub S和IdeaHub Enterprise(以下简称 终端)的对外API接口及其使用方法。

(11)

2 开发指南

2.1 环境搭建

2.1.1 开发工具

本项目为简单的原生java项目,使用前请先安装jdk。案例中使用的jdk版本为jdk11。

请下载java文本编辑开发工具idea。

2.1.2 新建工程

idea新建工程的步骤如下:

步骤1 打开idea,选择“File > New > Project”。如图2-1所示:

(12)

2-1 新建项目

步骤2 选择“gradle > Next”。如图2-2所示:

2-2 选择路径

(13)

步骤3 输入新建工程名,选择Finish。如图2-3所示:

2-3 修改工程名

步骤4 项目的gradle工程创建完毕。工程创建完成后目录如图2-4所示:

2-4 工程目录

----结束

(14)

2.1.3 基本配置

步骤1 build.gradle中为工程所依赖的一些maven库jar包,以及工程打包的结构。工程新建完 成以后有一个初始化的build.gradle文件,需要用如下内容替换初始生成的gradle文 件。

plugins { id 'application'

}group 'com.huawei.cloudlink' version '1.0-release'

sourceCompatibility = 1.8 repositories {

maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' } maven { url 'http://maven.aliyun.com/nexus/content/repositories/jcenter' } maven { url 'http://maven.aliyun.com/nexus/content/repositories/google' } maven { url 'http://maven.aliyun.com/nexus/content/repositories/gradle-plugin' } }

dependencies {

compile 'commons-beanutils:commons-beanutils:1.9.4' compile 'commons-collections:commons-collections:3.2.2' compile 'commons-lang:commons-lang:2.6'

compile 'commons-logging:commons-logging:1.2' compile 'org.apache.httpcomponents:httpclient:4.5.7' compile 'org.apache.httpcomponents:httpcore:4.4.11' compile 'org.apache.httpcomponents:httpmime:4.5.9' compile 'org.json:json:20190722'

}

mainClassName = 'com.huawei.cloudlink.Main' task generateJar(type: Jar, dependsOn:['build']) { archiveName = "Controller${version}.jar"

from('build/classes/java/main') manifest{

// manifest 文件声明主程序入口

attributes "Main-Class":"com.huawei.cloudclink.Main"

} from {

//添加依赖到打包文件

configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }

destinationDir = file('release')

}task zip(type: Zip,dependsOn:['generateJar']) { from 'release'

destinationDir file('./') baseName 'hwcontroller' version ''

}build.finalizedBy(zip)

步骤2 替换完成后点击如图1小笨象刷新工程:

(15)

2-5 小笨象

步骤3 工程右键New > Package, 新建一个包名com.huawei.ideahub, 回车确认:

2-6 新建 com.huawei.ideahub 包流程

步骤4 如图所示输入包名

2-7 输入包名

步骤5 建好包以后,右击包名,新建一个Main入口函数,New-->Java Class:

2-8 新建 Main.java 类流程

步骤6 输入类名为Main,选择Class,回车确认:

(16)

2-9 新建 Main.java 类

----结束

2.1.4 工程结构

工程的主要目录结构如下:

2-10 工程目录结构

Main.java

为函数的主入口,在main函数中需要配置三个参数:1.访问的函数名称 2.登录用户账 户 3.登录用户密码

如图 args = new String[] {"WEB_CallSiteAPI","api","Change_Me"},

说明

这里的 api, Change_Me 应该改成用户登录的用户名密码,如本次访问的环境为https://

192.168.32.77,则应该改成该环境的登录用户名密码 /**

* 主函数入口 *

* @param args 用户输入的参数 */

public static void main(String[] args) {

args = new String[]{"WEB_CallSiteAPI","api","Change_Me"};

if(args.length<=2){

return;

}

initSeesionId();

token = login(HttpClientUtil.sessionId, args);

if (TextUtils.isEmpty(token)) { systemPrint("login failed");

return;

}

(17)

HttpClientUtil.java

为http请求连接池工具类。HttpClientUtil.java内容如下:

package com.huawei.ideahub;

import org.apache.http.*;

import org.apache.http.client.ClientProtocolException;

import org.apache.http.client.HttpRequestRetryHandler;

import org.apache.http.client.config.RequestConfig;

import org.apache.http.client.methods.*;

import org.apache.http.client.protocol.HttpClientContext;

import org.apache.http.config.Registry;

import org.apache.http.config.RegistryBuilder;

import org.apache.http.conn.ConnectTimeoutException;

import org.apache.http.conn.socket.ConnectionSocketFactory;

import org.apache.http.conn.socket.LayeredConnectionSocketFactory;

import org.apache.http.conn.socket.PlainConnectionSocketFactory;

import org.apache.http.conn.ssl.SSLConnectionSocketFactory;

import org.apache.http.conn.ssl.SSLContextBuilder;

import org.apache.http.conn.ssl.TrustStrategy;

import org.apache.http.conn.ssl.X509HostnameVerifier;

import org.apache.http.entity.ContentType;

import org.apache.http.entity.StringEntity;

import org.apache.http.entity.mime.HttpMultipartMode;

import org.apache.http.entity.mime.MultipartEntityBuilder;

import org.apache.http.impl.client.CloseableHttpClient;

import org.apache.http.impl.client.HttpClients;

import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;

import org.apache.http.protocol.HttpContext;

import org.apache.http.util.EntityUtils;

import org.json.JSONObject;

import javax.net.ssl.*;

import java.io.File;

import java.io.IOException;

import java.io.InterruptedIOException;

import java.io.UnsupportedEncodingException;

import java.net.UnknownHostException;

import java.nio.charset.Charset;

import java.security.KeyManagementException;

import java.security.KeyStoreException;

import java.security.NoSuchAlgorithmException;

import java.security.cert.CertificateException;

import java.security.cert.X509Certificate;

import java.text.Normalizer;

import java.text.Normalizer.Form;

import java.util.Map;

/** * 功能描述:连接池 * @since 2020/7/1 */public class HttpClientUtil { /**

* 每一个请求都会用到的sessionid */

public static String sessionId;

/**

* HttpClient对象 */

private static CloseableHttpClient httpclient = null;

// 这里就直接默认固定了,因为以下三个参数在新建的method中仍然可以重新配置并被覆盖.

static final int CONNECT_IONREQUEST_TIMEOUT = 5000; // ms毫秒,从池中获取链接超时时间 static final int CONNECTT_IMEOUT = 5000; // ms毫秒,建立链接超时时间

static final int SOCKET_TIMEOUT = 30000; // ms毫秒,读取超时时间

(18)

// 总配置,主要涉及是以下两个参数,如果要作调整没有用到properties会比较后麻烦,但鉴于一经粘贴,随处可用 的特点,就不再做依赖性配置化处理了.

// 而且这个参数同一家公司基本不会变动.

static final int MAX_TOTAL = 50; // 最大总并发,很重要的参数 static final int MAX_PERROUTE = 10; // 每路并发,很重要的参数 // 正常情况这里应该配成MAP或LIST

// 细化配置参数,用来对每路参数做精细化处理,可以管控各ip的流量,比如默认配置请求baidu:80端口最大100个 并发链接,

private static CloseableHttpClient getHttpClient() { if (null == httpclient) {

synchronized (HttpClientUtil.class) { if (null == httpclient) {

httpclient = init();

} } }

return httpclient;

} /**

* 链接池初始化 这里最重要的一点理解就是. 让CloseableHttpClient 一直活在池的世界里, 但是HttpPost却一 直用完就消掉.这样可以让链接一直保持着.

* @return 初始化 */

private static CloseableHttpClient init() { CloseableHttpClient newHttpclient = null;

// 设置连接池

PoolingHttpClientConnectionManager cm = getPoolingHttpClientConnectionManager();

// 请求重试处理

HttpRequestRetryHandler httpRequestRetryHandler = getHttpRequestRetryHandler();

// 配置请求的超时设置

RequestConfig requestConfig =

RequestConfig.custom().setConnectionRequestTimeout(CONNECT_IONREQUEST_TIMEOUT) .setConnectTimeout(CONNECTT_IMEOUT).setSocketTimeout(SOCKET_TIMEOUT).build();

newHttpclient =

HttpClients.custom().setConnectionManager(cm).setDefaultRequestConfig(requestConfig) .setRetryHandler(httpRequestRetryHandler).build();

return newHttpclient;

}

private static HttpRequestRetryHandler getHttpRequestRetryHandler() { return new HttpRequestRetryHandler() {

@Override

public boolean retryRequest(IOException exception, int executionCount, HttpContext context) { if (executionCount >= 2) { // 如果已经重试了2次,就放弃

return false;

}

if (exception instanceof NoHttpResponseException) { // 如果服务器丢掉了连接,那么就重试 return true;

}

if (exception instanceof SSLHandshakeException) { // 不要重试SSL握手异常 return true;

}

if (exception instanceof InterruptedIOException) { // 超时 return false;

}

if (exception instanceof UnknownHostException) { // 目标服务器不可达 return false;

}

if (exception instanceof ConnectTimeoutException) { // 连接被拒绝 return false;

}

(19)

}

HttpClientContext clientContext = HttpClientContext.adapt(context);

HttpRequest request = clientContext.getRequest();

// 如果请求是幂等的,就再次尝试

if (!(request instanceof HttpEntityEnclosingRequest)) { return true;

}

return false;

}};

}

private static PoolingHttpClientConnectionManager getPoolingHttpClientConnectionManager() { LayeredConnectionSocketFactory sslsf = null;

try {

SSLContext sslContext = getSslContext();

sslsf = new SSLConnectionSocketFactory(sslContext, new X509HostnameVerifier() { /**

* @param arg0 String * @param arg1 SSLSession * @return boolean */

public boolean verify(String arg0, SSLSession arg1) { return true;

} /**

*

* @param host String * @param ssl SSLSocket * @throws IOException */

public void verify(String host, SSLSocket ssl) throws IOException { }

/**

*

* @param host String * @param cert X509Certificate * @throws SSLException */

public void verify(String host, X509Certificate cert) throws SSLException { }

/**

*

* @param host String * @param cns String[]

* @param subjectAlts String[]

* @throws SSLException 握手异常 */

public void verify(String host, String[] cns, String[] subjectAlts) throws SSLException { }

});

} catch (KeyManagementException e) { } catch (NoSuchAlgorithmException e) { } catch (KeyStoreException e) { }

return getPoolingHttpClientConnectionManager(sslsf);

}

private static PoolingHttpClientConnectionManager

getPoolingHttpClientConnectionManager(LayeredConnectionSocketFactory sslsf) { if (null == sslsf) {

sslsf = SSLConnectionSocketFactory.getSocketFactory();

}

ConnectionSocketFactory plainsf = PlainConnectionSocketFactory.getSocketFactory();

Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create() .register("http", plainsf).register("https", sslsf).build();

PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(registry);

// 将最大连接数增加

(20)

cm.setMaxTotal(MAX_TOTAL);

// 将每个路由基础的连接增加

cm.setDefaultMaxPerRoute(MAX_PERROUTE);

return cm;

}

private static SSLContext getSslContext() throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException {

return new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() { @Override

public boolean isTrusted(X509Certificate[] arg0, String arg1) throws CertificateException { return true;

} }).build();

} /**

* Get请求 *

* @param uri 请求url

* @param headerMap 请求头集合 * @return JSONObject

*/

public static JSONObject get(String uri, Map<String, String> headerMap) { return excute(uri, HttpGet.METHOD_NAME, null, headerMap);

} /**

* Delete请求 *

* @param uri 请求url

* @param headerMap 请求头集合 * @return JSONObject

*/

public static JSONObject delete(String uri, Map<String, String> headerMap) { return excute(uri, HttpDelete.METHOD_NAME, null, headerMap);

} /**

* Put请求 *

* @param uri 请求url

* @param bodyParamsJsonObject body参数 * @param headerMap 请求头集合 * @return JSONObject

*/

public static JSONObject put(String uri, JSONObject bodyParamsJsonObject, Map<String, String>

headerMap) {

return excute(uri, HttpPut.METHOD_NAME, bodyParamsJsonObject, headerMap);

} /**

* Post请求 *

* @param uri 请求url

* @param bodyParamsJsonObject body参数 * @param headerMap 请求头集合 * @return JSONObject

*/

public static JSONObject post(String uri, JSONObject bodyParamsJsonObject, Map<String, String>

headerMap) {

return excute(uri, HttpPost.METHOD_NAME, bodyParamsJsonObject, headerMap);

} /**

* @param uri 请求url

(21)

* @param headerMap 请求头集合 * @return 返回json字符串

*/

public static JSONObject excute(String uri, String methodType, JSONObject bodyParamsJsonObject, Map<String, String> headerMap) {

uri = Normalizer.normalize(uri, Form.NFKC);

// 1.创建请求对象

HttpRequestBase httpRequest = getHttpRequest(uri, methodType);

// 2.设置请求头Header

if (headerMap != null && !headerMap.isEmpty()) {

for (Map.Entry<String, String> entry : headerMap.entrySet()) { httpRequest.setHeader(entry.getKey(), entry.getValue());

} }

CloseableHttpResponse response = null;

try {

// 3.设置Body请求参数。只对put和post方法有效

setBody(methodType, bodyParamsJsonObject, (HttpEntityEnclosingRequestBase) httpRequest);

// 4.发起请求并解析响应

response = getHttpClient().execute(httpRequest);

if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { if (isNeedParseHeader(uri)) {

sessionId = response.getFirstHeader("Set-Cookie").getValue().split(";")[0];

} else {

HttpEntity entity = response.getEntity();

if (null != entity) {

String string = EntityUtils.toString(entity, "UTF-8");

JSONObject jsonObject = new JSONObject(string);

return jsonObject;

} } } else { return null;

}

} catch (UnsupportedEncodingException e) { } catch (ClientProtocolException e) { } catch (Exception e) {

} finally {

if (null != response) { try {

EntityUtils.consume(response.getEntity());

response.close();

} catch (IOException e) { }

} }

return null;

}

private static HttpEntity resEntity;

/**

* 上传文件 *

* @throws ParseException * @throws IOException */

public static String upgradeSystem(String url, String token, String filePath) throws ParseException, IOException {

try {

// 要上传的文件的路径

// 把一个普通参数和文件上传给下面这个地址 是一个servlet HttpPost httpPost = new HttpPost(url);

httpPost.setHeader("acCSRFToken", token);

String sessionIdNew = sessionId.split(";")[0];

httpPost.setHeader("Cookie", sessionIdNew);

httpPost.setHeader("X-Requested-With", "XMLHttpRequest");

httpPost.setHeader("Connection", "keep-alive");

(22)

// 把文件转换成流对象FileBody File file = new File(filePath);

MultipartEntityBuilder mutiEntity = MultipartEntityBuilder.create();

mutiEntity.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);

mutiEntity.addBinaryBody("uploadFile", file, ContentType.create("application/octet-stream"),

"cloudlink.dat");

HttpEntity reqEntity = mutiEntity.build();

httpPost.setEntity(reqEntity);

// 发起请求 并返回请求的响应

CloseableHttpResponse response = getHttpClient().execute(httpPost);

try {

resEntity = response.getEntity();

if (resEntity != null) { // 打印响应长度 // 打印响应内容

String result=EntityUtils.toString(resEntity, Charset.forName("UTF-8"));

return result;

}else{

return null;

} } finally { // 销毁

EntityUtils.consume(resEntity);

} } finally { } }

private static void setBody(String methodType, JSONObject bodyParamsJsonObject, HttpEntityEnclosingRequestBase httpRequest) throws UnsupportedEncodingException { if (bodyParamsJsonObject != null && !bodyParamsJsonObject.isEmpty()

&& (HttpPut.METHOD_NAME.equalsIgnoreCase(methodType) || HttpPost.METHOD_NAME.equalsIgnoreCase(methodType))) { String bodyParams = bodyParamsJsonObject.toString().trim();

if (!bodyParams.isEmpty()) {

HttpEntity entity = new StringEntity(bodyParams);

httpRequest.setEntity(entity);

} } }

private static HttpRequestBase getHttpRequest(String uri, String methodType) { HttpRequestBase httpRequest = null;

if (HttpDelete.METHOD_NAME.equalsIgnoreCase(methodType)) { httpRequest = new HttpDelete(uri);

} else if (HttpPost.METHOD_NAME.equalsIgnoreCase(methodType)) { httpRequest = new HttpPost(uri);

} else if (HttpPut.METHOD_NAME.equalsIgnoreCase(methodType)) { httpRequest = new HttpPut(uri);

} else {

httpRequest = new HttpGet(uri);

}

return httpRequest;

}

private static boolean isNeedParseHeader(String uri) {

return uri.contains("WEB_RequestSessionIDAPI") || uri.contains("WEB_ChangeSessionIDAPI");

} }

2.2 通用接口使用概述

(23)

stringHashMap记录了访问接口的命令和接口名称的关联的键值对,后续有详细使用 介绍。

private static String baseUrl = "https://192.168.32.77";

private static String token;

private static HashMap<String, String> stringHashMap = new HashMap<String, String>();

说明

main函数的成员变量需要修改成此次需要访问环境的IP地址。这里IP地址https://192.168.32.77 仅为格式举例

主函数调用四个基础接口,initSeesionId, login, changeSeesionId 和 callMethodByName.

前三个接口分别为3.3小节登录认证的请求会话ID, 登录Login 和 改变SessionId 三个模 块 , 第四个接口为反射方法, 通过反射调用Main中对应的函数接口。

说明

每一个接口使用前都必须有initSeesionId和login的操作。

/** * 主函数入口 *

* @param args 用户输入的参数 */

public static void main(String[] args) {

args = new String[]{"WEB_CallSiteAPI","api","Change_Me"};

if(args.length<=2){

return;

}

initSeesionId();

token = login(HttpClientUtil.sessionId, args);

if (TextUtils.isEmpty(token)) { systemPrint("login failed");

return;

}

changeSeesionId();

callMethodByName(args);

}

callMethodByName 内容如下,参数args中带有了需要访问的method名称,所有的 method需要在Main的成员变量stringHashMap中。

以访问LogOut方法举例说明如下,args中带有Method参数名Logout, 则for循环中遍 历stringHashMap中的所有键值对,找到LogOut中对应的Main

的成员函数名称为LogOut. 下面则是一系列反射操作,先通过路径 com.huawei.ideahub.Main获取类对象。

Method mth = obj.getClass().getDeclaredMethod(methodName, String[].class);//为需要被反射的方法,可以 有参数可以无参数。

mth.invoke(obj, (Object) args);//为调用反射方法的调用逻辑。

/**

* 通过参数找到方法 通过方法名调用方法 *

* @param args 用户输入的参数 */

private static void callMethodByName(String[] args) { if (!(args.length == 3 || args.length == 4)) { systemPrint("Parameter error");

return;

}

String methodName = null;

(24)

for (String key : stringHashMap.keySet()) { if (key.contains(args[0])) {

methodName = stringHashMap.get(key);

} }

if (TextUtils.isEmpty(methodName)) { systemPrint("Parameter error");

return;

} try {

Class clz = Class.forName("com.huawei.ideahub.Main");

Object obj = clz.newInstance();

if (args.length == 3) { // 获取无参方法

Method mth = obj.getClass().getDeclaredMethod(methodName);

mth.invoke(obj);

} else if (args.length == 4) { // 获取有参方法

Method mth = obj.getClass().getDeclaredMethod(methodName, String[].class);

}

} catch (Exception e) {

systemPrint("Parameter error");

} }

stringHashMap

private static HashMap<String, String> stringHashMap = new HashMap<String, String>();

static {

stringHashMap.put("WEB_CallSiteAPI", "WEB_CallSiteAPI");

stringHashMap.put("CancelCallAPI", "CancelCallAPI");

stringHashMap.put("Logout", "Logout");

stringHashMap.put("WEB_ScheduleConfAPI", "WEB_ScheduleConfAPI");

stringHashMap.put("BaseMess", "BaseMess");

}

由此,调用一个通用接口的使用方法总结如下。

步骤1 修改main函数中args = new String[] {"","",""}中的调用命令。

步骤2 添加一个被调用成员函数,在其中写函数接口。

步骤3 在stringHashMap中新增一个键值对。键需要和main函数中的args = new String[]

{"","",""} 的第一个参数保持一致,值需要与被调用成员函数的名称保持一致。

----结束

2.3 登录认证

使用本参考文档进行开发时首先需要完成登录认证,再进行相应的业务处理,最后处 理完业务后需要登出。

(25)

2-11 API 接口的整体使用流程

说明

在使用API接口前,必须完成登录认证。认证的用户名为api,默认密码为Change_Me,实际密 码请与管理员确认。

使用本章实例前,请仔细阅读2.1 环境搭建

2.3.1 请求 SessionID

应用场景

认证用户名和密码前,建立会话。

前提条件

终端正常启动且网络正常。

接口概述

该操作获取一个新的SessionID,为下一步登录验证用户名和密码做准备。

SessionID放在响应头的Set-Cookie字段。

(26)

请求 URL

/action.cgi?ActionID=WEB_RequestSessionIDAPI

/** * 请求会话id *

* @return 返回sessionid */

private static String initSeesionId() {

String uri = baseUrl + "/action.cgi?ActionID=WEB_RequestSessionIDAPI";

Map<String, String> header = new HashMap<>();

HttpClientUtil.post(uri, null, header);

return HttpClientUtil.sessionId;

}

请求成功返回报文

HTTP/1.1 200 OK

Set-Cookie: SessionID=161419d23001a280c8cab12b4c93b1cb1757c5e99243e470d17104aa7314b8ca;

Path=/; Secure; HttpOnly Connection: Keep-Alive X-Content-Type-Options: nosniff X-Download-Options: noopen X-Frame-Options: sameorigin X-XSS-Protection: 1; mode=block

Strict-Transport-Security: max-age=31536000; includeSubdomains

Content-Security-Policy: script-src 'self' 'unsafe-eval' 'unsafe-inline' ;img-src 'self' Content-Type: text/plain

Response-Result: 1 Content-Length: 83

{"success":1,"data":"{\"acSessionId\":\"\",\"szTermType\":\"HUAWEI IdeaHub Pro\"}"}

2.3.2 登录 Login

应用场景

校验用户名和密码。

前提条件

已请求并返回SessionID。

接口概述

该接口用于验证用户名和密码,验证成功后返回CSRF Token。在使用其他业务功能API 时,必须携带CSRF Token。

请求 URL

/action.cgi?ActionID=WEB_RequestCertificateAPI

private static String login(String seesionId, String[] args) {

String uri = baseUrl + "/action.cgi?ActionID=WEB_RequestCertificateAPI";

JSONObject bodyParamsJsonObject = new JSONObject();

bodyParamsJsonObject.put("user", args[args.length - 2]);

bodyParamsJsonObject.put("password", args[args.length - 1]);

(27)

header.put("Content-type", "application/json; charset=UTF-8");

JSONObject result = HttpClientUtil.post(uri, bodyParamsJsonObject, header);

if (null != result) { try {

JSONObject tokenObject =new JSONObject(result.get("data").toString());

Object acCSRFToken = tokenObject.get("acCSRFToken");

return acCSRFToken.toString();

} catch (Exception e) { return null;

} } else { return null;

} }

登录认证接口请求报文如下:

POST https://192.168.47.99/action.cgi?ActionID=WEB_RequestCertificateAPI HTTP/1.1 Host: 192.168.47.99

Connection: keep-alive Content-Length: 120

Accept: application/json, text/plain, */*

X-Requested-With: XMLHttpRequest

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/

84.0.4147.135 Safari/537.36 Content-Type: application/json Origin: https://192.168.47.99 Sec-Fetch-Site: same-origin Sec-Fetch-Mode: cors Sec-Fetch-Dest: empty Referer: https://192.168.47.99/

Accept-Encoding: gzip, deflate, br Accept-Language: zh-CN,zh;q=0.9

Cookie: SessionID=161419d23001a280c8cab12b4c93b1cb1757c5e99243e470d17104aa7314b8ca {"user":"api","password":"Change_Me"}

登录成功后则返回一个acCSRFToken,后续操作都必须携带该Token。返回的报文如 下:

HTTP/1.1 200 OK Connection: Keep-Alive X-Content-Type-Options: nosniff X-Download-Options: noopen X-Frame-Options: sameorigin X-XSS-Protection: 1; mode=block

Strict-Transport-Security: max-age=31536000; includeSubdomains

Content-Security-Policy: script-src 'self' 'unsafe-eval' 'unsafe-inline' ;img-src 'self' Content-Type: text/plain

Response-Result: 1 Content-Length: 109

{"success":1,"data":"{\"acCSRFToken\":

\"714dc61225ec2babb7a57dabb2bcc2e126b0c8ea67a41c509c2bb77eae7391b6\"}"}

2.3.3 更换 SessionID

应用场景

用户名和密码认证通过后,更换SessionID。

前提条件

用户名和密码验证通过。

(28)

接口概述

更换会话标识。

请求 URL

/action.cgi?ActionID=WEB_ChangeSessionIDAPI

private static String changeSeesionId() {

String uri = baseUrl + "/action.cgi?ActionID=WEB_ChangeSessionIDAPI";

Map<String, String> header = new HashMap<>();

HttpClientUtil.post(uri, null, header);

return HttpClientUtil.sessionId;

}

请求成功返回报文

该操作获取了一个新的SessionID,后续API操作使用更新后的SessionID。

HTTP/1.1 200 OK

Set-Cookie: SessionID=920ac57c3a96c61a3350dd077b772d6483b75ba7a6a16b9c1531bbe7bd878580;

Path=/; Secure; HttpOnly Connection: Keep-Alive X-Content-Type-Options: nosniff X-Download-Options: noopen X-Frame-Options: sameorigin X-XSS-Protection: 1; mode=block

Strict-Transport-Security: max-age=31536000; includeSubdomains

Content-Security-Policy: script-src 'self' 'unsafe-eval' 'unsafe-inline' ;img-src 'self' Content-Type: text/plain

Response-Result: 1 Content-Length: 83

{"success":1,"data":"{\"acSessionId\":\"\",\"szTermType\":\"HUAWEI IdeaHub Pro\"}"}

2.4 呼叫

应用场景

发起点对点呼叫或者呼叫会议ID。

前提条件

已完成登录认证,终端处于空闲状态。

接口概述

前面的较长代码主要是封装请求json报文的操作,其中szName为192.168.47.99, 则该 呼叫请求为192.168.32.77(通用接口概述中配置的IP地址)呼叫99机器的操作。

值得注意的是obj.put("acCSRFToken",token);操作的是在报文中传入上述Login操作中 获取的最新token.

请求 URL

/action.cgi?ActionID=WEB_CallSiteAPI

(29)

obj.put("bIsLdapCall",0);

obj.put("bIsVideoCall",1);

obj.put("ucEnableH239",0);

obj.put("ulCallRecID",6);

obj.put("ulcallDirecID",1);

obj.put("ulCallPort",0);

obj.put("ucH235Policy",0);

JSONObject objson = new JSONObject();

objson.put("stTPS",new JSONObject());

objson.put("stCTS",new JSONObject());

objson.put("stISDN",new JSONObject());

objson.put("stIP",new JSONObject());

objson.put("stV35",new JSONObject());

objson.put("stE1",new JSONObject());

objson.put("stIPOverE1",new JSONObject());

objson.put("stT1",new JSONObject());

objson.put("stPhone",new JSONObject());

objson.put("stPSTN",new JSONObject());

objson.put("uwID",0);

objson.put("ucDevice",0);

objson.put("bIsLdap",0);

objson.put("ucOnline",0);

objson.put("uwSortPos",0);

objson.put("ucType",8);

objson.put("szName","192.168.47.99");

objson.put("szPName","");

JSONObject objGrandSon = new JSONObject();

objGrandSon.put("ucBaudRate",1920);

objGrandSon.put("szAlias","");

objGrandSon.put("szIP","");

objGrandSon.put("szUri","");

objson.put("stSIP",objGrandSon);

obj.put("stSiteInfo",objson);

obj.put("acCSRFToken", token);

systemPrint(obj.toString());

JSONObject result = HttpClientUtil.post(uri, obj, null);

try {

systemPrint("result:"+result);

} catch (Exception e) { systemPrint("failed");

} }

main 函数调用

public static void main(String[] args) {

args = new String[]{"WEB_CallSiteAPI","api","Change_Me"};

stringHashMap 配置

stringHashMap.put("WEB_CallSiteAPI", "WEB_CallSiteAPI");

请求成功返回 json 报文

{"data":"{\"resID\":0,\"num\":0,\"param1\":\"192.168.47.99\",\"param2\":

\"\"}","success":1}

(30)

2.5 取消呼叫

应用场景

取消3.4章节的呼叫

前提条件

已完成登录认证,已经发起了呼叫,终端处于空闲状态。

接口概述

挂断一个呼叫请求,token的值为上述login操作获取的值,该操作挂断一个呼叫请 求。

请求 URL

/action.cgi?ActionID=WEB_CancelCallAPI

private static void CancelCallAPI() {

String uri = baseUrl + "/action.cgi?ActionID=WEB_CancelCallAPI";

obj.put("ucSiteHandle",1);

obj.put("acCSRFToken", token);

JSONObject result = HttpClientUtil.post(uri, obj, null);

try {

systemPrint("result:"+result);

} catch (Exception e) { systemPrint("failed");

} }

main 函数调用

public static void main(String[] args) {

args = new String[]{"CancelCallAPI","api","Change_Me"};

stringHashMap 配置

stringHashMap配置:stringHashMap.put("CancelCallAPI", "CancelCallAPI");

2.6 查询基本信息

应用场景

查询时间与时区,电源管理,铃声,邮箱,用户,ai配置的基本信息。

(31)

接口概述

请求报文含义为需要查询哪些字段的结果在返回报文之中。

请求 URL

/action.cgi?ActionID=WEB_GetCfgParamAPI

//查询基本信息配置

private static void BaseMess() {

String uri = baseUrl + "/action.cgi?ActionID=WEB_GetCfgParamAPI";

JSONArray cfgArr = new JSONArray();

cfgArr.put("timezone");

cfgArr.put("timeformat");

cfgArr.put("dateformat");

cfgArr.put("daylight");

cfgArr.put("country");

cfgArr.put("synSerTime");

cfgArr.put("ntpGetMode");

cfgArr.put("timeServer");

obj.put("CfgIDString",cfgArr);

obj.put("acCSRFToken", token);

JSONObject result = HttpClientUtil.post(uri, obj, null);

try {

systemPrint("mybaseMess:"+result);

} catch (Exception e) { systemPrint("failed");

} }

main 函数调用

public static void main(String[] args) {

args = new String[]{"BaseMess","api","Change_Me"};

stringHashMap 配置

stringHashMap.put("BaseMess", "BaseMess");

token 的值为上述 login 操作获取的值,查询结果报文

{"success":1,"data":"{\"timeServer\":\"\",\"timezone\":20,\"timeformat\":

1,\"dateformat\":0,\"daylight\":1,\"country\":13,\"synSerTime\":0,\"ntpGetMode\":

1}"}

2.7 召集

应用场景

需要添加多个用户进入会议

前提条件

已完成登录认证,终端处于空闲状态。

(32)

接口概述

召集涉及的封装报文较长,罗列字段报文如下,该操作召集了三个用户。token的值为 上述login操作获取的值。

请求 URL

/action.cgi?ActionID=WEB_ScheduleConfAPI

//召集

private static void WEB_ScheduleConfAPI() {

String uri = baseUrl + "/action.cgi?ActionID=WEB_ScheduleConfAPI";

obj.put("uwID",0);

obj.put("szName","PreConf record 001");

obj.put("ucConfMode",1);

obj.put("stStartTime",new JSONObject());

obj.put("ucCallType",254);

obj.put("uwBaudRate",159);

obj.put("bSupportMultiStream",254);

obj.put("ucAuxStrmRoleLabel",254);

obj.put("ucMutiPicGroupNum",0);

obj.put("ucSubPicNum",0);

obj.put("ucMutiPicMode",0);

obj.put("ucSrtpEncrypt",2);

obj.put("bMiniMcuCallset",0);

JSONObject stMcuCallsetInfoJsonObject = new JSONObject();

stMcuCallsetInfoJsonObject.put("ucPreType",0);

JSONObject stPreTimeJsonObject = new JSONObject();

stPreTimeJsonObject.put("year",2020);

stPreTimeJsonObject.put("month",7);

stPreTimeJsonObject.put("day",30);

stPreTimeJsonObject.put("hour",22);

stPreTimeJsonObject.put("minute",10);

stPreTimeJsonObject.put("second",0);

stMcuCallsetInfoJsonObject.put("stPreTime",stPreTimeJsonObject);

stMcuCallsetInfoJsonObject.put("uwDuration",0);

stMcuCallsetInfoJsonObject.put("ucMultiPic",0);

stMcuCallsetInfoJsonObject.put("ucH235Policy",2);

stMcuCallsetInfoJsonObject.put("bDataConf",0);

stMcuCallsetInfoJsonObject.put("ucMLPRate",0);

stMcuCallsetInfoJsonObject.put("uwIPAnonymousSiteNum",0);

stMcuCallsetInfoJsonObject.put("uwISDNAnonymousSiteNum",0);

stMcuCallsetInfoJsonObject.put("uwPSTNAnonymousSiteNum",0);

stMcuCallsetInfoJsonObject.put("uwSIPAnonymousSiteNum",0);

stMcuCallsetInfoJsonObject.put("szConfCtrlPassword","");

stMcuCallsetInfoJsonObject.put("szCardNo","");

stMcuCallsetInfoJsonObject.put("szPassword","");

stMcuCallsetInfoJsonObject.put("ucPaySide",1);

stMcuCallsetInfoJsonObject.put("ucVideoEncode",254);

stMcuCallsetInfoJsonObject.put("ucVideoFormat",254);

stMcuCallsetInfoJsonObject.put("ucVideoFrame",254);

stMcuCallsetInfoJsonObject.put("ucAudioEncode",254);

stMcuCallsetInfoJsonObject.put("ucDuleAudioChn",254);

stMcuCallsetInfoJsonObject.put("ucLSDRate",0);

stMcuCallsetInfoJsonObject.put("ucAuxStreamProtocol",254);

stMcuCallsetInfoJsonObject.put("uwAuxStreamBandWidth",0);

stMcuCallsetInfoJsonObject.put("ucAuxStreamFormat",254);

stMcuCallsetInfoJsonObject.put("ucAuxStreamFrame",254);

stMcuCallsetInfoJsonObject.put("ucIsUseVoiceSwitch",0);

stMcuCallsetInfoJsonObject.put("ucVoiceSwitchType",0);

stMcuCallsetInfoJsonObject.put("ucVoiceSwitchLimit",0);

(33)

obj.put("uwTotalSiteCount",0);

obj.put("auwSiteID",new JSONArray());

obj.put("auwGroupID",new JSONArray());

JSONArray astTempSiteInfoArr = new JSONArray();

JSONObject astTempSiteInfo1 = new JSONObject();

astTempSiteInfo1.put("szTempSiteInfo","07553584");

astTempSiteInfo1.put("szTempSiteName","_200_19_35_84");

astTempSiteInfo1.put("ucCallType",10);

astTempSiteInfo1.put("uwCallRate",246);

JSONObject astTempSiteInfo2 = new JSONObject();

astTempSiteInfo2.put("szTempSiteInfo","075520760");

astTempSiteInfo2.put("szTempSiteName","member1");

astTempSiteInfo2.put("ucCallType",10);

astTempSiteInfo2.put("uwCallRate",246);

JSONObject astTempSiteInfo3 = new JSONObject();

astTempSiteInfo3.put("szTempSiteInfo","07552620");

astTempSiteInfo3.put("szTempSiteName","member2");

astTempSiteInfo3.put("ucCallType",10);

astTempSiteInfo3.put("uwCallRate",246);

astTempSiteInfoArr.put(astTempSiteInfo1);

astTempSiteInfoArr.put(astTempSiteInfo2);

astTempSiteInfoArr.put(astTempSiteInfo3);

obj.put("astTempSiteInfo",astTempSiteInfoArr);

obj.put("ulUseFre",0);

obj.put("ucIsDirectBroadcast",0);

obj.put("ucIsRecordPlay",0);

obj.put("ulSetReportMode",0);

obj.put("acCSRFToken", token);

systemPrint(obj.toString());

obj.put("acCSRFToken", token);

JSONObject result = HttpClientUtil.post(uri, obj, null);

try {

systemPrint("zhaoji:"+result);

} catch (Exception e) { systemPrint("failed");

} }

main 函数调用

public static void main(String[] args) {

args = new String[]{"WEB_ScheduleConfAPI","api","Change_Me"};

stringHashMap 配置

stringHashMap.put("WEB_ScheduleConfAPI", "WEB_ScheduleConfAPI");

token 的值为上述 login 操作获取的值,召集成功返回报文

{"success":1,"data":""}

(34)

2.8 登出

应用场景

用户需要退出到登录页面

前提条件

已完成登录认证。

接口概述

用户退出登录。

请求 URL

/action.cgi?ActionID=WEB_Logout

private static void Logout() {

String uri = baseUrl + "/action.cgi?ActionID=WEB_Logout";

obj = new JSONObject();

obj.put("acCSRFToken", token);

JSONObject result = HttpClientUtil.post(uri, obj, null);

try {

systemPrint("result_logout:"+result);

} catch (Exception e) { systemPrint("failed");

} }

main 函数调用

public static void main(String[] args) {

args = new String[]{"Logout","api","Change_Me"};

stringHashMap 配置

stringHashMap.put("Logout", "Logout");

token 的值为上述 login 操作获取的值,登出成功返回报文

{"success":1,"data":""}

(35)

3 HTTP API 接口

本章介绍HTTP API接口的使用方法。

3.1 函数接口

3.1.1 登录认证类

3.1.1.1 请求会话 ID 接口名称

WEB_RequestSessionIDAPI

功能描述

请求会话ID,会话ID是区分不同用户连接的唯一标识。

应用场景

用户登录认证前,请求会话ID,后续认证时,需要将会话ID作为cookie的一部分传递 下去。

URL

https://ip/action.cgi?ActionID=WEB_RequestSessionIDAPI

参数

(36)

返回值

3-1 请求会话 ID 返回值

参数 类

取值范围 参数说明

success int [0, 1] 响应结果 0:失败 1:成功

data Obj

ect 可选 成功返回数据。详细参考表3-2。

例如:{"success":1,"data":"{\"acSessionId\":\"

\",\"szTermType\":\"HUAWEI IdeaHub Pro

\"}"}

error Obj

ect 可选 失败返回错误信息。详细参考表3-3。

例如:{"success":0,"error":"id":

100666995,"code":33558532,"params":[]}}

3-2 data

参数 类

取值范围 参数说明

acSessionId stri

ng 为空 字段返回空,产品已将Sessionid放在cookie 中。

szTermType stri

ng 不能为空 终端型号

3-3 error

参数 类

取值范围 参数说明

id int 32位整数 错误id,用于转换。

code int 32位整数 错误码,跟错误id对应,具体含义参考7 错误

码。

param Obj

ect param 对象 失败响应的附带参数。

(37)

3.1.1.2 请求认证

接口名称

WEB_RequestCertificateAPI

功能描述

调用该接口请求认证,校验用户名、密码。并返回CSRF Token。

应用场景

通过该接口将用户名、密码等发到服务器端校验。如果校验成功,则认证通过并返回 CSRFToken,后续所有json数据请求都必须带上CSRF Token字段。反之,返回失败响 应,认证不通过。通过HTTP API接口对终端的操作,前提是认证通过。

URL

https://ip/action.cgi?ActionID=WEB_RequestCertificateAPI

参数

3-4 请求认证参数

参数 类

取值范围 参数说明

user stri

ng 不为空 用户名

password stri

ng 不为空 密码

返回值

3-5 请求认证返回值

参数 类

取值范围 参数说明

success int [0, 1] 响应结果 0:失败 1:成功

data Obj

ect 可选 成功返回数据。详细参考表3-6。

例如:{"success":1,"data":"{\"acCSRFToken\":

\"s9C1zjO5HLnSf9u4eKP9uKfn8Kb9T94j\"}"}

數據

表 3-15 error
表 3-18 error
表 3-21 error
表 3-53 stV3UserInfo 参数 类 型 取值范围 参数说明 AuthProtoca l int [0, 2] SNMPV3认证协议,参考 IFRAME_SNMP_E_SNMPV3_AUTH_PROTOCA L PrivProtocal int [0, 2] SNMPV3加密协议,参考 IFRAME_SNMP_E_SNMPV3_PRIV_PROTOCAL UserPermiss ion int [0, 1] SNMPV3用户权限,参考 IFRAME_SNMP_E_SNMPV3_USER_PERM
+7

參考文獻

相關文件

If the points line on the 45 o line then the skewness and excess kurtosis seen in the stochastic residuals is the same as that of a standard normal distribution, which indicates

 積熱電驛(Thermal relay, TH-RY),又稱為積熱過載 電驛(Thermal over-load relay, OL).  電磁開關(Magnetic

專案導向應用程式開發 階梯程式編輯畫面 狀態的監視與控制 階梯程式助憶碼輔助顯示 階梯程式註解功能

 If I buy a call option from you, I am paying you a certain amount of money in return for the right to force you to sell me a share of the stock, if I want it, at the strike price,

Study the following statements. Put a “T” in the box if the statement is true and a “F” if the statement is false. Only alcohol is used to fill the bulb of a thermometer. An

2-1 註冊為會員後您便有了個別的”my iF”帳戶。完成註冊後請點選左方 Register entry (直接登入 my iF 則直接進入下方畫面),即可選擇目前開放可供參賽的獎項,找到iF STUDENT

Return address Local variables Previous frame pointer?. Return address

Return address Local variables Previous frame pointer. Return