• 平台功能
  • 功能介绍
    • 配置文件
    • 系统函数
    • 组态图形
    • 页面集成
    • 功能扩展
    • SSL TLS
  • 本地部署
    • 数据库备份与还原
  • 协议处理
    • WebSocket
    • 国标协议
    • JT808协议
    • MQTT协议
    • OPC网关
    • 自定义协议(my)
    • 自定义协议(di)
    • 平台主动发给终端
    • 串口功能
    • 客户端功能
  • 完整案例演示
  • 系统函数源代码
  • 简洁的Ajax代码
  • 定制协议
    • 平台服务配置
    • 重启服务
    • 解析配置
      • 在setting.json中配置:
      • main.ds:
      • process.ds:
        • input函数
        • 处理的例子
  • 模板数据与实例
  • 前端展示
    • 图形展示
    • 自定义页面展示
    文档主题
    https://twuyun.com/help/doc/0/index?id=5f65f187a5a79a8ba43ec73c
    功能
    模板管理图形管理脚本测试文档管理系统日志
    0

    完整案例演示

    定制协议

    下面用完全自定义的协议做例子:

    平台服务配置

    1. ```
    2. <!--Role: work|web|ws|mq-->
    3. <add key="Role" value="work|web|ws|mq|my;9991;777;test"/>
    4. ```
    5. 其中 my;9991;777;test 就是自己配置的协议,组成如下:
    6. - my;端口号;最大连接数;服务名
    7. - 服务成功启动后新的服务名为:my_服务名
    8. - 如my;9991;777;test -》
    9. 服务名:my_test
    10. 端口号:9991
    11. 最大连接数:777

    重启服务

    可以在下面地址中查看服务情况:

    图片alt

    服务器情况:

    图片alt

    解析配置

    自定义协议基于目前比较流行的定义开始符与结束符的协议:

    在setting.json中配置:

    1. 两种选择
    2. - 在根目录下
    3. ```
    4. "MyProcess": {
    5. "my_test": {
    6. "process": "/./process.ds",
    7. "close": "/./offline.ds",
    8. "main": "/./main.ds"
    9. }
    10. },
    11. ```
    12. - 在同名目录下
    13. ```
    14. "MyProcess": {
    15. "process": "/./process.ds",//连接成功后的处理逻辑
    16. "close": "/./offline.ds",//连接断开后的处理逻辑
    17. "main": "/./main.ds" //协议解析构成
    18. },
    19. ```

    图片alt

    main.ds:

    1. 下面例子是一个通用的解析处理(参考JT808协议):
    2. ```
    3. //定义一个函数方便构成字典
    4. function unit(name, type, length, value) {
    5. return {
    6. "name": name,//单元描述,仅说明含义,无实际用途
    7. "type": type,//单元类型
    8. "length": length,//单元长度
    9. "value": value,//单元值
    10. };
    11. }
    12. return [
    13. unit("标识位", "STRING", 1, [0x7e]),
    14. unit("消息ID", "WORD", 2),
    15. unit("消息体属性", "WORD", 2),
    16. unit("终端手机号", "BCD", 6),
    17. unit("消息流水号", "WORD", 2),
    18. unit("消息体", "BYTE[]", 0),
    19. unit("校验码", "BYTE", 1),
    20. unit("标识位", "STRING", 1, [0x7e]),
    21. ]
    22. ```

    类型说明

    类型名 字节数 说明
    BIT 1位 位
    ASCII n ASCII字符串
    UTF8 n UTF8字符串
    GBK n GBK字符串
    STRING n GBK字符串
    WORD 2 2字节数字
    DWORD 4 4字节数字
    DECIMAL 8 8字节数字
    BCD 6 BCD时间
    DATE 6 时间
    DATE2 6 时间
    BYTE 1 1字节
    BYTE[] n n字节

    process.ds:

    处理程序在协议解析成功后执行:

    input函数

    利用input函数可以知道服务端传过来了哪些内容,下面是调用的结果参考:

    1. {
    2. "server": "my_test",
    3. "session": {
    4. "id": "49fd17b5-0285-4f14-905b-87a0e4cd3d2f",
    5. "ip": "192.168.0.107",
    6. "time": "2020-09-20T01:21:57.322Z"
    7. },
    8. "data": {
    9. "data": ["~", 512, 96, "14533806760", 4133, "AAAAAAAAAAABzqJQBq+NWAAAAAABNiAJFhkzNgEEAAACius8ACQAqQHMAAZwV+8HIHBXnIgtcFeechxwV6PWGnBXnT0WcFfvCRYADACyiYYEAhAgcAAyVgAGAIn/////",
    10. 218, "~"],
    11. "bytes": "7E020000600145338067601025000000000000000001CEA25006AF8D5800000000013620091619333601040000028AEB3C002400A901CC00067057EF072070579C882D70579E721C7057A3D61A70579D3D167057EF0916000C00B28986040210207000325600060089FFFFFFFFDA7E",
    12. "ip": "192.168.0.107",
    13. "prop": null
    14. },
    15. "err": "",
    16. "client": null
    17. }

    处理的例子

    1. var input = input();//这个可以取到传过来的所有参数,可以记录到日志便于操作。
    2. console.info(input());
    3. //一般input()中会看到所有的输入参数,也就是设备端传过来的数据,参考前面的介绍
    4. //我们可以获取到设备数据内容
    5. var device_data=input.data.data;//其中的base64的内容实际上是二进制数组,后面可以进一步调用解析函数得到具体的内容。
    6. var device_bytes=input.data.bytes;//这是原始的16进制报文
    7. //下面可以通过内置的解析函数解析具体的数据内容:
    8. var 消息体结构=[
    9. unit("经度", "WORD", 4),
    10. unit("纬度", "WORD", 4),
    11. ]
    12. var 消息体内容=bytes.parse(device_data[5],消息体结构,device_data);//这里的3个参数:
    13. //1. 二进制报文数据
    14. //2. 消息体构成定义
    15. //3. 收到的总体数据
    16. //消息体内容 就是解析出来的数据,是个数据数组,后面可以将他们存入数据库或者实例进行实时通知等。
    17. //下面是服务返回给设备的内容处理:
    18. result.result = 0;//0表示没问题,如果为1表示有问题,会关掉连接
    19. result.data = ["a", "b", "c"];//协议中的数据,与units里面定义的对应
    20. result.units = [
    21. unit("a", "STRING"),
    22. unit("b", "STRING"),
    23. unit("c", "STRING"),
    24. ]
    25. return result;
    26. //定义一个函数便于生成字典
    27. function unit(name, type, length, value) {
    28. return {
    29. "name": name,
    30. "type": type,
    31. "length": length,
    32. "value": value,
    33. };
    34. }

    模板数据与实例

    通过平台内置的管理页面可以很方便的进行管理:

    数据管理页面

    前端展示

    1. 可以通过平台提供的图形功能进行自定义设计与动态展示。
    2. 平台提供的动态数据api,可以在自定义页面中嵌入图形展示动态数据。
    3. 通过大屏自定义来展示数据。

    图形展示

    自定义图形

    自定义页面展示

    进入控制台

    下面这个例子可以在自定义的页面中集成实例数据与图形:

    1. <html>
    2. <head>
    3. <file src="/admin/graphic/runtime/link"></file>
    4. </head>
    5. <body>
    6. <b-page a="230" b=""></b-page>
    7. <div>
    8. <div>
    9. <b-data id="message" value="/this/msg.message"></b-data>
    10. </div>
    11. <div>
    12. <b-data value="=/this/msg.message+'_2222222'"></b-data>
    13. </div>
    14. <table>
    15. <tr>
    16. <td>
    17. <b-symbol name="5e868fd3776caf06542a2e90" width="500" height="200" cp.a="/a">
    18. </b-symbol>
    19. </td>
    20. <td>
    21. <b-symbol name="5f017aa7a5a79a0390cd2f77" width="200" height="100" cp.b="/a">
    22. </b-symbol>
    23. </td>
    24. <td>
    25. <b-symbol name="/admin/home/symbols/ccc/mysymbol" width="200" height="100" cp.b="/a">
    26. </b-symbol>
    27. </td>
    28. </tr>
    29. </table>
    30. </div>
    31. </body>
    32. <script>
    33. //可以定义onchange函数,在收到数据后自定义显示
    34. document.getElementById("message").onchange = function(value, time) {
    35. //
    36. document.getElementById("message").innerHTML = value + "," + time;
    37. }
    38. //-------------------------------------------
    39. var myruntime = new GraphicRuntime(); //定义api对象
    40. //在加载前执行,一般用作loading
    41. myruntime.oninit = function(dom) {
    42. //dom.parentElement.style.background = null;
    43. var p = dom.parentElement;
    44. p.style.background = "url(/admin/graphic/runtime/loading.gif) no-repeat 0 0";
    45. p.style.backgroundSize = "50px 50px";
    46. p.style.backgroundPositionX = "center";
    47. p.style.backgroundPositionY = "center";
    48. }
    49. //在数据加载完成后,可以取消loading
    50. myruntime.ondataready = function(dom) {
    51. //dom.parentElement.style.background = null;
    52. var p = dom.parentElement;
    53. p.style.background = null;
    54. }
    55. //在图形加载完成后,参数分别为:(展示对象,图形标题,图形用的数据模板,当前实例)
    56. myruntime.onready = function(display, title, template, instance) {
    57. document.title = "图形-" + title;
    58. var dom = display.getdom();
    59. dom.parentElement.style.background = null;
    60. //可以定义一个重新加载函数,重加载显示
    61. window.reloaddisplay = function(cps) {
    62. display.reload(cps);
    63. }
    64. //可以获取到模板下所有实例,便于操作实例的切换
    65. mxUtils.mypost("/admin/graphic/runtime/api/get_instances.ds", {
    66. "tid": template
    67. }, {},
    68. function(data) {
    69. //
    70. data = JSON.parse(data);
    71. // data = [
    72. // {
    73. // "id": "",
    74. // "name": "",
    75. // "desc": "没有实例",
    76. // "style": ""
    77. // }
    78. // ]
    79. }, function(data) {
    80. alert(data)
    81. });
    82. }
    83. //定义图形尺寸大小
    84. myruntime.getsize = function(dom) {
    85. var p = dom.parentElement;
    86. return {
    87. width: p.clientWidth,
    88. height: p.clientHeight
    89. }
    90. }
    91. //出错后的处理
    92. myruntime.onerror = function(error, dom) {
    93. alert(error);
    94. dom.parentElement.style.background = null;
    95. }
    96. //改变图形数据实例
    97. function changeinstance(iid) {
    98. myruntime.setinstance(iid);
    99. };
    100. //改变图形的自定义属性,也可设置实例:(name使用$.instance)
    101. function setprop(name, value) {
    102. myruntime.setpageprop(name, value);
    103. };
    104. //加载图形和数据
    105. myruntime.load();
    106. </script>
    107. </html>