智能车行接入

更新时间:2023-02-27 03:14:13下载pdf

本文介绍了涂鸦智慧行业车行接入方案,通过涂鸦边缘网关实现与平台通信的能力。

方案架构

涂鸦提供了接入方案,帮助车行设备快速接入涂鸦 IoT 开发平台。车行网关接入边缘网关的方案架构如下图所示:

智能车行接入

车行网关采用 MQTT 协议接入边缘网关并进行通信。

业务流程

涂鸦 IoT 开发平台边缘网关设备网关同步设备信息激活设备返回结果返回结果云端下发控制指令下发指令返回执行结果返回结果上报设备属性上报设备属性返回处理结果返回结果定时上报设备上下线上报设备上下线涂鸦 IoT 开发平台边缘网关设备网关

设备功能列表

请求类型 设备能力 功能说明 指令类型
1 车场信息同步指令下发 同步车场信息。 下发
2 车场信息上报 车场信息上报。 上报
3 设备数据同步指令下发 边缘网关发送设备列表同步请求,车行网关同步设备列表。 下发
4 设备数据同步消息上报 车行网关收到边缘网关发送设备列表同步请求,通过该接口上报车行网关下的车行设备信息。 上报
5 新增固定⻋指令下发 新增固定⻋。 下发
6 修改固定⻋指令下发 修改固定⻋。 下发
7 删除固定⻋指令下发 删除固定⻋。 下发
8 无牌车通行指令下发 无牌车通行。 下发
9 新增访客车指令下发 新增访客车。 下发
10 修改访客车指令下发 修改访客车。 下发
11 删除访客车指令下发 删除访客车。 下发
12 访客车延期指令下发 访客车延期。 下发
13 生成待支付订单指令下发 生成待支付订单。 下发
14 支付结果通知指令下发 支付结果通知。 下发
15 锁车指令下发 锁车。 下发
16 解锁车指令下发 解锁车。 下发
17 新增特殊车指令下发 新增特殊车。 下发
18 删除特殊车指令下发 删除特殊车。 下发
19 校正车牌事件上报 校正车牌事件。 上报
20 数据同步指令下发 数据指令同步。 下发
21 缴费记录事件上报 上报缴费记录事件。 上报
22 通行事件上报 上报通行事件。 上报
23 设备状态上报 上报设备的上线、离线消息。 上报
24 道闸当前车辆查询指令下发 道闸当前车辆查询。 下发
25 道闸控制指令下发 道闸控制。 下发

对接协议

车行网关用 MQTT 协议与涂鸦边缘网关进行通信,其中车行网关做客户端,涂鸦边缘网关做 MQTT 代理(Broker)。

连接认证

  • ip:MQTT Broker 设备的 IP 地址。与涂鸦 IoT 开发平台联调时,由涂鸦提供。

  • port:MQTT Broker 设备的端口。与涂鸦 IoT 开发平台联调时,由涂鸦提供。

  • clientId:表示车行网关客户端 ID。

  • username:车行网关设备厂商标识,与涂鸦 IoT 开发平台联调时由涂鸦提供。

  • passwordsub(md5(clientId + username), 0, 16)password 生成示例:

    clientId: abcd1234
    username: tuya
    password: sub(md5(clientId + username), 0, 16)-> c88ba730489ed678
    

ipportclientIdusername 需要提前配置到车行网关,便于您的车行网关每次启动都能读取到这些参数,从而连上边缘网关。

车行网关上报消息 Topic

推送:gateway/vehicle/out/{clientId}
payloadbase64.Encode(aes.encrypt(payload, password))

消息示例

password: "f4ae303385f24fc8"
payload: `{"t":1655200901,"reqId":"1655200901125274008","reqType":2,"data":{}}`
secPayload: "WMnpAqV9Diuz9hbhb5U5zMN3jgGubWaPGT3xDbY0QnUDy6B72W9pH0Li/cRN5i17dQnWqWZKnkicTZHv0G6WkKtFoEE6dkho0FhVAXOxNiY="

车行网关订阅消息 Topic

推送:gateway/vehicle/in/{clientId}
payloadbase64.Decode(aes.decrypt(payload, password))

消息示例

password: "f4ae303385f24fc8"
secPayload: "WMnpAqV9Diuz9hbhb5U5zMN3jgGubWaPGT3xDbY0QnUDy6B72W9pH0Li/cRN5i17dQnWqWZKnkicTZHv0G6WkKtFoEE6dkho0FhVAXOxNiY="
payload: `{"t":1655200901,"reqId":"1655200901125274008","reqType":1,"data":{}}`

消息加密和解密

设备推送和接收的消息要进行 AES 加密及解密:

  • 消息体使用 JSON 进行序列化和反序列化。
  • 加密解密方式:AES-ECB。
  • 加密解密密码:采用连接认证时使用的密码(password)。

加密或解密代码示例

