Playful 项目使用教程
1. 项目介绍
Playful 是一个 Ruby 实现的 UPnP(Universal Plug and Play)库,适用于 Ruby 1.9 及以上版本。该项目旨在填补 Ruby 1.9 中因 Soap4r 支持被移除而导致的 UPnP 实现空白。Playful 允许用户进行 SSDP 搜索、发现、广告,并能够作为 UPnP 控制点,提供 UPnP 设备和服务。该项目使用 EventMachine,因此熟悉 EventMachine 的概念将有助于更好地使用 Playful。
2. 项目快速启动
安装 Playful
首先,确保你已经安装了 Ruby 1.9 或更高版本。然后,使用以下命令安装 Playful:
gem install playful --pre
基本使用示例
以下是一个简单的示例,展示如何使用 Playful 进行 SSDP 搜索并发现设备:
require 'playful/ssdp'
# 搜索所有设备
all_devices = Playful::SSDP.search
# 搜索根设备
root_devices = Playful::SSDP.search 'upnp:rootdevices'
# 搜索特定 UUID 的设备
my_device = Playful::SSDP.search 'uuid:3c202906-992d-3f0f-b94c-90e1902a136d'
# 搜索特定类型的设备
my_media_server = Playful::SSDP.search 'urn:schemas-upnp-org:device:MediaServer:1'
# 输出搜索结果
all_devices.each do |device|
puts device
end
使用 EventMachine 进行异步搜索
如果你希望在 EventMachine 中进行异步搜索,可以使用以下代码:
require 'playful/ssdp'
require 'playful/control_point/device'
EM.run do
searcher = Playful::SSDP.search 'uuid:3c202906-992d-3f0f-b94c-90e1902a136d'
searcher.discovery_responses.pop do |notification|
device_creator = Playful::ControlPoint::Device.new(ssdp_notification: notification)
device_creator.errback do
puts "Failed creating the device"
exit
end
device_creator.callback do |built_device|
puts "Device has been created now"
p built_device.service_list.first.class
p built_device.service_list.first.service_type
p built_device.service_list.first.singleton_methods
p built_device.service_list.first.GetSystemUpdateID
end
device_creator.fetch
end
end
3. 应用案例和最佳实践
媒体服务器控制
Playful 可以用于控制 UPnP 媒体服务器,例如 Plex、Twonky 等。以下是一个简单的示例,展示如何搜索并控制媒体服务器:
require 'playful/ssdp'
require 'playful/control_point/device'
EM.run do
searcher = Playful::SSDP.search 'urn:schemas-upnp-org:device:MediaServer:1'
searcher.discovery_responses.pop do |notification|
device_creator = Playful::ControlPoint::Device.new(ssdp_notification: notification)
device_creator.errback do
puts "Failed creating the device"
exit
end
device_creator.callback do |built_device|
puts "Media Server has been created now"
p built_device.service_list.first.class
p built_device.service_list.first.service_type
p built_device.service_list.first.singleton_methods
p built_device.service_list.first.GetSystemUpdateID
end
device_creator.fetch
end
end
家庭自动化
Playful 还可以用于控制家庭自动化设备,例如 Philips Hue 灯泡。以下是一个简单的示例,展示如何搜索并控制 Philips Hue 灯泡:
require 'playful/ssdp'
require 'playful/control_point/device'
EM.run do
searcher = Playful::SSDP.search 'urn:schemas-upnp-org:device:HVAC_System:1'
searcher.discovery_responses.pop do |notification|
device_creator = Playful::ControlPoint::Device.new(ssdp_notification: notification)
device_creator.errback do
puts "Failed creating the device"
exit
end
device_creator.callback do |built_device|
puts "HVAC System has been created now"
p built_device.service_list.first.class
p built_device.service_list.first.service_type
p built_device.service_list.first.singleton_methods
p built_device.service_list.first.GetSystemUpdateID
end
device_creator.fetch
end
end
4. 典型生态项目
UPnP 控制点在 Sinatra 中的应用
Playful 提供了 Rack 中间件,可以轻松地将 UPnP 控制点集成到 Sinatra 应用中。以下是一个简单的示例,展示如何在 Sinatra 应用中使用 Playful:
require 'sinatra'
require 'playful/control_point'
get '/' do
control_point = Playful::ControlPoint.new
devices = control_point.search_and_create_devices
devices.map { |device| device.name }.join(', ')
end
UPnP 设备和服务开发
Playful 不仅支持控制现有的 UPnP 设备,还可以用于开发新的 UPnP 设备和服务。以下是一个简单的示例,展示如何使用 Playful 创建一个简单的 UPnP 设备:
require 'playful/device'
class MyDevice < Playful::Device
service_type 'urn:schemas-upnp-org:service:MyService:1'
action :MyAction do
argument :input, :in
argument :output, :out
end
end
device = MyDevice.new
device.start
通过以上示例,你可以轻松地创建和控制 UPnP 设备和服务,实现各种智能家居和媒体控制应用。