基于 QPlay 的智能无线流媒体传输音箱的功能实现
系统核心功能模块
系统需要实现的核心功能有QPlay认证功能,QPlay队列功能,设备离线功能,歌曲播放功能。
QPlay认证功能模块
QPlay认证功能处于系统的事件循环阶段。
事件回调函数event_handler()识别出事件类型(EventType)为UPNP_CONTROL_ACTION_REQUEST以及动作名称(ActionName)为"QPlayAuth"后,将调用函数qplayAuth()进行处理。
QPlay认证功能具体实现
QPlayAuth动作事件处理函数为qplayAuth,该函数用于提供QPlay认证所需的MID(制造商ID)、DID(设备类型ID)和Code(由Seed和PSK计算出的认证密钥)。
图为设备有关QPlayAuth动作的部分log信息。
◆ qplayAuth函数具体代码:
static int qplayAuth(struct action_event *event) {
int rc = -1;
char * seed = NULL;
char * code = NULL;
ENTER();
struct DocumentData docDataArray[] = {
{
"Seed", &seed },
{
NULL, NULL },
};
rc = check_document_element_array(event, docDataArray);
if (rc)
goto out;
code = md5sum_code(seed); // Calculate Code MD5
if (code == NULL)
goto out;
qplay_set_value(QPLAY_VAR_A_ARG_TYPE_Code, code);
upnp_append_variable(event, QPLAY_VAR_A_ARG_TYPE_Code, "Code");
upnp_append_variable(event, QPLAY_VAR_A_ARG_TYPE_MID, "MID");
upnp_append_variable(event, QPLAY_VAR_A_ARG_TYPE_DID, "DID");
out:
FREE_SAFETY(seed);
FREE_SAFETY(code);
LEAVE();
return rc;
}
QPlay认证功能具体表现
当QPlay设备的认证成功时,QQ音乐应用程序的设备列表中,该设备将显示为QPlay图标。如图所示通过认证的QPlay设备图标。
如果QPlay设备认证未成功,或是DLNA设备,则该设备将显示为普通扬声器设备图标,并且连接后会弹出“该设备尚未通过QPlay认证,部分操作可能无法正常使用。”。如图所示未通过认证的QPlay设备图标。
QPlay队列功能模块
QPlay队列功能处于系统的事件循环阶段。QPlay队列功能需要多个动作事件才能实现,主要有:“SetAVTransportURI”,“SetTracksInfo”,“Seek”,“Play”,“SetPlayMode"和"GetTracksInfo”。
QPlay队列功能方法实现
- 的SetAVTransportURI动作
SetAVTransportURI动作处理函数为set_avtransport_uri,SetAVTransportURI动作是DLNA规范规定的动作,在QPlay中被复用。
在QPlay中用于设置队列需要队列ID(QueueID),队列ID可以用于判断队列是否改变以及防止攻击等。
在SetAVTransportURI动作中标签的值如果开头为"qplay://",则是QPlay控制点(QQ音乐)的事件,后面是队列ID。否则,为一般DLNA控制点的事件。
在DLNA中则用于提供歌曲信息等,用于歌曲播放。
- SetTracksInfo动作
SetTracksInfo动作处理函数为setTracksInfo,该函数用于设置QPlay队列。设备具有歌曲队列后,可以脱离QQ音乐引用程序等控制点进行播放。同时,支持设备端的切歌操作。
◆ set_avtransport_uri函数具体代码:
static int setTracksInfo(struct action_event *event) {
i