163 lines
5.0 KiB
C#
163 lines
5.0 KiB
C#
using Newtonsoft.Json;
|
|
using System.Net.Sockets;
|
|
using System.Text;
|
|
|
|
namespace SHH.MjpegPlayer
|
|
{
|
|
/// <summary>
|
|
/// MJPEG HTTP命令类
|
|
/// </summary>
|
|
public class MjpegHttpCmd
|
|
{
|
|
#region DoHttpCmd
|
|
|
|
public static bool DoHttpCmd(NetworkStream stream,
|
|
SessionInfo Info, string Cmd)
|
|
{
|
|
try
|
|
{
|
|
switch (Cmd)
|
|
{
|
|
case "view":
|
|
Info.Message = "执行 view 命令.";
|
|
DoHttpCmdView(stream, Info);
|
|
return true;
|
|
|
|
case "task":
|
|
Info.Message = "执行 task 命令.";
|
|
DoHttpCmdTask(stream, Info);
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
SendJson(stream, $"Command Failed: {ex.Message}", 400);
|
|
return true;
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region DoHttpCmdView
|
|
|
|
private static void DoHttpCmdView(NetworkStream stream, SessionInfo Info)
|
|
{
|
|
var sessions = new List<SessionInfo>();
|
|
int iSessionCount = 0;
|
|
|
|
var allSessions = MjpegStatics.Sessions.GetAllSessionInfos();
|
|
|
|
foreach (var sessionInfo in allSessions)
|
|
{
|
|
if (sessionInfo == null) continue;
|
|
|
|
if (!string.IsNullOrEmpty(Info.DeviceId))
|
|
{
|
|
if (!string.IsNullOrEmpty(sessionInfo.DeviceId)
|
|
&& !sessionInfo.DeviceId.Equals(Info.DeviceId))
|
|
continue;
|
|
}
|
|
|
|
if (!string.IsNullOrEmpty(Info.TypeCode))
|
|
{
|
|
if (!string.IsNullOrEmpty(sessionInfo.TypeCode)
|
|
&& !sessionInfo.TypeCode.Equals(Info.TypeCode))
|
|
continue;
|
|
}
|
|
|
|
iSessionCount++;
|
|
sessions.Add(sessionInfo);
|
|
}
|
|
|
|
var chns = new List<ImageChannel>();
|
|
var imgChns = MjpegStatics.ImageChannels;
|
|
int iImgChanCount = 0;
|
|
|
|
foreach (var kvp in imgChns.Channels)
|
|
{
|
|
var imgChannel = kvp.Value;
|
|
if (imgChannel == null) continue;
|
|
|
|
if (!string.IsNullOrEmpty(Info.DeviceId))
|
|
{
|
|
if (!imgChannel.DeviceId.ToString().Equals(Info.DeviceId))
|
|
continue;
|
|
}
|
|
|
|
if (!string.IsNullOrEmpty(Info.TypeCode))
|
|
{
|
|
if (!imgChannel.Type.Equals(Info.TypeCode))
|
|
continue;
|
|
}
|
|
|
|
iImgChanCount++;
|
|
chns.Add(imgChannel);
|
|
}
|
|
|
|
var result = new
|
|
{
|
|
webAccessCount = iSessionCount,
|
|
deviceChannelCount = iImgChanCount,
|
|
webAccessItems = sessions,
|
|
deviceChannels = chns
|
|
};
|
|
|
|
SendJson(stream, JsonConvert.SerializeObject(result, Formatting.Indented));
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region DoHttpCmdTask
|
|
|
|
private static void DoHttpCmdTask(NetworkStream stream, SessionInfo Info)
|
|
{
|
|
// [Optimized]: 直接从 TaskManager 获取实时任务快照,避免遍历旧的静态字典
|
|
var activeTasks = TaskManager.RunningTasks.Values.ToList();
|
|
|
|
int iTaskCount = activeTasks.Count;
|
|
int iMjpegServerListenCount = activeTasks.Count(t => t.Name.Contains("MjpegServer-"));
|
|
|
|
var result = new
|
|
{
|
|
taskCount = iTaskCount,
|
|
portListenCount = iMjpegServerListenCount,
|
|
// 映射为前端需要的格式
|
|
taskItems = activeTasks.Select(t => new { t.Name, t.Type })
|
|
};
|
|
|
|
// 使用 Newtonsoft.Json 或 System.Text.Json 输出
|
|
SendJson(stream, JsonConvert.SerializeObject(result, Formatting.Indented));
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Helper
|
|
|
|
private static void SendJson(NetworkStream stream, string json, int code = 200)
|
|
{
|
|
try
|
|
{
|
|
string statusLine = code == 200 ? "200 OK" : "400 Bad Request";
|
|
|
|
// [修复] 添加 CORS 头,允许诊断页面跨域访问
|
|
byte[] response = Encoding.UTF8.GetBytes(
|
|
$"HTTP/1.1 {statusLine}\r\n" +
|
|
"Access-Control-Allow-Origin: *\r\n" +
|
|
"Access-Control-Allow-Methods: GET, POST\r\n" +
|
|
"Content-Type: application/json; charset=utf-8\r\n" +
|
|
$"Content-Length: {Encoding.UTF8.GetByteCount(json)}\r\n\r\n" +
|
|
json
|
|
);
|
|
|
|
stream.Write(response, 0, response.Length);
|
|
stream.Flush();
|
|
stream.Close();
|
|
}
|
|
catch { }
|
|
}
|
|
|
|
#endregion
|
|
}
|
|
} |