简介
STF是一个手机的远程控制平台,有点像远程协助似的,不过操作的不是远方的电脑,而是手机,且在网页上操作。
STF的官方主页是 https://github.com/openstf/stf, 核心作者只有两位Simo Kinnunen以及Günther Brunner
安装直接参考官方主页上的就可以了,上面已经写的很详细了。
项目主要是通过nodejs写成的。当前这个时间2015-10
还不支持nodejs 4.0, 我只试验过v0.12.7是可以的。 nodejs最好是通过nvm安装,这个更换版本会比较方便一些。
准备知识
项目主要用到的还是前端技术的知识。
- webpack
- gulp
- bower
- angularjs
- express
- Promise模型bluebird
- websocket
- protobuf
如果你本身就是学前端的话,这些你应该都知道了,可怜我只能从头学起。
组件
因为nodejs是单线程模型,所以当功能很多很大的时候,就开始分成不同的模块,没有模块运行在不同的进程上。stf就是由很多个模块组成。官方提供了一个简单的命令 stf local
直接运行这个命令就可以把所有的模块通过node的child_process
将所有进程启动起来。所以入手从stf local
这个命令入手是不错的。
从package.json
这个文件可以查到stf这个程序指向的是bin/stf
,而最后调用的是lib/cli.js
打开这个文件,直接跳转到
这一行。
里面有这么一句
这个procs其实就是需要启动的程序了。我简单的整理了下,大概分为这些
- app triproxy
- device triproxy
- processor
- reaper
- provider
- auth
- app
- websocket
- storage [image, apk, temp]
- poorxy
整整10个,也真是够多的。尽管很多,也只能一个个的看了。
先看下stf triproxy
,相关的代码在lib/units/triproxy
代码其实也不怎么多,最主要的他用到的zmq这个东西。
zeromq
zmq的全称是zero message queue. 这个东西可以说是影响了stf的整个设计。为此我又不得不把zmq的官网文档看了看 中文翻译版zguide
云风曾经写过一些zeromq的简单介绍http://blog.codingnow.com/2011/02/zeromq_message_patterns.html
文章中说zeromq主要分为3种模型,其实说成两个模型可能更好理解一些。
- Publish/Subscribe模型
- Pull/Push模型
这个Pub/Sub简单的理解就是广播的意思。有人发了天气预报的通知,所有订阅天气预报的人都会收到消息。
Pull/Push也比较好理解,有人发了一个任务,贴到了公告墙上,其他人到公告墙上把任务取走。Pull/Push可以是1:N,也可以是N:M(这个又涉及到了Dealer,暂时先不管管它,知道zeromq是负责消息传递的就可以了).
仅靠这两个模型,几乎所有的消息处理都可以用这两个组合着搞定。
zeromq只是负责消息流的处理,而具体如何组织消息,则是通过其他的方式,stf使用了google的protobuf
protobuf定义的文件都是以.proto
为扩展名的
此类相关的代码都在文件lib/wire/web.proto
,此文件跟zmq的应用如影随形。zmq负责消息的传递,而protobuf负责消息的封装。
官方的那个框架图,我贴下
triproxy
我把triproxy单独提取出来
triproxy分为3个对外的服务,PULL PUB DEALER
,triproxy的代码很短,功能主要是PULL负责收消息,然后发送给DEALER,DEALER收到的消息转发到PUB。
triproxy就有点类似一个消息中转节点了。上接web端的请求,发送到processor对其中的消息稍微进行下处理,通过层层转发最终就发送到了stf device
模块。虽然说是层层转发,但是因为zmq的效率太高了,所以并没有什么延迟问题。
reapter
图右侧的reapter的代码在lib/units/reaper/
下,代码倒也简单,主要是负责监控设备是否掉线,并刷新数据库的功能。
wire
里面有个router很有意思,至今看不太懂,不管了,先放在这了。
web端
前端是js,后端也是js。这个有点模糊了前后端的概念。
require本来是nodejs才有的特性,就是因为webpack使得前端代码也能用require,exports这种东西了。假如看到前端也被分割的一块块的也不用奇怪。把前端的东西当前后端的东西理解就好了。
掌握web端这些东西需要知道的一些技术
- gulp
- webpack
- express
- jade(这有个教程还不错http://jade-lang.com/)
- socket.io (其实就是websocket的封装)
- bower (前端一个js,css框架的包管理器)
- angularjs