Пример кода для управления Ethernet / Telnet видео коммутатором - PullRequest
0 голосов
/ 27 марта 2019

У нас есть видеопереключатель NTI (модель серии SM-nCm-15V-LC Veemux), которым мы должны управлять через Ethernet.Если я подключаюсь к нему через сеанс telnet, я могу отправлять команды, и коммутатор работает просто отлично.Мы написали некоторый код Ethernet для отправки тех же команд на коммутатор, и он не работает.Я связался с NTI, который прислал мне ссылку на некоторый общий код telnet, но этот код открывает окно telnet, которое я не хочу делать.Они говорят, что у них нет примера кода для отправки мне.

Кто-нибудь делал это раньше?Я приложил код (без какого-либо конкретного кода telnet), так что, может быть, я что-то упустил?Я знаю, что порт 2005 является правильным (согласно документации, плюс он работает в окне telnet с замазкой).

Любая помощь очень ценится!

Я попытался изменить тип соединения сокета с 0к TCP (6) без разницы, и я попытался добавить / n после / r в сообщении, но это не сработало либо

char CSMessage[9] = { 'C','S',' ', (char)0x30, (char)0x00,',', (char)0x30, (char)0x00, '\r' };

void CVideoSwitchControl::Initialize()
{
    vidSwitchPort = 2005;

    //Set up networking
    WSADATA wsaData;
    HRESULT hr;
    hr = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (hr != 0)
    {
        //Something went wrong
        AfxMessageBox("Error with setting up networking...");
        exit(0);
    }

    //Create socket
    vidSwitchSock = socket(AF_INET, SOCK_STREAM, 0);
    if (vidSwitchSock == INVALID_SOCKET)
    {
        //Something went wrong
        AfxMessageBox("Error creating socket.");
        WSACleanup();
        exit(0);
    }

    //Setup connection criteria to switch
    vidSwitchAddr.sin_family = AF_INET;
    hr = inet_pton(AF_INET, "192.168.1.30", &vidSwitchAddr.sin_addr);
    if (hr < 0)
    {
        //Something went wrong...
        AfxMessageBox("Failed to resolve IP of switch.");
        exit(0);
    }
    vidSwitchAddr.sin_port = htons(vidSwitchPort);

    //Attempt to establish connection
    hr = connect(vidSwitchSock, (SOCKADDR *)&vidSwitchAddr, sizeof(vidSwitchAddr));
    if (hr == SOCKET_ERROR)
    {
        //Something went wrong...
        AfxMessageBox("Failed to establish connection to switch.");
        WSACleanup();
        exit(0);
    }

    char buff[10];

    //Any response from the switch after connection?
    bytesRecv = recv(vidSwitchSock, (char*)&buff, sizeof(buff), 0);
    if (bytesRecv == SOCKET_ERROR || bytesRecv== 0)
    {
        //Something went wrong...
        AfxMessageBox("Switch not responding.");
        WSACleanup();
        exit(0);
    }

    //What did we get back?


    //if we got response, we're in and the switch in ready for control
    return;
}
void CVideoSwitchControl::SetVideoSwitch(int channel, OutputMonitor monitor)
{
    //did we receive valid channel and monitor values?
    if (channel >= MaxInputs)
    {
        //Invalid input channel
        AfxMessageBox("Invalid input selected for video switch.");
        exit(0);
    }
    if (monitor >= MaxMonitors)
    {
        //Invalid monitor selected for output
        AfxMessageBox("Invalid output monitor selected for video switch.");
        exit(0);
    }

    //Pack up CS message bytes 5 and 8
    CSMessage[4] = (char)inputMap[channel - 1];
    CSMessage[7] = (char)outputMap[monitor - 1];

    //Send CS message to video switch
    bytesSent = send(vidSwitchSock, (char*)&CSMessage, sizeof(CSMessage), 0);
    if (bytesSent == SOCKET_ERROR || bytesSent == 0)
    {
        //Video switch not responding
        AfxMessageBox("Video switch not responding.");
        WSACleanup();
        return;
    }

    //Maybe check for what the switch responds?...
    return;
}

Сейчас коммутатор не отвечает.Если я открываю окно telnet и вручную отправляю команды, это работает, поэтому что-то не так в кодовой части вещей.

...