基于 Thingsboard 平台自定义 RPC 控制类小部件示例

  • 1. 小部件介绍
  • 2. 创建小部件
  • 3. 部件编辑器
    • 3.1 简介
    • 3.2 资源 / HTML / CSS
    • 3.3 JavaScript
    • 3.4 设置模式 (Settings schema)
    • 3.5 部件预览 (Widget preview)
  • 4. 基础部件 API
    • 4.1 订阅对象 (Subscription object)
    • 4.2 时间窗口函数 (Timewindow functions)
    • 4.3 控制 API (Control API)
    • 4.4 动作 API (Actions API)
    • 4.5 状态控制器 (State Controller)
    • 4.6 类型参数对象 (Type parameters object)
    • 4.7 动作资源对象 (Action sources object)
  • 5. 创建 RPC(控制)部件示例

1. 小部件介绍

小部件(Thingboard Widget)是可以轻松集成进平台仪表板(Dashboard)的 UI 组件,它可以提供数据可视化、远程设备控制、警报管理、展示静态 Html 内容等功能。根据提供的特性,每个小部件定义代表一个特定的小部件类型。


2. 创建小部件

使用 tenant 或 sysadmin 帐号登陆系统,点击【部件库】菜单 -> 右上角【+】号 -> 【创建新的部件组】


根据提示填写标题、描述信息,如果有图片可以上传


添加完成后,在列表中打开该部件组

点击【添加新的部件类型】-> 选择想要创建的部件类型(此处选择控件部件)

此时出现该类型控件对应的默认示例


3. 部件编辑器

3.1 简介

部件编辑器是一个用来开发自定义部件的小型集成开发环境,主要包括顶部功能工具栏和四个主要部分

  • 资源 / HTML / CSS
  • JavaScript
  • 设置模式(Settings schema)
  • 部件预览(Widget preview)

3.2 资源 / HTML / CSS

这部分包含三个页签:

  1. 资源

    用于加载部件所使用的外部 JS / CSS 资源。

  2. HTML

    编写部件 HTML 代码。

  3. CSS

    编写部件样式。

3.3 JavaScript

这部分包含所有与部件相关的 JS 代码,根据官方提供的 Widget API

3.4 设置模式 (Settings schema)

这部分包含三个页签:

  1. 设置模式

    用于指定小部件 UI 表单设置的 json 模式,该表单是通过 react-schema-form builder 自动生成的 ,该设置显示在小部件设置的高级(Advanced)选项卡中。由该模式序列化的 Settings 对象用于存储特定的小部件设置,并可通过小部件JavaScript 代码访问。

  2. 数据键设置模式

    用于指定数据键设置的 json 模式,以便使用 react-schema-form builder 自动生成UI表单。这个生成的 UI 表单显示在数据键设置模式对话框的高级(Advanced)选项卡中。由该模式序列化的 Settings 对象用于存储小部件中定义的数据源的每个数据键的特定设置,这些设置可以通过小部件 JavaScript 代码访问。

  3. Widget settings

    用于配置部件缩略图及描述信息。

3.5 部件预览 (Widget preview)

此部分用于预览和测试自定义的小部件。它作为一个迷你仪表板来显示当前自定义小部件的一个实例。


4. 基础部件 API

所有与部件相关的代码都位于 JavaScript 部分,可以使用内置变量 self,它是一个部件实例的引用。
部件的每一个函数都应该作为 self 变量的属性来定义。
self 变量有一个 WidgetContext 类型的 ctx 属性,它是包含这个部件实例所有必要的 API 和数据的一个上下文引用。

要创建一个新部件,需要实现下列函数,但每个函数都是可选的,可以根据小部件特定的行为来实现。

