網關與子裝置開發實戰(java)

在很多物聯網場景中,終端裝置本身沒有連接配接網際網路能力,那麼資料如何上雲呢?
IoT物聯網平台支援裝置MQTT直連,也支援的裝置挂載到網關上,作為網關的子裝置,由網關代理接入IoT物聯網平台。
這時候網關裝置除了自身作為IoT網關裝置(擁有身份三元組)與IoT物聯網平台建立MQTT連接配接,收發資料,還要負責子裝置的管理,包括:
- 網關添加子裝置網絡拓撲關系
- 子裝置複用網關mqtt連接配接通道上線
- 網關把子裝置資料上報到雲端
- 網關接收指令,并轉發給子裝置
- 網關上報子裝置下線
- 網關删除子裝置網絡拓撲關系
網關和子裝置通信的協定由本地網絡決定,可以是http,mqtt,ZigBee,Modbus,BLE,OPC-UA等,這部分邏輯由網關實作,IoT SDK不包含這部分功能。
1.建立網關産品
建立網關産品時,需要選擇節點類型:網關,即指可以挂載子裝置的直連裝置。網關可以管理子裝置、可以維持與子裝置的拓撲關系,并将該拓撲關系同步到雲端。
網關與子裝置的拓撲關系如下圖所示:
2.網關裝置上線
LinkKitInitParams params = new LinkKitInitParams();
DeviceInfo gatewayInfo = new DeviceInfo();
gatewayInfo.productKey = gateway.productKey;
gatewayInfo.deviceName = gateway.deviceName;
gatewayInfo.deviceSecret = gateway.deviceSecret;
params.deviceInfo = gatewayInfo;
LinkKit.getInstance().init(params, ILinkKitConnectListener)
網關上線可以在控制台看到,裝置狀态是 線上
3.添加網絡拓撲關系
DeviceInfo deviceInfo = new DeviceInfo();
deviceInfo.productKey = productKey;
deviceInfo.deviceName = deviceName;
deviceInfo.deviceSecret = deviceSecret;
LinkKit.getInstance().getGateway().gatewayAddSubDevice(
deviceInfo, //子裝置身份
SubDeviceConnectListener)
4.子裝置上線
DeviceInfo deviceInfo = new DeviceInfo();
deviceInfo.productKey = productKey;
deviceInfo.deviceName = deviceName;
deviceInfo.deviceSecret = deviceSecret;
LinkKit.getInstance().getGateway().gatewaySubDeviceLogin(
deviceInfo, //子裝置身份
ISubDeviceActionListener)
子裝置檢視到接入官網的資訊
5.子裝置上報資料
DeviceInfo deviceInfo = new DeviceInfo();
deviceInfo.productKey = productKey;
deviceInfo.deviceName = deviceName;
deviceInfo.deviceSecret = deviceSecret;
LinkKit.getInstance().getGateway().gatewaySubDevicePublish(
topic, //子裝置topic
data, //資料
deviceInfo, //子裝置身份
ISubDeviceActionListener)
6.子裝置訂閱主題
DeviceInfo deviceInfo = new DeviceInfo();
deviceInfo.productKey = productKey;
deviceInfo.deviceName = deviceName;
deviceInfo.deviceSecret = deviceSecret;
LinkKit.getInstance().getGateway().gatewaySubDeviceSubscribe(
topic, //子裝置訂閱Topic
deviceInfo, //子裝置身份
ISubDeviceActionListener)
7.子裝置下線
DeviceInfo deviceInfo = new DeviceInfo();
deviceInfo.productKey = productKey;
deviceInfo.deviceName = deviceName;
deviceInfo.deviceSecret = deviceSecret;
LinkKit.getInstance().getGateway().gatewaySubDeviceLogout(
deviceInfo, //子裝置身份
ISubDeviceActionListener)
8.子裝置網絡拓撲删除
DeviceInfo deviceInfo = new DeviceInfo();
deviceInfo.productKey = productKey;
deviceInfo.deviceName = deviceName;
deviceInfo.deviceSecret = deviceSecret;
LinkKit.getInstance().getGateway().gatewayDeleteSubDevice(
deviceInfo, //子裝置身份
ISubDeviceRemoveListener)