druzy-upnp 2.0.1 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2f9604efe42ea90eb02b2b567e3901a7a32cc1b9
4
- data.tar.gz: 2608488daea06e5496e0466bc35c93ea868c8b62
3
+ metadata.gz: 892091358c3fced9d156e69cad0e861a33ef6e5d
4
+ data.tar.gz: 04d3dd0ee58e25f3c028986471001a064f1ab030
5
5
  SHA512:
6
- metadata.gz: 3a359f6328a4660b871404bf9138428687d1bd21ac3e5587ec30d8efe122f5e86345cb8046d544f898e6e18701e571e1e7a0e1b05bc5e4a264847c2a4dea1d22
7
- data.tar.gz: e36b3baf467e8a89cb6588d8ca06288c6d9220a8f064b44033e8a23c8ba7ca6d2d69488d27ec1b8916db92d8a5f9b752af32c1fc74e00286c64a548839f9c242
6
+ metadata.gz: f516ba8f7ca1c7197dd9c14ab99be5b0a5e308430f9d656ddbb05b2b0751af1940ee9d02fd8b5a9010da93dd52c6af20ca64d07b4f8916315949d751f802880d
7
+ data.tar.gz: 00832c588d4125a9086cc8cb1e02058a16968de6d66a22a532a89b5ef191ed2da84eb9c09614962ce442da9a865a491a1ea644c9ceba7434599afe615b88dfb2
@@ -0,0 +1,77 @@
1
+ require 'druzy/server/one_instance_by_port'
2
+ require 'druzy/utils/net'
3
+ require 'nokogiri'
4
+ require 'webrick'
5
+
6
+ module Druzy
7
+ module Upnp
8
+ module Event
9
+
10
+ class UpnpEventServer < Druzy::Server::OneInstanceByPort
11
+ attr_reader :event_address
12
+
13
+ def initialize(port)
14
+ super(port)
15
+
16
+ #sleep 0.5
17
+ @server.mount('/event',UpnpServlet, :event_server => self)
18
+ @listeners = {}
19
+ @event_address = "http://"+Druzy::Utils.get_local_public_ipv4+":"+@server.config[:Port].to_s+"/event"
20
+ start_server
21
+ end
22
+
23
+ def add_property_change_listener(uuid,listener)
24
+ @listeners[uuid] ||= []
25
+ @listeners[uuid] << listener
26
+ end
27
+
28
+ def remove_property_change_listener(uuid)
29
+ @listeners.delete(uuid)
30
+ end
31
+
32
+ def get_listeners(uuid)
33
+ if @listeners[uuid]!=nil
34
+ return @listeners[uuid]
35
+ else
36
+ return []
37
+ end
38
+ end
39
+
40
+ end
41
+
42
+ class UpnpServlet < WEBrick::HTTPServlet::AbstractServlet
43
+
44
+ def do_NOTIFY(request, response)
45
+ @options=@options[0]
46
+ xml = Nokogiri::XML(request.body)
47
+ xml.remove_namespaces!
48
+ #puts xml.to_s
49
+ xml.xpath('propertyset/property').each do |el|
50
+ el.children.each do |child|
51
+ if child.name.to_s == "LastChange"
52
+ child.xpath('Event/InstanceID').each do |el2|
53
+ el2.children.each do |child2|
54
+ @options[:event_server].get_listeners(request['SID']).each do |listener|
55
+ listener.property_change(Druzy::MVC::PropertyChangeEvent.new(request.remote_ip,child2.name.to_s,nil,child2.attribute("val")))
56
+ end
57
+ end
58
+ end
59
+ else
60
+ @options[:event_server].get_listeners(request['SID']).each do |listener|
61
+ listener.property_change(Druzy::MVC::PropertyChangeEvent.new(request.remote_ip,child.name.to_s,nil,child.text))
62
+ end
63
+ end
64
+ end
65
+ end
66
+
67
+ response.status = 200
68
+ end
69
+ end
70
+ end
71
+ end
72
+ end
73
+
74
+ if $0 == __FILE__
75
+ Druzy::Server::Event::UpnpEventServer.instance(12345)
76
+ Thread.list.each {|t| t.join if t!=Thread.main}
77
+ end
@@ -59,7 +59,13 @@ end
59
59
  if $0 == __FILE__
60
60
  Druzy::Upnp::Ssdp.new.search("urn:schemas-upnp-org:device:MediaRenderer:1") do |device|
61
61
  puts device.device_type
62
- connection_id, av_transport_id, rcs_id = device.ConnectionManager.PrepareForConnection("RemoteProtocolInfo" => "http-get:*:video/mp4:*", "PeerConnectionManager" => "/", "PeerConnectionID" => -1, "Direction" => "Output").values
63
- puts av_transport_id.to_s
62
+ device.service_list.each do |service|
63
+ puts service.service_type
64
+ service.subscribe do |event|
65
+ puts event.property_name+" : "+event.new_value
66
+ end
67
+ end
64
68
  end
69
+
70
+ sleep 600
65
71
  end
@@ -2,6 +2,7 @@ require_relative 'upnp_service'
2
2
 
3
3
  require 'net/http'
4
4
  require 'nokogiri'
5
+ require 'uri'
5
6
 
