• 沒有找到結果。

网关是一个特殊的设备,除具备一般设备功能之外,还具有子设备管理、子设备消息 转发的功能。SDK提供了AbstractGateway抽象类来简化网关的实现。该类提供了子设 备管理功能,需要从平台获取子设备信息并保存(需要子类提供子设备持久化接 口)、子设备下行消息转发功能(需要子类实现转发处理接口)、以及上报子设备列 表、上报子设备属性、上报子设备状态、上报子设备消息等接口。

● 使用AbstractGateway类

继承该类,在构造函数里提供子设备信息持久化接口,实现其下行消息转发的抽 象接口:

public abstract void onSubdevCommand(String requestId, Command command);

public abstract void onSubdevPropertiesSet(String requestId, PropsSet propsSet);

public abstract void onSubdevPropertiesGet(String requestId, PropsGet propsGet);

public abstract void onSubdevMessage(DeviceMessage message);

iot-gateway-demo代码介绍

工程iot-gateway-demo基于AbstractGateway实现了一个简单的网关,它提供 tcp设备接入能力。关键类:

SimpleGateway:继承自AbstractGateway,实现子设备管理和下行消息转发 StringTcpServer:基于netty实现一个TCP server,本例中子设备采用TCP协议,

并且首条消息为鉴权消息

SubDevicesFilePersistence:子设备信息持久化,采用json文件来保存子设备信 息,并在内存中做了缓存

Session:设备会话类,保存了设备id和TCP的channel的对应关系

