浏览 11447 次
该帖已经被评为良好帖
|
|
---|---|
作者 | 正文 |
发表时间:2008-07-26
例如我经常碰到要设计通讯协议以适应不可靠的传输,web的无状态特性正是克服不可靠传输的法宝,屡试不爽:-) 最近一段时间用ruby作了不少东西,也有用rails,但是从来没有对rails内部进行深究.直到最近碰到一个项目,促使我不得不到rails里面去挖掘,以借鉴rails一些优秀的东西。 这个项目非常有趣,是一套用于农场的自动化系统(所以使用者大多是奶牛,哈哈~),包含用于工人们佩戴的移动W设备,到处安装的RFID数据收集设备,闸门控制设备,电子称,显示屏....还有许多名目繁多的设备,这些设备的数据有的通过电缆,有的通过ZigBee无线网络汇集到一台服务器上,这台服务器跑Linux,运行Rails。服务器负责收集所有设备的数据,和发送指令给相关设备,例如控制闸门。 给我不断带来麻烦的是这个W设备。 W设备是这个系统里面除服务器外唯一和人打交道的设备,配有RFID数据收集器,一个小液晶显示屏,数个按钮,通过ZigBee无线网络和服务器通讯---典型的嵌入式移动设备。 客户起初对W设备的操作功能要求不高而对成本敏感,因此W设备配置了很低的硬件资源,基本上就是靠一个集成了无线功能的MCU操作,仅数十k的内存,但对于简单的数据收集和传输,绰绰有余。 然而好景不长,随着项目进行,客户对W设备赋予了更多更重要的角色,功能需求暴涨,且快速变化,更重要的是,要求日后能够定制功能(二次开发)。 Mission Impossible ? 不,这正是一个典型B/S架构的系统最适合做的事情了。当然普通web浏览器无法在W的数十k内存上跑,HTTP/HTML也无法有效的在ZigBee网络上传输,因此我们就新设计了一套通讯协议和标记语言,姑且称之为MML(Mini Markup Language)。 那么服务器端呢?已经有rails在跑用于收集/展示数据,输出报表之类的任务,可以利用rails来作为W的服务端么? 通讯问题,改改Webric,从串口(连接到ZigBee网络控制器)上获取数据并伪装成web请求,或许还可以...路由问题,由于ZigBee带宽极其有限,需要高度精简传输内容,因此传回来的请求串中包含的是非常简短的内容,需要转换到对应的Controller/Action,这个通过添加router映射似乎也可行。MML Render问题就比较头痛了,需要修改的地方不少。 考虑到修改rails可能工作量和分险比较高,于是采用另外一个方案:设计新的W Server,在W Server里面直接利用rails的资源。实际上,最终这个W Server直接放在rails应用程序的scripte目录下(也许vendor目录更合适),在W server里面只要加入: require File.dirname(__FILE__) + '/../config/boot' 然后就可以使用rails提供的任何资源了,当然对于W Server来说,最有用的是Models。这样W Server就和rails应用程序浑然一体了。 W Server有了rails这样强大的后盾之后,还需要有:Parser, Router,Server,Controller,和MML render. Parser: 负责解析自定义的通讯协议,获取从W设备传来的请求,并解析参数等。 Router: 扫描并装载Controllers,缓存Controller对象,根据Parser的结果取得相应Controller的对象。Router还负责监控Controller是否已被修改和重新装载Controller. Server: 总控制,从串口中读取数据,调用Parser解析,把结果传给Router,从Router中获取Controler对象并根据Parser结果调用Controller.Action,以及缓存Controller的输出等等。 Controller: 业务逻辑都在这里实现,调用rails的Models访问数据库。 MML Render: 使用erb作为模板文件,再加上一些辅助的功能,例如render link,menu之类的,和自定义的MML特性密切相关。MML Render作为module最终mixin到Controller里面。 可以看出,W Server模型几乎和rails的一样,在设计W Server碰到问题时经常探究在rails中是怎么解决的,因此倒是对rails的了解增进了不少。当然由于W Server的工作方式,目标和rails不同,因此复杂度就不可同日而语. 这个项目做完之后,我有几个感受: * Ruby的开发效率真的很高 除去注释,full stack的W Server的全部代码少于千行,what a surprise!当然,这里沾了rails的光,省却了Models,还有erb拿来就用.然而相比之下,在W上光MML解析和Render部分C代码就超过2000行. * 复用Rails真的很容易 在这个案例中,就是增加一行代码而已. * Web技术,可以无处不在 Ruby/Rails = Make it real! ~文以共勉~ 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2008-07-27
不错啊。楼主是不是在国外的
|
|
返回顶楼 | |
发表时间:2008-07-27
这种方式利用web mvc framework的确很少见。
看来rails的用武之地也不仅仅在B/S结构中呀! 期待楼主有更多相关的文章! |
|
返回顶楼 | |
发表时间:2008-07-28
其实我个人觉得 B/S 架构理解成为 User Agent - Server 比较合适一点。
可惜由于一直没有接触过其他的嵌入式设备,所以也没有如同楼主这样的开发经验了,不得不说是一种遗憾 |
|
返回顶楼 | |
发表时间:2008-08-05
楼主
你上面说的parser和server部分,主要读串口获取请求那部分也都是ruby写的吧?
|
|
返回顶楼 | |
发表时间:2008-08-12
universac 写道 楼主
你上面说的parser和server部分,主要读串口获取请求那部分也都是ruby写的吧? 是的. 用的是ruby-serialport扩展: http://ruby-serialport.rubyforge.org/ |
|
返回顶楼 | |
发表时间:2008-09-03
应该是"屡试不爽",这里的"爽"是"爽约"的爽,是贬义
|
|
返回顶楼 | |
发表时间:2008-09-04
klesh 写道 应该是"屡试不爽",这里的"爽"是"爽约"的爽,是贬义
已改正,谢谢指正! |
|
返回顶楼 | |
发表时间:2008-09-04
ray大叔又来掺和技术贴了?而且还回帖不认真看帖
文中提到的W Client和你的RIFI控制台有任何共同点么?它上面如果能运行Ruby GUI,rubynroll也不需要文章中的这种做法了。 |
|
返回顶楼 | |
发表时间:2008-09-04
Readonly 写道 ray大叔又来掺和技术贴了?而且还回帖不认真看帖
文中提到的W Client和你的RIFI控制台有任何共同点么?它上面如果能运行Ruby GUI,rubynroll也不需要文章中的这种做法了。 你也不认真看帖。 Parser: 负责解析自定义的通讯协议,获取从W设备传来的请求,并解析参数等。 Router: 扫描并装载Controllers,缓存Controller对象,根据Parser的结果取得相应Controller的对象。Router还负责监控Controller是否已被修改和重新装载Controller. Server: 总控制,从串口中读取数据,调用Parser解析,把结果传给Router,从Router中获取Controler对象并根据Parser结果调用Controller.Action,以及缓存Controller的输出等等。 ------------------------------------------------------------------------------------ Controller: 业务逻辑都在这里实现,调用rails的Models访问数据库。 ------------------------------------------------------------------------------------- MML Render: 使用erb作为模板文件,再加上一些辅助的功能,例如render link,menu之类的,和自定义的MML特性密切相关。MML Render作为module最终mixin到Controller里面。 俺就是觉得,这里rails的作用完全是辅助性的,而不是特别必要的的东西,我在这里把rails换成sms可以么?我看也成。 |
|
返回顶楼 | |