Skip to content

设备管理

RealMQ 提供产品管理和设备管理功能,在创建产品后,支持调用API进行动态注册设备,同时支持匿名、常规的用户名密码认证和阿里云的三元组加密方式认证,可以通过配置开启设备管理功能。 image.png 设备管理功能需要借助外部数据库进行存储,需要手动开启enabled设置为true, 支持的数据库类型有MySQLPostgreSQL,配置数据库连接之前,需要提前创建数据库:

创建数据库
CREATE DATABASE rmq_dm;

数据库表可以根据auto_create_tables配置自动创建,在参数设置中配置数据库连接信息后,点击应用即可 image-2.png 配置完即可启动设备管理功能 image-2.png

如果没有创建数据库表权限,那需要手动创建数据库表,表结构如下:

进入到数据库中
USR rmq_dm;

DROP TABLE IF EXISTS `rmq_products`;
    CREATE TABLE `rmq_products` (
        `id` bigint NOT NULL AUTO_INCREMENT,
        `name` varchar(255) DEFAULT NULL COMMENT 'product name',
        `type` tinyint DEFAULT '1' COMMENT 'product type',
        `product_key` varchar(255) DEFAULT NULL COMMENT 'product key',
        `product_secret` varchar(255) DEFAULT NULL COMMENT 'product secret',
        `dynamic_reg` tinyint DEFAULT '0' COMMENT 'product dynamic_reg flag',
        `auth_type` tinyint DEFAULT '0' COMMENT '',
        `status` tinyint DEFAULT '0' COMMENT '',
        `model_status` tinyint DEFAULT '0' COMMENT '',
        `description` varchar(255) DEFAULT NULL COMMENT 'product description',
        `create_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Created timestamp',
        `update_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Updated timestamp',
        PRIMARY KEY (`id`),
        UNIQUE KEY `name` (`name`)
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

        DROP TABLE IF EXISTS `rmq_devices`;
        CREATE TABLE `rmq_devices` (
        `id` bigint NOT NULL AUTO_INCREMENT,
        `mqtt_client_id` varchar(255) DEFAULT NULL COMMENT 'mqtt client id',
        `product_key` varchar(255) DEFAULT NULL COMMENT 'product key',
        `name` varchar(255) DEFAULT NULL COMMENT 'device name',
        `username` varchar(255) DEFAULT NULL COMMENT 'device username',
        `nickname` varchar(255) DEFAULT NULL COMMENT 'device nickname',
        `password` varchar(255) DEFAULT NULL COMMENT 'device password',
        `enable` tinyint DEFAULT '0' COMMENT '0 - disable 1 - enable',
        `log_trace` tinyint DEFAULT '0' COMMENT '0 - disable 1 - enable',
        `status` tinyint DEFAULT '0' COMMENT '',
        `ip` varchar(255) DEFAULT NULL COMMENT 'Client IP Address',
        `description` varchar(255) DEFAULT NULL COMMENT 'product description',
        `create_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Created timestamp',
        `update_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Updated timestamp',
        `connected_at` timestamp NULL DEFAULT NULL COMMENT 'Client connected timestamp',
        `disconnected_at` timestamp NULL DEFAULT NULL COMMENT 'Client disconnected timestamp. NULL means client is online and never disconnected',
        PRIMARY KEY (`id`),
        UNIQUE KEY `product_key_name` (`product_key`, `name`),
        INDEX `product_key_index` (`product_key`),
        INDEX `mqtt_client_id_index` (`mqtt_client_id`),
        INDEX `name_index` (`name`),
        INDEX `product_key_status_index` (`product_key`, `status`),
        INDEX `product_key_client_id` (`product_key`, `mqtt_client_id`)
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

        DROP TABLE IF EXISTS `rmq_sub_devices`;
        CREATE TABLE `rmq_sub_devices` (
        `id` bigint NOT NULL AUTO_INCREMENT,
        `device_id` bigint NOT NULL COMMENT 'device id',
        `mqtt_client_id` varchar(255) DEFAULT NULL COMMENT 'mqtt client id',
        `name` varchar(255) DEFAULT NULL COMMENT 'sub device name',
        `nickname` varchar(255) DEFAULT NULL COMMENT 'sub device nickname',
        `sn` varchar(255) DEFAULT NULL COMMENT 'sub device sn',
        `status` tinyint DEFAULT '0' COMMENT '',
        `create_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Created timestamp',
        `update_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Updated timestamp',
        `online_at` timestamp NULL DEFAULT NULL COMMENT 'Client connected timestamp',
        `offline_at` timestamp NULL DEFAULT NULL COMMENT 'Client disconnected timestamp. NULL means client is online and never disconnected',
        PRIMARY KEY (`id`),
        INDEX `device_id_index` (`device_id`),
        INDEX `mqtt_client_id_sn_index` (`device_id`, `sn`)
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

        DROP TABLE IF EXISTS `rmq_device_status_logs`;
        CREATE TABLE `rmq_device_status_logs` (
        `id` bigint NOT NULL AUTO_INCREMENT,
        `device_id` bigint NOT NULL COMMENT 'Device id',
        `type` tinyint DEFAULT '0' COMMENT '',
        `reason` varchar(255) DEFAULT NULL COMMENT 'offline reason',
        `create_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Created timestamp',
        PRIMARY KEY (`id`),
        INDEX `device_id` (`device_id`),
        INDEX `create_at` (`create_at`)
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8;


        DROP TABLE IF EXISTS `rmq_tags`;
        CREATE TABLE `rmq_tags` (
        `id` bigint NOT NULL AUTO_INCREMENT,
        `device_id` bigint NOT NULL COMMENT 'device id',
        `name` varchar(255) DEFAULT NULL COMMENT 'tag name',
        `value` varchar(255) DEFAULT NULL COMMENT 'tag value',
        `create_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Created timestamp',
        PRIMARY KEY (`id`),
        UNIQUE KEY `device_id_name` (`device_id`, `name`)
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8;


        DROP TABLE IF EXISTS `rmq_device_shadows`;
        CREATE TABLE `rmq_device_shadows` (
        `id` bigint NOT NULL AUTO_INCREMENT,
        `device_id` bigint NOT NULL COMMENT 'device id',
        `pub_topic` varchar(255) DEFAULT NULL COMMENT 'Publish Topic',
        `sub_topic` varchar(255) DEFAULT NULL COMMENT 'Subscribe Topic',
        `data` text DEFAULT NULL COMMENT 'Device Shadow Data',
        `status` tinyint DEFAULT '0' COMMENT 'Shadow Status',
        `version` int DEFAULT '1' COMMENT 'Shadow Version',
        `description` varchar(255) DEFAULT NULL COMMENT 'Shadow description',
        `create_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Created timestamp',
        `update_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Updated timestamp',
        PRIMARY KEY (`id`),
        UNIQUE KEY `device_id` (`device_id`),
        INDEX `pub_topic_index` (`pub_topic`)
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

设备认证

默认情况下,添加的设备后是使用用户名密码进行认证,如果需要开启阿里云三元组认证可以在配置中选择阿里云认证模式。 image-6.png

阿里云认证模式

clientid: productKey.deviceUserName|securemode=2,signmethod=hmacsha256,timestamp=1720057806414|

username: deviceUserName&productKey

password: signmethod(clientId${productKey}.${deviceUserName}deviceName${deviceName}productKey${productKey}timestamp${timestamp})

productKey = b1b25172e1
username = aaa
securemode = 2
signmethod = hmacsha256
timestamp = 1714120054045
deviceSecret = aaa
MQTT 连接登录信息
clientid: b1b25172e1.aaa|securemode=2,signmethod=hmacsha256,timestamp=1714120054045|
username: aaa&b1b25172e1
## hmacsha256("aaa", "clientIdb1b25172e1.aaadeviceNameaaaproductKeyb1b25172e1timestamp1714120054045")
password: 71a45ae7fc7e46fda5324a4784da5d6723d8698240964c1c58a849aea30178a8

可以通过设备详情页面查看MQTT连接参数信息 alt text

通用认证模式

productKey = dccf2f8f73
clientid = dccf2f8f73.test3
username = test3
deviceSecret = 3fb8169398958a3bde7f95d21090864d

MQTT 连接登录信息
clientid: dccf2f8f73.test3
username: test3&dccf2f8f73
password: 3fb8169398958a3bde7f95d21090864d

可以通过设备详情页面查看MQTT连接参数信息 alt text

产品管理

产品页面支持分页和模糊查询,对产品进行添加和管理

产品添加

产品添加支持配置 产品类型、动态注册、加密类型等,开启动态注册后,可以调用API进设备的动态创建。 image-3.png

动态注册API

POST /api/v1/register_device

Parameters (json):

NameTypeRequiredDefaultDescription
productKeyStringRequired产品key
deviceNameStringRequired设备名称
deviceUserNameStringOptional如果不填,使用deviceName填充
deviceSecretStringOptional如果不填,系统自动生成
randomStringRequired随机数
SignStringRequireddeviceName+productKey+random拼接的字符后用signMethod进行加密,signMethod(${product_secret}, deviceName${deviceName}productKey${productKey}random${random})
signMethodStringRequiredhmacmd5|hmacsha1|hmacsha256

Success Response Body (JSON)

NameTypeDescription
codeInteger0
messageStringsuccess
dataobject

Examples:

$ curl -i --basic -u root:123456 -X POST "http://localhost:8090/api/v1/register_device" -d '{"productKey":"2e044f1c20","deviceName":"test111","deviceSecret":"123456", "random": "123456", "sign": "8bb21ff136a8e3e3e0d20ab2a1bdce7dc054b903", "signMethod": "hmacsha1"}'

{"code":0,"message": "success", "data": {"productKey":"2e044f1c20","deviceName":"test111","deviceSecret":"123456"}}

Topic 定义

定义Topic后,设备可以通过Topic与设备和平台进行通信,从而实现设备、平台、业务服务器、其他云产品之间的通信 p-topic.png

  • 设备操作权限 设备对该Topic的操作权限,可设置为:发布 | 订阅 | 发布和订阅
  • 主题名称 Topic格式必须以 / 进行分层,区分每个类目。支持使用${clientId} | ${username} | ${deviceName} | ${deviceId} | ${productKey}。
  • 是否开启代理订阅 开启代理订阅后设备与平台建连时,平台查询已开启代理订阅的Topic,帮助设备完成订阅。
  • 描述 可输入文字,描述该Topic类,用于区分不同Topic类的功能

预置规则

设备登录和离线时,支持设置规则,异步操作数据库的SQL语句,更新数据库表结构

p-rule

  • 名称 规则名称
  • 类型 连接 | 断开连接
  • 描述 SQL语句模板

SQL语句模板支持的参数

字段描述
clientid客户端id
username用户名
peername终端的 IPAddress 和 Port
connected_at客户端连接完成时间 (ms)
disconnected_at客户端断开连接时间 (ms)
timestamp事件触发时间 (ms)

设备管理

设备页面支持分页和模糊查询,对设备进行添加和管理,给设备添加和删除标签 device-list.png

设备添加

image-4.png

  • 设备名称
  • 产品
  • MQTT用户名
  • MQTT 密码
  • 设备昵称
  • MQTT 客户端ID

设备标签

可以给设备设置标签,设置的标签可以在数据转换中进行过滤操作,通过headers.tags.xxx获取 image-5.png

设备影子

用户可以在设备详情里面开启设备影子功能,开启设备影子后,RealMQ 会把设备影子数据存储在数据库中,不管设备在线还是离线,都可以通过HTTP API 或者 MQTT消息 获取设备影子数据和管理影子数据。 image-7.png

设备影子 REST-API

插入影子数据

POST /api/v1/device_shadow
Params: {
  "device_id": xxx,
  "product_key": "xxx",
  "username": "xxx"
}
Response: {code: 200}

获取影子数据

GET /api/v1/device_shadow
Params: {
  "device_id": xxx
}
Response: {
    "id": 3,
    "device_id": xxx,
    "status": true,
    "sub_topic": "shadow/xxx/reply",
    "pub_topic": "shadow/xxx",
    "data": {
        "info": "xxx"
    },
    "create_at": "xxx",
    "update_at": "xxx",
}

修改影子数据

PUT /api/v1/device_shadow
Params: {
  "device_id": xxx,
  "product_key": "xxx",
  "username": "xxx",
  "data": {
    "xxx": xxx
  }
}
Response: {code: 200}

设备影子 MQTT API

插入影子数据

向 topic: shadow/${id} publish 下面的 payload
topic: shadow/${id}
payload: {
  "method": "PUT",
  "payload": {
    "info": "xxx"
  }
}

给影子追加数据

向 topic: shadow/${id} publish 下面的 payload
payload: {
  "method": "PATCH",
  "payload": {
    "info1": "xxx"
  }
}

获取影子数据

首先需要 subscribe topic: shadow/${id}/reply
在向 topic: shadow/${id} publish 下面的payload
payload: {
  "method": "GET"
}

单个设备统计

通过设备详情页面可以启动单个设备的消息收发统计和内容查看,有助于调试和排查问题,开启统计后系统会存储该客户端2小时内发布和接收的消息,如果没有手动关闭,系统会在2个小时后自动关闭。 image-7.png

设备模拟器

离线设备可以使用设备模拟器进行连接、上行指令调试和下行指令发布,实时查看消息收发日志。 image-simulator.png