2017-07-07 5 views
-1

J'ai besoin d'interroger l'imprimante sur le protocole JetDirect (Tcp-IP Port 9100)Powershell Tcp-IP, comment, Se connecter/SendData/ReadResult/Déconnexion

je l'ai déjà écrire le code pour connecter et déconnecter, mais pour mettre et lire les données que j'ai un problème :(

'printer.local:9100' | Connect-TcpHost | Disconnect-TcpHost 

résultat

TcpDestNodes  IsOpen Latency Query 
------------  ------ ------- ----- 
printer.local:9100 True 0,7065 {} 

Mon code

function Connect-TcpHost (
    [Parameter(ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true)]$Dest, 
    $TCPtimeout=250 
    ) { 
    Begin { 

    } Process { 
     ($HostName, $port) = $Dest.split(':') 
     Write-Verbose "$HostName : $port" 
     $tcpClient = New-Object System.Net.Sockets.TCPClient 
     $connect = $tcpClient.BeginConnect($HostName,$port,$null,$null) 

     Write-Verbose "Connecting..." 
     $timeMs = (Measure-Command { 
      $wait = $connect.AsyncWaitHandle.WaitOne($TCPtimeout,$false) 
      Write-Verbose "Connecting 2..." 
     }).TotalMilliseconds 
     If (!$wait) { 
      Write-error "$HostName : $Port" 
      Write-Verbose "Close connections..." 
      $tcpClient.Close() 
      $tcpClient.Dispose() 
      return; 
     } 
     [pscustomobject][ordered]@{ 
      TcpDestNodes = $dest 
      tcpClient = $tcpClient 
      connect = $connect 
      IsOpen = $true 
      Latency = $timeMs 
      Query = @() 
     } 
    } End { 

    } 
} 
function Disconnect-TcpHost (
    [Parameter(ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true)]$ObjTcp 
    ) { 
    Begin { 
    } Process { 
     Write-Verbose "Disconnecting..." 
     $ObjTcp.tcpClient.Close() 
     $ObjTcp.tcpClient.Dispose() 
     [pscustomobject][ordered]@{ 
      TcpDestNodes = $ObjTcp.TcpDestNodes 
      IsOpen = $ObjTcp.IsOpen 
      Latency = $ObjTcp.Latency 
      Query = $ObjTcp.Query 
     } 
    } End { 

    } 
} 
+1

Vous utilisez telnet pour vous connecter à l'imprimante de sorte que déjà beaucoup de blogs sur ce sujet sont disponibles. [Celui-ci] (https://thesurlyadmin.com/2013/04/04/using-powershell-as-a-telnet-client/) qui couvre le processus –

Répondre

0

I Write 2 nouvelle fonction Put-TcpHost() et Read-TcpHost()

'printer.local:9100' | Connect-TcpHost -verbose | Put-TcpHost -query '@PJL INFO ID' -verbose | Read-TcpHost -verbose | Disconnect-TcpHost -verbose 

retour

TcpDestNodes : 10.48.5.102:9100 
IsOpen  : True 
Latency  : 0,8351 
Query  : {@{Type=Query; Data=System.Object[]}, @{Type=Answer; Data=System.Object[]}} 

enter image description here

tout mon Tcp-Tools.ps1

function Connect-TcpHost (
    [Parameter(ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true)]$Dest, 
    $TCPtimeout=250 
    ) { 
    Begin { 

    } Process { 
     ($HostName, $port) = $Dest.split(':') 
     Write-Verbose "$HostName : $port" 
     $tcpClient = New-Object System.Net.Sockets.TCPClient 
     $connect = $tcpClient.BeginConnect($HostName,$port,$null,$null) 

     Write-Verbose "Connecting..." 
     $timeMs = (Measure-Command { 
      $wait = $connect.AsyncWaitHandle.WaitOne($TCPtimeout,$false) 
     }).TotalMilliseconds 
     If (!$wait) { 
      Write-error "$HostName : $Port" 
      Write-Verbose "Echec, Close socket..." 
      $tcpClient.Close() 
      $tcpClient.Dispose() 
      return; 
     } 
     Write-Verbose "Connection Available" 
     [pscustomobject][ordered]@{ 
      TcpDestNodes = $dest 
      tcpClient = $tcpClient 
      connect = $connect 
      IsOpen = $true 
      Latency = $timeMs 
      Query = @() 
     } 
    } End { 

    } 
} 
function Put-TcpHost (
    [Parameter(ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true)]$ObjTcp,[string]$query 
    ) { 
    Begin { 

    } Process { 
     if ($ObjTcp.tcpClient.Connected) { 
      Write-Verbose "Send > $query" 
      $ObjTcp.query += [pscustomobject][ordered]@{ 
        Type = 'Query' 
        Data = @($query) 
      } 
      $data = [System.Text.Encoding]::ASCII.GetBytes("$query`n") 
      $stream = $ObjTcp.TcpClient.GetStream() 
      $stream.Write($data, 0, $data.Length) 
     } else { 
      Write-error "N'est plus connecte !" 
      $ObjTcp.tcpClient.Close() 
      $ObjTcp.tcpClient.Dispose() 
      return; 
     } 
     $ObjTcp 
    } End { 

    } 
} 
function Read-TcpHost (
    [Parameter(ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true)]$ObjTcp, 
    $timeout=2500 
    ) { 
    Begin { 
     $step = 25 
    } Process { 
     $i=$timeout/$step 
     Write-Verbose "> Waiting Answer" 
     While ([int64]$ObjTcp.tcpClient.Available -le 0 -and $i--) { 
      Start-Sleep -Milliseconds $step 
     } 
     Write-Verbose "Reply $($timeout-$i*$step)ms > Bytes available: $($ObjTcp.tcpClient.Available)" 
     If ([int64]$ObjTcp.tcpClient.Available -gt 0) { 
      $stringBuilder = New-Object Text.StringBuilder 
      try { 
       $stream = $ObjTcp.TcpClient.GetStream() 
       $bindResponseBuffer = New-Object Byte[] -ArgumentList $ObjTcp.tcpClient.Available 
       [Int]$response = $stream.Read($bindResponseBuffer, 0, $bindResponseBuffer.count) 
       $Null = $stringBuilder.Append(($bindResponseBuffer | ForEach {[char][int]$_}) -join '') 

       Write-Verbose "Read > $(@($stringBuilder.Tostring() -split("`n"))[1])" 
       $ObjTcp.query += [pscustomobject][ordered]@{ 
        Type = 'Answer' 
        Data = @($stringBuilder.Tostring() -split("`n")) 
       } 
      } catch { 
       Write-error "Probleme !" 
       $ObjTcp.tcpClient.Close() 
       $ObjTcp.tcpClient.Dispose() 
       return; 
      } 
     } 
     $ObjTcp 
    } End { 

    } 
} 
function Disconnect-TcpHost (
    [Parameter(ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true)]$ObjTcp 
    ) { 
    Begin { 
    } Process { 
     Write-Verbose "Disconnecting..." 
     $ObjTcp.tcpClient.Close() 
     $ObjTcp.tcpClient.Dispose() 
     [pscustomobject][ordered]@{ 
      TcpDestNodes = $ObjTcp.TcpDestNodes 
      IsOpen = $ObjTcp.IsOpen 
      Latency = $ObjTcp.Latency 
      Query = $ObjTcp.Query 
     } 
    } End { 

    } 
} 
+0

14 minutes entre poser et répondre à votre propre question avec deux très approfondie les fonctions. Il me semble que vous aviez déjà la solution avant même d'avoir écrit votre question. –

+2

@JamesC. Les réponses auto sont autorisées et même encouragées, veuillez voir [Puis-je répondre à ma propre question?] (Https://stackoverflow.com/help/self-answer) –

+0

mon code Put/Read, ne fonctionne pas à mon premier poste et est maintenant pas parfait, j'ai besoin de vos réponses ou de vos idées d'amélioration – Alban