password := "f4ae303385f24fc8"
payload := `{"t":1655199371,"reqId":"1655199371114618671","reqType":1,"data":null}`
data, err := aes_crypto.AesECBEncrypt([]byte(payload), []byte(password))
fmt.Println(err)
base64str := base64.StdEncoding.EncodeToString(data)
fmt.Println(base64str)

dataE, err := base64.StdEncoding.DecodeString(base64str)
fmt.Println(err)
dataD, err := aes_crypto.AesECBDecrypt(dataE, []byte(password))
fmt.Println(err)
fmt.Println(string(dataD))

设备管理

同步车场信息指令下发

用于车行信息同步,在车行网关连接上涂鸦边缘网关的 MQTT 服务器后,会发送车行信息同步指令。车行网关接收到指令后上报车场信息。

请求参数

参数 类型 描述 是否必填
t Long 消息推送时间。
reqId String 请求流水号。推荐 UUID 生成,网关可以根据 reqId 监听本次推送的结果。最大长度为 64 字符。
reqType Integer reqType = 1,表示同步车场信息。
data Object 业务数据。

消息格式

{
	"t": 159801061****,
	"reqId": 123123****,
	"reqType": 1,
	"data": {}
}

车场信息上报

车行网关上报车场信息。涂鸦边缘网关会对上报的车场信息进行新增或更新。涂鸦边缘网关更新状态后,返回操作结果。

请求参数

参数 类型 描述 是否必填
t Long 消息推送时间。
reqId String 请求流水号。推荐 UUID 生成,网关可以根据 reqId 监听本次推送的结果。最大长度为 64 字符。
reqType Integer reqType = 2,表示车场信息上报。
data Object 业务数据。
+ parkId String 车场 ID,最大长度为 64 字符。
+ parkName String 车场名称。
+ totalSpaceNum Integer 总车位数。
+ freeSpaceNum Integer 空闲车位数。

消息格式

{
    "t": 1655275***,
    "reqId": "16552757***",
    "reqType": 2,
    "data": {
        "parkId": "parkId***",
        "parkName": "虚拟车场",
        "totalSpaceNum": 1000,
        "freeSpaceNum": 910
    }
}

设备数据同步指令下发

用于设备数据同步。在车行网关连接上涂鸦边缘网关的 MQTT 服务器后,会发送设备数据同步指令。车行网关接收到指令后,上报设备数据。

请求参数

参数 类型 描述 是否必填
t Long 消息推送时间。
reqId String 请求流水号。推荐 UUID 生成,网关可以根据 reqId 监听本次推送的结果。最大长度为 64 字符。
reqType Integer reqType = 3,表示设备数据同步。
data Object 业务数据。

消息格式

{
	"t": 159801061***,
	"reqId": 123123***,
	"reqType": 3,
	"data": {}
}

设备数据同步消息上报

车行网关上报设备数据。涂鸦边缘网关会对上报的设备数据进行新增或更新。涂鸦边缘网关更新状态后,返回操作结果。

请求参数

参数 类型 描述 是否必填
t Long 消息推送时间。
reqId String 请求流水号。推荐 UUID 生成,网关可以根据 reqId 监听本次推送的结果。最大长度为 64 字符。
reqType Integer reqType = 4,表示设备数据同步消息上报。
data Object 业务数据。
+ devs Array 设备列表。
++ cid String 三方设备 ID。建议采用设备端可读取的唯一标识作为 cid,例如设备的 SN 号、MAC 地址、IMEI 号等。最大长度为 64 字符。
++ deviceName String 设备名称。最大长度为 64 字符。
++ installLocation String 设备安装地址。最大长度为 64 字符。
++ deviceIp String 设备 IP。最大长度为 64 字符。
++ deviceType String 设备操作类型。
  • 1:进闸
  • 2:出闸

消息格式

{
    "t": 1655275***,
    "reqId": "16552757***",
    "reqType": 4,
    "data": {
        "devs": [
            {
                "cid": "vehicle***",
                "parkId": "parkId***",
                "deviceName": "车闸进",
                "installLocation": "虚拟车行",
                "deviceIp": "192.168.1.***",
                "deviceType": "1"
            },
            ...
        ]
    }
}

设备状态上报

上报设备的在线、离线状态。涂鸦边缘网关更新状态后,返回操作结果。

请求参数

参数 类型 描述 是否必填
t Long 消息推送时间。
reqId String 请求流水号。推荐 UUID 生成,网关可以根据 reqId 监听本次推送的结果。最大长度为 64 字符。
reqType Integer reqType = 23,表示设备状态上报。
data Object 业务数据。
+ cid String 三方设备 ID。建议采用设备端可读取的唯一标识作为 cid,例如设备的 SN 号、MAC 地址、IMEI 号等。最大长度为 64 字符。
+ online Integer 设备状态。
  • 1:设备离线
  • 2:设备在线

响应参数

