要优化ThingsBoard私有化部署后在手机上查看仪表盘的体验,我们可以采取以下步骤来实现将ThingsBoard的UI打包成App:
修改UI代码中的API路径:
- 由于App中JS运行在本地,而服务URL在远程,需要修改Angular.js中访问API的路径。具体来说,需要修改
ui/src/app/global-interceptor.service.js
文件,这是Angular.js的全局拦截器,负责Ajax请求响应的共同部分。默认Ajax请求是访问如“/api/”这样的路径,需要修改为完整的服务URL,如“http://192.168.1.222:8080/api/”的形式。
打包前端资源:
- 将前端的js/css/html等资源编译后直接打包成App使用,支持Android和iOS。这样可以将前端资源放在App中,只访问远程API,因为资源都在手机本地,加载会更快。
配置本地资源访问远程服务:
- 由于资源在本地,需要修改前端代码以确保正确访问远程API。这涉及到修改Angular.js的配置,以确保API请求能够正确地指向ThingsBoard服务器。
使用打包工具:
- 可以利用如AppCan等网站提供的服务将URL封装生成一个App。虽然这种方式所有资源都在远程,访问速度慢,但可以通过将前端资源打包到App中来优化。
优化资源打包方案:
- 为了提高App的健壮性和用户体验,可以设计一个资源打包方案,将Web资源目录打成一个压缩包,并构建一个最新版本的增量压缩包。同时,保持Web资源目录以目录形式存在于发布包中,以便在设备端本地资源不能用时,可以直接使用Web目录中的线上资源。
通过上述步骤,您可以将ThingsBoard的UI成功打包成App,并优化在手机上的查看和管理系统,提升用户体验。
具体步骤如下:
一、修改ui代码
1. 修改文件uisrcappglobal-interceptor.service.js 既然要让本地资源访问远程服务,就要修改angular访问api的路径问题。
由于App中JS运行在本地,而服务URL在远程,需要修改Angular.js中访问API的路径。具体来说,需要修改ui/src/app/global-interceptor.service.js
文件,这是Angular.js的全局拦截器,负责Ajax请求响应的共同部分。默认Ajax请求是访问如“/api/”这样的路径,需要修改为完整的服务URL,如“http://192.168.1.222:8080/api/”的形式。
其中,CUSTOMHOST是自定义变量,指向真实服务器访问地址,如:
var CUSTOMHOST = “http://iot.yoxvtech.com:8080”;
此外,修改一下response的Url来源判断,如图2红色标识部分,以及第167之后的一行相似位置需要添加相同代码。
2. 修改uisrcappapitelemetry-websocket.service.js,使前端的websocket服务器地址指向真实服务器,修改内容见下图。
二、打包App
前端UI修改并编译之后,并不能直接将dist文件放入App的assets中并以file方式访问,因为Angular打包之后以file方式会出现跨域请求、访问路径等问题,比较好的方式是在App中内置一个简单的http服务器,将根目录设定前端UI所在文件夹。
内置服务器有两种模式:一是使用Github上的Nanohttpd项目写一个简单的http服务器,并在App中设置assets中的相应目录为根目录,而后以webbrowser加载;二是完全使用混合开发模式,使用混合开发的内置httpd插件或服务。
前一种方式仍需要一定的开发,虽然比较简单。所幸,后一种也已经有同行实现,在cordova框架下有一个CorHttpd能够支持以web方式实现httpd服务器。该插件目前已停止更新,存在不能加载svg的问题,笔者已根据原项目的merge请求中的内容,修复了该问题,修复的代码见:https://github.com/lsyer/cordova-httpd
因此,整个打包过程可以选择使用cordova以及CorHttpd实现,具体代码如下:
$npm install -g cordova
$cordova create YoxvIoT
$cd YoxvIoT
$cordova platforms add android
$cordova plugin add https://github.com/lsyer/cordova-http.git
$mkdir www/htdocs //前端生成的UI放入该目录,是CorHttpd的服务器根目录
$touch www/index.html //使用CorHttpd建立http服务器,并使用全屏无边框的iframe显示UI,具体代码参考cordova-httpd项目中的test文件夹,在服务启动后将iframe的src重定向到UI界面
$touch www/loading.html //在CorHttpd完全启动之前的预载入界面,作为应用可用前的Splash
$cordova build android //编译生成App
最后一步生成的App不能直接安装,但是通过该命令可以使cordova完成android的平台项目生成,在platforms/android中可以看到完整的App项目,能够导入Android Studio中执行最后的编译生成最后的release包。需要注意的是,生成的App项目还需要添加一个权限,在AndroidManifest.xml的application标签中加入android:supportsRtl=“true”,以支持Android 8.0以上系统。
ThingsBoard 物联网平台编译时,报以下错误: Failed to execute goal com.github.eirslett:frontend-maven-plugin:1.0:npm (npm install) on proje…