openstf源码解读

简介

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

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负责消息的封装。

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

框架图

triproxy

我把triproxy单独提取出来

triproxy

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

今天先写到这里了,还有什么想看的,留言就好。^_^

转载于:https://my.oschina.net/goskyblue/blog/522482

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值