参数 类型 描述 是否必填
t Long 消息推送时间。
reqId String 请求流水号。推荐 UUID 生成,网关可以根据 reqId 监听本次推送的结果。最大长度为 64 字符。
reqType Integer reqType = 2,表示车场信息上报。
data Object 业务数据。
+ success Bool 请求结果。
  • true: 成功
  • false: 失败
+ msg String 响应信息。

消息格式

{
    "t": 1655275***,
    "reqId": "16552757***",
    "reqType": 23,
    "data": {
        "cid": "vehicle***",
        "online": 1
    }
}

响应消息格式

{
    "t": 1655275***,
    "reqId": "16552757***",
    "reqType": 23,
    "data": {
        "success": true,
        "msg": "success"
    }
}

道闸当前车辆查询指令下发

根据 cid 查询设备的当前车辆信息,车行网关收到指令后查询道闸设备当前车辆信息,然后上报结果。

请求参数

参数 类型 描述 是否必填
t Long 消息推送时间。
reqId String 请求流水号。推荐 UUID 生成,网关可以根据 reqId 监听本次推送的结果。最大长度为 64 字符。
reqType Integer reqType = 24,表示道闸当前车辆查询指令下发。
data Object 业务数据。
+ cid String 三方设备 ID。建议采用设备端可读取的唯一标识作为 cid,例如设备的 SN 号、MAC 地址、IMEI 号等。最大长度为 64 字符。

响应参数

参数 类型 描述 是否必填
t Long 消息推送时间。
reqId String 请求流水号。推荐 UUID 生成,网关可以根据 reqId 监听本次推送的结果。最大长度为 64 字符。
reqType Integer reqType = 24,表示道闸当前车辆查询指令。
data Object 业务数据。
+ success Bool 请求结果。
  • true: 成功
  • false: 失败
+ msg String 响应信息。
+ plateNo String 车牌号,格式:无-B0KPTX。最大长度为 64 字符。
+ captureTime Long 查询时间,13 位毫秒时间戳。

消息格式

{
    "t": 1655275***,
    "reqId": "16552757***",
    "reqType": 24,
    "data": {
        "cid": "vehicle***"
    }
}

返回结果消息格式

{
    "t": 1655275***,
    "reqId": "16552757***",
    "reqType": 24,
    "data": {
        "success": true,
        "msg": "success",
        "plateNo": "无-B0K123",
        "captureTime": 1655284422123,
    }
}

道闸控制指令下发

车行网关收到道闸控制指令,对应道闸设备进行操作,然后上报操作结果。

请求参数

参数 类型 描述 是否必填
t Long 消息推送时间。
reqId String 请求流水号。推荐 UUID 生成,网关可以根据 reqId 监听本次推送的结果。最大长度为 64 字符。
reqType Integer reqType = 25,表示道闸控制指令。
data Object 业务数据。
+ cid String 三方设备 ID。建议采用设备端可读取的唯一标识作为 cid,例如设备的 SN 号、MAC 地址、IMEI 号等。最大长度为 64 字符。
+ openModel Integer 道闸控制操作类型。
  • 1:开闸
  • 2:从抬杠到关闸
  • 3:启用常开
  • 4:关闭常开

消息格式

{
    "t": 1655275***,
    "reqId": "16552757***",
    "reqType": 25,
    "data": {
        "cid": "vehicle***",
        "openModel": 1
    }
}

返回结果消息格式

{
    "t": 1655275***,
    "reqId": "16552757***",
    "reqType": 25,
    "data": {
        "success": true,
        "msg": "success"
    }
}

车辆管理

新增固定⻋指令下发

车行网关收到新增固定⻋指令,进行新增固定车信息,然后上报操作结果。

请求参数

参数 类型 描述 是否必填
t Long 消息推送时间。
reqId String 请求流水号。推荐 UUID 生成,网关可以根据 reqId 监听本次推送的结果。最大长度为 64 字符。
reqType Integer reqType = 5,表示新增固定⻋指令。
data Object 业务数据。
+ id String 固定车唯一识别 ID。
+ cars Array 固定车列表。
++ plateNo String 车牌号,格式:无-B0KPTX。
+ beginTime Long 开始时间,13 位毫秒时间戳。
+ endTime Long 结束时间,13 位毫秒时间戳。
+ owner String 授权所属用户姓名。最大长度为 64 字符。

消息格式

{
    "t": 1655275***,
    "reqId": "16552757***",
    "reqType": 5,
    "data": {
        "id": "12***",
        "cars": [
            {
                "plateNo": "无-B0K123",
            }
        ],
        "beginTime": 1655284422123,
        "endTime": 1655284422123,
        "owner": "张三"
    }
}

响应消息格式

{
    "t": 1655275***,
    "reqId": "16552757***",
    "reqType": 5,
    "data": {
        "success": true,
        "msg": "success",
    }
}

修改固定⻋指令下发

车行网关收到修改固定⻋指令,进行修改固定车信息,然后上报操作结果。

请求参数

