1. 查询节点下的设备列表

1.1. 接口定义

GET /node/{nodeId}/{deviceType}/devices/meta?search={search}&status={status}&pageNo={pageNo}&pageSize={pageSize}

参数 是否必填 说明
nodeId 节点ID
deviceType 设备类型
示例:
- LEMO极简设备: LEMO
- rfid读写器: rfid_reader
- hfc_rfid读写器: hfc_rfid_reader
search 设备名称 或 设备id
status 为空时不过滤。
设备状态,取值:
- ONLINE:在线
- OFFLINE:离线
- UNACTIVE:未激活
- DISABLE:已禁用
pageNo 页码
pageSize 页大小,单页最大查询100条数据

1.2. 请求示例

  1. GET '/node/118d5961484f8fd533c417a27e6c53fe/hfc_rfid_reader/devices/meta?pageNo=1&pageSize=10' -- header 'Token:002689b8-a50a-4f49-8c32-a463d6175446'

1.3. 返回值

1.3.1. 成功 (Status 200)

{
    "data":[
        {
            "deviceId":"58bfdacf0d9ef758dbaf9b3799a99abd",
            "deviceType":"LEMO",
            "deviceName":"shouzhi_test_device",
            "deviceAlias":"this is a alias",
            "groupId":"IOT_INNTER_TEST_PRE",
            "nodeId":"118d5961484f8fd533c417a27e6c53fe",
            "online":false,
            "activeTime":null
        },
        {
            "deviceId":"7f7bb1c80333aabd12d74e793df3055e",
            "deviceType":"LEMO",
            "deviceName":"test-device-id-123",
            "deviceAlias":null,
            "groupId":"IOT_INNTER_TEST_PRE",
            "nodeId":"118d5961484f8fd533c417a27e6c53fe",
            "online":false,
            "activeTime":null
        },
        {
            "deviceId":"8a09f108b4ae65b5a40d75d831dcab92",
            "deviceType":"LEMO",
            "deviceName":"device-name-123456789",
            "deviceAlias":"设备sdk测试设备",
            "groupId":"IOT_INNTER_TEST_PRE",
            "nodeId":"118d5961484f8fd533c417a27e6c53fe",
            "online":false,
            "activeTime":null
        },
        {
            "deviceId":"4045de190a683a39aaf0fa890790cbd9",
            "deviceType":"LEMO",
            "deviceName":"device-name-1111111",
            "deviceAlias":null,
            "groupId":"IOT_INNTER_TEST_PRE",
            "nodeId":"118d5961484f8fd533c417a27e6c53fe",
            "online":false,
            "activeTime":null
        },
        {
            "deviceId":"b6dec180fb85178be23275badc9eb0d8",
            "deviceType":"LEMO",
            "deviceName":"device-name-222222222",
            "deviceAlias":null,
            "groupId":"IOT_INNTER_TEST_PRE",
            "nodeId":"118d5961484f8fd533c417a27e6c53fe",
            "online":false,
            "activeTime":null
        },
        {
            "deviceId":"39e78c42b5c60e21152aa177b074760d",
            "deviceType":"LEMO",
            "deviceName":"test-device-01234567",
            "deviceAlias":null,
            "groupId":"IOT_INNTER_TEST_PRE",
            "nodeId":"118d5961484f8fd533c417a27e6c53fe",
            "online":false,
            "activeTime":null
        },
        {
            "deviceId":"e28bc3dacd7485b7a1c72e2ad0d7bccb",
            "deviceType":"LEMO",
            "deviceName":"7c:a7:b0:6a:8e:a2",
            "deviceAlias":"守之的测试设备",
            "groupId":"IOT_INNTER_TEST_PRE",
            "nodeId":"118d5961484f8fd533c417a27e6c53fe",
            "online":false,
            "activeTime":null
        },
        {
            "deviceId":"2c4b67cfad230601fa65d8a4d9facae6",
            "deviceType":"LEMO",
            "deviceName":"test-device-123",
            "deviceAlias":"测试设备",
            "groupId":"IOT_INNTER_TEST_PRE",
            "nodeId":"118d5961484f8fd533c417a27e6c53fe",
            "online":false,
            "activeTime":null
        },
        {
            "deviceId":"f1b7f708b129535829fe386d5ecbb2ef",
            "deviceType":"LEMO",
            "deviceName":"test-device-12345689",
            "deviceAlias":"mock device",
            "groupId":"IOT_INNTER_TEST_PRE",
            "nodeId":"118d5961484f8fd533c417a27e6c53fe",
            "online":false,
            "activeTime":null
        },
        {
            "deviceId":"db3c4f7d6c024f53eefb58453512c9f4",
            "deviceType":"LEMO",
            "deviceName":"b0:f8:93:8f:7f:6e",
            "deviceAlias":"ecs压测专用设备",
            "groupId":"IOT_INNTER_TEST_PRE",
            "nodeId":"118d5961484f8fd533c417a27e6c53fe",
            "online":false,
            "activeTime":null
        }
    ],
    "total":21,
    "totalPages":3
}

