using System; using System.Collections.Generic; using System.Net; using System.Net.Sockets; using System.Security; using System.Text; using Shared; namespace HDL_ON.UI.Music { public class SendMethod { /// ///搜索A31音乐播放器 /// /// /// /// public static void Seach(Action action, int time = 5 * 1000, string uid = "AllUniqueDeviceName") { System.Threading.Tasks.Task.Run(() => { System.Net.Sockets.UdpClient udpClient = null; int localPort = 65535; for (; 1024 < localPort; localPort--) { try { udpClient = new System.Net.Sockets.UdpClient(localPort); break; } catch (Exception e) { System.Console.WriteLine(e.Message); } } System.Threading.Tasks.Task.Run(() => { var tempDateTime = DateTime.Now; while (udpClient != null) { try { if (time < (DateTime.Now - tempDateTime).TotalMilliseconds) { var tempBytes = System.Text.Encoding.UTF8.GetBytes("完成"); udpClient.Send(tempBytes, tempBytes.Length, new System.Net.IPEndPoint(System.Net.IPAddress.Parse("127.0.0.1"), localPort)); } else { var stringBuilder = new StringBuilder(); stringBuilder.AppendLine("M-SEARCH * HTTP/1.1"); stringBuilder.AppendLine("St: ssdp:wiimudevice"); stringBuilder.AppendLine("Mx: 3"); stringBuilder.AppendLine("Host: 239.255.255.250:1900"); stringBuilder.AppendLine("Man: \"ssdp:discover\""); stringBuilder.AppendLine(); var tempBytes = System.Text.Encoding.ASCII.GetBytes(stringBuilder.ToString()); //请求获取A31服务器信息 udpClient.Send(tempBytes, tempBytes.Length, new System.Net.IPEndPoint(System.Net.IPAddress.Parse("239.255.255.250"), 1900)); udpClient.Send(tempBytes, tempBytes.Length, new System.Net.IPEndPoint(System.Net.IPAddress.Parse("239.255.255.250"), 1900)); //如果1000毫秒没有数据回复,就关闭当前Socket,不再等待接收数据 } System.Threading.Thread.Sleep(500); } catch (Exception e) { System.Console.WriteLine(e.Message); } } }); while (true) { try { //接收回来的数据 var remoteIpEndPoint = new System.Net.IPEndPoint(0, 0); //开始在这里等待接收数据, var receviceBytes = udpClient.Receive(ref remoteIpEndPoint); if (receviceBytes == null) { break; } if ("完成" == System.Text.Encoding.UTF8.GetString(receviceBytes)) { if (action != null) { //表示完成了 action(null); } try { udpClient.Close(); udpClient = null; } catch (Exception e) { System.Console.WriteLine(e.Message); } break; } var sr = new System.IO.StreamReader(new System.IO.MemoryStream(receviceBytes, 0, receviceBytes.Length)); string tempLine = null; string ipAddress = null; int port = 0; string uniqueDeviceName = null; //一行一行数据判断,找出需要的信息 while ((tempLine = sr.ReadLine()) != null) { //找出Ip地址相关的信息 //System.Console.WriteLine (tempLine); if (tempLine.StartsWith("LOCATION: http://")) { tempLine = tempLine.Replace("LOCATION: http://", "").Split('/')[0]; string[] ipAndPort = tempLine.Split(':'); ipAddress = ipAndPort[0]; port = int.Parse(ipAndPort[1]); } else if (tempLine.StartsWith("USN: uuid:")) { uniqueDeviceName = tempLine.Replace("USN: uuid:", "").Split(':')[0]; } } //关闭流 sr.Close(); if (action != null) { if ("AllUniqueDeviceName" == uid) { action(new A31MusicModel { IPAddress = ipAddress, Port = port, Name = GetDeviceName(ipAddress, port), UniqueDeviceName = uniqueDeviceName }); } else if (uid == uniqueDeviceName) { if (action != null) { //表示完成了 action(null); } try { udpClient.Close(); udpClient = null; } catch (Exception e) { System.Console.WriteLine(e.Message); } break; } } } catch (Exception e) { System.Console.WriteLine(e.Message); } } }); } /// /// 更新A31播放器的状态 /// /// public static void ReadStatus(A31MusicModel a31MusicModel) { try { if (a31MusicModel.ServerClientType == 1) { var result = OpenWeb("http://" + a31MusicModel.IPAddress + "/httpapi.asp?command=multiroom:getSlaveList"); if (result != null && result != "Failed") { var slaves = Newtonsoft.Json.JsonConvert.DeserializeObject(result); if (slaves != null && slaves.slave_list != null && slaves.slave_list.Count != 0) { a31MusicModel.Slave = slaves; } } } WebClient webClient = new WebClient(); webClient.Headers.Add("Soapaction", "\"urn:schemas-upnp-org:service:AVTransport:1#GetInfoEx\""); webClient.Headers.Add("CONTENT-TYPE", "text/xml; charset=\"utf-8\""); var recevieBytes = webClient.UploadData(new Uri("http://" + a31MusicModel.IPAddress + ":" + a31MusicModel.Port + "/upnp/control/rendertransport1"), "POST", System.Text.Encoding.UTF8.GetBytes("0")); a31MusicModel.LastDateTime = DateTime.Now;//记录数据反馈的时间(因为有时间网络差数据不回复,导致当前播放音乐时间显示不正确) var se = System.Security.SecurityElement.FromString(System.Text.Encoding.UTF8.GetString(recevieBytes)).SearchForChildByTag("s:Body").SearchForChildByTag("u:GetInfoExResponse"); if ("PLAYING" == se.SearchForTextOfTag("CurrentTransportState")) { a31MusicModel.A31PlayStatus.status = "play"; } else { a31MusicModel.A31PlayStatus.status = "stop"; } a31MusicModel.A31PlayStatus.totlen = (DateTime.Parse(se.SearchForTextOfTag("TrackDuration")) - DateTime.Parse("00:00:00")).TotalMilliseconds.ToString(); var trackMetaData = se.SearchForTextOfTag("TrackMetaData"); if (string.IsNullOrEmpty(trackMetaData)) { return; } if (A31MusicModel.IsJson(trackMetaData)) { var a31QQSong = Newtonsoft.Json.JsonConvert.DeserializeObject(trackMetaData); a31MusicModel.A31PlayStatus.Title = a31QQSong.title; a31MusicModel.A31PlayStatus.Album = a31QQSong.album; a31MusicModel.A31PlayStatus.Artist = a31QQSong.creator; } else { var metadata = trackMetaData.Replace("", "").Replace("&", "&amp;"); var item = SecurityElement.FromString(metadata).SearchForChildByTag("item"); a31MusicModel.A31PlayStatus.Title = item.SearchForTextOfTag("dc:title"); a31MusicModel.A31PlayStatus.Artist = item.SearchForTextOfTag("upnp:artist"); a31MusicModel.A31PlayStatus.Album = item.SearchForTextOfTag("upnp:album"); } a31MusicModel.A31PlayStatus.curpos = (DateTime.Parse(se.SearchForTextOfTag("RelTime")) - DateTime.Parse("00:00:00")).TotalMilliseconds.ToString(); a31MusicModel.A31PlayStatus.vol = se.SearchForTextOfTag("CurrentVolume"); a31MusicModel.A31PlayStatus.loop = se.SearchForTextOfTag("LoopMode"); a31MusicModel.A31PlayStatus.Source = se.SearchForTextOfTag("PlayMedium"); a31MusicModel.A31PlayStatus.playSource = se.SearchForTextOfTag("TrackSource"); a31MusicModel.A31PlayStatus.TrackURL = se.SearchForTextOfTag("TrackURI").Replace("&", "&amp;"); } catch (Exception ex) { Console.WriteLine(ex.Message); } finally { #region 更新其他界面音乐状态 Application.RunOnMainThread(() => { a31MusicModel.trait_on_off.value = a31MusicModel.A31PlayStatus.status == "play" ? "on" : "off"; //Console.WriteLine($"music : {a31MusicModel.sid} : {a31MusicModel.on_off}"); HomePage.UpdataFunctionStates(a31MusicModel); foreach (var e in A31MusicModel.A31MusicModelList) { RoomPage.UpdataStates(a31MusicModel); } }); #endregion } } public static string OpenWeb(string url) { try { var webClient = new WebClient(); return webClient.DownloadString(url); } catch (Exception e) { System.Console.WriteLine(e.Message); return null; } } /// /// 获取A31的名称 /// /// /// /// static string GetDeviceName(string ip, int port) { string deviceName = null; System.IO.StreamReader sr = null; WebClient webClient = new WebClient(); try { var receviceBytes = webClient.DownloadData(new Uri("http://" + ip + ":" + port + "/description.xml")); sr = new System.IO.StreamReader(new System.IO.MemoryStream(receviceBytes), Encoding.UTF8); string line = null; string deviceType = null; while ((line = sr.ReadLine()) != null) { //System.Console.WriteLine (line); if (line.StartsWith("")) { deviceName = line.Replace("", "").Replace("", ""); } else if (line.StartsWith("")) { deviceType = line.Replace("", "").Replace("", ""); } } switch (deviceType) { case "iEAST": case "Linkplay Technology Inc.": break; //不是A31的音乐数据 default: deviceName = null; break; } } catch (Exception e) { System.Console.WriteLine(e.Message); } finally { if (sr != null) { sr.Close(); } } return deviceName; } /// /// 切换播放器模式,修改音乐名称,切换蓝牙,线路输入 /// /// public static void SendCommand(string url) { System.Threading.Tasks.Task.Run(() => { WebClient webClient = new WebClient(); try { byte[] recevieBytes1 = webClient.DownloadData(new Uri(url)); } catch (Exception ex) { //this.IPAddress = ex.Message; } }); } /// /// 播放 /// public static void Play(A31MusicModel a31player) { System.Threading.Tasks.Task.Run(() => { StringBuilder sb = new StringBuilder(); sb.AppendLine(""); sb.AppendLine(""); sb.AppendLine(""); sb.AppendLine("0"); sb.AppendLine("1"); sb.AppendLine(""); sb.AppendLine(""); sb.AppendLine(""); System.Net.WebClient webClient = new System.Net.WebClient(); webClient.Headers.Add("SOAPACTION", "\"urn:schemas-upnp-org:service:AVTransport:1#Play\""); webClient.Headers.Add("CONTENT-TYPE", "text/xml; charset=\"utf-8\""); try { webClient.UploadData(new Uri("http://" + a31player.IPAddress + ":" + a31player.Port + "/upnp/control/rendertransport1"), "POST", Encoding.UTF8.GetBytes(sb.ToString())); } catch { } }); } /// /// 暂停 /// public static void Pause(A31MusicModel a31player) { System.Threading.Tasks.Task.Run(() => { StringBuilder sb = new StringBuilder(); sb.AppendLine(""); sb.AppendLine(""); sb.AppendLine(""); sb.AppendLine("0"); sb.AppendLine(""); sb.AppendLine(""); sb.AppendLine(""); System.Net.WebClient webClient = new System.Net.WebClient(); webClient.Headers.Add("SOAPACTION", "\"urn:schemas-upnp-org:service:AVTransport:1#Pause\""); webClient.Headers.Add("CONTENT-TYPE", "text/xml; charset=\"utf-8\""); try { webClient.UploadData(new Uri("http://" + a31player.IPAddress + ":" + a31player.Port + "/upnp/control/rendertransport1"), "POST", Encoding.UTF8.GetBytes(sb.ToString())); } catch { } }); } /// /// 下一曲 /// public static void Next(A31MusicModel a31player) { System.Threading.Tasks.Task.Run(() => { StringBuilder sb = new StringBuilder(); sb.AppendLine(""); sb.AppendLine(""); sb.AppendLine(""); sb.AppendLine("0"); sb.AppendLine(""); sb.AppendLine(""); sb.AppendLine(""); System.Net.WebClient webClient = new System.Net.WebClient(); webClient.Headers.Add("SOAPACTION", "\"urn:schemas-upnp-org:service:AVTransport:1#Next\""); webClient.Headers.Add("CONTENT-TYPE", "text/xml; charset=\"utf-8\""); try { webClient.UploadData(new Uri("http://" + a31player.IPAddress + ":" + a31player.Port + "/upnp/control/rendertransport1"), "POST", Encoding.UTF8.GetBytes(sb.ToString())); } catch { } }); } /// /// 上一曲 /// public static void Previous(A31MusicModel a31player) { System.Threading.Tasks.Task.Run(() => { StringBuilder sb = new StringBuilder(); sb.AppendLine(""); sb.AppendLine(""); sb.AppendLine(" "); sb.AppendLine("0"); sb.AppendLine(""); sb.AppendLine(""); sb.AppendLine(""); System.Net.WebClient webClient = new System.Net.WebClient(); webClient.Headers.Add("SOAPACTION", "\"urn:schemas-upnp-org:service:AVTransport:1#Previous\""); webClient.Headers.Add("CONTENT-TYPE", "text/xml; charset=\"utf-8\""); try { webClient.UploadData(new Uri("http://" + a31player.IPAddress + ":" + a31player.Port + "/upnp/control/rendertransport1"), "POST", Encoding.UTF8.GetBytes(sb.ToString())); } catch { } }); } /// /// 快进 /// public static void Seek(string seekvolume, A31MusicModel a31player) { System.Threading.Tasks.Task.Run(() => { StringBuilder sb = new StringBuilder(); sb.AppendLine(""); sb.AppendLine(""); sb.AppendLine(" "); sb.AppendLine("0"); sb.AppendLine("REL_TIME"); sb.AppendLine("" + seekvolume + ""); sb.AppendLine(""); sb.AppendLine(""); sb.AppendLine(""); System.Net.WebClient webClient = new System.Net.WebClient(); webClient.Headers.Add("SOAPACTION", "\"urn:schemas-upnp-org:service:AVTransport:1#Seek\""); webClient.Headers.Add("CONTENT-TYPE", "text/xml; charset=\"utf-8\""); try { webClient.UploadData(new Uri("http://" + a31player.IPAddress + ":" + a31player.Port + "/upnp/control/rendertransport1"), "POST", Encoding.UTF8.GetBytes(sb.ToString())); } catch { } }); } /// /// 调节音量 /// /// Volume. public static void ControlVolume(int volume, A31MusicModel a31player) { System.Threading.Tasks.Task.Run(() => { A31MusicModel.ProgressDateTime = DateTime.Now; try { if (a31player.ServerClientType == -1) { new System.Net.WebClient().DownloadData(new Uri("http://" + a31player.MainPlayIP + "/httpapi.asp?command=multiroom:SlaveVolume:" + a31player.IPAddress + ":" + volume)); } else if (a31player.ServerClientType == 1) { new System.Net.WebClient().DownloadData(new Uri("http://" + a31player.IPAddress + "/httpapi.asp?command=setPlayerCmd:slave_vol:" + volume)); } else { var sb = new StringBuilder(); sb.AppendLine(""); sb.AppendLine(""); sb.AppendLine(""); sb.AppendLine("0"); sb.AppendLine("Master"); sb.AppendLine("" + volume + ""); sb.AppendLine(""); sb.AppendLine(""); sb.AppendLine(""); var webClient = new System.Net.WebClient(); webClient.Headers.Add("SOAPACTION", "\"urn:schemas-upnp-org:service:RenderingControl:1#SetVolume\""); webClient.Headers.Add("CONTENT-TYPE", "text/xml; charset=\"utf-8\""); webClient.UploadData(new Uri("http://" + a31player.IPAddress + ":" + a31player.Port + "/upnp/control/rendercontrol1"), "POST", Encoding.UTF8.GetBytes(sb.ToString())); } } catch { } }); } /// /// 获取USb的列表 /// public static List GetUsbList(A31MusicModel a31player) { var musicInfoList = new List(); musicInfoList.Clear(); var usbString = GetUSBPlayList(a31player); if (usbString == null) { return musicInfoList; } var se = System.Security.SecurityElement.FromString(usbString); if (se == null) { return musicInfoList; } while (se.Children != null) { se = se.Children[0] as System.Security.SecurityElement; } foreach (SecurityElement track in SecurityElement.FromString(se.Text).SearchForChildByTag("Tracks").Children) { MusicInfo musicInfo = new MusicInfo(); musicInfo.URL = track.SearchForTextOfTag("URL").Replace("&", "&amp;"); var metadata = track.SearchForTextOfTag("Metadata").Replace("&", "&"); var item = SecurityElement.FromString(metadata).SearchForChildByTag("item"); musicInfo.Title = item.SearchForTextOfTag("dc:title").Replace("&", "&amp;"); musicInfo.Artist = item.SearchForTextOfTag("upnp:artist").Replace("&", "&amp;"); musicInfo.Album = item.SearchForTextOfTag("upnp:album").Replace("&", "&amp;"); musicInfo.Duration = item.SearchForTextOfTag("res"); musicInfo.AlbumId = item.SearchForTextOfTag("song:albumid").Replace("&", "&amp;"); musicInfoList.Add(musicInfo); } return musicInfoList; } /// ///请求USB列表命令 /// public static string GetUSBPlayList(A31MusicModel a31player) { StringBuilder getPlayList = new StringBuilder(); getPlayList.AppendLine(""); getPlayList.AppendLine(""); getPlayList.AppendLine(""); getPlayList.AppendLine("USBDiskQueue"); getPlayList.AppendLine(""); getPlayList.AppendLine(""); getPlayList.AppendLine(""); WebClient webClient = new WebClient(); webClient.Headers.Add("SOAPACTION", "\"urn:schemas-wiimu-com:service:PlayQueue:1#BrowseQueue\""); webClient.Headers.Add("CONTENT-TYPE", "text/xml; charset=\"utf-8\""); try { byte[] recevieBytes = webClient.UploadData(new Uri("http://" + a31player.IPAddress + ":" + a31player.Port + "/upnp/control/PlayQueue1"), "POST", System.Text.Encoding.UTF8.GetBytes(getPlayList.ToString())); return System.Text.Encoding.UTF8.GetString(recevieBytes, 0, recevieBytes.Length); } catch { } return null; } /// /// 读取电台组列表 /// /// 读取到的电台组列表信息,读取不到反馈为null public static string ReadRadioList(string url) { WebClient webClient = new WebClient(); webClient.Proxy = null; webClient.Headers.Add("Content-type", "plain/text; charset=UTF-8"); if (Language.CurrentLanguage == "Chinese") { webClient.Headers.Add("Accept-Language", "zh-cn"); } else { webClient.Headers.Add("Accept-Language", "en-us"); } try { byte[] recevieBytes = webClient.DownloadData(new Uri(url)); return System.Text.Encoding.UTF8.GetString(recevieBytes, 0, recevieBytes.Length); } catch (Exception e) { return null; } } /// /// 获取当前播放的列表 /// public static string GetCurrentPlayList(A31MusicModel a31player) { System.Text.StringBuilder getPlayList = new System.Text.StringBuilder(); getPlayList.AppendLine(""); getPlayList.AppendLine(""); getPlayList.AppendLine(""); getPlayList.AppendLine(""); getPlayList.AppendLine("CurrentQueue"); getPlayList.AppendLine(""); getPlayList.AppendLine(""); getPlayList.AppendLine(""); System.Net.WebClient webClient = new System.Net.WebClient(); webClient.Headers.Add("SOAPACTION", "\"urn:schemas-wiimu-com:service:PlayQueue:1#BrowseQueue\""); webClient.Headers.Add("CONTENT-TYPE", "text/xml; charset=\"utf-8\""); try { byte[] recevieBytes = webClient.UploadData(new Uri("http://" + a31player.IPAddress + ":" + a31player.Port + "/upnp/control/PlayQueue1"), "POST", System.Text.Encoding.UTF8.GetBytes(getPlayList.ToString())); return System.Text.Encoding.UTF8.GetString(recevieBytes, 0, recevieBytes.Length); } catch { } return null; } /// /// 播放USB音乐命令 /// /// 列表名称 /// 播放索引 public static void ListMusicPlay(string listName, object number, A31MusicModel a31player) { System.Text.StringBuilder playstrings = new System.Text.StringBuilder(); playstrings.AppendLine(""); playstrings.AppendLine(""); playstrings.AppendLine(""); playstrings.AppendLine(""); playstrings.AppendLine("" + listName + ""); playstrings.AppendLine("" + number + ""); playstrings.AppendLine(""); playstrings.AppendLine(""); playstrings.AppendLine(""); System.Net.WebClient webClient = new System.Net.WebClient(); webClient.Headers.Add("SOAPACTION", "\"urn:schemas-wiimu-com:service:PlayQueue:1#PlayQueueWithIndex\""); webClient.Headers.Add("CONTENT-TYPE", "text/xml; charset=\"utf-8\""); try { byte[] recevieBytes = webClient.UploadData(new Uri("http://" + a31player.IPAddress + ":" + a31player.Port + "/upnp/control/PlayQueue1"), "POST", Encoding.UTF8.GetBytes(playstrings.ToString())); var s = System.Text.Encoding.UTF8.GetString(recevieBytes, 0, recevieBytes.Length); } catch { } } /// /// 推送播放命令 /// /// 播放音乐 /// 列表名称 /// 推送列表(默认推50首) public static void PushList(MusicInfo musicInfo, string listName, List musicList, A31MusicModel a31player,string musicSource) { //最大发送的条数 int maxCount = 50; //找出当前点击音乐的索引 int statIndex = musicList.FindIndex((obj) => { return obj == musicInfo; }); //点击后面还有多少条音乐 int count = musicList.Count - statIndex; int endIndex = 0; if (maxCount < count) { //如果后面的音乐大于最大数,设置后面数据的最大索引 endIndex = statIndex + maxCount - 1; } else { //如果后面数据不多,就用总数减去最大条数,得到开始索引 statIndex = musicList.Count - maxCount - 1; endIndex = musicList.Count - 1; } //如果开始索引小于0,那就设置为第一条音乐 if (statIndex < 0) { statIndex = 0; } StringBuilder sb = new StringBuilder(); sb.AppendLine(""); sb.AppendLine(""); sb.AppendLine(""); sb.AppendLine(""); sb.AppendLine("<?xml version=\"1.0\"?>"); sb.AppendLine("<PlayList>"); sb.AppendLine("<ListName>DLNA" + listName + "</ListName>"); sb.AppendLine("<ListInfo>"); sb.AppendLine("<Radio>0</Radio>");// sb.AppendLine("<SourceName>UPnPServer</SourceName>");// sb.AppendLine("<MarkSearch>0</MarkSearch>"); sb.AppendLine("<TrackNumber>" + (endIndex - statIndex + 1) + "</TrackNumber>"); sb.AppendLine("<Quality>0</Quality>"); sb.AppendLine("<UpdateTime>5367</UpdateTime>"); sb.AppendLine("<LastPlayIndex>2</LastPlayIndex>"); sb.AppendLine("<SwitchPageMode>0</SwitchPageMode>"); sb.AppendLine("<CurrentPage>0</CurrentPage>"); sb.AppendLine("<TotalPages>0</TotalPages>"); sb.AppendLine("</ListInfo>"); sb.AppendLine("<Tracks>"); int number = 1; for (int i = statIndex, Tracknumber = 1; i <= endIndex; i++, Tracknumber++) { var tempMusicInfo = musicList[i]; if (musicInfo == tempMusicInfo) { number = Tracknumber; } if (tempMusicInfo.SourceType == "Local") { tempMusicInfo.URL = "http://" + new Shared.Net.NetWiFi().IpAddress + ":" + com.hdl.on.Server.Port + "/" + tempMusicInfo.ID; } sb.AppendLine("<Track" + Tracknumber + ">"); sb.AppendLine("<URL>" + tempMusicInfo.URL + "</URL>"); sb.AppendLine("<Metadata>&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;"); sb.AppendLine("&lt;DIDL-Lite xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:upnp=&quot;urn:schemas-upnp-org:metadata-1-0/upnp/&quot; xmlns:song=&quot;www.wiimu.com/song/&quot; xmlns=&quot;urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/&quot;&gt;"); sb.AppendLine("&lt;upnp:class&gt;object.item.audioItem.musicTrack&lt;/upnp:class&gt;"); sb.AppendLine("&lt;item id=&quot;0&quot;&gt;"); sb.AppendLine("&lt;song:subid&gt;&lt;/song:subid&gt;"); sb.AppendLine("&lt;song:description&gt;unknown&lt;/song:description&gt;"); sb.AppendLine("&lt;song:skiplimit&gt;6&lt;/song:skiplimit&gt;"); sb.AppendLine("&lt;song:id&gt;" + tempMusicInfo.ID + "&lt;/song:id&gt;"); sb.AppendLine("&lt;song:like&gt;0&lt;/song:like&gt;"); sb.AppendLine("&lt;song:singerid&gt;0&lt;/song:singerid&gt;"); sb.AppendLine("&lt;song:albumid&gt;" + tempMusicInfo.AlbumId + "&lt;/song:albumid&gt;"); sb.AppendLine("&lt;res protocolInfo=&quot;http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;&quot; duration=&quot;" + "0:0:0.0" + "&quot;&gt;" + tempMusicInfo.URL + "&lt;/res&gt;"); sb.AppendLine("&lt;dc:title&gt;" + tempMusicInfo.Title + "&lt;/dc:title&gt;"); sb.AppendLine("&lt;dc:creator&gt;DJ Sanny J&lt;/dc:creator&gt;"); if (musicSource== "我的列表") { sb.AppendLine("&lt;upnp:artist&gt;" + listName + "&lt;/upnp:artist&gt;"); } else { sb.AppendLine("&lt;upnp:artist&gt;" + tempMusicInfo.Artist + "&lt;/upnp:artist&gt;"); } sb.AppendLine("&lt;upnp:album&gt;" + tempMusicInfo.Album + "&lt;/upnp:album&gt;"); sb.AppendLine("&lt;upnp:albumArtURI&gt;unknown&lt;/upnp:albumArtURI&gt;"); sb.AppendLine("&lt;/item&gt;"); sb.AppendLine("&lt;/DIDL-Lite&gt;"); sb.AppendLine("</Metadata>"); sb.AppendLine("<Id>" + tempMusicInfo.ID + "</Id>"); sb.AppendLine("<Source>STATION-NETWORK</Source>");//UPnPServer sb.AppendLine("<Key>" + tempMusicInfo.URL + "</Key>"); sb.AppendLine("</Track" + Tracknumber + ">"); } sb.AppendLine("</Tracks>"); sb.AppendLine("</PlayList>"); sb.AppendLine(""); sb.AppendLine(""); sb.AppendLine(""); sb.AppendLine(""); SendMusicLists(a31player.IPAddress, a31player.Port, "CreateQueue", sb.ToString()); StringBuilder playString = new StringBuilder(); playString.AppendLine(""); playString.AppendLine(""); playString.AppendLine(""); playString.AppendLine(""); playString.AppendLine("DLNA" + listName + ""); playString.AppendLine("" + number + ""); playString.AppendLine(""); playString.AppendLine(""); playString.AppendLine(""); Play(a31player.IPAddress, a31player.Port, playString.ToString()); } static void SendMusicLists(string ip, int port, string soapAction, string listInfo) { System.Net.WebClient webClient = new System.Net.WebClient(); webClient.Headers.Add("SOAPACTION", "\"urn:schemas-wiimu-com:service:PlayQueue:1#" + soapAction + "\""); webClient.Headers.Add("CONTENT-TYPE", "text/xml; charset=\"utf-8\""); try { byte[] recevieBytes = webClient.UploadData(new Uri("http://" + ip + ":" + port + "/upnp/control/PlayQueue1"), "POST", System.Text.Encoding.UTF8.GetBytes(listInfo)); var s = System.Text.Encoding.UTF8.GetString(recevieBytes, 0, recevieBytes.Length); } catch(Exception e) { var d = e.Message; } } static void Play(string ip, int port, string info) { System.Net.WebClient webClient = new System.Net.WebClient(); webClient.Headers.Add("SOAPACTION", "\"urn:schemas-wiimu-com:service:PlayQueue:1#PlayQueueWithIndex\""); webClient.Headers.Add("CONTENT-TYPE", "text/xml; charset=\"utf-8\""); try { byte[] recevieBytes = webClient.UploadData(new Uri("http://" + ip + ":" + port + "/upnp/control/PlayQueue1"), "POST", System.Text.Encoding.UTF8.GetBytes(info)); var s = System.Text.Encoding.UTF8.GetString(recevieBytes, 0, recevieBytes.Length); } catch { } } static System.Threading.Thread thread; /// /// 修改蓝牙名称 /// /// public static void ModifyBluetoothName(string message) { if (thread != null) { thread.Abort(); } thread = new System.Threading.Thread(() => { var tcpClient = new TcpClient() { ReceiveTimeout = 1000 }; try { //进行连接 tcpClient.Connect(new IPEndPoint(IPAddress.Parse(A31MusicModel.Current.IPAddress), 8899)); var buffter = Encoding.UTF8.GetBytes(message); var sendByes = new byte[20 + buffter.Length]; sendByes[0] = 0x18; sendByes[1] = 0x96; sendByes[2] = 0x18; sendByes[3] = 0x20; sendByes[4] = (byte)((buffter.Length & 0x000000FF) >> 0); sendByes[5] = (byte)((buffter.Length & 0x0000FF00) >> 8); sendByes[6] = (byte)((buffter.Length & 0x00FF0000) >> 16); sendByes[7] = (byte)((buffter.Length & 0xFF000000) >> 24); var checkSum = getCheckSum(buffter); sendByes[8] = (byte)((checkSum & 0x000000FF) >> 0); sendByes[9] = (byte)((checkSum & 0x0000FF00) >> 8); sendByes[10] = (byte)((checkSum & 0x00FF0000) >> 16); sendByes[11] = (byte)((checkSum & 0xFF000000) >> 24); sendByes[16] = 0x08; Array.Copy(buffter, 0, sendByes, 20, buffter.Length); tcpClient.GetStream().Write(sendByes, 0, sendByes.Length); tcpClient.GetStream().Flush(); thread = null; } catch { } finally { tcpClient.Close(); } }); thread.Start(); } static uint getCheckSum(byte[] buffer) { uint check_sum = 0; for (int i = 0; i < buffer.Length; i++) { check_sum += buffer[i]; } return check_sum; } public class A31QQSong { public string title = string.Empty; public string album = string.Empty; public string creator = string.Empty; } } }