参数 类型 描述 是否必填
t Long 消息推送时间。
reqId String 请求流水号。推荐 UUID 生成,网关可以根据 reqId 监听本次推送的结果。最大长度为 64 字符。
reqType Integer reqType = 6,表示修改固定⻋指令。
data Object 业务数据。
+ id String 固定车唯一识别 ID。
+ cars Array 固定车列表。
++ plateNo String 车牌号,格式:无-B0KPTX。
+ beginTime Long 开始时间,13 位毫秒时间戳。
+ endTime Long 结束时间,13 位毫秒时间戳。
+ owner String 授权所属用户姓名。最大长度为 64 字符。

消息格式

{
    "t": 1655275***,
    "reqId": "16552757***",
    "reqType": 6,
    "data": {
        "id": "12***",
        "cars": [
            {
                "plateNo": "无-B0K123",
            }
        ],
        "beginTime": 1655284422123,
        "endTime": 1655284422123,
        "owner": "张三"
    }
}

响应消息格式

{
    "t": 1655275***,
    "reqId": "16552757***",
    "reqType": 6,
    "data": {
        "success": true,
        "msg": "success",
    }
}

删除固定⻋指令下发

车行网关收到删除固定⻋指令,进行固定车信息删除,然后上报操作结果。

请求参数

参数 类型 描述 是否必填
t Long 消息推送时间。
reqId String 请求流水号。推荐 UUID 生成,网关可以根据 reqId 监听本次推送的结果。最大长度为 64 字符。
reqType Integer reqType = 7,表示删除固定⻋指令。
data Object 业务数据。
+ id String 固定车唯一识别 ID。最大长度为 64 字符。

消息格式

{
    "t": 1655275***,
    "reqId": "16552757***",
    "reqType": 7,
    "data": {
        "id": "12***"
    }
}

响应消息格式

{
    "t": 1655275***,
    "reqId": "16552757***",
    "reqType": 7,
    "data": {
        "success": true,
        "msg": "success",
    }
}

无牌车通行指令下发

车行网关收到无牌车通行指令,进行无牌车通行操作,然后上报操作结果。

请求参数

参数 类型 描述 是否必填
t Long 消息推送时间。
reqId String 请求流水号。推荐 UUID 生成,网关可以根据 reqId 监听本次推送的结果。最大长度为 64 字符。
reqType Integer reqType = 8,表示无牌车通行指令。
data Object 业务数据。
+ cid String 三方设备 ID。建议采用设备端可读取的唯一标识作为 cid,例如设备的 SN 号、MAC 地址、IMEI 号等。最大长度为 64 字符。
+ cardNo String 无牌车身份标识码,可以是卡号、手机号、微信号等用户的唯一标识。最大长度为 64 字符。

消息格式

{
    "t": 1655275***,
    "reqId": "16552757***",
    "reqType": 8,
    "data": {
        "cid": "vehicle***",
        "cardNo": "156***",
    }
}

响应消息格式

{
    "t": 1655275***,
    "reqId": "16552757***",
    "reqType": 8,
    "data": {
        "success": true,
        "msg": "success",
    }
}

新增访客车指令下发

车行网关收到新增访客车指令,进行新增访客车信息,然后上报操作结果。

请求参数

参数 类型 描述 是否必填
t Long 消息推送时间。
reqId String 请求流水号。推荐 UUID 生成,网关可以根据 reqId 监听本次推送的结果。最大长度为 64 字符。
reqType Integer reqType = 9,表示新增访客车指令。
data Object 业务数据。
+ id String 访客车唯一识别 ID。最大长度为 64 字符。
+ plateNo String 车牌号,格式:无-B0KPTX。最大长度为 64 字符。
+ visitorName String 访客名字。最大长度为 64 字符。
+ visitorPhone String 访客手机号。最大长度为 64 字符。
+ beginTime Long 开始时间,13 位毫秒时间戳。
+ endTime Long 结束时间,13 位毫秒时间戳。

消息格式

{
    "t": 1655275***,
    "reqId": "16552757***",
    "reqType": 9,
    "data": {
        "id": "12***",
        "plateNo": "无-B0K123",
        "visitorName": "visitor",
        "beginTime": 1655284422123,
        "endTime": 1655284422123,
        "visitorPhone": "156***"
    }
}

响应消息格式

{
    "t": 1655275***,
    "reqId": "16552757***",
    "reqType": 9,
    "data": {
        "success": true,
        "msg": "success",
    }
}

修改访客车指令下发

请求参数

参数 类型 描述 是否必填
t Long 消息推送时间。
reqId String 请求流水号。推荐 UUID 生成,网关可以根据 reqId 监听本次推送的结果。最大长度为 64 字符。
reqType Integer reqType = 10,表示修改访客车指令。
data Object 业务数据。
+ id String 访客车唯一识别 ID。最大长度为 64 字符。
+ plateNo String 车牌号,格式:无-B0KPTX。最大长度为 64 字符。
+ visitorName String 访客名字。最大长度为 64 字符。
+ visitorPhone String 访客手机号。最大长度为 64 字符。
+ beginTime Long 开始时间,13 位毫秒时间戳。
+ endTime Long 结束时间,13 位毫秒时间戳。