1.3.2. 失败-节点不存在 (Status 404)

Node not exists: 118d5961484f8fd533c417a27e6c53f1

2. 查询设备信息

2.1. 接口定义

GET /{deviceType}/device/{deviceName}/meta

参数 是否必填 说明
deviceType 设备类型
deviceName 设备名称

2.2. 请求示例

GET '/LEMO/device/58bfdacf0d9ef758dbaf9b3799a99abd/meta' -- header 'Token:002689b8-a50a-4f49-8c32-a463d6175446'

2.3. 返回值

2.3.1. 成功 (Status 200)

{
    "deviceId":"58bfdacf0d9ef758dbaf9b3799a99abd",
    "deviceType":"LEMO",
  "deviceName":"shouzhi_test_device",
  "deviceAlias":"this is a alias",
  "groupId":"IOT_INNTER_TEST_PRE",
  "nodeId":"118d5961484f8fd533c417a27e6c53fe",
  "online":false,
  "activeTime":null
}

2.3.2. 失败-设备不存在 (Status 404)

Device not exists. deviceType: LEMO, deviceName: shouzhi_test_device

3. 根据设备ID查询设备信息

3.1. 接口定义

GET /device/{deviceId}/meta

参数 是否必填 说明
deviceId 设备ID

3.2. 请求示例

GET '/device/58bfdacf0d9ef758dbaf9b3799a99abd/meta'

3.3. 返回值

3.3.1. 成功 (Status 200)

{
    "deviceId":"58bfdacf0d9ef758dbaf9b3799a99abd",
    "deviceType":"LEMO",
  "deviceName":"shouzhi_test_device",
  "deviceAlias":"this is a alias",
  "groupId":"IOT_INNTER_TEST_PRE",
  "nodeId":"118d5961484f8fd533c417a27e6c53fe",
  "online":false,
  "activeTime":null
}

3.3.2. 失败-设备不存在 (Status 404)

Device not exists: 58bfdacf0d9ef758dbaf9b3799a99abd

4. 查询设备属性

4.1. 接口定义

GET /node/{nodeId}/{deviceType}/device/{deviceName}/properties?propertyNames={propertyNames}

参数 是否必填 说明
nodeId 节点ID
deviceType 设备类型
deviceName 设备名称
propertyNames 为空时查询所有属性
可以指定一个或多个属性名称,以英文逗号“,”隔开
示例:
language,timezone

4.2. 请求示例

GET '/node/118d5961484f8fd533c417a27e6c53fe/LEMO/device/7c:a7:b0:6a:8e:a2/properties'

4.3. 返回值

4.3.1. 成功 (Status 200)

{
    "otaVersion": {
        "value": "2.2.0.14",
        "time": 1631194662000
    },
    "wifiMac": {
        "value": "7c:a7:b0:6a:8e:a1\n",
        "time": 1631194662000
    },
    "sn": {
        "value": "H02001L10100160",
        "time": 1631194662000
    },
    "deviceInfo": {
        "value": {
            "deviceId": "66406dffd7de488cab0628335e43d946",
            "name": "LEMO_",
            "hardwareVersion": "H02001L10100160"
        },
        "time": 1631194662000
    }
}

4.3.2. 失败-设备不存在 (Status 404)

Device not exists. deviceType: LEMO, deviceName: 7c:a7:b0:6a:8e:a2

5. 根据设备ID查询设备属性

5.1. 接口定义