函数名 描述
onInit() 小部件准备好进行初始化时调用的第一个函数。用于准备小部件DOM、处理小部件设置和初始订阅信息。
onDataUpdated() 当从小部件订阅获得新数据时调用。
onResize() 当小部件容器调整大小时调用。
onEditModeChanged() 在更改仪表板编辑模式时调用。
onMobileModeChanged() 当仪表板视图宽度跨越移动断点时调用。
onDestroy() 销毁时调用。
getSettingsSchema() 返回设置模式 json,作为设置模式选项卡对应部分的替代选项。
getDataKeySettingsSchema() 返回数据键设置模式 json,作为数据键设置模式选项卡对应部分的替代选项。
typeParameters() 返回描述小部件数据源参数的 WidgetTypeParameters 对象。
actionSources() 返回描述定义用户操作的可用小部件操作源 (WidgetActionSource) 的映射。

4.1 订阅对象 (Subscription object)

小部件订阅对象是 IWidgetSubscription 的实例,根据小部件类型包含所有订阅信息,也包括当前数据。订阅对象根据小部件类型提供不同的数据结构。

4.2 时间窗口函数 (Timewindow functions)

用于管理带有时间窗口的小部件数据的时间框架,可以在时间序列或报警部件中使用。

4.3 控制 API (Control API)

为 RPC (控制) 小部件提供 API 函数的对象。

函数名 描述
sendOneWayCommand(method, params, timeout) 发送单向(无响应) RPC 命令到设备。
sendTwoWayCommand(method, params, timeout) 发送双向(带响应) RPC 命令到设备。

4.4 动作 API (Actions API)

一个用于执行用户自定义动作的 API 函数集。

4.5 状态控制器 (State Controller)

仪表板状态控制器 (IStateController) 的实例引用,提供 API 来管理当前仪表板状态。

4.6 类型参数对象 (Type parameters object)

描述部件数据源参数的对象。

4.7 动作资源对象 (Action sources object)

描述可用的小部件动作源的映射,用户动作可以分配给它。


5. 创建 RPC(控制)部件示例

  • 清空 CSS 编辑器中的内容

  • 在 HTML 中填入如下代码

        <form #rpcForm="ngForm" (submit)="sendCommand()"><div class="mat-content mat-padding" fxLayout="column"><mat-form-field class="mat-block"><mat-label>RPC method</mat-label><input matInput required name="rpcMethod" #rpcMethodField="ngModel" [(ngModel)]="rpcMethod"/><mat-error *ngIf="rpcMethodField.hasError('required')">RPC method name is required.</mat-error></mat-form-field><mat-form-field class="mat-block"><mat-label>RPC params</mat-label><input matInput required name="rpcParams" #rpcParamsField="ngModel" [(ngModel)]="rpcParams"/><mat-error *ngIf="rpcParamsField.hasError('required')">RPC params is required.</mat-error></mat-form-field><button [disabled]="rpcForm.invalid || !rpcForm.dirty" mat-raised-button color="primary" type="submit" >Send RPC command</button><div><label>RPC command response</label><div style="width: 100%; height: 100px; border: solid 2px gray" [innerHTML]="rpcCommandResponse"></div></div></div></form>
    
  • 在设置模式中填入如下代码

        {"schema": {"type": "object","title": "Settings","properties": {"oneWayElseTwoWay": {"title": "Is One Way Command","type": "boolean","default": true},"requestTimeout": {"title": "RPC request timeout","type": "number","default": 500}},"required": []},"form": ["oneWayElseTwoWay","requestTimeout"]} 
  • 在 JavaScript 中填入如下代码

    self.onInit = function() {self.ctx.$scope.sendCommand = function() {var rpcMethod = self.ctx.$scope.rpcMethod;var rpcParams = self.ctx.$scope.rpcParams;var timeout = self.ctx.settings.requestTimeout;var oneWayElseTwoWay = self.ctx.settings.oneWayElseTwoWay ? true : false;var commandObservable;if (oneWayElseTwoWay) {commandObservable = self.ctx.controlApi.sendOneWayCommand(rpcMethod, rpcParams, timeout);} else {commandObservable = self.ctx.controlApi.sendTwoWayCommand(rpcMethod, rpcParams, timeout);}commandObservable.subscribe(function (response) {if (oneWayElseTwoWay) {self.ctx.$scope.rpcCommandResponse = "Command was successfully received by device.<br> No response body because of one way command mode.";} else {self.ctx.$scope.rpcCommandResponse = "Response from device:<br>";                    self.ctx.$scope.rpcCommandResponse += JSON.stringify(response, undefined, 2);}self.ctx.detectChanges();},function (rejection) {self.ctx.$scope.rpcCommandResponse = "Failed to send command to the device:<br>"self.ctx.$scope.rpcCommandResponse += "Status: " + rejection.status + "<br>";self.ctx.$scope.rpcCommandResponse += "Status text: '" + rejection.statusText + "'";self.ctx.detectChanges();});}
    }
  • 输入部件名称,点击保存,再点击运行,红框处即小部件预览效果,如下图:

