JSP引擎

特性

JSP引擎是面向敏捷交付类项目,这种应用场景而设计的。

JSP引擎的优势是 即改即用 ,缺点是性能比较一般。

再加上JavaScript语言能力跟JAVA比起来,相对来说比较弱,它适合做简单设备的解码器。

如果遇到哪种层次式的复杂设备协议,或者是同时管理的设备数量比较多,此时去选择JAVA的JAR引擎。

方案

1、ScriptEngine

JSP引擎是基于JVM自带的ScriptEngine技术,允许JAVA的JVM执行JavaScript脚本,实现在JAVA代码中执行JavaScript脚本的特性。

Nashorn是OpenJDK8和11版提供了ScriptEngine,该引擎在OpenJDK17和21后被替换成Oracle的Graalvm。

Fox-Edge现在默认编译环境是OpenJDK8和11版,此时跟着默认依赖的是OpenJDK8和11版自带的Nashorn引擎。

Ubuntu 20.0默认安装的是OpenJDK11,Ubuntu 22.0和Debain 12默认安装的是OpenJDK17 如果要使用JSP引擎特性,请把JAVA安装成8或者11。

1.1、最近更新

Fox-Edge现在提供了3种编译版本,可以让用户在JDK8、11、17下使用Fox-Edge的JavaScript特性。

Nashorn版,它依赖JDK自带的ScriptEngine,JavaScript特性只能在JDK8、11下使用。

Graalvm版,它额外带上了Graalvm引擎包,所以它同样可以在JDK8、11、17使用,但是因为是额外携带的Graalvm引擎包,所以个头同样比较大。

Fox-Edge同样支持OpenJDK8、11、17下的编译,如果你想在JDK17下使用JDK自带的Graalvm引擎,还可以使用另一种简单的方案, 就是单独使用JDK17编译Fox-Edge,你会得到一份JDK17版的fox-edge-server-device-service.jar文件来解决上述问题

2、函数约定

在设备解码器中,将设备协议处理分为 编码函数解码函数 两种操作。

编码函数用于向设备发送报文的编码操作,解码函数用于接收到设备数据后的解码操作。

2.1、编码函数

固定的入口函数为 function encode(param)

开发者自己写的jsp脚本,用这个入口函数来调用

其中param是设备服务传递给开发者的操作参数和设备配置参数并集

/**
* 编码器的入口函数
* 输入参数:
*   param:json字符串格式的设备参数/操作参数的合并对象
* 返回值:
*   提供给通道的发送数据。根据不同的通道服务,它可能是HEX结构的文本,也可能是JSON结构的对象,请自行根据选定的通道服务进行确认
*/
function encode(param) {
	return encodeHex(param);
}

/**
* 开发者自己写的编码函数1
* 返回格式1:HEX格式的字符串
*     比如串口通道,TCP通道、模拟通道,它们的输入/输出格式,就是HEX格式的文本
*/
function encodeHex(param) {
	return "46 49 4E 53 00 00 00 1A 00 00 00 02 00 00 00 00 80 00 02 00 0A 00 00 71 00 FF 01 01 B1 00 0A 00 00 01";
}

/**
* 开发者自己写的编码函数2
* 返回格式2:JSON格式的字符串
*     比如S7通道、MQTT通道,它们的输入/输出格式,就是JSON格式的文本
*/
function encodeJson(param) {
  var object = JSON.parse(param);
	return JSON.stringify(object);
}

2.2、解码函数

固定的入口函数为 function decode(recv, param)

开发者自己写的jsp脚本,用这个入口函数来调用

其中recv是设备通道服务,从设备获得的数据报文,数据格式为文本格式。当时具体是HEX还是JSON,由具体通道服务确定。

其中param是设备服务传递给开发者的操作参数和设备配置参数并集

/**
* 解码器的入口函数
* 输入参数:
*   recv:通道返回的接收数据,根据不同的通道服务,它可能是HEX结构的文本,也可能是JSON结构的对象,请自行根据选定的通道服务进行确认。
*   param:json字符串格式的设备参数/操作参数的合并对象
* 返回值:
*   json字符串格式的Map结构对象
*/
function decode(recv, param) {
	return decodeJson(recv, param);
}

/**
* 开发者自己写的解码函数1
* 返回格式:JSON格式的字符串
*/
function decodeJson(recv, param) {
  var object = JSON.parse(param);
	return JSON.stringify(object);
}

使用

1、新建JSP操作方法

定义一个操作方法,此时实际上也会形成一个设备型号

2、编辑JSP脚本

进入详情后,将解码器脚本贴入代码编辑框。

具体入口函数/返回值的约定,看上文。

JSP脚本的开发,一种高效率的做法:在开发阶段将JSP脚本测试,写在一个html页面中,然后用Chrome浏览器进行单步调试。 开发完成后,再将JSP脚本贴入到Fox-Edge的JSP操作代码框之中。

3、新增设备

在设备管理页面中,你新增设备的时候,会发现多了一种设备型号,就是刚才在JSP设备操作方法中定义的设备型号。

4、测试效果

在设备操作任务界面,可以对设备进行操作,可以看到JSP解码器进行通信数据的编码和解码,并返回了操作结果

5、调试建议

在JSP的开发阶段,建议建一个HTML文件,结合Chrome浏览器的调试功能,对自己写的JSP脚本进行开发和调试。

在设备联调阶段,分别打开Fox-Edge的JSP脚本页面和设备操作页面,可以进行即改即用的方式,进行实际上的集成调试。