消息格式

{
    "t": 1655275***,
    "reqId": "16552757***",
    "reqType": 10,
    "data": {
        "id": "12***",
        "plateNo": "无-B0K123",
        "visitorName": "visitor",
        "beginTime": 1655284422123,
        "endTime": 1655284422123,
        "visitorPhone": "156***"
    }
}

响应消息格式

{
    "t": 1655275***,
    "reqId": "16552757***",
    "reqType": 10,
    "data": {
        "success": true,
        "msg": "success",
    }
}

删除访客车指令下发

请求参数

参数 类型 描述 是否必填
t Long 消息推送时间。
reqId String 请求流水号。推荐 UUID 生成,网关可以根据 reqId 监听本次推送的结果。最大长度为 64 字符。
reqType Integer reqType = 11,表示删除访客车指令。
data Object 业务数据。
+ id String 访客车唯一识别 ID。最大长度为 64 字符。

消息格式

{
    "t": 1655275***,
    "reqId": "16552757***",
    "reqType": 11,
    "data": {
        "id": "12***"
    }
}

响应消息格式

{
    "t": 1655275***,
    "reqId": "16552757***",
    "reqType": 11,
    "data": {
        "success": true,
        "msg": "success",
    }
}

访客车延期指令下发

车行网关收到访客车延期指令,对现有访客车进行延期操作,然后上报操作结果。

请求参数

参数 类型 描述 是否必填
t Long 消息推送时间。
reqId String 请求流水号。推荐 UUID 生成,网关可以根据 reqId 监听本次推送的结果。最大长度为 64 字符。
reqType Integer reqType = 12,表示访客车延期指令。
data Object 业务数据。
+ id String 访客车唯一识别 ID。最大长度为 64 字符。
+ beginTime Long 开始时间,13 位毫秒时间戳。
+ endTime Long 结束时间,13 位毫秒时间戳。

消息格式

{
    "t": 1655275***,
    "reqId": "16552757***",
    "reqType": 12,
    "data": {
        "id": "12***",
        "beginTime": 1655284422123,
        "endTime": 1655284422123
    }
}

响应消息格式

{
    "t": 1655275***,
    "reqId": "16552757***",
    "reqType": 12,
    "data": {
        "success": true,
        "msg": "success",
    }
}

锁车指令下发

车行网关收到锁车指令,对车辆进行锁车操作,然后上报操作结果。

请求参数

参数 类型 描述 是否必填
t Long 消息推送时间。
reqId String 请求流水号。推荐 UUID 生成,网关可以根据 reqId 监听本次推送的结果。最大长度为 64 字符。
reqType Integer reqType = 15,表示锁车指令。
data Object 业务数据。
+ plateNo String 锁车车牌号,格式:无-B0KPTX。最大长度为 64 字符。

消息格式

{
    "t": 1655275***,
    "reqId": "16552757***",
    "reqType": 15,
    "data": {
        "plateNo": "无-B0K123"
    }
}

响应消息格式

{
    "t": 1655275***,
    "reqId": "16552757***",
    "reqType": 15,
    "data": {
        "success": true,
        "msg": "success",
    }
}

解锁车指令下发

车行网关收到解锁车指令,对车辆进行解锁车操作,然后上报操作结果。

请求参数

参数 类型 描述 是否必填
t Long 消息推送时间。
reqId String 请求流水号。推荐 UUID 生成,网关可以根据 reqId 监听本次推送的结果。最大长度为 64 字符。
reqType Integer reqType = 16,表示解锁车指令。
data Object 业务数据。
+ plateNo String 解锁车车牌号,格式:无-B0KPTX。最大长度为 64 字符。

消息格式

{
    "t": 1655275***,
    "reqId": "16552757***",
    "reqType": 16,
    "data": {
        "plateNo": "无-B0K123"
    }
}

响应消息格式

{
    "t": 1655275***,
    "reqId": "16552757***",
    "reqType": 16,
    "data": {
        "success": true,
        "msg": "success",
    }
}

新增特殊车指令下发

车行网关收到新增特殊车指令,新增特殊车辆白名单或黑名单,然后上报操作结果。

请求参数

参数 类型 描述 是否必填
t Long 消息推送时间。
reqId String 请求流水号。推荐 UUID 生成,网关可以根据 reqId 监听本次推送的结果。最大长度为 64 字符。
reqType Integer reqType = 17,表示新增特殊车指令。
data Object 业务数据。
+ plateNo String 车牌号,格式:无-B0KPTX。最大长度为 64 字符。
+ specialType String 特殊车辆类型。
  • WHITE_LIST:白名单
  • BLACK_LIST:黑名单

消息格式

{
    "t": 1655275***,
    "reqId": "16552757***",
    "reqType": 17,
    "data": {
        "plateNo": "无-B0K123",
        "specialType": "WHITE_LIST"
    }
}

