owlplatform五天听课笔记

本文介绍了一个基于传感器数据处理的学习过程,包括使用Ruby脚本通过快照方式和流方式获取数据,检测传感器强度变化以判断移动状态,以及如何将数据存入服务器等关键技术点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这几天老师请了老外来讲课,于是乎被召去学习学习。老外自己造了一套传感器,卖给我们,然后作为售后服务交流,特地来到这里给我们做培训。相关网站就是这个猫头鹰平台(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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值