
## Installation

```js
npm install uno-info-sdk --save
```

## Usage

```jsx
import { IndustrySDK } from 'uno-info-sdk';

const industrysdk = new IndustrySDK({
  service: 'wss://pre-citybrain-open.aliyun.com/app/space-ws/ws',
  registerData: {
    name: "注册消息B",
    group: "industry_room"
  },
  source: 'web',
  target: 'web'
});

const { camera } = industrysdk;

sdk.wsClient.on('load', () => {
  camera.focus.toTarget({
    camera: [26957,52297,63267],
    lookat: [55849,60942,67897],
    layer: "Impedit hic aliquam omnis molestias aspernatur.",
    target: "Asperiores et unde dolor rerum rem est aperiam."
  })
})

sdk.listener('camera.focus.toTarget', (data) => {
  console.log(data)
})
```

## Options

| 属性名 | 说明 | 必填 | 类型 | 默认值 |
| :-----| :---- | :----: | :---- | :----: |
| service | 需要连接的服务地址 | 是 | String | - |
| source | 当前客户端id | 否 | String | - |
| target | 消息发送目标端 | 否 | Array<String> | - |
| roomExclude | 当前广播需要过滤的端, target优先级高 | 否 | Array<String> | - |
| registerData | 注册内容 | 是 | {name: string, group: string, hasCbMsg}[RegisterData](#registerdata) | - |
| extraWs | websocket扩展配置 | 否 | [Options](https://www.npmjs.com/package/uno-ws-client) | {} |

## Instance API

| 属性名 | 说明 | 类型 | 备注 |
| :-----| :---- | :---- | :---- |
| listener | 按event和action监听消息内容返回 | (eventName: string, callback: (message: object) => void) => void | eventName规则： `sdk_${event}.${action}`，'.action'非必填。[Default Events](#default-events) |
| registerEvent | 注册自定义事件 | (eventName: string, parser: (data) => data)) => {} | eventName规则： `sdk_${event}.${action}`，'.action'非必填 |
| send | 发送消息 | (event: string, message: object) => {} | - |
| updateOptRetry | 更新配置后重新初始化 | (opts: Options) => {} | - |
| destroy | 销毁函数 | Function | - |

## RegisterData

| 属性名 | 说明 | 必填 | 类型 | 默认值 |
| :-----| :---- | :----: | :----: | :----: |
| name | 发送端名称 | 否 | string | - |
| group | 消息通道房间名称 | 是 | string | - |
| hasCbMsg | 注册消息是否需要广播 | 否 | boolean | - |
| disconnectTime | 长时间不发送消息时，服务端主动断开服务需要的时间 | 否 | number | 60000 |

## SDK json结构

```javascript
[
  {
    "name": "对象查看", // dk大类名称
    "desc": "", // sdk大类描述
    "entity": "camera", // sdk作用实体
    "category": "sequence", // sdk所属分类
    "actionCode": "focus", // sdk的action
    "params": [{ // sdk参数配置
      "name": "camera", // 参数名称
      "type": "[number, number, number]", // 参数类型，typescript语法
      "require": true, // 参数是否必填
      "desc": "" // 参数描述
    }, {
      "name": "lookat",
      "type": "[number, number, number]",
      "require": true,
      "desc": ""
    }, {
      "name": "layer",
      "type": "string",
      "require": false,
      "desc": ""
    }, {
      "name": "target",
      "type": "string",
      "require": false,
      "desc": ""
    }],
    "children": {
      "toTarget": { // sdk子类code
        "name": "对象特写", // sdk子类名称
        "fields": [ // sdk子类参数字段，取大类的params中的key
          "camera", //name是这个字符串的参数，配置同大类
          "lookat",
          {  "target": true },, // name是这个对象的key的参数，配置同大类，但是require以当前的value为准
          { "layer": true }
        ],
        "desc": ""
      },
      "fixed": {
        "name": "定点特写",
        "fields": ["camera", "lookat"],
        "desc": ""
      }
    }
  }
]
```

# SDK文档v1.0.0

## 调用方式：sdkName({ param1, param2, ... })

## 1、对象查看镜头

sdkName: camera.focus

描述：调用系统镜头对单一指定对象或指定位置进行查看

| 字段名 | 字段类型 | 是否必须 | 描述 |
| :---: | :---: | :---: | :--- |
| camera | [number, number, number] | 是 | 镜头的相机参数 |
| lookat | [number, number, number] | 是 | 镜头的视点参数 |
| layer | string | 否 | 对象的图层名 |
| target | string | 否 | 对象ID |


### 1.1、对象特写

sdkName: camera.focus.toTarget

描述：调用镜头实现对任意位置的定点特写。如：对隧道口、匝道口做特写

| 字段名 | 字段类型 | 是否必须 | 描述 |
| :---: | :---: | :---: | :--- |
| camera | [number, number, number] | 是 | 镜头的相机参数 |
| lookat | [number, number, number] | 是 | 镜头的视点参数 |
| target | string | 是 | 对象ID |
| layer | string | 是 | 对象的图层名 |
  


### 1.2、定点特写

sdkName: camera.focus.fixed

描述：调用系统镜头实现对一个指定静态对象ID的定点特写，被特写对象会有外轮廓高亮。如：实现对某个杆子或路侧设备的特写

| 字段名 | 字段类型 | 是否必须 | 描述 |
| :---: | :---: | :---: | :--- |
| camera | [number, number, number] | 是 | 镜头的相机参数 |
| lookat | [number, number, number] | 是 | 镜头的视点参数 |
  
<br />

---

<br />
  

## 2、多对象查看镜头

sdkName: camera.show

描述：调用系统镜头对多个指定对象进行查看

| 字段名 | 字段类型 | 是否必须 | 描述 |
| :---: | :---: | :---: | :--- |
| layer | string | 是 | 对象的图层名 |
| target | [string] | 是 | 对象ID数组 |

<br />

---

<br />
  

## 3、跟踪镜头

sdkName: camera.track

描述：调用系统镜头实现对一个指定动态对象或不指定ID的任一对象实施动态跟踪，被跟踪对象会有外轮廓高亮

| 字段名 | 字段类型 | 是否必须 | 描述 |
| :---: | :---: | :---: | :--- |
| layer | string | 是 | 对象的图层名 |
| target | string | 否 | 对象ID |
| target_type | string | 否 | 对象类型 |
| continuously | boolean | 否 | 是否连续跟踪，即跟丢了再选同类的下一个对象 |
| location | [number,number,number] | 否 | 被跟踪对象的位置: 三维场景只加载当前范围内的车辆，如果被跟踪对象不在当前范围就找不到该对象，需要先让三维场景跳转到被跟踪对象的位置（location参数），加载新范围内的车辆再进行跟踪 |
| cameraMode | string | 否 | 跟踪视角（"Car"(车内), "Drone"(无人机跟车), "Flight"(高空俯视)） |
| cameraDistance | [number,number] | 否 | 镜头相对被跟踪对象的位置，默认值[3,2] |


### 3.1、指定对象（ID）跟踪

sdkName: camera.track.toTarget

描述：调用系统镜头实现对一个指定动态对象实施动态跟踪

| 字段名 | 字段类型 | 是否必须 | 描述 |
| :---: | :---: | :---: | :--- |
| layer | string | 是 | 对象的图层名 |
| target | string | 是 | 对象ID |
| continuously | boolean | 是 | 是否连续跟踪，即跟丢了再选同类的下一个对象 |
| location | [number,number,number] | 是 | 被跟踪对象的位置: 三维场景只加载当前范围内的车辆，如果被跟踪对象不在当前范围就找不到该对象，需要先让三维场景跳转到被跟踪对象的位置（location参数），加载新范围内的车辆再进行跟踪 |
| cameraMode | string | 是 | 跟踪视角（"Car"(车内), "Drone"(无人机跟车), "Flight"(高空俯视)） |
| cameraDistance | [number,number] | 是 | 镜头相对被跟踪对象的位置，默认值[3,2] |
  


### 3.2、不指定对象（ID）跟踪

sdkName: camera.track.noTarget

描述：调用系统镜头实现对不指定ID的任一对象实施动态跟踪

| 字段名 | 字段类型 | 是否必须 | 描述 |
| :---: | :---: | :---: | :--- |
| layer | string | 是 | 对象的图层名 |
| continuously | boolean | 是 | 是否连续跟踪，即跟丢了再选同类的下一个对象 |
| target_type | string | 是 | 对象类型 |
| cameraMode | string | 是 | 跟踪视角（"Car"(车内), "Drone"(无人机跟车), "Flight"(高空俯视)） |
| cameraDistance | [number,number] | 是 | 镜头相对被跟踪对象的位置，默认值[3,2] |
  


### 3.3、释放跟踪镜头

sdkName: camera.track.release

描述：取消跟踪

| 字段名 | 字段类型 | 是否必须 | 描述 |
| :---: | :---: | :---: | :--- |
| layer | string | 是 | 对象的图层名 |
| target | string | 是 | 对象ID |
  
<br />

---

<br />
  

## 4、预设镜头

sdkName: camera.call

描述：调用预先编排好的一个镜头序列

| 字段名 | 字段类型 | 是否必须 | 描述 |
| :---: | :---: | :---: | :--- |
| sequence | [string] | 是 | 预设镜头的数组 |

<br />

---

<br />
  

## 5、释放镜头

sdkName: camera.release

描述：解锁原来的任何镜头

| 字段名 | 字段类型 | 是否必须 | 描述 |
| :---: | :---: | :---: | :--- |
| cameraOffset | [number,number,number] | 是 | 释放后镜头相对最后位置的位移 |

<br />

---

<br />
  

## 6、切换跟踪视角

sdkName: camera.switchMode

描述：在对象跟踪镜头下切换跟踪视角

| 字段名 | 字段类型 | 是否必须 | 描述 |
| :---: | :---: | :---: | :--- |
| cameraMode | string | 是 | 跟踪视角（"Car"(车内), "Drone"(无人机跟车), "Flight"(高空俯视)） |

<br />

---

<br />
  

## 7、隐藏三维图层

sdkName: layer.hide

描述：隐藏三维图层

| 字段名 | 字段类型 | 是否必须 | 描述 |
| :---: | :---: | :---: | :--- |
| layer | string | 是 | 图层名 |

<br />

---

<br />
  

## 8、显示三维图层

sdkName: layer.show

描述：显示三维图层

| 字段名 | 字段类型 | 是否必须 | 描述 |
| :---: | :---: | :---: | :--- |
| layer | string | 是 | 图层名 |

<br />

---

<br />
  

## 9、隐藏面板图层

sdkName: billboard.hide

描述：隐藏面板图层

| 字段名 | 字段类型 | 是否必须 | 描述 |
| :---: | :---: | :---: | :--- |
| layer | string | 是 | 图层名 |

<br />

---

<br />
  

## 10、显示面板图层

sdkName: billboard.show

描述：显示面板图层

| 字段名 | 字段类型 | 是否必须 | 描述 |
| :---: | :---: | :---: | :--- |
| layer | string | 是 | 图层名 |

<br />

---

<br />
  

## 11、切换气象

sdkName: climate.setup

描述：切换场景中的天气、日照等状态

| 字段名 | 字段类型 | 是否必须 | 描述 |
| :---: | :---: | :---: | :--- |
| weather | [string] | 是 | 气象状态数组（foggy、rainy、snowy），数组为空即为晴天 |
| sunlight | string | 是 | 日夜切换，day/night |

<br />

---

<br />
  

## 12、恢复气象

sdkName: climate.reset

描述：恢复场景中的天气和日照状态

| 字段名 | 字段类型 | 是否必须 | 描述 |
| :---: | :---: | :---: | :--- |


<br />

---

<br />
  

## 13、切换数据环境

sdkName: env.changeEnv

描述：切换场景中的数据环境，即车辆、事件等数据来源从实时模式切换为历史模式或仿真模式

| 字段名 | 字段类型 | 是否必须 | 描述 |
| :---: | :---: | :---: | :--- |
| env | string | 是 | 数据环境名称 |
| isPlaying | boolean | 是 | 是否播放 |

<br />

---

<br />
  

## 14、指定时间播放

sdkName: env.play

描述：在非实时环境下实现从指定日期指定时间开始播放

| 字段名 | 字段类型 | 是否必须 | 描述 |
| :---: | :---: | :---: | :--- |
| playTime | string | 是 | 开始播放的时间 |
| isPlaying | true | 是 | 播放 |
| uniqueId | string | 是 | 一次播放的ID |
| env | string | 是 | 数据环境名称（playback历史数据, simulation仿真数据, release实时数据） |

<br />

---

<br />
  

## 15、暂停播放

sdkName: env.pause

描述：在非实时环境下实现暂停播放

| 字段名 | 字段类型 | 是否必须 | 描述 |
| :---: | :---: | :---: | :--- |
| playTime | string | 是 | 停止播放的时间 |
| isPlaying | false | 是 | 暂停播放 |
| uniqueId | string | 是 | 一次播放的ID |
| env | string | 是 | 数据环境名称（playback历史数据, simulation仿真数据, release实时数据） |

<br />

---

<br />
  

## 16、请求地图同步

sdkName: map.request

描述：web端请求UE端发送地图位置信息，用于一些需要三维场景跳转到新位置之后再响应的web消息

| 字段名 | 字段类型 | 是否必须 | 描述 |
| :---: | :---: | :---: | :--- |
| entity | string | 是 | 被同步对象为地图参数 |

<br />

---

<br />
  

## 17、监听地图同状态

sdkName: camera.update

描述：UE端返回web端请求的地图位置信息（响应web的请求地图同步）

| 字段名 | 字段类型 | 是否必须 | 描述 |
| :---: | :---: | :---: | :--- |
| position | [number, number, number] | 是 | 三维场景当前的位置 |

<br />

---

<br />
  

## 18、呼出web的跟车控制面板

sdkName: layer.switchCameraUI

描述：UE找到车辆开始跟踪之后，控制web端打开/关闭web的跟车控制面板

| 字段名 | 字段类型 | 是否必须 | 描述 |
| :---: | :---: | :---: | :--- |
| enable | boolean | 是 | 打开/关闭面板 |

<br />

---

<br />
  

## 19、孪生设备同步

sdkName: layer.update

描述：UE端返回视频接力中当前设备视频流和下一路设备的视频流地址

| 字段名 | 字段类型 | 是否必须 | 描述 |
| :---: | :---: | :---: | :--- |
| value | { this: string; next: string; } | 是 | 视频接力中的当前视频流和下一个视频流 |
| entity | string | 是 | 被操作对象为图层 |

<br />

---

<br />
  

## 20、对象悬浮选择

sdkName: layer.hover

描述：UE端返回当前鼠标悬浮的对象

| 字段名 | 字段类型 | 是否必须 | 描述 |
| :---: | :---: | :---: | :--- |
| layer | string | 是 | 被高亮对象的图层名 |
| target | string | 是 | 被高亮对象的ID |

<br />

---

<br />
  

## 21、对象双击选择

sdkName: layer.dclick

描述：UE端返回当前鼠标点击的对象

| 字段名 | 字段类型 | 是否必须 | 描述 |
| :---: | :---: | :---: | :--- |
| layer | string | 是 | 被高亮对象的图层名 |
| target | string | 是 | 被高亮对象的ID |

<br />

---

<br />
  
  