GET /device/{deviceId}/properties?propertyNames={propertyNames}

参数 是否必填 说明
deviceId 设备ID
propertyNames 为空时查询所有属性
可以指定一个或多个属性名称,以英文逗号“,”隔开
示例:
language,timezone

5.2. 请求示例

GET '/device/66406dffd7de488cab0628335e43d946/properties'

5.3. 返回值

5.3.1. 成功 (Status 200)

{
    "otaVersion": {
        "value": "2.2.0.14",
        "time": 1631194662000
    },
    "wifiMac": {
        "value": "7c:a7:b0:6a:8e:a1\n",
        "time": 1631194662000
    },
    "sn": {
        "value": "H02001L10100160",
        "time": 1631194662000
    },
    "deviceInfo": {
        "value": {
            "deviceId": "66406dffd7de488cab0628335e43d946",
            "name": "LEMO_",
            "hardwareVersion": "H02001L10100160"
        },
        "time": 1631194662000
    }
}

5.3.2. 失败-设备不存在 (Status 404)

Device not exists: 66406dffd7de488cab0628335e43d946

6. 设置设备期望属性

6.1. 接口定义

16.1.1 根据nodeId+deviceType+deviceName设置设备期望属性

POST /node/{nodeId}/{deviceType}/device/{deviceName}/properties/desired

参数 是否必填 说明
nodeId 节点ID
deviceType 设备类型
deviceName 设备名称

16.1.1 根据deviceId设置设备期望属性

POST /device/{deviceId}/properties/desired

参数 是否必填 说明
deviceId 设备唯一ID

请求体(JSON)

需要设置的设备属性,支持设置多个属性。
设备属性是JSON格式,每个属性的具体结构为:Key:Value。
Key是属性名称,Value是属性值+属性上报时间的集合。

  • Value也为JSON格式,每个Value的具体结构为:

      {"value":"属性值","time":上报时间(毫秒时间戳)}<br />例如:
    
    {
      "language": {
          "value": "GMT+8",
          "time": 1640831293770
      },
      "aoaSwitch": {
          "value": 1,
          "time": 1640831495419
      }
    }
    

    6.2 请求示例

    POST '/node/6696d7a77ca996fe80eaef34509a9877/LEMO/device/0827768921be8183/properties'
    --data '{"aoaSwitch":{"value":1,"time":1640831495419}}'
    

    6.3 返回值

    6.3.1 成功(Status 200),返回body为空

    6.3.2 失败-未指定属性/非空属性值为空/物模型定义非法(Status 400)

    // 未指定属性
    Properties not specified
    // 非空属性值为空
    property 'timezone' is required
    // 物模型定义非法
    unsupported type: list
    

    6.3.3 失败-设备不存在(Status 404)

    Device not exists: {deviceId}
    

    7. 删除设备

    7.1. 接口定义

    POST /device/{deviceId}/delete

参数 是否必填 说明
deviceId 设备ID

7.2 请求示例

POST '/device/66406dffd7de488cab0628335e43d946/delete'

7.3 返回值

7.3.1 成功(Status 200),返回body为空

8. 生成设备注册短链

8.1. 接口定义

POST /node/{nodeId}/{deviceType}/device/short-url?ttl={ttl}

参数 传参方式 是否必填 说明
nodeId 路径参数 节点id
deviceType 路径参数 设备类型
ttl 查询参数 短链有效期,单位:秒,范围3600 ~ 86400
propertyMap JSON Body 预置属性(非必填)。
生成设备注册短链时,允许为设备设置预置属性。
一旦传入了预置属性,该接口生成的短链,会自动为设备设置预置属性。

格式:
预置属性是JSON格式,每个属性的具体结构为:Key:Value。
Key是属性在物模型定义中的identifier,Value是属性值。

8.2 请求示例

无需预置属性

POST '/node/1b747c8faf3c4021a3b66cf451fc5ed6/testWorkstation4/device/short-url?ttl=3600'

需要预置属性(请求短链进行注册设备时,会根据生成短链时的预置属性为设备设置属性)

curl --location --request 
POST '/node/d5623b012de447f3a710bea3bd3353e1/LEMO/device/short-url?ttl=3600'
--header 'Content-Type: application/json'
--data-raw '{
    "language": "zh_CN.UTF-8"
}'

