首页 > 代码库 > 从封闭式电脑(系统)中传输数据的解决方案
从封闭式电脑(系统)中传输数据的解决方案
定义:
封闭式电脑(系统):电脑与外界网络隔离,所有U口锁定,主板设置密码,操作系统远程登录,本地只为终端(或无盘);除了键盘与鼠标外,无任何形式输入;除了屏幕与机箱小喇叭外,无任何输出。
思考:
如何从这样一个封闭的系统中获取文件?
思路:
因输出形式只有两种:屏幕与主机小喇叭,所以可考虑的方案有两种:图像识别与传输,声音编码数据播放。
考虑到是在办公室环境下,声音比较嘈杂,所以声音方式不做考虑。
图像识别这种模式深入思考如下:
文件如何通过图像传输?打开每个文档,拍照然后OCR?文件量大以及识别率都是很现实的问题,所以只能考虑用什么形式的传输二进制数据,然后还原。
首先考虑到的就是二维码,读取文件二进制流,然后进行二维码图片化,再进行批量识别,进行还原。
二维码的选型:
既然决定使用二维码进行传输,那就要对二维码进行选型,二维码的种类很多,需要选择一种信息量大,识别快速的二维码进行使用,常见二维码如下:
这些二维码可以使用barcode4j.jar,ZXing-2.3.0.jar,Qrcode.jar等实现出图与识别。
继续深入了解后可知,这些二维码中,容量最大以及识别率最好的是QR二维码。
QR二维码有40个版本,最高的40版本可以容纳4296个字符(容错级别最低时),理想状态下,一张图片可以传输4K的数据。
这其实并不是很满意的传输载体,毕竟QR二维码是小日本上个世纪90年代初的东东,目前他们已经有更好的了,在日本的网站搜索过,有容量更大的二维码,但那是付费的,只有演示,没有生成与识别的jar,需要购买,没办法了,只能使用这个了。
二维码的生成:
首先,从封闭式系统中查找二维码的jar:Qrcode.jar(假定是开发人员使用的系统,有很多工程用jar),这个一定要查到,没有就从系统内的通讯工具找其他人要一份,要是都没有,呵呵,不要往下看了,没工具,无法实现。
然后对这个jar进行封装,二次开发一下,这个较为简单,就是读读文件,字节流编一下码,然后输出图片,这个不再细说。
特别指出,最好对每个图片进行哈希校验,然后校验字符串单独用二维码图片输出,因为已经将二维码的容错降到了最低,所以额外的校验要有。
二维码的系统外识别:
如何在显示屏上识别出来呢?
最早的想法是批量拍照(既生成一个大图片,里面分几行几列显示多个二维码图片),然后对图片进行批量识别(对拍照后图片进行代码切割,然后逐个识别),但,失败了,显示屏像素低,照出来的图片根本识别不出来。只能尝试新的方法。
高清摄像头,手机摄像头连接电脑时时识别,也失败了,效果非常不理想。
偶然发现了一个apk手机二维码软件,XX二维码扫描(不为他们做广告了),普通二维码识别率与速度都不错,而且有个非常重要的功能:批量扫描。
遗憾的是,这个软件只能支持到QR二维码30版本,而且因为数据过多,高版本识别时间有些长,经过摸索与尝试,发现将生成二维码的版本设定到25,最为合理,虽然容量变小了,但识别率与速度都上去了。
25版本的QR,可以容纳1853个字符,除去代表顺序的前几位,容量就更加有限了,大概一张图片传输1K数据。(不满意,但这是目前尝试出来的最优方法了。。。。。。。)
然后就是针对批量扫描的结果进行代码开发了,读文件,然后拼接,这个简单,就不再详述了。
如何在这有限的容量里面放入更大的数据量呢,压缩吧,目前已知压缩率最大的是7Z压缩,使用7Z的极限压缩,可以获得非常好的压缩率,然后编码传输。
其他配套工具:
系统外:花10元买个手机支架吧,举着连拍累的要命啊。
系统内:写两个页面,一个页面是顺序放映二维码图片的幻灯页面,设定1.5秒放映一张;另一个页面是在首次识别遗漏或错误的时候使用,用于放映指定图片。
效率:
当设定幻灯1.5秒时,理想状态下每小时可拍2400张,就是2M的数据,效率我认为是可以接受的,因为如果系统内部的文档因工作需要一定要拿出来,只能手打的时候,这样比较效率就很高了,而且无需人工参与,找个电脑放在那里拍就OK了,当然了,也不建议传输超大的文件,对手机也是有损耗的。
另一个指标是正确率,因为是幻灯不停的跑,所以就有识别率的问题,图片采用25版本的QR就是调优出来的结果,这样识别率平均为90%,在程序中,将不合格或漏拍的图片编码输出,然后通过键盘输入到封闭试系统中,使用第二个工具页从新放映指定的图片,再次识别,这样反复几次就可完全识别,并在系统外部生成原始的文件。
设计与实现用时:
这个方案从开始思考,到不断探索,验证,实现,共用时1月(非工作业余时间)。
结束:
至此,方案完毕,此方案适用于小型文档,少量重要工具,重要代码等的传输。虽然不是很满意,但确实是最实际的,期待更大容量的二维码早日开源。
用到的技术:
二维码生成,文件读写操作,字节流编解码,哈希校验,js放映幻灯。
从封闭式电脑(系统)中传输数据的解决方案