Expect a připojení na seriový port switche

David123

Expect a připojení na seriový port switche
« kdy: 04. 12. 2012, 20:36:48 »
Ahoj, občas potřebuju nastavit switch pomocí seriového portu (automaticky), dosud jsem používal minicom společně s runscriptem, chtěl bych vypustit minicom a udělat to samé pouze v expectu.

Tohle je runscript který mi fungoval:

Kód: [Vybrat]
timeout 600
send ""
send ""
send ""
expect {
"Press any key to continue"
timeout 30 goto next
}
next:
send ""
send ""
send ""
expect {
"ProCurve 2910al-48G Switch#"
timeout 30 ! killall minicom
}
send "show flash"
expect {
"ProCurve 2910al-48G Switch"
  timeout 300
}

Problém je, že se nějak nemůžu připojit přes seriovou linku na ten switch... Pomocí minicomu, nebo microcomu se připojím vžycky ok.

Kód: [Vybrat]
#!/usr/bin/expect -f

set baud 57600
set device /dev/ttyS1
set timeout 3000

spawn -open [open $device w+]
#set spawned [spawn -open [open $device w+]]
#puts "[string trim $spawned \r\n]"
stty raw < $device
stty echo istrip parity $baud crtscts hupcl < $device
send -- "\r"
send -- "\r"
send -- "\r"
expect  "Press any key to continue"
send -- "\r"
expect "*#"
send -- "show flash\r"

Problém je, že toto mi nefunguje... netušíte kde dělám chybu? Ten switch by měl komunikovat přes seriovou linku jako VT100 terminál. Je potřeba mu odeslat před zahájením komunikace 3x CR aby se probral a určil správně rychlost...


artk

Re:Expect a připojení na seriový port switche
« Odpověď #1 kdy: 05. 12. 2012, 07:27:58 »
Ahoj, možná blbost, ale co to zkusit místo v RAW modu v edit modu?

David123

Re:Expect a připojení na seriový port switche
« Odpověď #2 kdy: 05. 12. 2012, 10:35:54 »
Myslíš třeba takhle?

Kód: [Vybrat]
stty +edit < $deviceChápu dobře že princip by měl být:
  • Otevřu pomocí spawn zařízení /dev/ttyS0
  • Spustím stty, jako vstup mu dám /dev/ttyS0 a spávně ho nastavím
  • Můžu normálně komunikovat

Ale asi to takhle jednoduché není... nebo ano? Šlo by využít místo toho spawn open třeba spawn microcom?

David123

Re:Expect a připojení na seriový port switche
« Odpověď #3 kdy: 05. 12. 2012, 12:49:10 »
Tak jsem zkoušel toto:

Kód: [Vybrat]
#!/usr/bin/expect -f

set speed 57600
set dev /dev/ttyS1

set timeout 3000
spawn microcom -s $speed $dev

send "\r"
send "\r"
send "\r"
#expect "*#*"
send "show flash\r"
#send "ahoj"
expect "*Switch*"
send "configure\r"

Na jiném terminálu jsem si pustil
Kód: [Vybrat]
cat < /dev/ttyS1abych viděl co se děje, výše uvedený kód mi funguje až do okamžiku kdy je tam
Kód: [Vybrat]
expect "*Switch*" - na tom se zastaví, z výpisu catu je vidět že všechno předtím se provede. Pokud zakomentuju ten expect tak se nestane vůbec nic. Ani se nepošlou ty první tři
Kód: [Vybrat]
\r
Netuším co dělám špatně. 

Kód: [Vybrat]
expect version 5.44.1.15
argv[0] = /usr/bin/expect  argv[1] = -d  argv[2] = /home/david/read.sh
set argc 0
set argv0 "/home/david/read.sh"
set argv ""
executing commands from command file /home/david/read.sh
spawn microcom -s 57600 /dev/ttyS1
parent: waiting for sync byte
parent: telling child to go ahead
parent: now unsynchronized from child
spawn: returns {1945}
send: sending "\r" to { exp6 }
send: sending "\r" to { exp6 }
send: sending "\r" to { exp6 }
send: sending "show flash\r" to { exp6 }

expect: does "" (spawn_id exp6) match glob pattern "*Switch*"? no


Vypadá to jakoby expect nebyl schopný číst odpovědi od microcomu....

artk

Re:Expect a připojení na seriový port switche
« Odpověď #4 kdy: 05. 12. 2012, 19:09:52 »


David123

Re:Expect a připojení na seriový port switche
« Odpověď #5 kdy: 06. 12. 2012, 21:58:26 »
Chtěl bych to udělat právě BEZ minicomu. Každopádně ale děkuju moc, že vůbec reaguješ. Našel jsem někde tenhle kus kódu a to mi částečně jde:

Kód: [Vybrat]
#!/usr/bin/expect -df

set timeout 1

#Open serial port
set portname "/dev/ttyS1"
spawn -open [set port [open $portname "r+"]]
fconfigure $port -mode 57600,n,8,1

resp tohle správně otevře port, lze na něj něco posílat a čekat na odpověď, potřebuju ale při inicializaci spojení vytvořit smyčku která bude posílat <CR> dokud nebude odpovědí prompt (končící #), protože switch z toho pozná jaká je rychlost, vypíše nějaký hlášky a potom čeká na příkazy na té seriové lince.

Zkoušel jsem něco ve stylu:

Kód: [Vybrat]
#!/usr/bin/expect -df

... otevreni viz nahore ....

while {1} {
  send "\r"
  sleep 1
  expect {
    "*#*" {
      break
    }   
  }
}
send "\r"
send "show flash\r"

Tohle se ale chová divně... podle debug výpisu to vypadá že to projede několikrát tu smyčku a pak to z ní vyskočí a pošle to show flash, ale od switche nepřijde žádná odpověď...

Zejtra můžu hodit debug výpis.

David123

Re:Expect a připojení na seriový port switche
« Odpověď #6 kdy: 07. 12. 2012, 13:35:44 »
Tak tohle funguje! :)

Kód: [Vybrat]
#!/usr/bin/expect -f

#Set variables
set timeout 1
set env(TERM) "vt100"
set prompt "*#*"

#Open serial port
set portname "/dev/ttyS1"
#spawn -open [set port [open $portname "r+"]]
spawn -open [set port [open $portname w+]]
fconfigure $port -mode 57600,n,8,1

#Init loop
send "\r"
while {1} {
  send "\r"
  sleep 1
  expect "$prompt" {
    break
  }
}
send "show flash\r"


expect "$prompt"
#expect eof
#send "configure\r"



artk

Re:Expect a připojení na seriový port switche
« Odpověď #7 kdy: 07. 12. 2012, 21:21:18 »
Tak to je fajn. :-)

Mé příspěvky byly poněkud mimo, s expectem jsem zatím nedělal, takže něco nového pro mne.

Komunikace přes sériový port mne zajímá, chtěl bych přes něj zkusit odečítat data přes Android zařízení.
Ale asi bude jednodušší na něj nainstalovat Linux, než zápasit  s USB->RS232 ovladačem na Androidu.
Otázka je, zda to bude přes ten USB->RS232  FTDI převodník  vůbec možné. :-)