8.3 返回值

8.3.1 成功(Status 200)

http://dev-devops.loginx.cainiao.test/s/3Q3FU0

POST方式请求上述返回值中的url(http://dev-devops.loginx.cainiao.test/s/3Q3FU0),即可实现设备注册,如下所示:

POST http://dev-devops.loginx.cainiao.test/s/3Q3FU0
--data {
    "deviceName": "21:01:20:11:49:13",
    "deviceAlias": "短链注册工作台设备",
    "properties": {}
}

9. 禁用设备

9.1. 接口定义

POST /device/{deviceId}/disable

参数 是否必填 说明
deviceId 设备id

9.2 请求示例

POST '/device/2f87d4d8d5e1b62f52cbd5c87fb4ba6e/disable'

9.3 返回值

9.3.1 成功(Status 200),无返回值

10. 启用设备

10.1. 接口定义

POST /device/{deviceId}/enable

参数 是否必填 说明
deviceId 设备id

10.2 请求示例

POST '/device/2f87d4d8d5e1b62f52cbd5c87fb4ba6e/enable'

10.3 返回值

10.3.1 成功(Status 200),无返回值

11. 创建设备批量注册任务

本接口调用返回的成功结果,仅表示批量注册的申请已经提交成功。实际的注册会有一个过程。 请调用查询设备批量注册任务执行状态接口查看批量注册结果。

11.1. 接口定义

POST /node/{nodeId}/{deviceType}/device/batch-register-job

参数 是否必填 说明
nodeId 节点id,同一批预注册设备必须同属一个物流节点
deviceType 设备类型,同一批预注册设备必须同属一种设备类型

请求体(JSON)

需要设置的设备名称/别名,支持设置多个设备。格式如下:

[
    {
        "deviceName": "xxx01",
        "deviceAlias": "xxx01"
    },
    {
        "deviceName": "xxx02",
        "deviceAlias": "xxx02"
    }
]

⚠️设备名称和设备别名需满足格式规范

11.2. 请求示例

POST '/node/a5d76108694f471ebe6036a60b0b1278/LEMO/device/batch-register'
--data-raw '[
    {
        "deviceName": "test_batch_register-02131600",
        "deviceAlias": ""
    },
    {
        "deviceName": "$test_batch_register-02131601",
        "deviceAlias": ""
    }
]'

11.3. 返回值

返回数据说明详见 13.3.1 返回数据说明

11.3.1 成功(Status 200)

IoT平台返回申请批次ID(applyId)以及批量注册记录(包括设备名称校验合法的设备集合originRegistrationDevices,以及设备名称校验非法的设备集合failedDeviceRegisterRecords)。 ⚠️注意:返回成功仅表示批量校验设备名称的申请已经提交成功。实际的校验是异步执行的,会有一个过程。

{
    "applyId": 373,
    "status": "CREATING",
    "deviceType": "LEMO",
    "nodeId": "52c2fe3b97ee49ba999f3b33582b5ad1",
    "originRegistrationDevices": [
        {
            "deviceId": "6644102d556e4cb2a7e8435be9b6a787",
            "deviceType": "LEMO",
            "deviceName": "test_batch_register-02131600",
            "deviceAlias": "test_batch_register_02131600",
            "groupId": "INNTER_TEST_PRE",
            "nodeId": "52c2fe3b97ee49ba999f3b33582b5ad1",
            "online": false,
            "clinkVersion": null,
            "activeTime": null
        }
    ],
    "successRegisteredDevices": null,
    "failedDeviceRegisterRecords": [
        {
            "deviceName": "$test_batch_register-02131601",
            "deviceAlias": "",
            "errorMessage": "device name must be 4 to 32 characters in length, and can contain letters, digits, hyphens (-), underscores (_), at signs (@), periods (.), and colons (:)"
        }
    ],
    "createTime": null,
    "updateTime": null
}

12. 查询设备批量注册任务执行状态

12.1. 接口定义

GET /device/batch-register/status?applyId={applyId}

参数 是否必填 说明
applyId 申请批次ID

12.2. 请求示例

/device/batch-register/status?applyId=371

12.3. 返回示例

12.3.1 返回数据说明