6
7
  module Druzy
7
8
  module Upnp
@@ -1,11 +1,18 @@
1
+ require_relative 'event/upnp_event_server'
2
+
3
+ require 'druzy/mvc/event'
4
+ require 'druzy/utils/net'
1
5
  require 'net/http'
2
6
  require 'nokogiri'
7
+ require 'socket'
3
8
  require 'uri'
4
9
 
5
10
  module Druzy
6
11
  module Upnp
7
12
  class UpnpService
8
13
 
14
+ @@event_port = 15323
15
+
9
16
  attr_reader :service_type, :service_id, :location, :control_url, :event_sub_url
10
17
 
11
18
  def initialize(args)
@@ -15,6 +22,8 @@ module Druzy
15
22
  @location = args[:location]
16
23
  @control_url = args[:control_url]
17
24
  @event_sub_url = args[:event_sub_url]
25
+ @event_timeout = 300
26
+ @event_sid = nil
18
27
 
19
28
  uri = URI(@location)
20
29
  xml=Net::HTTP.get(uri)
@@ -68,6 +77,84 @@ module Druzy
68
77
  end
69
78
 
70
79
  end
80
+
81
+ def subscribe
82
+ if block_given?
83
+ server = Druzy::Upnp::Event::UpnpEventServer.instance(@@event_port)
84
+ uri = URI(@event_sub_url)
85
+ http = Net::HTTP.new(uri.host,uri.port)
86
+ request = Net::HTTPGenericRequest.new('SUBSCRIBE',false,true,uri)
87
+ request['CALLBACK'] = '<'+server.event_address+'>'
88
+ request['NT'] = 'upnp:event'
89
+ request['TIMEOUT'] = 'Second-'+@event_timeout.to_s
90
+
91
+ response = http.request(request)
92
+ if response.code.to_i == 200
93
+ @event_timeout = response['TIMEOUT'][7..-1].to_i
94
+ @event_sid = response['SID']
95
+
96
+ Thread.new do
97
+ puts "début thread renew"
98
+ sleep @event_timeout
99
+ if @event_sid !=nil
100
+ renew_subscription
101
+ end
102
+ end
103
+
104
+ server.add_property_change_listener(@event_sid, Druzy::MVC::PropertyChangeListener.new do |event|
105
+ yield(event)
106
+ end)
107
+ return @event_sid
108
+ else
109
+ return nil
110
+ end
111
+ else
112
+ return nil
113
+ end
114
+ end
115
+
116
+ def renew_subscription
117
+ uri = URI(@event_sub_url)
118
+ http = Net::HTTP.new(uri.host,uri.port)
119
+ request = Net::HTTPGenericRequest.new('SUBSCRIBE',false,true,uri)
120
+ request['SID'] = @event_sid
121
+ request['TIMEOUT'] = 'Second-'+@event_timeout.to_s
122
+
123
+ response = http.request(request)
124
+ if response.code.to_i == 200
125
+ @event_timeout = response['TIMEOUT'][7..-1].to_i
126
+
127
+ Thread.new do
128
+ sleep @event_timeout
129
+ if @event_sid !=nil
130
+ renew_subscription
131
+ end
132
+ end
133
+ end
134
+ end
135
+
136
+ def unsubscribe
137
+ if @event_sid !=nil
138
+ server = Druzy::Upnp::Event::UpnpEventServer.instance(@@event_port)
139
+ server.remove_property_change_listener(@event_sid)
140
+
141
+ uri = URI(@event_sub_url)
142
+ http = Net::HTTP.new(uri.host,uri.port)
143
+ request = Net::HTTPGenericRequest.new('UNSUBSCRIBE',false,true,nil)
144
+ request['SID'] = @event_sid
145
+
146
+ response = http.request(request)
147
+ if response.code == 200
148
+ @event_sid = nil
149
+ return true
150
+ else
151
+ return false
152
+ end
153
+ else
154
+ return true
155
+ end
156
+ end
157
+
71
158
  end
72
159
  end
73
160
  end
@@ -1,5 +1,5 @@
1
1
  module Druzy
2
2
  module Upnp
3
- VERSION = "2.0.1"
3
+ VERSION = "3.0.0"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,15 +1,57 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: druzy-upnp
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.1
4
+ version: 3.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jonathan Le Greneur
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-07-02 00:00:00.000000000 Z
11
+ date: 2016-07-23 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: druzy-mvc
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 1.2.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 1.2.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: druzy-server
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 2.0.1
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: 2.0.1
41
+ - !ruby/object:Gem::Dependency
42
+ name: druzy-utils
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: 1.0.0
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: 1.0.0
13
55
  - !ruby/object:Gem::Dependency
14
56
  name: nokogiri
15
57
  requirement: !ruby/object:Gem::Requirement
@@ -60,6 +102,7 @@ extensions: []
60
102
  extra_rdoc_files: []
61
103
  files:
62
104
  - lib/druzy/upnp.rb
105
+ - lib/druzy/upnp/event/upnp_event_server.rb
63
106
  - lib/druzy/upnp/ssdp.rb
64
107
  - lib/druzy/upnp/upnp_device.rb
65
108
  - lib/druzy/upnp/upnp_service.rb