SDDS(Stream Data Dynamic Structure)
PHP流数据动态结构处理包
用途
应用层二进制通讯协议编码与解码的通用组件
格式化的二进制流的编码与解码的通用组件
简介
PHP Socket(非WebSocket)通讯开发两大难点,第一是通讯层,第二则是应用协议解析层。现在,因为有Swoole和WorkerMan两大通讯层组件,所以,通讯层已变成了开箱即用。但是,对于通常基于二进制的应用层协议,诸如ModBus, Zigbee, JT808等各类二进制通讯协议,其针对协议的数据包的解码与编码仍是一大难点。
并且,在这一领域,Google Protocol Buffer无法使用,Kaitai也不易于使用。而SDDS则是一个支持应用层二进制通讯协议编码与解码的通用的快速开发组件。通过SDDS,你只需要根据通讯协议以及SDDS Schema的语法简单定义对应的Schema,除外,只要增加一些必要的扩展函数,通讯程序即已完成。
为什么SDDS?
当我们使用WorkerMan或者Swoole编写基于TCP或UDP的二进制通讯应用时,WorkerMan或者Swoole仅仅解决了二进制数据包的收发。通常,针对不同的应用层协议,比如,JT808,ModBus等,均需要编写不同的数据包编码与解码程序。并且,对于这些程序,由于算法的复杂和协议的多样性,程序几乎是没有可重用性的。
当然,你也可以使用Google Protocol Buffer来实现编码与解码,但这一做法却改变了数据包的结构,并且,一些特殊硬件或协议也不方便使用Protocol Buffer。
不过,现在有了SDDS,(Stream Data Dynamic Structure),使用SDDS,你只要使用JSON定义一下Scheme,除外,只要增加一些扩展函数,那么,应用层协议的编码与解码程序就完成了。
由此可见,SDDS解决了应用层通讯协议的组件化与可重用性的问题。不仅提升了开发速度,同时也大大提升了程序的可重用性,可扩展性和可维护性。
简单来说,SDDS简化了Socket通讯应用开发中最复杂的一层——应用协议层编码与解码程序的开发。
使用SDDS,你甚至可以在一套应用中支持多套应用层协议。
使用SDDS,将会大大提升php针对不同二进制通讯应用协议的通讯应用开发速度。
SDDS与Protocol Buffer以及Kaitai的比较
Protocol Buffer简单来说是一个基于ID别名压缩数据长度的二进度的JSON。也就是一个JSON的增强版,使用Protocol Buffer则要改变二进制通讯协议原定的数据存储结构。Protocol Buffer可以很好的增强WebSocket的传输速度,以及新型的基于Protocol Buffer格式传输的协议。但无法处理JT808,ModBus,zigbee,obd等标准的二进制协议。
与Protocol Buffer不一样的是,Scheme编写完成后即可立即使用。不需要编译,同时,绝不改变通讯协议规定的数据包格式与变量存储结构。所以,可以广泛用于各类IoT,JT808,ModBus,zigbee,OBD II等各种二进制应用协议。同时也可以用来升级老程序。
过去,不同的应用层协议需要有不同的编解码程序。现在,使用SDDS,所有通用的编解码均由SDDS完成了,所有不同的只是各自拥有和各自不同的基于JSON定义的Scheme.
同类的开源Kaitai也是一个格式解析的DSL,但由于本身设计的问题,对协议本程的动态流程支持不足。但对文件流的处理能力则很强。
SDDS也可用于二进制格式文件的读取,比如,PDF,MP3等。与同类的开源Kaitai不同的是,SDDS一样不需要编译,并且,由于SDDS使用的是动态数据结构定义方式,所以,任何一种数据的处理的流程均可以通过Scheme定义。使用SDDS,只要简单定义Scheme和相应扩展函数即可,远比Kaitai方便。
所以,SDDS不只是通用的应用层二进制编码与解码程序,同时也是用于格式化的二进制流数据编码与解码的简单易用的组件。
总之,SDDS作为二进制通讯应用协议层快速开发和格式化二进制流数据读写的快速开发解决方案,具有以下优势:
1, SDDS可以广泛应用于各类基于应用层二进制通讯协议的Socket服务器端应用的开发,包括但不限于工业自动化控制,物联网等各种应用协议,比如,modbus,zigbee,jt808等等。它就是一个通用二进制协议的解析器。
2, SDDS完遵循应用二进制协议数据包的存储结构。所以,用它也能升级老程序。
3, 简单易用,开发效率明显提升。
4, 动态结构,编码解码流程完全由Scheme定义。
5, 无需编译。Scheme即写即用。方便程序修改与扩展。
6, SDDS不仅可以用于通讯应用,同时也可用于其它二进制格式流数据的读写。
7, SDDS可以方便地让一个平台同时支持多个协议。
附录
关于SDDS详细介绍,参见:
https://github.com/byteferry/sdds
SDDS的php组件,参见:
https://github.com/byteferry/sdds_php