响应消息格式

{
    "t": 1655275***,
    "reqId": "16552757***",
    "reqType": 17,
    "data": {
        "success": true,
        "msg": "success",
    }
}

删除特殊车指令下发

车行网关收到删除特殊车指令,删除特殊车辆的白名单或黑名单,然后上报操作结果。

请求参数

参数 类型 描述 是否必填
t Long 消息推送时间。
reqId String 请求流水号。推荐 UUID 生成,网关可以根据 reqId 监听本次推送的结果。最大长度为 64 字符。
reqType Integer reqType = 18,表示删除特殊车指令。
data Object 业务数据。
+ plateNo String 车牌号,格式:无-B0KPTX。最大长度为 64 字符。
+ specialType String 特殊车辆类型。
  • WHITE_LIST:白名单
  • BLACK_LIST:黑名单

消息格式

{
    "t": 1655275***,
    "reqId": "16552757***",
    "reqType": 18,
    "data": {
        "plateNo": "无-B0K123",
        "specialType": "WHITE_LIST"
    }
}

响应消息格式

{
    "t": 1655275***,
    "reqId": "16552757***",
    "reqType": 18,
    "data": {
        "success": true,
        "msg": "success",
    }
}

校正车牌事件上报

工作人员根据通行记录,校正车牌信息后,车行网关上报校正后的车牌信息。涂鸦边缘⽹关收到后更新车牌信息,然后返回操作结果。

请求参数

参数 类型 描述 是否必填
t Long 消息推送时间。
reqId String 请求流水号。推荐 UUID 生成,网关可以根据 reqId 监听本次推送的结果。最大长度为 64 字符。
reqType Integer reqType = 23,表示设备状态上报。
data Object 业务数据。
+ inParkingId String 入场 ID。
+ originalPlateNo String 原始车牌号,格式:无-B0KPTX。最大长度为 64 字符。
+ newPlateNo String 新车牌号,格式:无-B0KPTY。最大长度为 64 字符。
+ modifyTime Long 修改时间,13 位毫秒时间戳。
+ operateId String 操作员 ID。最大长度为 64 字符。
+ operateName String 操作员姓名。最大长度为 64 字符。

消息格式

{
    "t": 1655275***,
    "reqId": "16552757***",
    "reqType": 19,
    "data": {
        "originalPlateNo": "无-B0K123",
        "newPlateNo": "无-B0K124",
        "modifyTime": 1655284422123,
        "operateId": "***",
        "operateName": "***"
    }
}

响应消息格式

{
    "t": 1655275***,
    "reqId": "16552757***",
    "reqType": 19,
    "data": {
        "success": true,
        "msg": "success",
    }
}

订单管理

生成待支付订单指令下发

生成车辆的待支付订单,车行网关收到指令后,创建订单信息,然后返回信息结果。

请求参数

参数 类型 描述 是否必填
t Long 消息推送时间。
reqId String 请求流水号。推荐 UUID 生成,网关可以根据 reqId 监听本次推送的结果。最大长度为 64 字符。
reqType Integer reqType = 13,表示生成待支付订单指令。
data Object 业务数据。
+ plateNo String 车牌号,格式:无-B0KPTY。最大长度为 64 字符。

响应参数

参数 类型 描述 是否必填
t Long 消息推送时间。
reqId String 请求流水号。推荐 UUID 生成,网关可以根据 reqId 监听本次推送的结果。最大长度为 64 字符。
reqType Integer reqType = 13,表示生成待支付订单指令响应。
data Object 业务数据。
+ success Bool 请求结果。
  • true:成功
  • false:失败
+ msg String 响应信息。最大长度为 255 字符。
+ plateNo String 车牌号,格式:无-B0KPTX。最大长度为 64 字符。
+ orderNo String 订单 ID。最大长度为 64 字符。
+ inboundTime Integer 入场时间,13 位毫秒时间戳。
+ elapsedTime Integer 停车时长,单位分钟。
+ startTime Integer 开始计费时间,13 位毫秒时间戳。
+ payableAmount Integer 应收金额,单位:分。
+ paidAmount Integer 实收金额,单位:分。
+ discountAmount Integer 优惠金额,单位:分。

消息格式

{
    "t": 1655275***,
    "reqId": "16552757***",
    "reqType": 13,
    "data": {
        "plateNo": "无-B0K123"
    }
}

返回结果消息格式

{
    "t": 1655275***,
    "reqId": "16552757***",
    "reqType": 13,
    "data": {
        "success": true,
        "msg": "success",
        "plateNo": "无-B0K123",
        "orderNo": "O1234***",
        "inboundTime": 1655284422123,
        "elapsedTime": 66,
        "startTime": 1655284422123,
        "payableAmount": 2000,
        "paidAmount": 600,
        "discountAmount": 1400
    }
}

支付结果通知指令下发

订单支付成功后,发送支付结果通知指令,车行网关收到后操作完成,然后返回操作结果。