for (DeviceInfo subdevice : subDevicesInfo.getDevices()) {

Session session = nodeIdToSesseionMap.get(subdevice.getNodeId());

if (session != null) {

return super.onDeleteSubDevices(subDevicesInfo);

}

public void onSubdevMessage(DeviceMessage message) {

//平台接口带的都是deviceId,deviceId是由nodeId和productId拼装生成的,即 //deviceId = productId_nodeId

String nodeId = IotUtil.getNodeIdFromDeviceId(message.getDeviceId());

if (nodeId == null) { return;

}

//通过nodeId获取session,进一步获取channel Session session = nodeIdToSesseionMap.get(nodeId);

if (session == null) {

session.getChannel().writeAndFlush(message.getContent());

log.info("writeAndFlush " + message);

public void onSubdevPropertiesSet(String requestId, PropsSet propsSet) { if (propsSet.getDeviceId() == null) {

return;

}

String nodeId = IotUtil.getNodeIdFromDeviceId(propsSet.getDeviceId());

if (nodeId == null) { return;

}

Session session = nodeIdToSesseionMap.get(nodeId);

if (session == null) { return;

}

设备接入

开发指南 4 设备侧开发

//这里我们直接把对象转成string发给子设备,实际场景中可能需要进行一定的编解码转换 session.getChannel().writeAndFlush(JsonUtil.convertObject2String(propsSet));

//为了简化处理,我们在这里直接回响应。更合理做法是在子设备处理完后再回响应 getClient().respondPropsSet(requestId, IotResult.SUCCESS);

log.info("writeAndFlush " + propsSet);

}

属性查询:

@Override

public void onSubdevPropertiesGet(String requestId, PropsGet propsGet) { //不建议平台直接读子设备的属性,这里直接返回失败

log.error("not supporte onSubdevPropertiesGet");

deviceClient.respondPropsSet(requestId, IotResult.FAIL);

}

– 命令:处理流程和消息类似,实际场景中可能需要不同的编解码转换。

@Override

public void onSubdevCommand(String requestId, Command command) { if (command.getDeviceId() == null) {

return;

}

String nodeId = IotUtil.getNodeIdFromDeviceId(command.getDeviceId());

if (nodeId == null) { return;

}

Session session = nodeIdToSesseionMap.get(nodeId);

if (session == null) { return;

}

//这里我们直接把command对象转成string发给子设备,实际场景中可能需要进行一定的编解 码转换 session.getChannel().writeAndFlush(JsonUtil.convertObject2String(command));

//为了简化处理,我们在这里直接回命令响应。更合理做法是在子设备处理完后再回响应 getClient().respondCommand(requestId, new CommandRsp(0));

log.info("writeAndFlush " + command);

} }

如果会话存在,则进行消息转发:

else {

//如果需要上报属性则调用reportSubDeviceProperties DeviceMessage deviceMessage = new DeviceMessage(s);

deviceMessage.setDeviceId(session.getDeviceId());

simpleGateway.reportSubDeviceMessage(deviceMessage, null);

}

到这里,网关的关键代码介绍完了,其他的部分看源代码。整个demo是开源的,

用户可以根据需要进行扩展。比如修改持久化方式、转发中增加消息格式的转 换、实现其他子设备接入协议。

iot-gateway-demo的使用 a. 在平台上为网关注册开户。

b. 修改StringTcpServer的main函数,替换构造参数,然后运行该类。

simpleGateway = new SimpleGateway(new SubDevicesFilePersistence(), "ssl://iot-acc.cn-north-4.myhuaweicloud.com:8883",

"5e06bfee334dd4f33759f5b3_demo", "mysecret");

c. 在平台上看到该网关在线后,添加子设备。

此时网关上日志打印:

2020-02-11 09:42:17 INFO SubDevicesFilePersistence:75 - add subdev: ffff d. 运行TcpDevice类,建立连接后,输入子设备的nodeId。

e. 在平台上看到子设备上线。

f. 子设备上报消息 设备接入

开发指南 4 设备侧开发

查看日志看到上报成功

g. 查看消息跟踪

在平台上找到网关,选择 设备详情-消息跟踪,打开消息跟踪。继续让子设备 发送数据,等待片刻后看到消息跟踪:

4.2.3 IoT Device SDK 使用指南(C)

IoT Device SDK(C)提供设备接入华为云IoT物联网平台的C版本的SDK,提供设备和 平台之间通讯能力,以及设备服务、网关服务、OTA等高级服务,并且针对各种场景 提供了丰富的demo代码。相关集成指导请参考IoT Device SDK(C)使用指南。

4.2.4 IoT Device SDK 使用指南(C#)

IoT Device SDK(C#)提供设备接入华为云IoT物联网平台的C#版本的SDK,提供设备 和平台之间通讯能力,以及设备服务、OTA等高级服务,并且针对各种场景提供了丰 富的demo代码。相关集成指导请参考IoT Device SDK(C#)使用指南。

4.2.5 IoT Device SDK 使用指南(Android)

IoT Device SDK(Android)提供设备接入华为云IoT物联网平台的Android版本的 SDK,提供设备和平台之间通讯能力,以及设备服务、OTA等高级服务,并且针对各种 场景提供了丰富的demo代码。相关集成指导请参考IoT Device SDK(Android)使用 指南。

说明

IoT Device SDK Tiny可以运行于无linux操作系统的设备,也可以被模组集成,但是不提供网关 服务。

4.3 使用 MQTT Demo 接入

4.3.1 MQTT 使用指导

概述

MQTT(Message Queuing Telemetry Transport)是一个基于客户端-服务器的消息发 布/订阅传输协议,主要应用于计算能力有限,且工作在低带宽、不可靠的网络的远程 传感器和控制设备,适合长连接的场景,如智能路灯等。更多关于MQTT协议语法及 接口信息,请访问这里获取。

MQTTS是MQTT使用TLS加密的协议。采用MQTTS协议接入平台的设备,设备与物联 网平台之间的通信过程,数据都是加密的,具有一定的安全性。

设备接入

开发指南 4 设备侧开发

1. 设备接入前,需创建产品(可通过控制台创建或者使用应用侧API创建产品)。

2. 产品创建完毕后,需注册设备(可通过控制台注册单个设备或者使用应用侧API注 册设备创建)。

3. 设备注册完毕后,可以按照图中流程实现消息/属性上报、接收命令/属性/消息、

OTA升级、自定义Topic等功能。关于平台预置topic可参考Topic定义 说明

您可以通过mqtt.fx进行原生协议接入调测,可以参考快速体验mqtt接入。