为了测试控件 RPC 控制功能,需要将其放在一个仪表板中,并绑定到一个使用 RPC 控制的设备。步骤如下:

  1. 使用租户(tenant)管理员登陆

  2. 在【设备】菜单下添加新设备

  1. 打开设备详情页,点击【复制访问令牌】按钮

  1. 下载 mqtt-js-rpc-from-server.sh 和 mqtt-js-rpc-from-server.js 并放入同一个文件夹下
  • 编辑 mqtt-js-rpc-from-server.sh , 将 $ACCESS_TOKEN 替换为刚才复制的访问令牌

  • 如果是本地源码启动的 TB 服务,需要编辑 mqtt-js-rpc-from-server.js , 修改服务器地址为 localhost

  1. 使用 Linux Shell 执行 mqtt-js-rpc-from-server.sh,运行成功则显示 connected

  1. 在【仪表板库】菜单下新建仪表板并打开,点击【实体别名】-【添加别名】

  1. 点击【添加新的部件】,选择之前创建的控制部件



  1. 填入 RPC method 和 RPC params,点击 Send RPC commond 发送模拟命令,收到如下响应

    此时设备端收到如下内容

  1. 测试发送双向 RPC 命令,编辑部件,在【高级】页签中,取消勾选【Is One Way Command】,保存即可。

填入上一步单向命令的方法和参数,点击发送命令按钮

关闭设备端 js 脚本,再次发送命令,响应如下:

在本例中,使用 controlApi 发送 RPC 命令。此外,为了配置 RPC 命令模式和 RPC 请求超时,引入了自定义小部件设置。来自设备的响应由 commandObservable 处理。它具有成功回调和失败回调,并具有相应的响应,或者包含关于请求执行结果信息的拒绝对象。

