简介

STF是一个手机的远程控制平台,有点像远程协助似的,不过操作的不是远方的电脑,而是手机,且在网页上操作。 

OpenSTF技术知识与组件解读_adb

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​

打开这个文件,直接跳转到

program
.command('local [serial...]')

这一行。

里面有这么一句

function fun(){
var procs = [
// app triproxy
procutil.fork(__filename, [
...

这个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种模型,其实说成两个模型可能更好理解一些。

  1. Publish/Subscribe模型
  2. 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负责消息的封装。

官方的那个框架图,我贴下

OpenSTF技术知识与组件解读_stf_02

triproxy

我把triproxy单独提取出来

OpenSTF技术知识与组件解读_adb_03

triproxy分为3个对外的服务,​​PULL PUB DEALER​​,triproxy的代码很短,功能主要是PULL负责收消息,然后发送给DEALER,DEALER收到的消息转发到PUB。

triproxy就有点类似一个消息中转节点了。上接web端的请求,发送到processor对其中的消息稍微进行下处理,通过层层转发最终就发送到了​​stf device​​模块。虽然说是层层转发,但是因为zmq的效率太高了,所以并没有什么延迟问题。

reapter

图右侧的reapter的代码在​​lib/units/reaper/​​下,代码倒也简单,主要是负责监控设备是否掉线,并刷新数据库的功能。

wire

function Router() {
if (!(this instanceof Router)) {
return new Router()
}

EventEmitter.call(this)
}

里面有个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