请求参数

参数 类型 描述 是否必填
t Long 消息推送时间。
reqId String 请求流水号。推荐 UUID 生成,网关可以根据 reqId 监听本次推送的结果。最大长度为 64 字符。
reqType Integer reqType = 14,表示支付结果通知指令。
data Object 业务数据。
+ orderNo String 订单 ID。最大长度为 64 字符。
+ paidAmount Integer 实收金额,单位:分。
+ payMethod Integer 支付方式。
  • 1:支付宝
  • 2:微信
  • 3:银行卡
  • 4:现金
  • 5:其他
+ payTime Long 支付时间,13 位毫秒时间戳。
+ payerMobile String 支付人手机号。最大长度为 64 字符。
+ payerName String 支付人姓名。最大长度为 64 字符。

消息格式

{
    "t": 1655275***,
    "reqId": "16552757***",
    "reqType": 14,
    "data": {
        "orderNo": "O1234***",
        "paidAmount": 600,
        "payMethod": 1,
        "payTime": 1655284422123,
        "payerMobile": "156***",
        "payerName": "张三"
    }
}

返回结果消息格式

{
    "t": 1655275***,
    "reqId": "16552757***",
    "reqType": 14,
    "data": {
        "success": true,
        "msg": "success"
    }
}

数据管理

数据同步指令下发

车行网关收到数据同步指令,根据数据同步类型和参数,上报缴费记录或通行记录。收到指令后返回结果,异步上报数据。

上报规则:

  • 同步时间段内的数据。
  • 时间段内数据和云端总数不一致则上报,相同则不需要上报。

请求参数

参数 类型 描述 是否必填
t Long 消息推送时间。
reqId String 请求流水号。推荐 UUID 生成,网关可以根据 reqId 监听本次推送的结果。最大长度为 64 字符。
reqType Integer reqType = 20,表示数据指令同步指令。
data Object 业务数据。
+ dataType Integer 将要同步的数据类型。
  • 1:通行数据
  • 2:缴费记录数据
+ plateNo String 车牌号,格式:无-B0KPTX。最大长度为 64 字符。
+ syncDataParams Array 数据同步参数。
++ totalCount Integer 时间段内总数。
++ startTime Long 统计开始时间,13 位毫秒时间戳。
++ endTime Long 统计结束时间,13 位毫秒时间戳。
++ passDirection Integer 通行出入类型。
  • 1:入场
  • 2:出场,要求上报的记录类型

消息格式

{
    "t": 1655275***,
    "reqId": "16552757***",
    "reqType": 20,
    "data": {
        "dataType": 1,
        "syncDataParams": [
            {
                "totalCount": 100,
                "startTime": 1655284422123,
                "endTime": 1655284422123,
                "passDirection": 1
            }
        ]
    }
}

响应消息格式

{
    "t": 1655275***,
    "reqId": "16552757***",
    "reqType": 20,
    "data": {
        "success": true,
        "msg": "success",
    }
}

缴费记录事件上报

车行网关可以主动上报或接收到数据同步指令后,上报车场的缴费记录数据。

请求参数

参数 类型 描述 是否必填
t Long 消息推送时间。
reqId String 请求流水号。推荐 UUID 生成,网关可以根据 reqId 监听本次推送的结果。最大长度为 64 字符。
reqType Integer reqType = 21,表示缴费记录事件上报。
data Object 业务数据。
+ records Array 缴费记录列表。
++ plateNo String 车牌号,格式:无-B0KPTX。最大长度为 64 字符。
++ orderNo String 订单 ID,最大长度为 64 字符。
++ startTime Long 开始计费时间,13 位毫秒时间戳。
++ endTime Integer 结束计费时间,13 位毫秒时间戳。
++ payMethod Integer 支付方式。
  • 1:支付宝
  • 2:微信
  • 3:银行卡
  • 4:现金
  • 5:其他
++ payTime Long 支付时间,13 位毫秒时间戳。
++ payableAmount Integer 应收金额,单位:分。
++ paidAmount Integer 实收金额,单位:分。
++ discountAmount Integer 优惠金额,单位:分。
++ inParkingId String 入场 ID,最大长度为 64 字符。
++ voucherType Integer 支付凭证。
  • 1:车牌号
  • 2:车位
  • 3:无牌⻋
  • 4:卡片
  • 99:其他
++ voucherDesc String 支付凭证描述,可以是车牌号或卡号等。

消息格式

{
    "t": 1655275***,
    "reqId": "16552757***",
    "reqType": 21,
    "data": {
        "records": [
            {
                "plateNo": "无-B0K123",
                "orderNo": "O1234***",
                "startTime": 1655284422123,
                "endTime": 1655284422123,
                "paidAmount": 600,
                "payMethod": 1,
                "payTime": 1655284422123,
                "payableAmount": 2000,
                "discountAmount": 1400,
                "inParkingId": "park***"
                "voucherType": 1,
                "voucherDesc": "无-B0K123"
            }
        ]
    }
}

