==技术选型==
#框架暂时先采用rails + mysql(rails 3.2+ devise +cancan用户权限管理 )，以后有扩展再根据情况重新选择迁移。
#客户端选用sinatra框架，比较简单
#关于远程验证，需要终端加密请求到服务器，然后服务器端接受请求再做处理。

==终端登录远程验证 research&study==
*http 加密
*https certificate
*oauth
reference:
  http://stakeventures.com/articles/2007/11/26/how-to-turn-your-rails-site-into-an-oauth-provider
  https://github.com/pelle/oauth-plugin
  https://github.com/oauth/oauth-ruby
  http://stakeventures.com/articles/2008/02/23/developing-oauth-clients-in-ruby
  http://xaop.com/blog/2010/03/05/authentication-with-oauth-in-ruby-on-rails/

{| class="wikitable"
|-
!   !! 实现 !! 开发和速度 !! 优点 !! 缺点
|-
| http+openssl || 通过http post 请求服务器url api方法，但是需要对参数加密，尤其是密码<br/>，加解密方法用openssl,private 和 public key || 开发比较容易 || 开发简单 || 安全性不是很高
|- 
| https certificate || 通过证书加密传输信息 || 开发较难 || 信息安全 || 安全性高
|-
| oAuth || Oauth是通过服务端provider 和 客户端 consumer来工作的，我主要参看了以上文档和gem，<br/>但是demo创建失败 || 开发相对比较耗时 || 较难开发 || 里面的token机制还需要进一步研究，比较耗时
|-
| Ldap ||   ||   ||   ||  
|}

==RabbitMQ research&study==
Ruby gem :
#http://rdoc.info/github/ruby-amqp/amqp/master/file/docs/GettingStarted.textile
#https://github.com/ruby-amqp/bunny
#https://github.com/ruby-amqp/amqp/


#传输最大package size, frame_max = 131072
#同时并发链接client数，设置ulimit参数
#建立链接发起人是client端
===测试环境===
#服务器
*操作系统 ubuntu 12.04 LTS desktop 
*内存 4G
*CPU Intel(R) Pentium(R) CPU G620 @ 2.60GHz



#客户端
*操作系统 ubuntu 11.10 
*内存 2G
*CPU Celeron(R) Dual-Core CPU       T3500  @ 2.10GHz

===终端请求响应速度，测试数据===
<pre>
EventMachine.run do
  connection = AMQP.connect(:host => '127.0.0.1')
  puts "Connected to AMQP broker. Running #{AMQP::VERSION} version of the gem..."
  channel = AMQP::Channel.new(connection)
  queue = channel.queue("amqpgem.examples.helloworld", :auto_delete => true)
  exchange = channel.direct("")
  t1 = Time.now
  queue.subscribe do |payload|
    t2 = Time.now
    puts (t2-t1)*1000
    puts "Received a message: #{payload}. Disconnecting..."
    connection.close { EventMachine.stop }
  end
  exchange.publish "Hello, world!", :routing_key => queue.name
end
</pre>
用以上代码测试了6次，数据如下，单位毫秒
*4.6566410000000005
*4.643991
*4.898907
*4.7237729999999996
*3.880868
*4.907225
如果从一台终端通过网络访问服务器，数据如下，单位毫秒
*5.896493
*6.15776
*5.959624
*6.1401
*6.454522
*6.342353

===服务器push速度快，测试数据===

测试publish 1kb数据用以下代码
<pre>
EventMachine.run do  
connection = AMQP.connect(:host => '192.168.10.45')
 puts "Connected to AMQP broker. Running #{AMQP::VERSION} version of the gem..."
 channel = AMQP::Channel.new(connection)
 queue = channel.queue("amqpgem.examples.helloworld", :auto_delete => true)
 exchange = channel.direct("")
 t1 = Time.now
 str = "repeat 1k bytes"
 exchange.publish str, :routing_key => queue.name
 queue.subscribe do |payload|
   t2 = Time.now
   puts (t2-t1)*1000
   puts "Received a message: #{payload}. Disconnecting..."
   connection.close { EventMachine.stop }
 end
end
</pre>
测试1k数据，
如果从一台终端通过网络访问服务器，数据如下，单位毫秒 
*6.698129ms
*6.723827
*6.377072
*6.656503
*6.8928460000000005

===本身网络延迟===
wyh77@ubuntu:~$ ping 192.168.10.45
PING 192.168.10.45 (192.168.10.45) 56(84) bytes of data.
*64 bytes from 192.168.10.45: icmp_req=1 ttl=64 time=0.278 ms
*64 bytes from 192.168.10.45: icmp_req=2 ttl=64 time=0.292 ms
*64 bytes from 192.168.10.45: icmp_req=3 ttl=64 time=0.296 ms
*64 bytes from 192.168.10.45: icmp_req=4 ttl=64 time=0.289 ms
*64 bytes from 192.168.10.45: icmp_req=5 ttl=64 time=0.294 ms
*64 bytes from 192.168.10.45: icmp_req=6 ttl=64 time=0.283 ms


===rabbitMQ flow chart===
[[File:mq.png]]
#根据我们的需求，我们需要定义不同的queue
#根据用户组，来到不同的queue里面publish 和 subscribe信息

==开发计划==
#先开发服务器端的rails应用软件，六月份计划是
    可支持语言的切换，所有编辑都需要支持多语言。(用Rails I18n gem)
    日志系统完备。(用log4r gem并保存至数据库,现在做了一个简单的http post 请求api接口，可以http请求往服务器端数据库插入log记录)
    登陆系统。（先做服务器端的登录系统）

接下来考虑一下以下模块
  管理权限：可以考虑做一个功能添加一个功能的管理权限。
  优先级管理
  用户管理系统。

==ERD图表== 
 用户或者系统管理员可以通过对权限的管理来达到限制一些用户做他们不需要的操作。管理员不许验证权限。具体的权限管理类别如下：
#1. 日志查询权限
#a. 普通日志查询（不可调配）：终端日志。默认所有用户都有。
#b. 系统日志查询（可调配）：默认只有管理员有。
 注意：查询终端日志时，非管理员用户需要验证他是否有管理的终端权限。
#2. 系统配置
#a. 系统配置权限（可调配）：默认管理员才有
#b. 终端配置权限（不可调配）：默认所有用户都有。但是需要进一步验证他对终端是否有管理权限。
#3. 管理用户
#a. 添加/删除/编辑 权限（可调配）：默认只有管理员有
#4. 媒体库管理广播区管理
#a. 添加/删除/编辑 权限（可调配）：默认只有管理员有
#5. 广播频道管理
#a. 添加/删除/编辑 权限（可调配）：默认只有管理员有
#6. 会话管理
#a. 查看/终止 （可调配）：默认只有管理员有。
#7. 录音和监听管理
#a. 配置权限（可调配）：默认只有管理员有。
#8. 更新权限：（不可调配）只有管理员有。
#9. 会话的优先级管理（可调配）：默认只有管理员有。
#10. 备份管理（可调配）：默认只有管理员有
#11. 管理权限的
#a. 更改现有的管理权限（可调配）：目前只有管理员有。



==数据库表结构信息==

=== 用户表 ===
*Email
*用户名
*密码
*启用和禁用标记

=== 超级管理员表 ===
* Email
* 用户名
* 密码

=== 日志表 ===
* 日志来源
* 日志等级
* 日志类别
* 日志信息

==freeswitch Research&Study==
#directory
  用户注册和登录配置conf/directory/ 目录下所有文件
#dialplan
  打电话计划安排配置 conf/dialplan/ 目录下所有文件