druzy-upnp 2.0.1 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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