## apiprovicer服务接口文档

## 接口响应约定

```json
{
  "code": 0,
  "message": "",
  "result": null
}
```

**code**为0，为请求成功

**message**保存相关的消息提示

**result**为服务器处理结果

### 1.服务功能

为厂商app提供平台原生的api调用能力

### 2.接口说明

| 接口URL                                               | 请求类型 | 功能说明                 |
|-----------------------------------------------------|------|----------------------|
| /application/v1/device/info                         | GET  | 根据device_key获取设备基本信息 |
| /application/v1//devices/{identifier}/info          | GET  | 根据设备identifier获取设备信息 |
| /application/v1/devices/{identifier}/status/current | GET  | 获取设备当前状态             |
| /application/v1/devices/{identifier}/status         | PUT  | 设置设备当前设备的状态          |
| /application/v1/devices/{identifier}/commands       | POST | 向指定设备发送命令            |
| /application/auth                                   | POST | 获取app认证token         |
| /application/v1/device/check_net_config             | GET  | 验证设备配网结果             |

### 2.1 获取App Token

_首先应用方要获取当前应用的授权访问token,为后续的接口请求提供正确的认证,应用方就根据expire_at值自动获取最新的token_

* 接口URL: `application/auth`
* 请求方法: `POST`
* 请求参数: `BODY`

| 参数        | 类型  | 是否必填 | 说明                |
|-----------|-----|------|-------------------|
| AppKey    | 字符串 | Y    | 平台为应用分配的AppKey    |
| Secretkey | 字符串 | Y    | 平台为应用分配的Secretkey |

* 接口响应: `JSON`

```json
{
  "code": 0,
  "message": "",
  "result": {
    "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJBcHBJRCI6MSwiQXBwTmFtZSI6ImNsaWVudCIsIkFwcEtleSI6IjRkMjJmZDZjOWU4YWY0MzQwM2QwZmU2MWMwYzdlNTYzODc4YTg1YWE5ZDE4MGZmNjcyNmUwOWIxYTEzOTdjOTZkN2MyNjkzZWM4NjlhZmU3MDc5ODZmZDgyNTMxYzdlZiIsIlNlY3JldEtleSI6Im5yM3preHBLRDg0UTJCV1giLCJWZW5kb3JJRCI6IjFwczlkanBzd2kwY2RzN2NvZnlua3NvMzAwZXFsNGl1IiwiZXhwIjoxNjMwOTg0MTU2LCJpYXQiOjE2MzA4OTc3NTYsImlzcyI6ImFwaXByb3ZpZGVyIn0.t0KX26p_8Q5WxzU-96Gwg5t6iuFnA8iDmUJk8bmW4Uc",
    "expire_at": 1630984156
  }
}
```

| 字符           | 类型  | 说明         |
|--------------|-----|------------|
| access_token | 字符串 | token字符串   |
| expire_at    | 数字  | 精确到秒的过期时间戳 |

### 2.2 根据设备device_key获取设备信息

_厂商可以通过平台为设备生成的device_key查询设备基础信息_

* 请求URL: `/application/v1/device/info`
* 请求方法: `GET`
* 请求参数: `Query`

| 参数         | 类型  | 是否必填 | 说明                        |
|------------|-----|------|---------------------------|
| device_key | 字符串 | Y    | 设备device_key,注册流程可以得到这个数据 |

* 请求Header:

| 参数            | 类型  | 是否必填 | 说明                                  |
|---------------|-----|------|-------------------------------------|
| Authorization | 字符串 | Y    | 获取AppToken(2.1)接口返回的access_token字段值 |

* 请求响应:

```json
{
  "code": 0,
  "message": "",
  "result": null,
  "data": {
    "identifier": "1-1-relay-test",
    "name": "TSL-8",
    "description": "模块",
    "version": "1.0.0"
  }
}
```

### 2.3 根据设备identifier获取设备基本信息

* 请求URL: `/application/v1/devices/{identifier}/info`
* 请求方法: `GET`
* 请求参数: `Path参数`

| 参数         | 类型  | 是否必填 | 说明                         |
|------------|-----|------|----------------------------|
| identifier | 字符串 | Y    | 设备的identifier,注册流程可以得到这个数据 |

* 请求Header:

| 参数            | 类型  | 是否必填 | 说明                                  |
|---------------|-----|------|-------------------------------------|
| App-Key       | 字符串 | Y    | 由平台分配的应用AppKey的值                    |
| Authorization | 字符串 | Y    | 获取AppToken(2.1)接口返回的access_token字段值 |

* 请求响应: `JSON`

```json
{
  "code": 0,
  "message": "",
  "result": null,
  "data": {
    "identifier": "1-1-relay",
    "name": "TSL-8",
    "description": "模块",
    "version": "1.0.0"
  }
}
```

### 2.4 根据设备identifier获取设备当前最新的状态值

* 请求URL: `/application/v1/devices/{identifier}/status/current`
* 请求方法: `GET`
* 请求参数: `Path参数`

| 参数         | 类型  | 是否必填 | 说明                         |
|------------|-----|------|----------------------------|
| identifier | 字符串 | Y    | 设备的identifier,注册流程可以得到这个数据 |

* 请求Header:

| 参数            | 类型  | 是否必填 | 说明                                  |
|---------------|-----|------|-------------------------------------|
| App-Key       | 字符串 | Y    | 由平台分配的应用AppKey的值                    |
| Authorization | 字符串 | Y    | 获取AppToken(2.1)接口返回的access_token字段值 |

* 请求响应: `JSON`

_data字符中的具体响应内容是根据产品配置中相应的字段名称生成的，以最终配置为准，平台会以格式化的数据，返回设备的最新状态_

```json
{
  "code": 0,
  "message": "",
  "result": null,
  "data": {
    "device_id": 9480,
    "outputState": {
      "route": 2,
      "value": 0
    }
  }
}
```

### 2.5 向指定设备发送指令

* 请求URL: `/application/v1/devices/{identifier}/commands`
* 请求方法: `POST`
* 请求参数: `JSON BODY`

| 参数         | 类型  | 是否必填 | 说明                         |
|------------|-----|------|----------------------------|
| identifier | 字符串 | Y    | 设备的identifier,注册流程可以得到这个数据 |

* BODY体结构: `根据产品的配置文件`

```json
{
  "objects": [
    {
      "no": 1,
      "label": "outputState",
      "part": 1,
      "status": [
        {
          "value_type": 7,
          "name": "route"
        },
        {
          "value_type": 7,
          "name": "value"
        }
      ]
    },
    {
      "no": 2,
      "label": "inputState",
      "part": 1,
      "status": [
        {
          "value_type": 7,
          "name": "route"
        },
        {
          "value_type": 7,
          "name": "value"
        }
      ]
    },
    {
      "no": 3,
      "label": "temperature",
      "part": 1,
      "status": [
        {
          "value_type": 1,
          "name": "degrees"
        }
      ]
    },
    {
      "no": 4,
      "label": "humidity",
      "part": 1,
      "status": [
        {
          "value_type": 1,
          "name": "degrees"
        }
      ]
    }
  ],
  "commands": [
    {
      "no": 1,
      "name": "setState",
      "part": 1,
      "priority": 0,
      "params": [
        {
          "value_type": 7,
          "name": "no"
        },
        {
          "value_type": 7,
          "name": "state"
        },
        {
          "value_type": 8,
          "name": "subDeviceID"
        }
      ]
    }
  ],
  "events": []
}

```

_例如上面的产品配置信息，commands字段有一个指令名称为setState,参数有三个，则传输的结构体为_

```json
{
  "setState": [
    1,
    1,
    1308
  ]
}
```

* 请求Header:

| 参数            | 类型  | 是否必填 | 说明                                  |
|---------------|-----|------|-------------------------------------|
| App-Key       | 字符串 | Y    | 由平台分配的应用AppKey的值                    |
| Authorization | 字符串 | Y    | 获取AppToken(2.1)接口返回的access_token字段值 |

* 请求响应: `JSON`

```json
{
  "code": 0,
  "message": "",
  "result": null
}
```

### 2.6 验证设备配网结果

* 请求URL: `/application/v1/devices/check_net_config`
* 请求方法: `GET`
* 请求参数: `Query`

| 参数          | 类型  | 是否必填 | 说明            |
|-------------|-----|------|---------------|
| device_code | 字符串 | Y    | 设备的identifier |
| md5         | 字符串 | Y    | 校验hash        |

* 响应BODY: `JSON`

```json
{
  "code": 0,
  "message": "",
  "result": false
  // false或true,代表失败或成功
}
```