基于 Thingsboard 平台自定义 RPC 控制类小部件示例相关推荐

  1. 基于微信平台的在线漫画阅读小程序设计与实现【附项目源码+论文说明】分享

    基于微信平台的在线漫画阅读小程序设计与实现演示 摘要 随着智能应用程序开发的普及,各种应用程序在人们的视野中如雨后春笋般涌现.同时,带来了很多不便,功能多种多样,使人们无法选择.同时,它也对智能手机的 ...

  2. 变分模态分解_Android小部件示例中的模态对话框(弹出)

    变分模态分解 在此示例中,我们将看到如何在主屏幕中创建一个可以打开弹出对话框的Android小部件. 如您所知,Android Widgets是小型应用程序,基本上可以做两件事. 按下时启动新的活动, ...

  3. 基于motoharw平台的电机控制策略模型simulink仿真实现

    目录 一.理论基础 二.核心程序 三.仿真测试结果 一.理论基础 HCU的控制算法开发是一个极其复杂的过程.其过程包括多个步骤:功能概念定义.算法开发.软件编程.底层操作系统和驱动程序开发.匹配标定及 ...

  4. SpringSecurity系列——其他的权限控制,基于access表达式的权限控制day6-2(源于官网5.7.2版本)

    SpringSecurity系列--其他的权限控制,基于access表达式的权限控制day6-2(源于官网5.7.2版本) 常见权限控制总表 基于access表达式的权限控制 实例1:改写hasRol ...

  5. 基于X86平台的PC机通过网络发送一个int(32位)整数的字节顺序

    1.字节顺序 字节顺序是指占内存多于一个字节类型的数据在内存中的存放顺序,通常有小端.大端两种字节顺序.小端字节序指低字节数据存放在内存低地址处,高字节数据存放在内存高地址处:大端字节序是高字节数据存 ...

  6. Android开发实战《手机安全卫士》——11.“进程管理”模块拓展 窗体小部件 生成快捷方式

    文章目录 1.进程管理--隐藏系统进程 2.进程管理--锁屏清理 3.拓展功能--生成快捷方式 4.高级工具--常用号码查询(布局实现) 5.高级工具--常用号码查询(逻辑实现) 6.拓展功能--窗体 ...

  7. 几十种小程序示例demo(源码来自github)

    腾讯云微信小程序 ★111 - 一站式解决方案客户端示例 wechat_mall_applet ★103 - 巴爷微信商城的简单版本 wechat-app-music ★91 - 微信小程序: 音乐播 ...

  8. 基于 Python 的横版 2D 动作类小游戏

    基于 Python 的横版 2D 动作类小游戏 游戏代码 游戏代码 游戏整体代码(基于 pygame 模块开发) // An highlighted block import pygame impor ...

  9. HTML5游戏_基于DOM平台跳跃小游戏开发_9.按键监听

    HTML5游戏_基于DOM平台跳跃小游戏开发 按键监听 视频讲解 HTML5游戏 效果图 本章知识点: 对象自定义名称属性,可以用变量来命名属性名称 //这段代码把多个属性(品牌, 型号, 排量)赋给 ...

最新文章

  1. SAP MM 可以不用创建盘点凭证直接录入盘点结果?
  2. opengl正方形绕点旋转_中考热点:再说旋转动点问题中的最值问题之提分攻略
  3. 加速SaaS规模化演进,餐道基于K8s的云上创新底座
  4. P3911 最小公倍数之和
  5. java值栈_Struts2 中的值栈是什么?
  6. nodejs上传图片并展示
  7. 搭建AD域环境时出现错误,未能为域创建GPO 出现扩展错误解决办法
  8. 1971旗舰cpu intel_Intel 酷睿i7 9700F搭配影驰GeForce RTX 2060大将
  9. java 回调函数的写法
  10. 主成分分析步骤matlab,主成分分析及matlab实现.ppt
  11. 2019年终总结-坚持的力量
  12. 服务器显示504,帮您解决win7系统访问nginx服务器提示504 Gateway Time-out错误的修复技巧...
  13. 高中生如何才能快速提高高二数学成绩
  14. [200814] 自己动手,搞定软件著作权申请(已成功)
  15. [音乐] 逆转裁判第二季 OP『Nеvеr Losе』
  16. 计算机专业的工匠精神例子,市计算机:传承中华传统文化,弘扬工匠精神
  17. 浅谈Android输入法(IME)架构
  18. 你还分不清谐波失真、总谐波失真、总谐波失真加噪声吗?
  19. Contiki开发1:Contiki与8位MCU
  20. 海信电视版本系统升级服务器地址,海信电视系统版本太低怎么升级?

热门文章

  1. GitHub超 7.9 万星,最全Python入门算法!
  2. 28届计算机表演赛辽宁赛区,第十九届计算机表演赛辽宁赛区网络基础类竞赛结果.doc...
  3. 高校的监控、有线、无线网络业务如何跑起来?
  4. Flume部署安装详细图文步骤(单节点)
  5. HTML基础标签总结(仅用作复习,持续补充扩展)
  6. 《运营之光》-- 学习笔记(三)
  7. 北京律师事务所名称大合集
  8. Android开发聊天功能
  9. 使用Python抓取网易云音乐所有歌手信息
  10. 从零开始5——简陋版坦克大战(2)