【笔记】利用upnpclient向DLNA设备发送音乐播放请求

前言

通用即插即用(英語:Universal Plug and Play,简称UPnP)是由“通用即插即用论坛”(UPnP™ Forum)推广的一套网络协议。该协议的目标是使家庭网络(数据共享、通信和娱乐)和公司网络中的各种设备能够相互无缝连接,并简化相关网络的实现。UPnP通过定义和发布基于开放、因特网通讯网协议标准的UPnP设备控制协议来实现这一目标。(维基百科
数字生活网络联盟(英語:Digital Living Network Alliance,简称:DLNA)是一个由消費性電子、行動電話以及電腦厂商组成的联盟组织。该组织的目标在于建立一套可以使得各厂商的产品互相连接,互相适应的工业标准,从而为消费者实现数字化生活。联盟成员包括飞利浦、三星電子、松下、惠普、索尼、微软、英特尔和诺基亚在内的众多业界领袖。(维基百科

利用upnpclient向DLNA设备发送音乐播放请求

准备工作

  • 支持DLNA的设备
  • 用于播放的音乐的URL

下载依赖

1
pip3 install upnpclient

获取所有UPnP设备

  • DLNA协议是UPnP协议的一种针对于媒体播放的应用
1
2
3
4
5
6
7
8
9
10
11
import upnpclient

# 扫描网络中的 UPnP 设备
devices = upnpclient.discover()

# 打印发现的 UPnP 设备信息
for device in devices:
print(f"location: {device.location}")
print(f"friendly_name: {device.friendly_name}")
print(f"manufacturer: {device.manufacturer}")
print("")

向DLNA设备发送播放请求

http://127.0.0.1/description.xml:指定设备描述文件的URL
http://127.0.0.1/music.mp3:指定歌曲文件的URL

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import upnpclient


# 设备location
location = "http://127.0.0.1/description.xml"
# 音乐URL
music_url = "http://127.0.0.1/music.mp3"
# 实例ID
instance_id = 1

# 扫描网络中的 UPnP 设备
devices = upnpclient.discover()

# 声明设备对象
speaker = None

# 选择指定的设备
for device in devices:
if device.location == location:
speaker = device

# 判断是否找到设备
if speaker is None:
print("未找到DLNA设备")
exit()

# 获取音频播放端口
avTransport = speaker.AVTransport

# 判断是否找到音频播放端口
if avTransport is None:
print("未找到AVTransport")
exit()

# 播放音乐
avTransport.SetAVTransportURI(CurrentURI=music_url, InstanceID=instance_id, CurrentURIMetaData=location)

完成