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

    自定义协议(my)

    自定义协议可以由用户完全自定义下面两种类型的协议。

    配置

    服务配置

    1. <add key="Role" value="work|web|ws|mq|my;9991;777;test;0;tcp/udp"/>
    2. 如:my;9991;777;test;0;tcp/udp
    3. my;端口号;最大连接数;服务名称;超时秒;协议类型tcp或者udp
    4. 定义好后,服务名为:my_test
    5. 在进行协议定义时注意文件夹名称为:my_test
    6. 超时秒默认为300秒也就是5分钟

    相关文件

    图片alt

    类型定义参考

    类型名 字节数 说明
    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字节

    首尾固定协议

    如 7E020000600145338067601025000000000000000001CEA25006AF8D5800000000013620091619333601040000028AEB3C002400A901CC00067057EF072070579C882D70579E721C7057A3D61A70579D3D167057EF0916000C00B28986040210207000325600060089FFFFFFFFDA7E

    1. unit("标识位", "STRING", 1, [0x7e]),
    2. unit("消息ID", "WORD", 2),
    3. unit("消息体属性", "WORD", 2),
    4. unit("终端手机号", "BCD", 6),
    5. unit("消息流水号", "WORD", 2),
    6. unit("消息体", "BYTE[]", 0),
    7. unit("校验码", "BYTE", 1),
    8. unit("标识位", "STRING", 1, [0x7e]),

    setting.json

    1. {
    2. "MyProcess": {
    3. "main": "/./main.ds",//定义协议构成
    4. "process": "/./process.ds",//定义解析后的数据处理
    5. "close": "/./offline.ds" //定义连接断开后的处理
    6. }
    7. }

    main.ds

    1. return [
    2. unit("标识位", "STRING", 1, [0x7e]),
    3. unit("消息ID", "WORD", 2),
    4. unit("消息体属性", "WORD", 2, null),
    5. unit("终端手机号", "BCD", 6),
    6. unit("消息流水号", "WORD", 2),
    7. unit("消息体", "BYTE[]", 0),
    8. unit("校验码", "BYTE", 1),
    9. unit("标识位", "STRING", 1, [0x7e]),
    10. ]

    process.ds

    1. try {
    2. var input = input();//这个input函数可以获取到传过来的参数
    3. console.info(input());
    4. var clientid = client.clientid; //获取客户端标识,用于判断是否登录
    5. var 数据模板 = "/./登录"; //指定存储数据的模板
    6. var 实例模板 = "/./手表"; //指定实时数据的模板
    7. switch (data[1]) {
    8. case "AP00": //登录包
    9. clientid = data[2][0];
    10. result = {
    11. "code": "BP00",
    12. "data": [数据1, 数据2, 数据3], //发送给终端的数据
    13. "units": //发送给终端数据的结构定义
    14. [
    15. unit("a", "STRING"),
    16. unit("b", "STRING"),
    17. unit("c", "STRING"),
    18. ],
    19. "clientid": clientid, //客户端的标识
    20. "userid": id(), //用户的标识
    21. "tag": tag //自定义变量,可以记录这个连接的一些特征
    22. };
    23. //下面定义存储的数据内容
    24. body.data.状态 = "在线";
    25. body.data.sid = session.id;//这里是存储此连接的id,在离线处理时会用到
    26. //指定实时数据的实例路径
    27. var instance = "/admin/home/demo/watch/" + clientid;
    28. instance.set(实例模板, instance, {
    29. "手表": {
    30. "Status": 1
    31. }
    32. });
    33. break;
    34. }
    35. if (clientid == "") {
    36. return null;
    37. }
    38. //下面是定义一个通用回复
    39. if (result.code == null) {
    40. result = {
    41. "code": "B" + data[1].remove(0, 1),
    42. "data": [""],
    43. "units": [
    44. unit("a", "STRING"),
    45. ]
    46. };
    47. }
    48. //下面将数据存下来,这里的例子是自动产生模板并生成数据
    49. body.data.IMEI = clientid;
    50. body.data.报文 = bytes;
    51. body.data.时间 = now();
    52. types.时间 = "DateTime";
    53. //
    54. var needupdate = false;
    55. var model = {};
    56. var exist = template.exist(tname);
    57. if (exist) {
    58. model = template.get(tname);
    59. }
    60. for (var v in body.data) {
    61. var id = v.key;
    62. var m = model[id];
    63. if (m == null) {
    64. needupdate = true;
    65. model[id] = {
    66. "_type": types[id] == null ? "String" : types[id],
    67. "_desc": id
    68. };
    69. }
    70. }
    71. if (needupdate) {
    72. file(tname + "?template", model);
    73. }
    74. instance.set(数据模板, 数据模板 + "/" + clientid, body.data);
    75. data.insert2(数据模板, body.data);
    76. return result;
    77. } catch (e) {
    78. console.error(path("/./") + ":" + e);
    79. result.result = 1; //1 标识要断开连接 0 是不会断开的
    80. return result;
    81. }

    offline.ds

    1. console.info("设备离线:" + client.clientid);
    2. var instname = path("/./登录/" + client.clientid);
    3. var sessionid = session.id;
    4. var sessionid2 = instance(instname).sid._value;
    5. //防止多个连接的断开处理错误
    6. if (sessionid != sessionid2) {
    7. return;
    8. }
    9. instance.set(instname, {
    10. "状态": "离线"
    11. });
    12. var instance2 = "/admin/home/demo/watch/" + client.clientid;
    13. var 模板2 = "/admin/home/templates/手表演示/手表";
    14. instance.set(模板2, instance2, {
    15. "手表": {
    16. "Status": 0
    17. }
    18. });

    指定内容长度协议

    如 2323075459555459553039383736353433323131010100A91405020F2B28515745313531353131313131383136377E88DECF468C6E672605F4B0847D717CB0248E5F3735E727CCC5467929CA96FC26A989B4AD1AEECDE40F4068088293AEE8A9F70CEDC92C80A2FFDFC0DE855527545955545955303938373635343332313120F3EADE31A2F9C1A50DFCD0880CF45ABC2A7A6466F08E99B682997A609CCEF3A620AC20187C42052329255687E902400D43E67BD82AD81FBE88CAC7518ECC2BD5728C

    1. unit("起始符", "STRING", 2, [0x23, 0x23]),
    2. unit("命令单元", "BYTE", 1),
    3. unit("车辆识别码", "STRING", 17),
    4. unit("软件版本号", "BYTE", 1),
    5. unit("数据加密方式", "BYTE", 1),
    6. unit("数据单元长度", "WORD", 2,null,true),
    7. unit("数据单元", "BYTE[]", 0),
    8. unit("校验码", "BYTE", 1),

    setting.json

    1. {
    2. "MyProcess": {
    3. "main": "/./main.ds",//定义协议构成
    4. "process": "/./process.ds",//定义解析后的数据处理
    5. "close": "/./offline.ds" //定义连接断开后的处理
    6. }
    7. }