更新时间:2024-06-20 01:58:27下载pdf
本文介绍了涂鸦智慧行业环境监测接入方案,通过涂鸦边缘网关实现与平台通信的能力。
涂鸦为智能环境监测设备提供了边缘网关接⼊的⽅案,帮助智能环境监测设备快速接⼊涂鸦开发者平台,方案架构如下图所示:
智能环境监测⽹关使⽤ MQTT 协议与涂鸦边缘⽹关进⾏通信,其中智能环境监测⽹关做客户端,涂鸦边缘⽹关做 broker。
如下是智能环境监测的具体设备属性信息,设备属性上报时作为参考。
DP ID | 功能点名称 | 标识符 | 数据传输类型 | 数据类型 | 功能点属性 |
---|---|---|---|---|---|
1 | 空气监测数据 | env_detect_data | 只上报(ro) | string | |
2 | 风速 | windspeed_gust | 只上报(ro) | value |
|
3 | 风力 | wind_power | 只上报(ro) | value |
|
4 | 风向 | wind_direct | 可下发可上报(rw) | enum | 枚举值: north, north_north_east, north_east, east_north_east, east, east_south_east, south_east, south_south_east, south, south_south_west, south_west, west_south_west, west, west_north_west, north_west, north_north_west |
5 | 风向度数 | wind_direct_value | 可下发可上报(rw) | value |
|
6 | 土壤 1 温湿度_EC_pH 值 | soil_data_1 | 只上报(ro) | raw | { “humidity”:“”,//土壤湿度 “temp”:“”,//土壤温度 “ecValue”:“”,//土壤 EC 值 “phValue”:“”,//土壤 pH 值 } |
7 | 土壤 2 温湿度_EC_pH 值 | soil_data_2 | 只上报(ro) | raw | { “humidity”:“”,//土壤湿度 “temp”:“”,//土壤温度 “ecValue”:“”,//土壤 EC 值 “phValue”:“”,//土壤 pH 值 } |
8 | 土壤 3 温湿度_EC_pH 值 | soil_data_3 | 只上报(ro) | raw | { “humidity”:“”,//土壤湿度 “temp”:“”,//土壤温度 “ecValue”:“”,//土壤 EC 值 “phValue”:“”,//土壤 pH 值 } |
9 | 土壤 4 温湿度_EC_pH 值 | soil_data_4 | 只上报(ro) | raw | { “humidity”:“”,//土壤湿度 “temp”:“”,//土壤温度 “ecValue”:“”,//土壤 EC 值 “phValue”:“”,//土壤 pH 值 } |
10 | 室外湿度 | humidity_outdoor | 可下发可上报(rw) | value |
|
11 | 室外温度 | temp_outdoor | 可下发可上报(rw) | value |
|
12 | 噪声 | noise_value | 只上报(ro) | value |
|
13 | 大气压强 | atmospheric_pressture | 只上报(ro) | value |
|
14 | 光照强度 | light_intensity | 只上报(ro) | value |
|
15 | 雨雪状态 | rain_snow_state | 只上报(ro) | enum | 枚举值: snowy, normal |
16 | 紫外线指数 | uv_index | 只上报(ro) | value |
|
17 | 总辐射 | radiation_total | 只上报(ro) | value |
|
18 | 光合有效辐射 | radiation_pho | 只上报(ro) | value |
|
19 | 累计雨量 | rain_total | 只上报(ro) | value |
|
20 | 当前雨量 | rain_current | 只上报(ro) | value |
|
21 | 瞬时雨量 | rain_instant | 只上报(ro) | value |
|
22 | 日雨量 | rain_1h | 只上报(ro) | value |
|
23 | O3 浓度 | o3_value | 只上报(ro) | value |
|
24 | CO 浓度 | co_value | 只上报(ro) | value |
|
25 | SO2 浓度 | so2_value | 只上报(ro) | value |
|
26 | O2 浓度 | o2_value | 只上报(ro) | value |
|
27 | H2S 浓度 | h2s_value | 只上报(ro) | value |
|
28 | 蒸发量 | evap_total | 只上报(ro) | value |
|
29 | PM2.5 浓度 | pm25_value | 只上报(ro) | value |
|
30 | PM10 | pm10 | 只上报(ro) | value |
|
31 | 氮 | nitrogen_value | 只上报(ro) | value |
|
32 | 磷 | phosphorus_value | 只上报(ro) | value |
|
33 | 钾 | potassium_value | 只上报(ro) | value |
|
34 | 负氧离子 | air_anion_value | 只上报(ro) | value |
|
35 | NH3 浓度 | nh3_value | 只上报(ro) | value |
|
36 | VOC 浓度 | voc_value | 只上报(ro) | value |
|
37 | 上电状态设置 | relay_status | 可下发可上报(rw) | enum | 枚举值: on, off |
38 | 状态 | state | 可下发可上报(rw) | enum | 枚举值: run, stop |
39 | 余氯浓度 | ppm_value | 可下发可上报(rw) | value |
|
40 | pH 值 | ph | 可下发可上报(rw) | value |
|
41 | 水质 | water_quality | 只上报(ro) | enum | 枚举值: normal, alarm |
42 | 浊度 | turbidity_value | 只上报(ro) | value |
|
44 | 故障告警 | fault | 只上报(ro) | fault | 故障值: fault, sensor_fault, amb_temp_fault |
47 | 空气质量 | air_quality_value | 只上报(ro) | value |
|
49 | 电池电量 | battery_percentage | 只上报(ro) | value |
|
50 | NO2 浓度 | no2_value | 只上报(ro) | value |
|
51 | CO2 浓度 | co2_value | 只上报(ro) | value |
|
52 | 剩余高度 | height | 只上报(ro) | value |
|
概述
MQTT 消息由固定报头(Fixed header)、可变报头(Variable header)和有效载荷(Payload)三部分组成。
其中固定报头(Fixed header)和可变报头(Variable header)格式的填写请参考 MQTT 标准规范,有效载荷(Payload)的格式由涂鸦定义,具体请产考下文。
MQTT 的语法和接口细节,请以 MQTT 标准规范 为准。
常见 MQTT 消息类型主要有 CONNECT、SUBSCRIBE、PUBLISH。
使用限制
设备接入涂鸦边缘网关,通过边缘网关进行通信。设备、涂鸦边缘网关和涂鸦云平台的通信流程示意图如下。
设备发送数据到涂鸦边缘网关
设备接入涂鸦边缘网关后,便可与涂鸦边缘网关进行通信。设备可通过以下方式发送数据到平台:
设备属性上报:用于设备按产品模型中定义的格式将属性数据上报给平台。
应用服务器下发指令给设备
设备接入涂鸦边缘网关后,涂鸦网关可通过以下方式发送指令到设备。
平台命令下发:应用服务器按产品模型中定义的命令格式下发控制命令给设备。
设备使用 MQTT 协议接入涂鸦边缘网关时,平台和设备通过 Topic 进行通信。平台预置的 Topic 列表如下:
Topic 分类 | Topic | Publisher | Subscriber | 用途 |
---|---|---|---|---|
设备同步相关 Topic | gateway_id/{gateway_id}/devices/sync | 设备 | 平台 | 设备激活 |
设备同步相关 Topic | gateway_id/{gateway_id}/devices/sync/response | 平台 | 设备 | 平台返回激活响应 |
设备命令相关 Topic | gateway_id/{gateway_id}/commands | 平台 | 设备 | 平台下发命令给设备 |
设备命令相关 Topic | gateway_id/{gateway_id}/commands/response | 设备 | 平台 | 设备返回命令响应 |
设备属性相关 Topic | gateway_id/{gateway_id}/properties/report | 设备 | 平台 | 设备属性上报 |
设备属性相关 Topic | gateway_id/{gateway_id}/properties/report/response | 平台 | 设备 | 平台返回上报属性响应 |
设备上下线 Topic | gateway_id/{gateway_id}/devices/status | 设备 | 平台 | 设备上下线上报 |
{gateway_id} 用于标识 topic 路由的目标设备,设备侧订阅该 topic 或往 topic 推送消息时,该值需要替换为设备与平台建立 MQTT 连接时使用的网关 ID 参数值。
MQTT 协议中规定了消息服务质量(Quality of Service),它保证了在不同的网络环境下消息传递的可靠性,MQTT 设计了 3 个 QoS 等级。
QoS 级别越高,流程越复杂,系统资源消耗越大。应用程序可以根据自己的网络场景和业务需求,选择合适的 QoS 级别。
涂鸦建议设备对接方在消息的推送和订阅上 QoS 设置为 1。
开发者平台设备侧支持 MQTT 协议的 connect 消息接口,鉴权通过后建立设备与平台间的 MQTT 连接。
参数 | 必选/可选 | 类型 | 参数描述 |
---|---|---|---|
broker | 必选 | String | 边缘⽹关 IP 地址,对接时由涂鸦提供 |
port | 必选 | String | TCP 固定为 58090,SSL/TLS 固定为 21883 |
clientId | 必选 | String | 第三方的网关 ID,此参数要保证唯一 |
username | 必选 | String | 第三⽅⼚商标识,对接时由涂鸦提供 |
password | 必选 | String | Password 的值为使用“md5”加密算法生成,具体请参考密码生成规则 |
SSL/TLS 为单向认证模式。
拼接 clientId 和 username 变量,然后用 md5 加密算法对拼接后的变量加密。
下面用 Go 语言生成连接密码例子,供参考。
func generatePassword() string {
var (
clientId string
username string
password string
)
// clientId username 请先赋值
password = md5V(clientId + username)
return password
}
// md5 加密算法函数
func md5V(str string) string {
h := md5.New()
h.Write([]byte(str))
return hex.EncodeToString(h.Sum(nil))
}
原生 MQTT 协议设备和平台建链时,常见返回码如下:
返回码 | 标示 | 返回码描述 | 原因 |
---|---|---|---|
0x00 | 连接成功 | 连接成功 | |
0x01 | unnacceptable protocol version | 请求拒绝,协议版本错误 | 服务器不支持客户端请求 MQTT 协议版本 |
0x02 | identifier rejected | 请求拒绝,无效的客户端标识符 | clientId 不符合格式要求或者心跳时间间隔不满足平台要求 |
0x03 | server Unavailable | 请求拒绝,服务器不可用 | 平台服务不可用 |
0x04 | bad user name or password | 请求拒绝,用户名或密码错误 | 用户名或密码错误 |
0x05 | not Authorized | 请求拒绝,没有授权 | 客户端没有权限连接 |
用于设备同步,在设备网关连接上涂鸦边缘网关的 MQTT 服务器后,要发送设备同步指令。涂鸦边缘网关会对上报的设备进行新增或更新。
必须先同步子设备才可进行后续操作,否则会出现找不到设备的错误。
Topic
上行:gateway_id/{gateway_id}/devices/sync
下行:gateway_id/{gateway_id}/devices/sync/response
字段名 | 必选/可选 | 类型 | 参数描述 |
---|---|---|---|
t | 必选 | Integer | Unix 时间戳(Unix timestamp) |
request_id | 必选 | String | 请求标示,建议用 UUID 算法生成。 |
param | 必选 | Object | 对象 |
param.cid | 必选 | String | 第三方设备 ID,由设备侧定义。建议采⽤设备端可读取的唯⼀标识作为 cid,例如设备的 SN 号、IMEI 号等。 |
param.product_id | 必选 | String | 产品对应的 product_id |
param.vendor_code | 可选 | String | 厂商 code |
param.comm_type | 可选 | String | 设备和网关通讯方式,请填写“mqtt” |
param.device_ip | 可选 | String | 设备 IP 地址 |
param.mac_address | 可选 | String | 设备 MAC 地址 |
param.device_desc | 可选 | String | 设备描述 |
param.install_location | 可选 | String | 设备安装位置 |
param.device_server_id | 可选 | String | 设备服务 ID |
param.product_sub_type | 可选 | String | 子产品类型 |
字段名 | 必选/可选 | 类型 | 参数描述 |
---|---|---|---|
t | 必选 | Integer | Unix 时间戳(Unix timestamp) |
request_id | 必选 | String | 请求唯一标示。 |
param | 必选 | Object | 对象 |
param.cid | 必选 | String | 设备 cid |
param.msg | 必选 | String | 含义请参考 全局错误码。 |
param.code | 必选 | Integer | 标识命令的执行结果。
|
Topic: gateway_id/{gateway_id}/devices/sync
数据格式:
{
"t":1627280679,
"request_id":"cd0fd3c3-bd15-42f6-8bf9-d230a085****",
"param":{
"cid":"92dda538fc2e636fd4b0c37f980b****",
"product_id":"sie4****",//请填写产品对应的 pid
"vendor_code":"",//设备厂商标识
"comm_type":"",
"device_ip":"",
"mac_address":"",
"device_name":"",
"device_desc":"",
"install_location":"",
"device_server_id":"",
"product_sub_type":""
}
}
Topic: gateway_id/{gateway_id}/devices/sync/response
数据格式:
{
"t":1627280679,
"request_id":"cd0fd3c3-bd15-42f6-8bf9-d230a085****",
"param":{
"cid":"92dda538fc2e636fd4b0c37f980b****",
"msg":"success",
"code":0
}
}
用于平台向设备下发设备控制命令。平台下发命令后,需要设备及时将命令的执行结果返回给平台,如果设备没回响应,平台会认为命令执行超时。
Topic
下行: gateway_id/{gateway_id}/commands
上行:gateway_id/{gateway_id}/commands/response
字段名 | 必选/可选 | 类型 | 参数描述 |
---|---|---|---|
t | 必选 | Integer | Unix 时间戳(Unix timestamp) |
cid | 必选 | String | 第三方设备 ID,由设备侧定义。建议采⽤设备端可读取的唯⼀标识作为 cid,例如设备的 SN 号、IMEI 号等 |
request_id | 必选 | String | 请求标示,建议用 UUID 算法生成 |
param | 必选 | Object | 对象 |
param.id | 必选 | String | 设备功能点 ID |
param.value | 必选 | 类型不固定 | 设备命令的执行参数 |
命令应答的 JSON 格式。
字段名 | 必选/可选 | 类型 | 参数描述 |
---|---|---|---|
t | 必选 | Integer | Unix 时间戳(Unix timestamp) |
cid | 必选 | String | 第三方设备 ID,由设备侧定义。建议采⽤设备端可读取的唯⼀标识作为 cid,例如设备的 SN 号、IMEI 号等。 |
request_id | 必选 | String | 请求唯一标示,建议用 UUID 算法生成。 |
param | 必选 | Object | 对象 |
param.msg | 必选 | String | 执行结果,如果成功,请填写 success。 |
param.code | 必选 | Integer | 标识命令的执行结果。
|
Topic: gateway_id/{gateway_id}/commands
数据格式:
{
"t":1627280679,
"cid": "92dda538fc2e636fd4b0c37f980b****",
"request_id":"cd0fd3c3-bd15-42f6-8bf9-d230a085****",
"param": {
"id":"1",
"value": "1"
}
}
Topic:gateway_id/{gateway_id}/commands/response
数据格式:
{
"t":1627280679,
"cid": "92dda538fc2e636fd4b0c37f980b****",
"request_id":"cd0fd3c3-bd15-42f6-8bf9-d230a085****",
"param": {
"msg": "success",
"code":0
}
}
用于设备按产品模型中定义的格式将属性数据上报给平台。平台在接到上报消息后,会将执行结果返回给设备。
Topic
上行:gateway_id/{gateway_id}/properties/report
下行:gateway_id/{gateway_id}/properties/report/response
字段 | 必选/可选 | 类型 | 参数描述 |
---|---|---|---|
t | 必选 | Integer | 时间戳:为设备连接平台时的 UTC 时间 |
request_id | 必选 | String | 请求唯一标示,建议用 UUID 算法生成 |
param | 必选 | Object | 对象 |
param.cid | 必选 | String | 第三方设备 ID,由设备侧定义。建议采⽤设备端可读取的唯⼀标识作为 cid,例如设备的 SN 号、IMEI 号等 |
param.product_id | 必选 | String | 产品 product_id,请参考自己产品的 ID 进行填写 |
param.id | 必选 | String | 产品下面某一个功能点 ID |
param.value | 必选 | 参考功能点类型 | 设备的属性值 |
字段名 | 必选/可选 | 类型 | 参数描述 |
---|---|---|---|
t | 必选 | Integer | Unix 时间戳(Unix timestamp) |
request_id | 必选 | String | 请求唯一标示 |
param | 必选 | Object | 对象 |
param.cid | 必选 | String | 第三方设备 ID,由设备侧定义。建议采⽤设备端可读取的唯⼀标识作为 cid,例如设备的 SN 号、IMEI 号等 |
param.msg | 必选 | String | 含义请参考全局错误码。 |
param.code | 必选 | Integer | 标识命令的执行结果。
|
gateway_id/{gateway_id}/properties/report
{
"t":1627280679,
"request_id":"cd0fd3c3-bd15-42f6-8bf9-d230a085****",
"param":{
"cid":"ee1880aca6b****",
"product_id":"r2fz6uv6aufd****",
"id":"1",
"value":"run"
}
}
Topic:gateway_id/{gateway_id}/properties/report/response
数据格式:
{
"t":1627280679,
"request_id":"cd0fd3c3-bd15-42f6-8bf9-d230a085****",
"param":{
"cid":"92dda538fc2e636fd4b0c37f980b****",
"msg":"success",
"code":0
}
}
设备网关需要定时把设备的上线下线状态同步给涂鸦边缘网关,建议至少每隔一分钟上报一次子设备状态。
Topic
上行:gateway_id/{gateway_id}/devices/status
字段 | 必选/可选 | 类型 | 参数描述 |
---|---|---|---|
t | 必选 | Integer | 时间戳:为设备连接平台时的 UTC 时间 |
request_id | 必选 | String | 请求唯一标示,建议用 UUID 算法生成 |
param | 必选 | Object | 对象数组 |
param.cid | 必选 | String | 第三方设备 ID,由设备侧定义。建议采⽤设备端可读取的唯⼀标识作为 cid,例如设备的 SN 号、IMEI 号等 |
param.status | 必选 | Bool | 设备状态。
|
Topic:gateway_id/{gateway_id}/devices/status
数据格式:
{
"t":1627280679,
"request_id":"cd0fd3c3-bd15-42f6-8bf9-d230a085****",
"param": [{
"cid": "92dda538fc2e636fd4b0c37f980b****",
"status":true
},
{
"cid": "da538fc2ebffdb463692dfdb0c37****",
"status":false
}
]
}
为了帮助开发者调用开放接口,我们提供了JAVA、PHP、GO三种语言版本的开发例子,演示了服务连接、验证、敏感信息加/解密、推送订阅等基础功能(更多语言版本的开发库将在近期陆续提供)
将下面显示的依赖性定义添加到 maven pom 文件中。
<dependencies>
<dependency>
<groupId>org.eclipse.paho</groupId>
<artifactId>org.eclipse.paho.client.mqttv3</artifactId>
<version>1.2.0</version>
</dependency>
</dependencies>
//消息发布
public class Publish {
public static void main(String[] args) {
String clientId = ""; // 即 gatewayID, 第三⽅⼚商⽹关 ID
String topic = ""; // 主题
String content = ""; // 内容
int qos = 1; // 服务质量
String broker = ""; // 服务器 IP 地址
String userName = ""; // 用户名,由涂鸦提供
String password = ""; // 密码,请参考密码生成规则
// 内存存储
MemoryPersistence persistence = new MemoryPersistence();
try {
// 创建客户端
MqttClient sampleClient = new MqttClient(broker, clientId, persistence);
// 创建链接参数
MqttConnectOptions connOpts = new MqttConnectOptions();
// 在重新启动和重新连接时记住状态
connOpts.setCleanSession(false);
// 设置连接的用户名
connOpts.setUserName(userName);
connOpts.setPassword(password.toCharArray());
// 建立连接
sampleClient.connect(connOpts);
// 创建消息
MqttMessage message = new MqttMessage(content.getBytes());
// 设置消息的服务质量
message.setQos(qos);
// 发布消息
sampleClient.publish(topic, message);
// 断开连接
sampleClient.disconnect();
// 关闭客户端
sampleClient.close();
} catch (MqttException me) {
System.out.println("reason " + me.getReasonCode());
System.out.println("msg " + me.getMessage());
System.out.println("loc " + me.getLocalizedMessage());
System.out.println("cause " + me.getCause());
System.out.println("excep " + me);
me.printStackTrace();
}
}
}
//消息订阅
public class Subscribe {
public static void main(String[] args) throws MqttException {
String clientId = ""; // 即 gatewayID, 第三⽅⼚商⽹关 ID
String host = ""; // 服务器 IP 地址
String topic = "gateway/in/" + clientId; // 主题
int qos = 1; // 服务质量
String userName = ""; // 用户名,由涂鸦提供
String password = ""; // 密码,请参考密码生成规则
try {
//MemoryPersistence 设置 clientid 的保存形式,默认为以内存保存
MqttClient client = new MqttClient(host, clientid, new MemoryPersistence());
// MQTT 的连接设置
MqttConnectOptions options = new MqttConnectOptions();
// 设置是否清空 session,这里如果设置为 false 表示服务器会保留客户端的连接记录,这里设置为 true 表示每次连接到服务器都以新的身份连接
options.setCleanSession(true);
// 设置连接的用户名
options.setUserName(userName);
// 设置连接的密码
options.setPassword(passWord.toCharArray());
// 设置超时时间,单位为秒
options.setConnectionTimeout(10);
// 设置会话心跳时间,单位为秒
options.setKeepAliveInterval(20);
// 设置回调函数
client.setCallback(new MqttCallback() {
public void connectionLost(Throwable cause) {
}
public void messageArrived(String topic, MqttMessage message) throws Exception {
// 消息处理部分
System.out.println("message content:"+new String(message.getPayload()));
}
public void deliveryComplete(IMqttDeliveryToken token) {
}
});
client.connect(options);
//订阅消息
client.subscribe(topic, qos);
} catch (Exception e) {
e.printStackTrace();
}
}
}
package main
import (
"fmt"
mqtt "github.com/eclipse/paho.mqtt.golang"
"log"
"os"
"time"
)
const broker = "" // 服务器 IP 地址,请联系涂鸦管理员获取
const username = "" // 用户名,由涂鸦提供
const password = "" // 密码,请参考密码生成规则
const clientID = "" // 即 gatewayID, 第三⽅⼚商⽹关 ID
const topic = "" // 主题
const port = "21883" // 服务端口号
// 订阅消息 topic = "gateway/in/" + clientID
// 发布消息 topic = "gateway/out/" + clientID
var f mqtt.MessageHandler = func(client mqtt.Client, msg mqtt.Message) {
fmt.Printf("TOPIC: %s\n", msg.Topic())
fmt.Printf("MSG: %s\n", msg.Payload())
}
func main() {
mqtt.DEBUG = log.New(os.Stdout, "", 0)
mqtt.ERROR = log.New(os.Stdout, "", 0)
opts := mqtt.NewClientOptions().AddBroker(fmt.Sprintf("tcp://%s:%s", broker, port)).SetClientID(clientID).
SetUsername(username).SetPassword(password)
opts.SetKeepAlive(60 * time.Second)
// 设置消息回调处理函数
opts.SetDefaultPublishHandler(f)
opts.SetPingTimeout(1 * time.Second)
c := mqtt.NewClient(opts)
if token := c.Connect(); token.Wait() && token.Error() != nil {
panic(token.Error())
}
// 订阅主题
if token := c.Subscribe(topic, 0, nil); token.Wait() && token.Error() != nil {
fmt.Println(token.Error())
os.Exit(1)
}
// 发布消息
token := c.Publish(topic, 0, false, "Hello World")
token.Wait()
time.Sleep(6 * time.Second)
// 取消订阅
if token := c.Unsubscribe(topic); token.Wait() && token.Error() != nil {
fmt.Println(token.Error())
os.Exit(1)
}
// 断开连接
c.Disconnect(250)
time.Sleep(1 * time.Second)
}
消息推送
<?php
require(""); // 引入 MQTT 类文件
$server = ''; // 服务器 IP 地址,请联系涂鸦管理员获取
$port = 21883; // 服务器端口
$username = ''; // 用户名,由涂鸦提供
$password = ''; // 密码,请参考密码生成规则
$client_id = '' // 即 gatewayID, 第三⽅⼚商⽹关 ID
$mqtt = new Bluerhinos\phpMQTT($server, $port, $client_id); // 实例化 MQTT 类
if ($mqtt->connect(true, NULL, $username, $password)) // 建立连接
{
$topic = 'gateway/out/'.$client_id; // 主题
$key = '' // 加密密钥 请填写连接认证时⽤的 password
$msg = ''; // 推送消息,请参考上方消息格式
// qos = 0:仅发一次,不管是否能收到
// qos = 1:没返回一直发,可能有重复接收
// qos = 2:保证必须收到,并且不重复
$mqtt->publish($topic, $msg, 0);//发送数据
$mqtt->close(); //关闭连接
}
else
{
echo "Time out!\n";
}
消息订阅
<?php
require(""); // 引入 MQTT 类文件
$server = ''; // 服务器 IP 地址,请联系涂鸦管理员获取
$port = 21883; // 服务器端口
$username = ''; // 用户名,由涂鸦提供
$password = ''; // 密码,请参考秘密生成规则
$client_id = '' // 即 gatewayID, 第三⽅⼚商⽹关 ID
$mqtt = new Bluerhinos\phpMQTT($server, $port, $client_id);
$mqtt->debug = true;
if(!$mqtt->connect(true, NULL, $username, $password))
{
echo "连接失败!\n";
exit(1);
}
$topic = 'gateway/in/'.$client_id; // 主题
// 订阅列表
$topics = [
$topic => ['qos' => 0, 'function' => 'procmsg'],
];
$mqtt->subscribe($topics, 0);
while ($mqtt->proc()){}
$mqtt->close();
function procmsg($topic, $msg) // 消息处理函数
{
$key = ''
echo $msg;
}
当调用接口发生错误时,会返回自定义错误信息。本文介绍全局错误码的含义。
错误码 code | 错误信息 msg | 说明 |
---|---|---|
400 | tedge error: 上游具体错误信息 | 上游错误,具体信息由上游定义 |
500 | system error,please contact the admin | 系统错误,请联系管理员 |
1001 | request time is invalid | 无效的请求时间 |
1100 | params is empty | 参数为空 |
1101 | params range invalid | 无效的参数范围 |
1102 | params is null | 参数为 Null |
1103 | params type is incorrect | 参数类型错误 |
1104 | request pid is invalid | 无效的 PID |
1105 | id does not exist in pid | 此 PID 内无此功能点 ID |
2001 | device is offline | 设备已离线 |
2002 | command or value not support | 不支持的指令或值 |
2003 | device not exist | 设备不存在 |
该内容对您有帮助吗?
是意见反馈该内容对您有帮助吗?
是意见反馈