字段 说明
applyId 申请批次ID
status 申请单的处理状态和结果:
CREATING // 设备批量创建任务执行中
CREATE_SUCCESS, �// 设备批量创建任务完成,全部成功或部分成功
CREATE_FAILED; // 设备批量创建任务完成,全部失败
deviceType 批量注册的设备类型
nodeId 节点id
originRegistrationDevices 接口传入的所有“设备名称(deviceName)合法”的待注册设备列表
successRegisteredDevices 注册成功的设备列表
- 当返回Status参数值为CREATE_SUCCESS时,返回创建成功的设备名称集合。
- 当返回Status参数值为CREATE_FAILED时,该参数为空数组。
- 当返回Status参数值为CREATING时,该参数为空。
failedDeviceRegisterRecords “设备名称非法”或“注册失败”的设备列表(非空时包含设备信息(device
�字段)和失败原因(errorMessage字段))
- 当返回Status参数值为CREATE_SUCCESSCREATE_FAILED时,返回创建失败的设备名称及失败原因集合。
- 当返回Status参数值为CREATING时,返回由于“设备名称校验失败”导致注册失败的设备名称及失败原因集合,或返回空数组。

12.3.2 成功(Status 200)

{
    "applyId": 373,
    "status": "CREATE_SUCCESS",
    "deviceType": "LEMO",
    "nodeId": "52c2fe3b97ee49ba999f3b33582b5ad1",
    "originRegistrationDevices": [
        {
            "deviceId": "6644102d556e4cb2a7e8435be9b6a787",
            "deviceType": "LEMO",
            "deviceName": "test_batch_register-02131600",
            "deviceAlias": "test_batch_register_02131600",
            "groupId": "INNTER_TEST_PRE",
            "nodeId": "52c2fe3b97ee49ba999f3b33582b5ad1",
            "online": false,
            "clinkVersion": null,
            "activeTime": null
        }
    ],
    "successRegisteredDevices": [
        {
            "deviceId": "6644102d556e4cb2a7e8435be9b6a787",
            "deviceType": "LEMO",
            "deviceName": "test_batch_register-02131600",
            "deviceAlias": "test_batch_register_02131600",
            "groupId": "INNTER_TEST_PRE",
            "nodeId": "52c2fe3b97ee49ba999f3b33582b5ad1",
            "online": false,
            "clinkVersion": null,
            "activeTime": null
        }
    ],
    "failedDeviceRegisterRecords": [
        {
            "deviceName": "$test_batch_register-02131601",
            "deviceAlias": "",
            "errorMessage": "device name must be 4 to 32 characters in length, and can contain letters, digits, hyphens (-), underscores (_), at signs (@), periods (.), and colons (:)"
        }
    ],
    "createTime": 1644745281000,
    "updateTime": 1644745381000
}

13. 动态注册(弃用,非安全方式)

该接口将弃用,请使用新的动态注册接口

13.1. 接口定义

POST /{deviceType}/device/dynamic-register

13.2. 请求示例

/LEMO/device/dynamic-register
--data-raw '{
    "deviceName": "test_batch_register-02131600",
    "productSecret": "XXXXX5C51FA9FB1XXXXX8C3EC790F185XXXXX496C2A00C63XXXXX0344B3XXXXX"
}'

13.3. 返回示例

13.3.1. 成功(Status 200)

{
    "groupId": "INNTER_TEST_PRE",
    "deviceType": "LEMO",
    "deviceName": "test_batch_register-02131600",
    "deviceSecret": "CC234710B5EC413CD80CFF496FD67853B951C6F0A7CC5AE1B4ED91298E5C7DFC",
    "deviceId": "6644102d556e4cb2a7e8435be9b6a787",
    "nodeName": "木升测试节点",
    "nodeId": "52c2fe3b97ee49ba999f3b33582b5ad1",
    "nodeCode": "MSCSJD",
    "mqttBroker": {
        "address": [
            "tcp://11.161.91.194:8080"
        ],
        "version": "3.0",
        "cert": null
    },
    "httpServer": {
        "address": [
            "http://device-proxy.taobao.net"
        ],
        "version": "2.0",
        "cert": null
    },
    "mqttAddress": "tcp://11.161.91.194:8080"
}

