自定义协议可以由用户完全自定义下面两种类型的协议。
<add key="Role" value="work|web|ws|mq|my;9991;777;test;0;tcp/udp"/>
如:my;9991;777;test;0;tcp/udp
my;端口号;最大连接数;服务名称;超时秒;协议类型tcp或者udp
定义好后,服务名为:my_test
在进行协议定义时注意文件夹名称为:my_test
超时秒默认为300秒也就是5分钟
类型名 | 字节数 | 说明 |
---|---|---|
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
unit("标识位", "STRING", 1, [0x7e]),
unit("消息ID", "WORD", 2),
unit("消息体属性", "WORD", 2),
unit("终端手机号", "BCD", 6),
unit("消息流水号", "WORD", 2),
unit("消息体", "BYTE[]", 0),
unit("校验码", "BYTE", 1),
unit("标识位", "STRING", 1, [0x7e]),
{
"MyProcess": {
"main": "/./main.ds",//定义协议构成
"process": "/./process.ds",//定义解析后的数据处理
"close": "/./offline.ds" //定义连接断开后的处理
}
}
return [
unit("标识位", "STRING", 1, [0x7e]),
unit("消息ID", "WORD", 2),
unit("消息体属性", "WORD", 2, null),
unit("终端手机号", "BCD", 6),
unit("消息流水号", "WORD", 2),
unit("消息体", "BYTE[]", 0),
unit("校验码", "BYTE", 1),
unit("标识位", "STRING", 1, [0x7e]),
]
try {
var input = input();//这个input函数可以获取到传过来的参数
console.info(input());
var clientid = client.clientid; //获取客户端标识,用于判断是否登录
var 数据模板 = "/./登录"; //指定存储数据的模板
var 实例模板 = "/./手表"; //指定实时数据的模板
switch (data[1]) {
case "AP00": //登录包
clientid = data[2][0];
result = {
"code": "BP00",
"data": [数据1, 数据2, 数据3], //发送给终端的数据
"units": //发送给终端数据的结构定义
[
unit("a", "STRING"),
unit("b", "STRING"),
unit("c", "STRING"),
],
"clientid": clientid, //客户端的标识
"userid": id(), //用户的标识
"tag": tag //自定义变量,可以记录这个连接的一些特征
};
//下面定义存储的数据内容
body.data.状态 = "在线";
body.data.sid = session.id;//这里是存储此连接的id,在离线处理时会用到
//指定实时数据的实例路径
var instance = "/admin/home/demo/watch/" + clientid;
instance.set(实例模板, instance, {
"手表": {
"Status": 1
}
});
break;
}
if (clientid == "") {
return null;
}
//下面是定义一个通用回复
if (result.code == null) {
result = {
"code": "B" + data[1].remove(0, 1),
"data": [""],
"units": [
unit("a", "STRING"),
]
};
}
//下面将数据存下来,这里的例子是自动产生模板并生成数据
body.data.IMEI = clientid;
body.data.报文 = bytes;
body.data.时间 = now();
types.时间 = "DateTime";
//
var needupdate = false;
var model = {};
var exist = template.exist(tname);
if (exist) {
model = template.get(tname);
}
for (var v in body.data) {
var id = v.key;
var m = model[id];
if (m == null) {
needupdate = true;
model[id] = {
"_type": types[id] == null ? "String" : types[id],
"_desc": id
};
}
}
if (needupdate) {
file(tname + "?template", model);
}
instance.set(数据模板, 数据模板 + "/" + clientid, body.data);
data.insert2(数据模板, body.data);
return result;
} catch (e) {
console.error(path("/./") + ":" + e);
result.result = 1; //1 标识要断开连接 0 是不会断开的
return result;
}
console.info("设备离线:" + client.clientid);
var instname = path("/./登录/" + client.clientid);
var sessionid = session.id;
var sessionid2 = instance(instname).sid._value;
//防止多个连接的断开处理错误
if (sessionid != sessionid2) {
return;
}
instance.set(instname, {
"状态": "离线"
});
var instance2 = "/admin/home/demo/watch/" + client.clientid;
var 模板2 = "/admin/home/templates/手表演示/手表";
instance.set(模板2, instance2, {
"手表": {
"Status": 0
}
});
如 2323075459555459553039383736353433323131010100A91405020F2B28515745313531353131313131383136377E88DECF468C6E672605F4B0847D717CB0248E5F3735E727CCC5467929CA96FC26A989B4AD1AEECDE40F4068088293AEE8A9F70CEDC92C80A2FFDFC0DE855527545955545955303938373635343332313120F3EADE31A2F9C1A50DFCD0880CF45ABC2A7A6466F08E99B682997A609CCEF3A620AC20187C42052329255687E902400D43E67BD82AD81FBE88CAC7518ECC2BD5728C
unit("起始符", "STRING", 2, [0x23, 0x23]),
unit("命令单元", "BYTE", 1),
unit("车辆识别码", "STRING", 17),
unit("软件版本号", "BYTE", 1),
unit("数据加密方式", "BYTE", 1),
unit("数据单元长度", "WORD", 2,null,true),
unit("数据单元", "BYTE[]", 0),
unit("校验码", "BYTE", 1),
{
"MyProcess": {
"main": "/./main.ds",//定义协议构成
"process": "/./process.ds",//定义解析后的数据处理
"close": "/./offline.ds" //定义连接断开后的处理
}
}