这几天老师请了老外来讲课,于是乎被召去学习学习。老外自己造了一套传感器,卖给我们,然后作为售后服务交流,特地来到这里给我们做培训。相关网站就是这个猫头鹰平台(http://www.owlplatform.com/)。从传感器到上层应用仿TCP/IP的分层式结构,互不打扰。老外敲代码非常流畅,用VIM非常娴熟,而且基本没见过他用鼠标的。不过他也没讲什么,只是简单的介绍一下怎么用而已,说GITHUB他上传的很多代码我们可以慢慢研究,毕竟人家过来是给我们装传感器布置服务器的嘛。
----- -------- --------
| SENSOR | ----> | AGGREGATOR | ----> | WORLDMODEL |
----- -------- --------
1. 传感器是买的,据说电池持续时长至少2年
2. 从AGGREGATOR开始都是自己开发
3. WORLDMODEL直接决定了我们的应用层面
4. 第一天来就做了实验,确实有意思
学习一(通过服务器已经现有的WM以快照的方式查看数据)
require 'rubygems'
require 'client_world_connection.rb'
require 'wm_data.rb'
require 'buffer_manip.rb'
cwc = ClientWorldConnection.new('127.0.0.1', 7012)
data = cwc.snapshotRequest('.*door.*', ['closed']).get()
data.each_pair{ |name, attributes|
puts name
puts attributes
}
学习二(通过流的方式不断地查看数据)
query = cwc.streamRequest('.*flood.*', ['(closed|temperature_celcius|wet)'], 0)
while (not query.isComplete())
data = query.next()
data.each_pair{ |name, attributes|
attributes.each{ |attribute|
if (attribute.name == 'closed')
status = attribute.data.unpack('U')[0]
if (1 == status)
puts "#{name} closed."
else
puts "#{name} opened."
end
elsif (attribute.name == 'wet')
wet = attribute.data.unpack('U')[0]
if (1 == wet)
puts "#{name} wet."
else
puts "#{name} dry."
end
elsif (attribute.name == 'temperature_celcius')
tmp = attribute.data.unpack('G')[0]
puts "#{name} is #{tmp} degress."
end
}
}
end
学习三(检测传感器强度变化,并据此判断移动状况)
require 'rubygems'
require 'solver_aggregator'
agg = SolverAggregator.new('192.168.0.20', 7008)
phy = 1
transmitters = []
#transmitters = []
interval = 0
rule = AggrRule.new(phy, transmitters, interval)
agg.sendSubscription([rule])
def variance(samples)
if (samples.length < 2)
return 0
end
avg = 0
samples.each{|sample|
avg += sample / samples.length
}
sum_of_squares = 0
samples.each{|sample|
sum_of_squares += (avg - sample)**2.0
}
return sum_of_squares / (samples.length - 1)
end
rssis = Hash.new()
while (agg.handleMessage)
if (0 < agg.available_packets.length) then
agg.available_packets.each{|packet|
#puts packet
#puts "Amount of data is #{packet.sense_data.length}"
#puts "Data 1 is #{packet.sense_data[0].unpack('U')}"
#puts "Data 2 is #{packet.sense_data[1].unpack('C')}"
#puts "signal level is #{packet.rssi}"
if (not rssis.has_key? packet.device_id)
rssis[packet.device_id] = []
end
rssis[packet.device_id].push(packet.rssi)
#remove data older than 5 seconds
if (rssis[packet.device_id].length > 5)
rssis[packet.device_id].shift
end
var = variance(rssis[packet.device_id])
#Standard deviation is the square root of the variance
stddev = var ** 0.5
#puts "The standard deviation is #{var**0.5}"
if (4 < (var ** 0.5))
puts "#{packet.device_id} is moving!"
end
}
#Erase the packets that we have processed
agg.available_packets = []
end
end
学习四(往服务器存传感器数据)
require 'rubygems'
require 'solver_aggregator'
require 'wm_data.rb'
require 'client_world_connection.rb'
require 'solver_world_model'
sensor_to_name = Hash.new()
cwm = ClientWorldConnection.new('127.0.0.1', 7010)
data = cwm.snapshotRequest('.*', ['sensor']).get()
data.each_pair{|name, attributes|
sensor_attribute = attributes[0].data
phy = sensor_attribute.unpack('U')[0]
sensor_attribute = sensor_attribute[1.. sensor_attribute.length]
id = unpackuint128(sensor_attribute)
puts "Found sensor #{id} for name #{name}"
sensor_to_name[id] = name
}
swm = SolverWorldModel.new('127.0.0.1', 7009, "Ben")
agg = SolverAggregator.new('127.0.0.1', 7008)
phy = 1
transmitters = []
#transmitters = []
interval = 0
rule = AggrRule.new(phy, transmitters, interval)
agg.sendSubscription([rule])
def variance(samples)
if (samples.length < 2)
return 0
end
avg = 0
samples.each{|sample|
avg += sample / samples.length
}
sum_of_squares = 0
samples.each{|sample|
sum_of_squares += (avg - sample)**2.0
}
return sum_of_squares / (samples.length - 1)
end
rssis = Hash.new()
while (agg.handleMessage)
if (0 < agg.available_packets.length) then
agg.available_packets.each{|packet|
#puts packet
#puts "Amount of data is #{packet.sense_data.length}"
#puts "Data 1 is #{packet.sense_data[0].unpack('U')}"
#puts "Data 2 is #{packet.sense_data[1].unpack('C')}"
#puts "signal level is #{packet.rssi}"
txid = packet.device_id
rxid = packet.receiver_id
if (not rssis.has_key? txid)
rssis[txid] = Hash.new()
end
if (not rssis[txid].has_key? rxid)
rssis[txid][rxid] = []
end
rssis[txid][rxid].push(packet.rssi)
#remove data older than 5 seconds
if (rssis[txid][rxid].length > 5)
rssis[txid][rxid].shift
end
stddev_sum = 0.0
rssis[txid].each_value{|rssi_values|
var = variance(rssi_values)
#Standard deviation is the square root of the variance
stddev = var ** 0.5
stddev_sum += stddev
}
avg = stddev_sum / rssis[txid].length
#puts "The standard deviation is #{var**0.5}"
#puts "#{txid} is moving!"
if (sensor_to_name.has_key? txid)
name = sensor_to_name[txid]
if (4 < avg)
puts "#{name} is moving"
attribute = WMAttribute.new("moving", [0x01].pack('C'), getMsecTime())
else
puts "#{name} is not moving"
attribute = WMAttribute.new("moving", [0x00].pack('C'), getMsecTime())
end
data = WMData.new(name, [attribute])
swm.pushData([data], true)
end
}
#Erase the packets that we have processed
agg.available_packets = []
end
end