Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: David123 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:
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.
#!/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...
-
Ahoj, možná blbost, ale co to zkusit místo v RAW modu v edit modu?
-
Myslíš třeba takhle?
stty +edit < $device
Chá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?
-
Tak jsem zkoušel toto:
#!/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
cat < /dev/ttyS1
abych viděl co se děje, výše uvedený kód mi funguje až do okamžiku kdy je tam 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 \r
Netuším co dělám špatně.
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....
-
Tady jsem našel příklad pro minicom:
http://www.unix.com/shell-programming-scripting/157574-expect-minicom.html
-
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:
#!/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:
#!/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.
-
Tak tohle funguje! :)
#!/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"
-
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é. :-)