13.3.2. 失败(Status 4xx)

// 设备类型不支持动态注册
400 Product: {deviceType} is not allowed to dynamically registered.

// 一型一密非法,动态注册失败
400 Invalid product secret, deny to register device dynamically.

// 设备不存在,请先进行设备预注册,或者查询批量注册任务执行状态
404 Device not found for nodeId: {nodeId}, deviceType: {deviceType}, deviceName: {deviceName}. Please pre-register the device first, or check the dynamical registration status.

14. 设置设备属性

本接口仅允许为在线设备设置属性值。如果设备不在线,则接口直接报错。

14.1. 接口定义

14.1.1 根据nodeId+deviceType+deviceName设置设备属性

POST /node/{nodeId}/{deviceType}/device/{deviceName}/properties

参数 是否必填 说明
nodeId 节点ID
deviceType 设备类型
deviceName 设备名称

14.1.2 根据nodeId+deviceType+deviceName设置设备属性

POST /device/{deviceId}/properties

参数 是否必填 说明
deviceId 设备唯一ID

请求体(JSON)

需要设置的设备属性,支持设置多个属性。
设备属性是JSON格式,每个属性的具体结构为:Key:Value。
Key是属性名称,Value是属性值
例如:

{
    "detailConfig": {
        "value": "{\"usbVideoDelayEnd\":5,\"junoEnable\":false,\"scaleComPort\":\"COM1\",\"scaleBaudRate\":19200,\"scaleModule\":1,\"isUsbVideoProxy\":false,\"directPrint\":false,\"cloudPrint\":\"cloud\",\"junoNetworkId\":\"88\",\"usbVideoSwitch\":false,\"storageId\":\"\"}",
        "time": 1644843410465
    }
}

14.2 请求示例

POST '/device/3d832b1b7c1359aab0549916757e125c/properties'
--data '{"detailConfig":{"value":"{\"usbVideoDelayEnd\":5,\"junoEnable\":false,\"scaleComPort\":\"COM1\",\"scaleBaudRate\":19200,\"scaleModule\":1,\"isUsbVideoProxy\":false,\"directPrint\":false,\"cloudPrint\":\"cloud\",\"junoNetworkId\":\"88\",\"usbVideoSwitch\":false,\"storageId\":\"\"}","time":1644843410465}}'

14.3. 返回示例

14.3.1. 成功(Status 200),无返回体

14.3.2. 失败(Status 500),设备不在线

errorCode:ALIYUN_LP_FAILED,errorMsg:The device is offline.

15. 设备方法调用

本接口仅允许为在线设备进行方法调用。如果设备不在线,则接口直接报错。

15.1. 接口定义

15.1.1. 根据deviceId调用设备同步/异步方法

同步方法调用:POST /device/{deviceId}/sync-method/{methodName} 异步方法调用:POST /device/{deviceId}/async-method/{methodName}

参数 是否必填 说明
deviceId 设备ID
methodName 物模型定义中的待调用方法identifier

15.1.2. 根据deviceType和deviceName调用设备同步/异步方法

同步方法调用:POST /{deviceType}/device/{deviceName}/sync-method/{methodName} 异步方法调用:POST /{deviceType}/device/{deviceName}/async-method/{methodName}

参数 是否必填 说明
deviceType 设备类型
deviceName 设备名称
methodName 物模型定义中的待调用方法identifier

请求体(JSON)

物模型方法定义中的方法入参。

  1. 如果物模型方法入参为空,例如:"inputData": []

则请求体传入空map:{};

  1. 如果物模型方法入参非空,例如:
    "inputData":[{"identifier":"text","name":"text","dataType":{"type":"text","specs":{"length":2048}}}]
    
    则请求体传入:{"text": "123"}

    15.2 请求示例

    POST '/device/516aad9a94ccab42b87d9f9bb0abae24/sync-method/speak'
    --header 'content-type: application/json;charset=UTF-8'
    --data '{"text":"123"}'
    

    15.3. 返回示例

    15.3.1. 成功(Status 200),返回体格式由物模型方法出参定义

    15.3.2. 失败(Status 500), 设备离线

    errorCode:ALIYUN_LP_FAILED,errorMsg:The device is offline.
    

    15.3.3. 失败(Status 500), 非同步/异步方法

    物模型定义中方法为同步(异步)方法,方法调用时发起了异步(同步)方法调用

