QPlay 协议框架

本文详细介绍了QPlay协议框架,包括QPlay设备描述、QPlay服务(队列、认证、设置)以及与DLNA的关系。QPlay遵循UPnP结构,QQ音乐作为控制点,设备作为媒体渲染器。QPlay服务为核心,包含队列管理、认证机制和设备设置。同时,设备需支持AVTransport、RenderingControl和ConnectionManager服务。QPlay认证确保了用户听觉体验的统一,而设置功能允许设备通过WiFi网络设置。

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

QPlay 协议框架

QPlay设备描述

目前QPlay最新规范为QPlay 2.0,QPlay所有的功能必须遵循UPnP结构体系。在QPlay规范中,QQ音乐应用充当控制点(Control Point),第三方设备充当媒体渲染器(Media Render)。而媒体渲染器必须实现至少四种服务:音视频传输(AVTransport),播放控制(RenderingControl),连接管理(ConnectionManager)三个标准服务;最后一个为QPlay服务,是QPlay规范最核心的服务,包含QPlay播放列表功能,QPlay认证功能,QPlay设置功能等。该规范定义了QPlay设备的最基础的服务,相应的动作和状态变量,第三方设备都应该支持。
在QQ音乐程序启动后
,将广播发送搜索信息查找设备类型为“urn:schemas-upnp-org:device:MediaRenderer”的设备。当QQ音乐发现设备可用时,将读取描述文件。UPnP的设备描述包含几个信息:设备制造商信息、所有的嵌入式设备定义和设备URL,所有的服务列表和控制URL(controlURL)、事件URL(eventURL)等。
QPlay设备还需要一个标签声明其支持QPlay功能:

<qq:X_QPlay_SoftwareCapability xmlns:qq="http://www.tencent.com">QPlay:VersionNumber</qq:X_QPlay_SoftwareCapability>

其中VersionNumber(版本号)描述了设备支持的QPlay版本,版本号的值可以是1或者2,其中的区别见表。

QPlay各版本功能

Services QPlay:1 QPlay:2
AVTranpsort
RenderingControl
ConnectionManager
QPlay N/A
  1. AVTransport 服务

该服务必须符合UPnP设备架构1.0版本(UPnP Device Architecture Version 1.0)。QPlay仅支持部分UPnP音视频传输服务(AVTransport)。该服务主要实现音频流的传输控制。

AVTransport服务在设备描述中的模板:

<serviceType>urn:schemas-upnp-org:service:AVTransport:1</serviceType>
<serviceId>urn:upnp-org:service:AVTransport</serviceId>
<controlURL>_urn-schemas-upnp-org-service-AVTransport_control</controlURL>
<eventSubURL>_urn-schemas-upnp-org-service-AVTransport_event</eventSubURL>
</
要使用 C# 调用 QPlay API 发送推送消息,你需要遵循以下步骤和注意事项: ### 1. 准备请求头参数 - **content-type**: 必填,值为 `"application/json; charset=utf-8"` - **app-key**: 必填,根据环境选择不同的值: - Develop: `appqplaydev` - Staging: `appqplaytest` - Production: `appqplay` - **signature-time**: 必填,生成签名的时间(Unix 时间戳),共10位。 - **signature**: 必填,计算方式为 `Base64(HMAC-SHA256(SignatureTime, AppSecretKey))`,其中 `AppSecretKey` 为 `swexuc453refebraXecujeruBraqAc4e`。 ### 2. 准备 URL 参数 - **lang**: 必填,语系,例如 `zh-tw` - **app_key**: 必填,根据环境选择不同的值: - Develop: `appqplaydev` - Staging: `appqplaytest` - Production: `appqplay` - **need_push**: 必填,值为 `Y` ### 3. 准备请求体参数 - **template_id**: 必填,值为 `0` - **message_type**: 必填,值为 `event` - **message_title**: 必填,消息标题,需要进行编码 - **message_text**: 必填,消息内容,需要进行编码 - **message_source**: 必填,公司英文名称,例如 `BenQ` - **source_user_id**: 必填,发送推送的用户,格式为 `Domain\AD工号`,例如 `BenQ\Darren.K.Ti` - **destination_user_id**: 必填,需要收到推送通知的用户列表,格式为 `[Domain\AD]`,例如 `[BenQ\Darren.K.Ti, QGROUP\Thomas.YC.Hsieh]` ### 4. 构建请求 ```csharp using System; using System.Net.Http; using System.Text; using System.Security.Cryptography; using System.Web; public class QPlayApiClient { private readonly string _appSecretKey = "swexuc453refebraXecujeruBraqAc4e"; private readonly string _appKey; private readonly string _apiUrl; public QPlayApiClient(string environment) { switch (environment.ToLower()) { case "develop": _appKey = "appqplaydev"; _apiUrl = "https://qplaydev.benq.com/qplayApi/public/v101/qplay/sendPushMessage"; break; case "staging": _appKey = "appqplaytest"; _apiUrl = "https://qplaytest.benq.com/qplayApi/public/v101/qplay/sendPushMessage"; break; case "production": _appKey = "appqplay"; _apiUrl = "https://qplay.benq.com/qplayApi/public/v101/qplay/sendPushMessage"; break; default: throw new ArgumentException("Invalid environment"); } } public async Task<HttpResponseMessage> SendPushMessageAsync(string messageTitle, string messageText, string sourceUserId, List<string> destinationUserIds) { // Generate signature-time long signatureTime = (DateTime.UtcNow.Ticks - 621355968000000000) / 10000000; // Generate signature string signature = GenerateSignature(signatureTime.ToString(), _appSecretKey); // Create request body var requestBody = new { template_id = 0, message_type = "event", message_title = EncodeString(messageTitle), message_text = EncodeString(messageText), message_source = "BenQ", source_user_id = sourceUserId, destination_user_id = destinationUserIds }; // Serialize request body to JSON string jsonRequestBody = Newtonsoft.Json.JsonConvert.SerializeObject(requestBody); // Create HTTP client using (var httpClient = new HttpClient()) { // Set headers httpClient.DefaultRequestHeaders.Add("content-type", "application/json; charset=utf-8"); httpClient.DefaultRequestHeaders.Add("app-key", _appKey); httpClient.DefaultRequestHeaders.Add("signature-time", signatureTime.ToString()); httpClient.DefaultRequestHeaders.Add("signature", signature); // Create HTTP POST request var httpContent = new StringContent(jsonRequestBody, Encoding.UTF8, "application/json"); // Send request return await httpClient.PostAsync(_apiUrl, httpContent); } } private string GenerateSignature(string signatureTime, string appSecretKey) { using (var hmacsha256 = new HMACSHA256(Encoding.UTF8.GetBytes(appSecretKey))) { byte[] hashmessage = hmacsha256.ComputeHash(Encoding.UTF8.GetBytes(signatureTime)); return Convert.ToBase64String(hashmessage); } } private string EncodeString(string input) { return HttpUtility.UrlEncode(input, Encoding.UTF8); } } ``` ### 5. 使用示例 ```csharp var client = new QPlayApiClient("production"); var response = await client.SendPushMessageAsync( messageTitle: "这是推播标题", messageText: "这是推播内容", sourceUserId: "BenQ\\Darren.K.Ti", destinationUserIds: new List<string> { "BenQ\\Darren.K.Ti", "QGROUP\\Thomas.YC.Hsieh" } ); if (response.IsSuccessStatusCode) { Console.WriteLine("推送消息发送成功"); } else { Console.WriteLine($"推送消息发送失败: {response.StatusCode}"); } ``` ### 注意事项 1. **签名时间**:`signature-time` 必须是生成签名的当前时间(Unix 时间戳)。 2. **签名**:`signature` 必须使用 `HMAC-SHA256` 算法生成,并进行 Base64 编码。 3. **消息编码**:`message_title` 和 `message_text` 需要进行 URL 编码。 4. **用户存在性**:确保 `destination_user_id` 中的用户存在于数据库中,否则会返回错误代码 `000912`。 5. **权限**:确保发送推送的用户未被停权,否则会返回错误代码 `000914`。 通过以上步骤,你可以使用 C# 调用 QPlay API 发送推送消息。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值