物联网平台与kettle技术的结合(一)

1,890 阅读2分钟

上篇文章介绍了电力监控平台,它是基于tb的物联网平台实现的。tb是一个开源的物联网平台,虽然功能很强大,但是毕竟是老外写的,在使用的过程中你会发现很多的使用习惯与国内的系统都有差异。比如:tb暴露的rest接口,往往没有经过进一步的封装,格式输出较为散乱,如果直接供前端使用的话,就会导致很不协调。同样如果直接使用tb的websocket接口,前端的解析也是非常复杂。如何屏蔽掉这些差异性呢?

提出问题:

rest接口如何统一格式?

比如获取token的鉴权接口,tb的数据格式是这样的:

{"token":"eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiI4OTMzOTM5NTNAcXEuY29tIiwic2NvcGVzIjpbIlRFTkFOVF9BRE1JTiJdLCJ1c2VySWQiOiIwMmNkNGVhMC1mZDRkLTExZWEtYTg3ZC1iYjQyNTAyMjE0MmUiLCJmaXJzdE5hbWUiOiLkuIkiLCJsYXN0TmFtZSI6IuW8oCIsImVuYWJsZWQiOnRydWUsImlzUHVibGljIjpmYWxzZSwidGVuYW50SWQiOiI1NTBjYWNkMC1mZDRiLTExZWEtYTg3ZC1iYjQyNTAyMjE0MmUiLCJjdXN0b21lcklkIjoiMTM4MTQwMDAtMWRkMi0xMWIyLTgwODAtODA4MDgwODA4MDgwIiwiaXNzIjoidGhpbmdzYm9hcmQuaW8iLCJpYXQiOjE2MTc2MjA4ODcsImV4cCI6MTYxNzcxMDg4N30.1ahiSf-noEU993G4m5jO8m8MiASdBM1AW1D-a40W3EV920OpIaLW1S5f7fm3C-QHrqZBneFMKeWYA_NDLcE-xA","refreshToken":"eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiI4OTMzOTM5NTNAcXEuY29tIiwic2NvcGVzIjpbIlJFRlJFU0hfVE9LRU4iXSwidXNlcklkIjoiMDJjZDRlYTAtZmQ0ZC0xMWVhLWE4N2QtYmI0MjUwMjIxNDJlIiwiaXNQdWJsaWMiOmZhbHNlLCJpc3MiOiJ0aGluZ3Nib2FyZC5pbyIsImp0aSI6ImFlZWNkYTQ4LWUwMzItNGZiOC1iMjk0LTg1M2Y1YzNjZmZkMCIsImlhdCI6MTYxNzYyMDg4NywiZXhwIjoxNjE4MjI1Njg3fQ.jwX3cqAHXjcSdkU1ctDr6qhU8fgl0pvBt9LZlE7x-N0GRSqvfdyK8c2FJCmXifzRGBPekKze_1ZRTbRDdHoJ6w"}

而我们正常需要的数据出参,应该是这样的:

{"success":true,"resultCode":"00","resultMsg":"","result":{"token":"eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiI4OTMzOTM5NTNAcXEuY29tIiwic2NvcGVzIjpbIlRFTkFOVF9BRE1JTiJdLCJ1c2VySWQiOiIwMmNkNGVhMC1mZDRkLTExZWEtYTg3ZC1iYjQyNTAyMjE0MmUiLCJmaXJzdE5hbWUiOiLkuIkiLCJsYXN0TmFtZSI6IuW8oCIsImVuYWJsZWQiOnRydWUsImlzUHVibGljIjpmYWxzZSwidGVuYW50SWQiOiI1NTBjYWNkMC1mZDRiLTExZWEtYTg3ZC1iYjQyNTAyMjE0MmUiLCJjdXN0b21lcklkIjoiMTM4MTQwMDAtMWRkMi0xMWIyLTgwODAtODA4MDgwODA4MDgwIiwiaXNzIjoidGhpbmdzYm9hcmQuaW8iLCJpYXQiOjE2MTc2MjA4ODcsImV4cCI6MTYxNzcxMDg4N30.1ahiSf-noEU993G4m5jO8m8MiASdBM1AW1D-a40W3EV920OpIaLW1S5f7fm3C-QHrqZBneFMKeWYA_NDLcE-xA","refreshToken":"eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiI4OTMzOTM5NTNAcXEuY29tIiwic2NvcGVzIjpbIlJFRlJFU0hfVE9LRU4iXSwidXNlcklkIjoiMDJjZDRlYTAtZmQ0ZC0xMWVhLWE4N2QtYmI0MjUwMjIxNDJlIiwiaXNQdWJsaWMiOmZhbHNlLCJpc3MiOiJ0aGluZ3Nib2FyZC5pbyIsImp0aSI6ImFlZWNkYTQ4LWUwMzItNGZiOC1iMjk0LTg1M2Y1YzNjZmZkMCIsImlhdCI6MTYxNzYyMDg4NywiZXhwIjoxNjE4MjI1Njg3fQ.jwX3cqAHXjcSdkU1ctDr6qhU8fgl0pvBt9LZlE7x-N0GRSqvfdyK8c2FJCmXifzRGBPekKze_1ZRTbRDdHoJ6w"}}

如何将tb原始的格式,转换为我们需要的格式呢?

解决方案:

  • 通过修改tb的源码进行解决

修改tb的源码,改起来非常简单,但是却会导致tb平台内置的管理后台不可用。因为tb的前端本身调用的就是这些接口,所以修改的同时要特别注意与tb平台的兼容性。也就是说,tb平台要同时保证有两种出参格式。还有另一种方式就是修改tb前端解析数据的方式,这种方式更为复杂,尤其是对后端开发者来说。总之修改源码,对原有系统的侵入性较大,耦合度较高。

  • 通过基于kettle的数据平台解决

之前的博客介绍过kettle平台的强大功能,对于解决这种数据格式转换的问题来说,应该说是非常适合的。这里只做简单的介绍,具体内容请参考kettle专栏的博客。

演示:

创建kettle文件,并在kettle中进行数据格式转换。

观察解析result节点,通过js脚本进行转换。

将转换文件上传到kettle平台。

在kettle平台中配置服务。

执行获取token接口,日志如下。

查看日志详情。

总结 :

本篇文章通过对tb平台rest接口易用性的问题进行讨论,并最终选型使用kettle平台进行优化,kettle平台非常完美的解决了数据格式转换问题。当然这只是针对rest接口而已,如果是websocket接口,又该如何解决呢,kettle平台同样支持对websocket协议透传。下篇文章将详细介绍kettle平台对websocket通信转换功能。