errorCode:NOT_ASYNC_METHOD,errorMsg:this is not async method

16. 一型一密动态注册

16.1. 接口定义

POST /device/dynamic-register

参数 传参方式 是否必填 说明
registry JSON Body 动态注册参数,JSON格式。
每个参数的具体结构为:Key:Value。
Key是参数名,Value是参数值。Key区分大小写。

动态注册必须包含Key为“deviceType”,“deviceName”,“sign”,“signMethod”四个参数,除上述四个必填参数外,允许自定义附加参数,附加参数将参数签名运算。其中:
- “sign”签名计算规则如下:
1. 生成待签字符串:将所有提交给服务器的参数(sign、signMethod除外)按照非大小写敏感的字典序升序排序,然后将参数和值依次拼接(无拼接符号)。
1. 通过“signMethod”指定的加签算法,使用产品的productSecret,对待签字符串进行加签。
> 如果“deviceType”为“LEMO”, “deviceName”为“test”,则待签字符串为“deviceNametestdeviceTypeLEMO”。以HmacSHA256签名方法为例,签名“sign”计算示例如下:

sign = HexEncode(HmacSHA256(productSecret, deviceNametestdeviceTypeLEMO))。 上式中,HexEncode表示以小写字母形式返回的Base16编码函数,HmacSHA256()表示基于HmacSHA256算法的哈希运算。

  • signMethod”签名方法,目前支持HmacMD5、HmacSHA1、HmacSHA256。签名方法不区分大小写。
    |

16.2 请求示例

POST '/device/dynamic-register'
--header 'Content-Type: application/json'
--data '{
    "deviceName": "test",
    "deviceType": "LEMO",
    "sign": "593287c5333f9b814a32b69d5e3acf717540241992ecdb3c17ebe980f929962d",
    "signMethod": "HmacSHA256"
}'

16.3 返回示例

16.3.1. 成功(Status 200),返回设备信息

{
    "groupId": "test_business_PRE",
    "deviceType": "LEMO",
    "deviceName": "test",
    "deviceSecret": "xxxxxx4c668fxxxxxxd571d762xxxxxx",
    "deviceId": "c9317ba4cfcfa60037fba1b745b7171c",
    "nodeName": "测试节点1",
    "nodeId": "a5d76108694f471ebe6036a60b0b1278",
    "nodeCode": "test_node1",
    "mqttBroker": {
        "address": [
            "tcp://1.2.3.4:8080"
        ],
        "version": "3.0",
        "cert": null
    },
    "httpServer": {
        "address": [
            "http://device-proxy.taobao.net"
        ],
        "version": "2.0",
        "cert": null
    },
    "mqttAddress": "tcp://1.2.3.4:8080"
}

16.3.2. 失败(Status 4xx)

// 设备类型不支持动态注册
400 Product: {deviceType} is not allowed to dynamically registered.

// 缺失必要的动态注册参数
400 deviceType/deviceName/sign/signMethod is absent.

// 不支持的签名方法
400 Algorithm {inputAlgorithm} not available, only support [HmacMD5, HmacSHA1, HmacSHA256].

// 验签失败
403 Failed to auth sign, deny to dynamically register device.

// 产品不存在
404 Product not exist for: {deviceType}

// 设备不存在,请先进行设备预注册,或者查询批量注册任务执行状态
404 Device not found for nodeId: {nodeId}, deviceType: {deviceType}, deviceName: {deviceName}. Please pre-register the device first, or check the dynamical registration status.

17.查询某产品下设备列表

17.1. 接口定义

GET /{deviceType}/devices?deviceNames=name1,name2,name3

参数 传参方式 是否必填 说明
deviceNames 查询参数 设备名称列表,最多允许传入50个设备名称,支持以”,”分隔符分割多个设备名称。
以下两种传参方式等价:
方式一:?deviceNames=name1,name2,name3
等价于
方式二:?deviceNames=name1&deviceNames=name2&deviceNames=name3

⚠️注意:本接口仅会返回传入deviceNames中存在的设备。例如,查询参数中传入了三个设备名称,”name1”, “name2”, “name_not_exist” ,其中名称为”name_not_exist”的设备不存在,则接口返回的设备列表中将仅包含设备名称为”name1”, “name2”的设备信息。