响应消息格式

{
    "t": 1655275***,
    "reqId": "16552757***",
    "reqType": 21,
    "data": {
        "success": true,
        "msg": "success",
    }
}

通行事件上报

车行网关可以主动上报或接收到数据同步指令后,上报车场的通行事件数据。

请求参数

参数 类型 描述 是否必填
t Long 消息推送时间。
reqId String 请求流水号,推荐 UUID 生成。网关可以根据 reqId 监听本次推送的结果。最大长度为 64 字符。
reqType Integer reqType = 22,表示通行事件上报。
data Object 业务数据。
+ records Array 通行事件列表。
++ cid String 三方设备 ID。
++ plateNo String 车牌号,格式:无-B0KPTX。最大长度为 64 字符。
++ passDirection Integer 通行出入类型。
  • 1:入场
  • 2:出场
++ passTime Integer 通行时间,13 位毫秒时间戳。
++ openState Integer 开闸状态。
  • 1:正常
  • 2:异常
  • 3:未知
++ imageUrl String 图⽚地址,例如:http://xxx.jpg。最⼤⻓度为 255 字符,地址要求⽀持访问下载。
++ inParkingId String 入场 ID。最大长度为 64 字符。
++ operateId String 操作员 ID。最大长度为 64 字符。
++ operateName String 操作员姓名。最大长度为 64 字符。
++ plateDimension Integer 车辆类型。
  • 1:临时车
  • 2:无牌车
  • 3:月租车
  • 4:白名单
  • 5:内部车
  • 6:产权车
  • 99:其他车
++ feeDimension Integer 收费类型。
  • 1:收费
  • 2:免费
++ passDimension Integer 通行类型。
  • 1:手工
  • 2:远程
  • 3:自动
  • 4:异常

消息格式

{
    "t": 1655275***,
    "reqId": "16552757***",
    "reqType": 22,
    "data": {
        "records": [
            {
                "cid": "vehicle***",
                "plateNo": "无-B0K123",
                "passDirection": 1,
                "passTime": 1655284422123,
                "openState": 1,
                "imageUrl": "http://***.jpg",
                "inParkingId": "***",
                "operateId": "***",
                "operateName": "***",
                "plateDimension": 1,
                "feeDimension": 1,
                "passDimension": 3
            }
        ]
    }
}

响应消息格式

{
    "t": 1655275***,
    "reqId": "16552757***",
    "reqType": 22,
    "data": {
        "success": true,
        "msg": "success",
    }
}

应用示例

MQTT 连接示例:


import (
	"crypto/md5"
	"encoding/hex"
	"fmt"
	"log"
	"time"

	mqtt "github.com/eclipse/paho.mqtt.golang"
)

var (
	client mqtt.Client
	pubTopic string
	subTopic string
	password string
)

func main() {
	log.SetFlags(log.LstdFlags | log.Lshortfile)

	var (
		username = "tuya_vehicle_***"
		clientId = "vehicle_*"
		broker   = "tcp://ip:port"
	)
	password = string(genSecKey(clientId, username))
	pubTopic = fmt.Sprintf("gateway/vehicle/out/%s", clientId)
	subTopic = fmt.Sprintf("gateway/vehicle/in/%s", clientId)

	opts := mqtt.NewClientOptions().SetClientID(clientId).SetUsername(username).SetPassword(password)
	opts = opts.SetAutoReconnect(true).SetCleanSession(true).SetKeepAlive(5 * time.Second).
		SetMaxReconnectInterval(10 * time.Second).
		SetConnectRetry(true).SetConnectRetryInterval(time.Second)

	opts.AddBroker(broker)
	opts.SetOnConnectHandler(func(client mqtt.Client) {
		log.Println("connected")

		client.Subscribe(subTopic, 1, onMessage)
	}).SetConnectionLostHandler(func(client mqtt.Client, err error) {
		log.Println("connect lost")
	})
	client = mqtt.NewClient(opts)
	token := client.Connect()
	if ok := token.WaitTimeout(time.Second * 10); !ok {
		panic("connect timeout")
	}

	for {
	}
}

func onMessage(client mqtt.Client, msg mqtt.Message) {
	log.Printf("onmessage, topic:%v, messageId:%v, msg: %+v\n", msg.Topic(), msg.MessageID(), string(msg.Payload()))
	// TODO 消息处理逻辑
}

// publish 消息发送
func publish(payload []byte) error {
	token := client.Publish(pubTopic, 1, true, payload)
	log.Println(token)
	return nil
}

func genSecKey(clientID, userName string) []byte {
	secKey := genMd5(clientID + userName)[:16]
	return []byte(secKey)
}

func genMd5(source string) (md5str string) {
	md5Ctx := md5.New()
	md5Ctx.Write([]byte(source))
	cipherStr := md5Ctx.Sum(nil)
	md5str = hex.EncodeToString(cipherStr)
	return
}