PJLink-CSharp-连接投影机

控制类

using System;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;

public class PJLinkController
{
    private readonly string _ipAddress;
    private readonly int _port = 4352; // PJLink 默认端口
    private readonly string _password = ""; // 如果投影机设置了密码,需在此填入

    public PJLinkController(string ipAddress, string password = "")
    {
        _ipAddress = ipAddress;
        _password = password;
    }

    // 连接投影机并执行命令
    private async Task<string> SendCommandAsync(string command)
    {
        using var client = new TcpClient();
        await client.ConnectAsync(_ipAddress, _port);
        
        using var stream = client.GetStream();
        var buffer = new byte[1024];
        
        // 读取欢迎消息
        var bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length);
        var welcomeMessage = Encoding.ASCII.GetString(buffer, 0, bytesRead);
        
        // 验证是否需要密码
        string authString = "";
        if (welcomeMessage.Contains("%1"))
        {
            // 计算认证哈希
            var hash = CalculateHash(welcomeMessage.Substring(2, 8));
            authString = $"%1{hash}";
        }
        
        // 发送带认证的命令
        var commandBytes = Encoding.ASCII.GetBytes($"{authString}{command}\r");
        await stream.WriteAsync(commandBytes, 0, commandBytes.Length);
        
        // 读取响应
        bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length);
        return Encoding.ASCII.GetString(buffer, 0, bytesRead);
    }
    
    // 计算认证哈希
    private string CalculateHash(string salt)
    {
        if (string.IsNullOrEmpty(_password)) return "";
        return $"{salt}{_password.GetHashCode():X8}";
    }

    // 电源控制
    public async Task PowerOnAsync() => await SendCommandAsync("%1POWR 1");
    public async Task PowerOffAsync() => await SendCommandAsync("%1POWR 0");
    public async Task<string> GetPowerStatusAsync() => await SendCommandAsync("%1POWR ?");

    // 3D模式控制(理光特有命令)
    public async Task Set3DModeAsync(int mode)
    {
        // 理光3D模式代码:
        // 0 = 3D关闭, 1 = 帧连续, 2 = 并排, 3 = 上下, 4 = 帧封装
        await SendCommandAsync($"%1AVMT 3D {mode}");
    }
    
    public async Task<string> Get3DModeAsync() => await SendCommandAsync("%1AVMT 3D ?");

    // 输入源切换
    //public async Task SetInputSourceAsync(string source)
    //{
    //    // 输入源代码示例:
    //    // RGB1 = 11, RGB2 = 12, HDMI1 = 31, HDMI2 = 32, Network = 41
    //    await SendCommandAsync($"%1INPT {source}");
    //}

    // 信号源切换方法
    public async Task SetInputSourceAsync(string sourceCode)
    {
        // 验证输入源代码格式
        if (!System.Text.RegularExpressions.Regex.IsMatch(sourceCode, @"^\d{2}$"))
        {
            throw new ArgumentException("输入源代码必须是两位数字", nameof(sourceCode));
        }
        // 输入源代码示例:
        // RGB1 = 11, RGB2 = 12, HDMI1 = 31, HDMI2 = 32, Network = 41
        await SendCommandAsync($"%1INPT {sourceCode}");
    }

    // 获取当前输入源
    public async Task GetCurrentInputSourceAsync()
    {
        var response = await SendCommandAsync("%1INPT ?");
        // 解析响应 (格式: %1INPT=xx)
        if (response.Contains("="))
        {
            return response.Split('=')[1].Trim();
        }
        return "未知";
    }


 

}

 

 

使用

// 使用示例
public static async Task Main()
{
    var controller = new PJLinkController("192.168.1.100"); // 替换为投影机实际IP
    
    // 开机
    await controller.PowerOnAsync();
    Console.WriteLine("已发送开机命令");
    
    // 等待投影机启动
    await Task.Delay(30000); // 等待30秒
    
    // 切换到HDMI1
    await controller.SetInputSourceAsync("31");
    Console.WriteLine("已切换到HDMI1");
    
    // 开启3D模式(帧连续)
    await controller.Set3DModeAsync(1);
    Console.WriteLine("已开启3D模式");
    
    // 获取电源状态
    var status = await controller.GetPowerStatusAsync();
    Console.WriteLine($"电源状态: {status}");
    
    // 5分钟后关机
    await Task.Delay(300000);
    await controller.PowerOffAsync();
    Console.WriteLine("已发送关机命令");
}