17.2. 请求示例

GET '/LEMO/devices?deviceNames=test,short:url:register:test,08:00:27:91:5f:05'

17.3. 返回示例

17.3.1. 成功(Status 200)

[{
    "deviceId": "2f87d4d8d5e1b62f52cbd5c87fb4ba6e",
    "deviceType": "LEMO",
    "deviceName": "short:url:register:test",
    "deviceAlias": "短链注册测试设备",
    "groupId": "aliyu_business_PRE",
    "nodeId": "eb05f64cacd94a0e90b17b8ffd3e87c9",
    "clinkVersion": null,
    "activeTime": null,
    "lastOnlineTime": null,
    "productKey": "gppgjJgemdD",
    "status": "UNACTIVE"
}, {
    "deviceId": "256350ecc423edd667d2193c3ed14cb8",
    "deviceType": "LEMO",
    "deviceName": "08:00:27:91:5f:05",
    "deviceAlias": "测试1",
    "groupId": "aliyu_business_PRE",
    "nodeId": "a5d76108694f471ebe6036a60b0b1278",
    "clinkVersion": null,
    "activeTime": null,
    "lastOnlineTime": null,
    "productKey": "gppgjJgemdD",
    "status": "UNACTIVE"
}, {
    "deviceId": "c9317ba4cfcfa60037fba1b745b7171c",
    "deviceType": "LEMO",
    "deviceName": "test",
    "deviceAlias": "test",
    "groupId": "aliyu_business_PRE",
    "nodeId": "a5d76108694f471ebe6036a60b0b1278",
    "clinkVersion": null,
    "activeTime": null,
    "lastOnlineTime": null,
    "productKey": "gppgjJgemdD",
    "status": "OFFLINE"
}]

18.单个设备注册

18.1. 接口定义

POST /node/{nodeId}/{deviceType}/device

参数 是否必填 说明
nodeId 节点id,同一批预注册设备必须同属一个物流节点
deviceType 设备类型,同一批预注册设备必须同属一种设备类型

请求体(JSON)

需要设置的设备名称/别名。格式如下:

{
    "deviceName": "xxx",
    "deviceAlias": "xxx"
}

请求体中,deviceName为待注册的设备名称,deviceAlias为待注册的设备别名。

⚠️设备名称deviceName和设备别名deviceAlias需要满足如下格式要求:
  • deviceName长度为4~32个字符,可以包含英文字母、数字和特殊字符:短划线(-)、下划线(_)、at(@)、半角句号(.)、半角冒号(:)。
  • deviceAlias长度为4~64个字符,可包含中文汉字、英文字母、数字和下划线(_)。一个中文汉字算2个字符。

    18.2. 请求示例

    POST /node/a5d76108694f471ebe6036a60b0b1278/LEMO/device
    --data-raw '{
      "deviceName": "device1",
      "deviceAlias": "device1别名"
    }'
    

    18.3. 返回示例

    18.3.1. 成功(Status 200)

    {
      "groupId": "aliyu_business_PRE",
      "deviceType": "LEMO",
      "productKey": "xxxgjJgexxx",
      "deviceName": "device1",
      "deviceSecret": "xxx",
      "deviceId": "xxxx6195c3acd39bcfa117b9860cxxxx",
      "iotId": "xxxxD81tGrEBtVU2MRwegpxxxx",
      "nodeName": "阿里云对接测试节点1",
      "nodeId": "a5d76108694f471ebe6036a60b0b1278",
      "nodeCode": "aliyun_node1",
      "mqttBroker": {
          "address": [
              "tcp://iot-010a09xr.mqtt.iothub.aliyuncs.com:1883"
          ]
      },
      "httpServer": {
          "address": [
              "http://11.161.37.234:80"
          ],
          "version": "2.0"
      },
      "mqttAddress": "tcp://iot-010a09xr.mqtt.iothub.aliyuncs.com:1883"
    }
    

    18.3.2. 失败(Status 400)

    // 设备名称非法
    400 device name must be 4 to 32 characters in length, and can contain letters, digits, hyphens (-), underscores (_), at signs (@), periods (.), and colons (:)