• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Serwer WEB, ESP8266, Lua, ESPlorer i przesyłanie znaków ASCII wpisywanych z klawiatury przez UART

Object Storage Arubacloud
0 głosów
1,099 wizyt
pytanie zadane 23 lutego 2018 w JavaScript przez Czes Nowicjusz (160 p.)
edycja 10 marca 2018 przez Czes

Jak w tytule załączam fotkę ekranu serwera oraz, kod który powinien realizować funkcję przesyłania znaków ASCII z klawiatury do UART ale jest  błąd którego nie umiem określić.
Nie działa mianowicie funkcja przekazywania znaków wpisywanych z klawiatury do  zmiennej 'mycode'. Pozostałe funkcje programu włącznie z samą komunikacją UART (przycisk 'SENDtoUART') czyli nadawaniem i odbiorem znaków  działają bez zarzutu.
Linie kodu gdzie wg mnie przypuszczalnie tkwi błąd:

    conn:send('</form>\n')
conn:send('<form action="" method="GET">\n')
conn:send('<scripttype="text/javascript"\n')
conn:send('function inptext(){\n')
conn:send('var mycode = document.getElementById("field").value \n')
conn:send('document.getElementById("mycode").innerHTML = mycode}\n')
conn:send('</script>\n')

conn:send('<input type="text" id="field" />\n')
conn:send('<input type="submit" value="<-INPUT" onclick="inptext()" />\n')
conn:send('<div id="mycode"></div>\n')

Być może powinna być zastosowana inna metoda?
Jak widać na fotce program generuje przycisk onclick i okienko i można do niego wpisywać znaki. Jednak po kliknięciu przycisku  INPUT wpisane znaki znikają z okienka nic sie nie dzieje, czyli zmienna 'mycode' pozostaje pusta, ma wartość 'nil'.
Do obsługi programowania płytki używałem programu Flasher oraz ESPlorera wg opisu:
https://nodemcu.readthedocs.io/en/master/en/flash/#sdk-init-data

Jest pytanie i prośba do programistów, którzy ogarniają ESP8266 i programowanie w LUA by przyjrzeć sie temu.

całość kodu:

--uart
uart.setup(0,9600,8,0,1,1)
dwa = " "
datax = " "
--mycode= "oz"
gpio.mode(2, gpio.OUTPUT)
gpio.write(2, gpio.LOW)

---- Set the WEB AP server, constant IP address of the router needed
SSID = "TTTTTTTT" --input your router login
PW = "SSSSSSSSS"--input your router password
IPADR = "192.168.1.175"--Requested router static IP address for the ESP
IPROUTER = "192.168.1.1"--IP address your router (LAN)
PORT = "78"--set the inner port 
PORTZEWN = "31"--set the external port
wifi.setmode(wifi.STATION)
wifi.sta.setip({ip=IPADR,netmask="255.255.255.0",gateway=IPROUTER,port=PORT})
wifi.sta.config(SSID,PW)
srv=net.createServer(net.TCP) srv:listen(PORTZEWN,function(conn)
conn:on("receive",function(conn,payload)
--print(payload)
--print(wifi.sta.getmac())
--print(wifi.sta.getip())
    function ctrlpower()
   klik=string.sub(payload,kdesi[2]+1,#payload)

if klik=="ON2" then gpio.write(2, gpio.HIGH) dwa = "* " return end
if klik=="OFF2" then gpio.write(2, gpio.LOW) dwa = " " return end
if klik=="SENDtoUART" and mycode~=nil then uart.write(0,mycode.."$") return end--send to UART string
end

    kdesi={string.find(payload,"pwmi=")}
    if kdesi[2]~=nil then ctrlpower()end
    conn:send('HTTP/1.1 200 OK\n\n')
    conn:send('<!DOCTYPE HTML>\n')
    conn:send('<html>\n')
    conn:send('<head><meta  content="text/html; charset=utf-8">\n')
    conn:send('<title>ESP8266</title></head>\n')
    conn:send('<body>\n')
    conn:send('<h4>NodeMcu Esp8266</h4>\n')
--------
    conn:send('<form action="" method="POST">\n')
   conn:send(dwa)
     conn:send('<input type="submit" name="pwmi" value="ON2">\n')
    conn:send('<input type="submit" name="pwmi" value="OFF2"><br><br>\n')
-------
    conn:send('<input type="submit" name="pwmi" value="SENDtoUART"><br><br>\n')
--   conn:send(mycode)
    conn:send(datax) --wyświetl odpowiedź odebraną z UART
conn:send('</form>\n')

----------------------------------------------------
conn:send('<form action="http://192.168.1.175:31" onsubmit="event.preventDefault(); return false;">\n')
--conn:send('<form onsubmit="event.preventDefault(); return false;">\n')
conn:send('<script type="text/javascript">\n')
conn:send('function wprowadz(){\n')
conn:send('var mycode = document.getElementById("pole").value\n')
conn:send('document.getElementById("mycode").innerHTML = mycode\n')
conn:send('console.log(mycode)}\n')
--conn:send('}\n')
conn:send('</script>\n')

conn:send('<input type="text" id="pole"/>\n')
conn:send('<input type="submit" value="<-INPUT" onclick="wprowadz()"/>\n')
conn:send('<div id="mycode"></div>\n')
--------------------------------------------------------
    conn:send('</form></body></html>\n')
    conn:on("sent",function(conn) conn:close() end)

end)
end)


--the dot ends the string of UART string receiving
uart.on("data", "\.", function(data)
datax = data
    if data=="quit\." then
      uart.on("data") -- unregister callback function
    end
end, 0)

--------------
--blinking led at output 4, its only for conroll program
znacznik = 1
pin=4
gpio.mode(pin, gpio.OUTPUT)
tmr.alarm(0, 100, 1,--2 sek
function ()
if znacznik == 0 then
gpio.write(pin, gpio.LOW)
znacznik = 1
else
gpio.write(pin, gpio.HIGH)
znacznik = 0
end
end)

Płytka ESP8266

 

komentarz 24 lutego 2018 przez ScriptyChris Mędrzec (190,190 p.)

conn:send('<scripttype="text/javascript"\n')

Czy tworzysz tutaj element <script> z atrybutem type? Tam spacja powinna być, czyli <script type...

function inptext()

Wstaw na końcu w funkcji console.log( mycode ). Wyświetla się coś? W ogóle, czy w konsoli nie pojawia się jakiś błąd?

1 odpowiedź

0 głosów
odpowiedź 24 lutego 2018 przez Czes Nowicjusz (160 p.)
edycja 24 lutego 2018 przez Czes

Wstawilem spację w 'script type' i po uruchomieniu programu skutek jest taki że zniknął na ekranie przycisk '<--INPUT' oraz to okienko po lewej jego stronie do wprowadzania znaków.

Dodałem w koncu lini conn:send('<script type="text/javascript">\n') znak '>' i po uruchomieniu wyzej wspomniane okienko znowu sie pokazało ale bład z wczytywamiem znakow jest dalej

 

 

Co do konsoli to jak rozumiem sa to dwa głowne okna po prowej stronie  czyli dolne 'LOG' i górne komunikaty. W górnym oknie niepojawiaja sie zadne komunikaty o bledach. W dolnym (zielony tekst) jest mnóstwo komunikatów, których nie da sie przekleić. Jeśli to cos moze dać to spróbuję je przepisać albo zrobic fotkę i zalaczyć.

cytat:"Wstaw na końcu w funkcji console.log( mycode ). Wyświetla się coś? W ogóle, czy w konsoli nie pojawia się jakiś błąd?"

Własnie nie rozumiem w ktorym miejscu mam wstawić to 'console.log( mycode )'?

komentarz 24 lutego 2018 przez ScriptyChris Mędrzec (190,190 p.)

Wstawilem spację w 'script type' i po uruchomieniu programu skutek jest taki że zniknął na ekranie przycisk '<--INPUT' oraz to okienko po lewej jego stronie do wprowadzania znaków 

Otwórz źródło strony (skrót CTRL + U lub prawy klawisz będąc w oknie przeglądarki i "Wyświetl źródło strony") i wklej tu proszę w bloczek do HTMLa kod strony. Być może trafił się jakiś błąd składni.

Co do konsoli to jak rozumiem sa to dwa głowne okna po prowej stronie  czyli dolne 'LOG' i górne komunikaty

Hmm, nie wiem o których oknach piszesz, ale ja miałem na myśli konsolę przeglądarki (klawisz F12) i w otwartym panelu powinieneś mieć zakładkę "Console" lub "Konsola" (zależnie od przeglądarki/ustawionego języka).

Własnie nie rozumiem w ktorym miejscu mam wstawić to  

Pomiędzy poniższe dwie linijki:

conn:send('document.getElementById("mycode").innerHTML = mycode}\n')
conn:send('</script>\n')
komentarz 24 lutego 2018 przez Czes Nowicjusz (160 p.)
edycja 24 lutego 2018 przez Czes
<!DOCTYPE HTML>
<html>
<head><meta  content="text/html; charset=utf-8">
<title>ESP8266</title></head>
<h4>NodeMcu Esp8266</h4>
<form action="" method="POST">
 <input type="submit" name="pwmi" value="ON2">
<input type="submit" name="pwmi" value="OFF2"><br><br>
<input type="submit" name="pwmi" value="SENDtoUART">
zp33$</form>
<form action="" method="GET">
<script type="text/javascript">
function inptext(){
var mycode = document.getElementById("field").value
document.getElementById("mycode").innerHTML = mycode}
</script>
<input type="text" id="field" />
<input type="submit" value="<-INPUT" onclick="inptext()" />
<console.log( mycode )/>
<div id="mycode"></div>
</form></body></html>

Wstawilem linię wraz  z  conn:send('<console.log( mycode )/>\n')

Powyzszy wydruk jest skopiowany juz po wstawieniu tej linii.

Własnie, czy nie brakuje znaków '<>' w liniach skryptu jawy?

Próbowalem wczesniej wstawic te znaki  w linie odpowiedno i zrobic próbę ale nie rozwiazalo to problemu.

 

 

komentarz 24 lutego 2018 przez ScriptyChris Mędrzec (190,190 p.)

Brakuje otwierającego tagu <body>. Wstaw go za </head>.

Własnie, czy nie brakuje znaków '<>' w liniach skryptu jawy?

Tu nie ma Javy, jest JavaScript. Nie, znaczniki "<>" służą do tworzenia tagów w języku HTML.

 Tą linijkę:

<console.log( mycode )/>

Wstaw - jak już wcześniej napisałem - pomiędzy poniższe dwie linijki:

conn:send('document.getElementById("mycode").innerHTML = mycode}\n')

conn:send('</script>\n')

komentarz 24 lutego 2018 przez Czes Nowicjusz (160 p.)
<!DOCTYPE HTML>
<html>
<head><meta  content="text/html; charset=utf-8">
<title>ESP8266</title></head>
<h4>NodeMcu Esp8266</h4>
<form action="" method="POST">
 <input type="submit" name="pwmi" value="ON2">
<input type="submit" name="pwmi" value="OFF2"><br><br>
<input type="submit" name="pwmi" value="SENDtoUART">
zp33$</form>
<form action="" method="GET">
<script type="text/javascript">
function inptext(){
var mycode = document.getElementById("field").value
document.getElementById("mycode").innerHTML = mycode}
<console.log( mycode )/>
</script>
<input type="text" id="field" />
<input type="submit" value="<-INPUT" onclick="inptext()" />
<div id="mycode"></div>
</form></body></html>

Wkleilem:

conn:send('document.getElementById("mycode").innerHTML = mycode}\n')
conn:send('<console.log( mycode )/>\n')
conn:send('</script>\n')

 

komentarz 24 lutego 2018 przez ScriptyChris Mędrzec (190,190 p.)

<title>ESP8266</title></head>

<h4>NodeMcu Esp8266</h4>

Nie wstawiłeś otwierającego tagu <body>. Powinien być pomiędzy </head> a <h4>.

Co pokazuje teraz konsola?


document.getElementById("mycode").innerHTML = mycode}

<console.log( mycode )/>

Chyba klamry nie wstawiłeś tam gdzie trzeba. Powinna być tuż przed zamykającym tagiem </script>. I linijka z console bez tych dziubków "<" i ">". Czyli:

<script type="text/javascript">
    function inptext(){
        var mycode = document.getElementById("field").value;
        document.getElementById("mycode").innerHTML = mycode;
        console.log(Â mycodeà );
    }
</script>

Jeszcze kodowanie się pokrzaczyło, bo w console masz dziwne znaki. 

komentarz 24 lutego 2018 przez Czes Nowicjusz (160 p.)

 

<!DOCTYPE HTML>
<html>
<head><meta  content="text/html; charset=utf-8">
<title>ESP8266</title></head>
<body>
<h4>NodeMcu Esp8266</h4>
<form action="" method="POST">
 <input type="submit" name="pwmi" value="ON2">
<input type="submit" name="pwmi" value="OFF2"><br><br>
<input type="submit" name="pwmi" value="SENDtoUART">
zp33$</form>
<form action="" method="GET">
<script type="text/javascript">
function inptext(){
var mycode = document.getElementById("field").value
document.getElementById("mycode").innerHTML = mycode}
<console.log( mycode )/>
</script>
<input type="text" id="field" />
<input type="submit" value="<-INPUT" onclick="inptext()" />
<div id="mycode"></div>
</form></body></html>

Zrobione

   conn:send('<title>ESP8266</title></head>\n')
    conn:send('<body>\n')
	conn:send('<h4>NodeMcu Esp8266</h4>\n')

Sprawdzam ale bez pozytywnego skutku  :(

komentarz 24 lutego 2018 przez ScriptyChris Mędrzec (190,190 p.)

<console.log( mycode )/>

A co z tą linijką...? Usuń te "dziubki" i klamrę z wyższej linijki przesuń za console. Opisałem Ci to w poprzednim komentarzu.

komentarz 24 lutego 2018 przez Czes Nowicjusz (160 p.)
<!DOCTYPE HTML>
<html>
<head><meta  content="text/html; charset=utf-8">
<title>ESP8266</title></head>
<body>
<h4>NodeMcu Esp8266</h4>
<form action="" method="POST">
 <input type="submit" name="pwmi" value="ON2">
<input type="submit" name="pwmi" value="OFF2"><br><br>
<input type="submit" name="pwmi" value="SENDtoUART">
zp33$</form>
<form action="" method="GET">
<script type="text/javascript">
function inptext(){
var mycode = document.getElementById("field").value
document.getElementById("mycode").innerHTML = mycode
console.log( mycode )}
</script>
<input type="text" id="field" />
<input type="submit" value="<-INPUT" onclick="inptext()" />
<div id="mycode"></div>
</form></body></html>

Czy tak jest dobrze?

conn:send('document.getElementById("mycode").innerHTML = mycode\n')
conn:send('console.log( mycode )}\n')
conn:send('</script>\n')

 

komentarz 24 lutego 2018 przez ScriptyChris Mędrzec (190,190 p.)
Lepiej. Co pokazuje teraz konsola przeglądarki?
komentarz 24 lutego 2018 przez Czes Nowicjusz (160 p.)
edycja 24 lutego 2018 przez Czes
To znaczy F12 ? Nie udaje mi sie tego skopiowac ale są takie same  komunikaty jak na załączonej kopii z CTLR+U. Mam fotkę ekranu ale w tej chwili problem z przesłaniem jej.

Zauwazylem pewną zmianę. To znaczy po wpisaniu znaków  do okienka i klikmieciu przycisku na moment pojawia się ten tekst pod okienkiem i znika.

Ale tak się dzieje gdy usunę te linię    conn:send('console.log( mycode )}\n')
komentarz 24 lutego 2018 przez ScriptyChris Mędrzec (190,190 p.)

To znaczy F12 ? Nie udaje mi sie tego skopiowac ale są takie same  komunikaty jak na załączonej kopii z CTLR+U.

Możesz zapisać treść konsoli do pliku. Jeśli korzystasz z przeglądarki Chrome: https://support.shortpoint.com/support/solutions/articles/1000222881-save-google-chrome-browser-s-console-file 

po wpisaniu znaków  do okienka i klikmieciu przycisku na moment pojawia się ten tekst pod okienkiem i znika.

Pewnie formularz jest zatwierdzany i odświeża się strona. Generalnie powinieneś użyć addEventListener, ale jako, że i tak masz już bałagan w kodzie, to zapisz wewnątrz znacznika <form> onsubmit="event.preventDefault(); return false;"

komentarz 24 lutego 2018 przez Czes Nowicjusz (160 p.)
edycja 24 lutego 2018 przez Czes

W okienku console jest komunikat - Uncaught SyntaxError: missing ) after argument list   index :17)

 

Próbowalem wpisać tak jak poniżej ale jest źle. Na ekranie przegladarki wyswietla sie fragment tego kodu

conn:send('<form action="" method="GET">\n')
conn:send('<form> onsubmit="event.preventDefault(); return false;">\n')
conn:send('<script type="text/javascript">\n')
komentarz 24 lutego 2018 przez ScriptyChris Mędrzec (190,190 p.)

conn:send('<form> onsubmit

Usuń znak ">".

 W okienku console jest komunikat

Czy możesz kliknąć w index:17 (w środku komunikatu o błędzie - wygląda jak link, jest podkreślony)? Powinno przekierować Cię do tego miejsca - zrób screen i pokaż. Możliwe, że jest to spowodowane dziwnymi znakami "Â mycodeÂ", które przekazujesz do console.log.

komentarz 24 lutego 2018 przez Czes Nowicjusz (160 p.)
edycja 24 lutego 2018 przez Czes

Utknąlem z print screenem na windowsie normalnie uzywam suse i tam to jest akurat proste.

Gdzie mam kliknąć? Klikniecie na console nic nie daje nie otwiera się żadne okienko 'wyslij plik' tak jak to jest w opisie.

To jest do kitu, obrazek jest nieczytelny za mała rozdzielczość tego okna

komentarz 24 lutego 2018 przez ScriptyChris Mędrzec (190,190 p.)
Pokazałem zieloną strzałką https://imgur.com/a/58tBc
komentarz 24 lutego 2018 przez Czes Nowicjusz (160 p.)
Przeladowywalem jeszcze ten obrazek próbujac poprawić czytelność. Pewnie strzalka sie skasowala.
komentarz 24 lutego 2018 przez ScriptyChris Mędrzec (190,190 p.)

Nie widzisz zielonej strzałki?

komentarz 24 lutego 2018 przez Czes Nowicjusz (160 p.)
edycja 24 lutego 2018 przez Czes

Teraz OK. Indeks pojawia się jesli wczesniej kliknę w ktoryś przycisk (serwera) w przegladarce i bład jest sygnalizowany na tym listingu tylko i za kazdym razem obok lini 'console.log( mycode )}'  (czerwone kolko z krzyżykiem) a pod ( mycode )}'  jest czerwony wężyk

Numery błedu to index 18 oraz index 43

Jesli klikne na przycisk 'INPUT' to pojawia sie tylko bład index18

<!DOCTYPE HTML>
<html>
<head><meta  content="text/html; charset=utf-8">
<title>ESP8266</title></head>
<body>
<h4>NodeMcu Esp8266</h4>
<form action="" method="POST">
* <input type="submit" name="pwmi" value="ON2">
<input type="submit" name="pwmi" value="OFF2"><br><br>
<input type="submit" name="pwmi" value="SENDtoUART">
zp33$</form>
<form action="" method="GET">
<form onsubmit="event.preventDefault(); return false;">
<script type="text/javascript">
function inptext(){
var mycode = document.getElementById("field").value
document.getElementById("mycode").innerHTML = mycode
console.log( mycode )}
</script>
<input type="text" id="field" />
<input type="submit" value="<-INPUT" onclick="inptext()" />
<div id="mycode"></div>
</form></body></html>
HTTP/1.1 200 OK

 

komentarz 24 lutego 2018 przez ScriptyChris Mędrzec (190,190 p.)

obok lini 'console.log( mycode )}' 

Pisałem Ci o tym wcześniej: https://forum.pasja-informatyki.pl/329380/serwer-esp8266-esplorer-przesylanie-znakow-ascii-wpisywanych-klawiatury-przez-uart?show=329715#c329715. Wiesz już co poprawić. :)

 

komentarz 24 lutego 2018 przez Czes Nowicjusz (160 p.)
edycja 24 lutego 2018 przez Czes

No wlasnie nie bardzo wiem. Klikam na ten link i kieruje mnie spowrotem w to samo miejsce tutaj.

Ten znak ">" oczywiscie usunalem i tamten blad zniknął.

 

komentarz 24 lutego 2018 przez ScriptyChris Mędrzec (190,190 p.)

Popraw te dziwne znaki w console.log.

komentarz 24 lutego 2018 przez Czes Nowicjusz (160 p.)
edycja 24 lutego 2018 przez Czes

Wykasowałem je razem ze spacjami w nawiasie i teraz w konsoli przegladarki nie pojawia sie bład. Wprowadzenie znaków do okna i klikniecie '<--INPUT' skutkuje  teraz wyswietleniem pod okienkiem ma ulamek sekundy wprowadzonego tekstu.  

Jesli uruchamia sie podobny skrypt w HTMLu to dziala to podobnie ale tekst pod okienkiem nie znika az do czasu wprowadzenia kolejnego ciagu znaków...

conn:send('console.log(mycode)}\n')

 

komentarz 24 lutego 2018 przez ScriptyChris Mędrzec (190,190 p.)
edycja 24 lutego 2018 przez ScriptyChris

Masz jeszcze jeden niezamknięty <form>:

<form action="" method="GET">

Zdecyduj się na któryś, bo formularzy w HTML nie możesz zagnieżdżać.

Wprowadzenie znaków do okna i klikniecie '<--INPUT' 

A w konsoli pokazuje się to, co wpisałeś w console.log? Powinno być to, co wpisałeś w elemencie o id="field".

komentarz 24 lutego 2018 przez Czes Nowicjusz (160 p.)
edycja 25 lutego 2018 przez Czes
--    conn:send('</form>\n')
--conn:send('<form action="" method="GET">\n')

Usunąłem te dwie linie powyzej pozostala linia z 

    conn:send('<form action="" method="POST">\n') nie widze jednak efektu

Teraz po kliknieciu przycisku 'INPUT' pojawia sie w 'console' przez ułamek sekundy 'index: 16' ale nie da sie tego wyswietlić tak jak poprzednio. 

Aktualnie całość kodu:

--uart
uart.setup(0,9600,8,0,1,1)
dwa = " "
initial=33
gpio.mode(2, gpio.OUTPUT)
gpio.write(2, gpio.LOW)

---- Set the WEB AP server, constant IP address of the router needed
SSID = "TES" --input your router login
PW = "B46"--input your router password
IPADR = "192.168.1.17"--Requested router static IP address for the ESP
IPROUTER = "192.168.1.1"--IP address your router (LAN)
PORT = "70"--set the inner port 
PORTZEWN = "301"--set the external port
wifi.setmode(wifi.STATION)
wifi.sta.setip({ip=IPADR,netmask="255.255.255.0",gateway=IPROUTER,port=PORT})
wifi.sta.config(SSID,PW)
srv=net.createServer(net.TCP) srv:listen(PORTZEWN,function(conn)
conn:on("receive",function(conn,payload)
--print(payload)
--print(wifi.sta.getmac())
--print(wifi.sta.getip())
    function ctrlpower()
   klik=string.sub(payload,kdesi[2]+1,#payload)


if klik=="ON2" then gpio.write(2, gpio.HIGH) dwa = "* " return end
if klik=="OFF2" then gpio.write(2, gpio.LOW) dwa = " " return end
if klik=="SENDtoUART" then uart.write(0, mycodex) return end--send to UART string
end

    kdesi={string.find(payload,"pwmi=")}
    if kdesi[2]~=nil then ctrlpower()end
    conn:send('HTTP/1.1 200 OK\n\n')
    conn:send('<!DOCTYPE HTML>\n')
    conn:send('<html>\n')
    conn:send('<head><meta  content="text/html; charset=utf-8">\n')
    conn:send('<title>ESP8266</title></head>\n')
    conn:send('<body>\n')
	conn:send('<h4>NodeMcu Esp8266</h4>\n')
--------
    conn:send('<form action="" method="POST">\n')
   conn:send(dwa)
     conn:send('<input type="submit" name="pwmi" value="ON2">\n')
    conn:send('<input type="submit" name="pwmi" value="OFF2"><br><br>\n')
-------
    conn:send('<input type="submit" name="pwmi" value="SENDtoUART"><br><br>\n')
   conn:send(mycodex)

----------------------------------------------------
    conn:send('</form>\n')
conn:send('<form action="" method="GET">\n')
conn:send('<form onsubmit="event.preventDefault(); return false;">\n')
conn:send('<script type="text/javascript">\n')
conn:send('function inptext(){\n')
conn:send('var mycode = document.getElementById("field").value\n')
conn:send('document.getElementById("mycode").innerHTML = mycode\n')
conn:send('console.log(mycode)}\n')
conn:send('</script>\n')

conn:send('<input type="text" id="field" />\n')
conn:send('<input type="submit" value="<-INPUT" onclick="inptext()" />\n')
conn:send('<div id="mycode"></div>\n')
--------------------------------------------------------
    conn:send('</form></body></html>\n')
    conn:on("sent",function(conn) conn:close() end)
end)
end)

----------------
if mycode~=nil then
mycodex="zp"..mycode.."$"--assemble string code for send UART
print (mycode)-- wydrukuj wynik w konsoli ESPlorer
--uart.write(0, mycodex)
else
mycode=initial
mycodex="zp"..mycode.."$"
print (mycode)
end


--the dot ends the string of UART string receiving
uart.on("data", "\.", function(data)
datax = data
    if data=="quit\." then
      uart.on("data") -- unregister callback function
    end
end, 0)

--------------
--blinking led at output 4, its only for conroll program
znacznik = 1
pin=4
gpio.mode(pin, gpio.OUTPUT)
tmr.alarm(0, 100, 1,--2 sek
function ()
if znacznik == 0 then
gpio.write(pin, gpio.LOW)
znacznik = 1
else
gpio.write(pin, gpio.HIGH)
znacznik = 0
end
end
)

 

 

komentarz 24 lutego 2018 przez ScriptyChris Mędrzec (190,190 p.)

usunąłem te dwie linie powyzej

Miałeś usunąć <form>, który tworzył zagnieżdżenie dla innego formularza. Nie możesz umieszczać formularzy wewnątrz innych. Możesz natomiast umieszczać je pod spodem:

// ŹLE
<form>
  <form>
    <form></form>
  </form>
</form>

// DOBRZE
<form></form>
<form></form>
<form></form>

Nie odpowiedziałeś na pytanie:

A w konsoli pokazuje się to, co wpisałeś w console.log? Powinno być to, co wpisałeś w elemencie o id="field".

Jeśli w konsoli pokaże się wartość, którą wpisałeś do pola, to ok. Grunt, żeby formularz nie odświeżał strony, po kliknięciu w przycisk zatwierdzający go - to powinny blokować instrukcje event.preventDefault(); return false; w onsubmit..

komentarz 25 lutego 2018 przez Czes Nowicjusz (160 p.)
edycja 25 lutego 2018 przez Czes

"Miałeś usunąć <form>, który tworzył zagnieżdżenie dla innego formularza."

O która linię wg zamieszczonego powyżej kodu chodzi? No capito. Czy o tę?

'conn:send('<form action="" method="GET">\n')'  

"A w konsoli pokazuje się to, co wpisałeś w console.log? Powinno być to, co wpisałeś w elemencie o id="field"."

 

Sory ale nie moge zalapac o co chodzi  może to już zmęczenie. Mam pomysl by przesłac ci na priv adres internetowy do tej plytki do sprawdzenia. Jest późno Jutro. 

komentarz 25 lutego 2018 przez Czes Nowicjusz (160 p.)
edycja 25 lutego 2018 przez Czes
Ja nie widzę w kodzie sekwencji otwarć formularzy bez nastepujacych po kazdym z nich zamknięć. Chyba ze chodzi o linie 51 i 52, czyli:

conn:send('<form action="" method="GET">\n')
conn:send('<form onsubmit="event.preventDefault(); return false;">\n')

Ale o co tu chodzi ? Czy o wstawienie miedzy nie polecenia zamkniecia, czyli 'conn:send('</form>\n')'?

Przywróciłem spowrotem te dwie usuniete linie.  Aktualny kod jest powyżej w okienku.
Przeslalem na priw adres WEB do plyki sprobuj otworzyc w przeglądarce, poklikać w przyciski i sprawdzić komunikaty w konsoli.

Jakie zmiany i w ktorych miejscach wprowadzić?
komentarz 25 lutego 2018 przez ScriptyChris Mędrzec (190,190 p.)

Usuń tą linijkę:

conn:send('<form action="" method="GET">\n')

U mnie działa:

komentarz 25 lutego 2018 przez Czes Nowicjusz (160 p.)
Zrobione.

U mnie podobnie, też sie teraz wpisuje.

Bede probował sprawdzic przesylanie do UART.
komentarz 25 lutego 2018 przez Czes Nowicjusz (160 p.)
edycja 25 lutego 2018 przez Czes

Wykonalem rózne proby  i na razie poległem. 

Ostatecznie wkleilem ponizej zmienioną wersję kodu. Zmiana dotyczy linii 29 

'if klik=="SENDtoUART" and mycode~=nil then uart.write(0, "zp"..mycode.."$") return end'

w ktorej sprawdza sie warunek czy zmienna 'mycode' nie jest wartoscią pustą (co jest o tyle ważne jak zaużyłem, że interpreter nodemcu nie toleruje działań na zmiennych z pustą  wartością sygnalizuje to jako błąd i przerywa egzekucję kodu) 

Na poczatku programu jest wpisana wstępna  wartość '29' do zmiennej 'mycode' i ta wartośc jest podawana do UART po kliknieciu przycisku  'SENDtoUART'  w przypadku próby wklikania i wprowadzenia pustego ciagu znaków  do 'mycode'.

Wpisanie do okienka innej wartości i klikniecie '<--INPUT' a nastepnie 'SENDtoUART' nie powoduje przesłania tej nowej wartosci. Jesli usunie się z programu w/w wspomniana deklarację wartosci 'mycode' to  zmienna mycode w linii 29 jest traktowana jako pusta i nic sie nie wysyla na UART.

 JSHolic czy mozesz sie temu przyjrzeć? Moze linię  'uart.write(0, "zp"..mycode.."$")' nalezaloby umiescic w innym miejscu kodu? Pozostawiam płytkę ESP8266  zalaczoną.

Całość kodu po zmianach:

--uart
uart.setup(0,9600,8,0,1,1)
dwa = " "
--initial=30
mycode=29
gpio.mode(2, gpio.OUTPUT)
gpio.write(2, gpio.LOW)

---- Set the WEB AP server, constant IP address of the router needed
SSID = "TP-LINK_CZES" --input your router login
PW = "S2B4D38H7PU46"--input your router password
IPADR = "192.168.1.17"--Requested router static IP address for the ESP
IPROUTER = "192.100.1.1"--IP address your router (LAN)
PORT = "87"--set the inner port 
PORTZEWN = "301"--set the external port
wifi.setmode(wifi.STATION)
wifi.sta.setip({ip=IPADR,netmask="255.255.255.0",gateway=IPROUTER,port=PORT})
wifi.sta.config(SSID,PW)
srv=net.createServer(net.TCP) srv:listen(PORTZEWN,function(conn)
conn:on("receive",function(conn,payload)
--print(payload)
--print(wifi.sta.getmac())
--print(wifi.sta.getip())
    function ctrlpower()
   klik=string.sub(payload,kdesi[2]+1,#payload)

if klik=="ON2" then gpio.write(2, gpio.HIGH) dwa = "* " return end
if klik=="OFF2" then gpio.write(2, gpio.LOW) dwa = " " return end
if klik=="SENDtoUART" and mycode~=nil then uart.write(0, "zp"..mycode.."$") return end--send to UART string
end

    kdesi={string.find(payload,"pwmi=")}
    if kdesi[2]~=nil then ctrlpower()end
    conn:send('HTTP/1.1 200 OK\n\n')
    conn:send('<!DOCTYPE HTML>\n')
    conn:send('<html>\n')
    conn:send('<head><meta  content="text/html; charset=utf-8">\n')
    conn:send('<title>ESP8266</title></head>\n')
    conn:send('<body>\n')
    conn:send('<h4>NodeMcu Esp8266</h4>\n')
--------
    conn:send('<form action="" method="POST">\n')
   conn:send(dwa)
     conn:send('<input type="submit" name="pwmi" value="ON2">\n')
    conn:send('<input type="submit" name="pwmi" value="OFF2"><br><br>\n')
-------
    conn:send('<input type="submit" name="pwmi" value="SENDtoUART"><br><br>\n')
--   conn:send(mycodex)
   conn:send(mycode)
conn:send('</form>\n')
----------------------------------------------------

--conn:send('<form action="" method="GET">\n')
conn:send('<form action="http://192.168.1.175:78/" onsubmit="event.preventDefault(); return false;">\n')
--conn:send('<form onsubmit="event.preventDefault(); return false;">\n')
conn:send('<script type="text/javascript">\n')
conn:send('function inptext(){\n')
conn:send('var mycode = document.getElementById("field").value\n')
conn:send('document.getElementById("mycode").innerHTML = mycode\n')
conn:send('console.log(mycode)}\n')
conn:send('</script>\n')

conn:send('<input type="text" id="field" />\n')
conn:send('<input type="submit" value="<-INPUT" onclick="inptext()" />\n')
conn:send('<div id="mycode"></div>\n')
--------------------------------------------------------
    conn:send('</form></body></html>\n')
    conn:on("sent",function(conn) conn:close() end)

end)
end)
-----------------------------




--the dot ends the string of UART string receiving
uart.on("data", "\.", function(data)
datax = data
    if data=="quit\." then
      uart.on("data") -- unregister callback function
    end
end, 0)

--------------
--blinking led at output 4, its only for conroll program
znacznik = 1
pin=4
gpio.mode(pin, gpio.OUTPUT)
tmr.alarm(0, 100, 1,--2 sek
function ()
if znacznik == 0 then
gpio.write(pin, gpio.LOW)
znacznik = 1
else
gpio.write(pin, gpio.HIGH)
znacznik = 0
end
end
)

komentarz 25 lutego 2018 przez ScriptyChris Mędrzec (190,190 p.)

Nie znam systemu/oprogramowania, w którym piszesz kod. Z tego co widzę, to stawiasz jakiś serwer o IP: 192.168.1.17. Jeśli chcesz przesłać wartość zmiennej myCode utworzonej w JavaScript na stronie internetowej, to powinieneś przesłać ją w POST pod wspomniane IP. Nie wiem jak w przypadku Twojego oprogramowania możesz to odebrać po stronie serwera. Natomiast w kodzie HTML brakuje Ci atrybutu action z adresem docelowym. Uzupełnij formularz:

conn:send('<form action="http://192.168.1.17:87/" onsubmit="event.preventDefault(); return false;">\n')

Dostosuj IP i port (w action="..."), jeśli wstawiłem nie te co trzeba.

Jeśli nadal będą problemy, to spróbuj zmienić kolejność wykonywania skryptu - najpierw utwórz HTMLa, a potem sprawdzaj zmienną myCode.

komentarz 25 lutego 2018 przez Czes Nowicjusz (160 p.)
edycja 26 lutego 2018 przez Czes

 

A więc zastapilemlinię:

'conn:send('<form onsubmit="event.preventDefault(); return false;">\n')'

linią:

'conn:send('<form action="http://1.1.1.1:1/" onsubmit="event.preventDefault(); return false;">\n')'

ale bez bez minany. 

Zmienilem też w jscript miejscami linie: 

conn:send('var mycode = document.getElementById("field").value\n')

conn:send('document.getElementById("mycode").innerHTML = mycode\n')

skutek był taki ze po kliknięciu przycisku "<--INPUT' pod okienkiem tekstowym zamiast znaków pokazał sie komunikat 'undefined'

więc przywrocilem kolejność zamienionych linii spowrotem.

Zaktualizowalem treść kodu w oknie powyzej.

komentarz 25 lutego 2018 przez ScriptyChris Mędrzec (190,190 p.)
Sprawdź po stronie serwera, czy odbierasz zapytanie POST. Nie pomogę Ci w odczytaniu tego, bo nie znam oprogramowania, którego używasz. Poszukaj w dokumentacji/na forach tego oprogramowania o przesyłaniu (odczytywaniu) zapytań HTTP (w tym metodą POST).
komentarz 26 lutego 2018 przez Czes Nowicjusz (160 p.)
edycja 26 lutego 2018 przez Czes

"Sprawdź po stronie serwera, czy odbierasz zapytanie POST."

Korzystam z tego:

https://nodemcu.readthedocs.io/en/master/en/modules/http/

https://nodemcu.readthedocs.io/en/master/en/flash/#sdk-init-data

Jest przyklad:

http.post('http://httpbin.org/post',
  'Content-Type: application/json\r\n',
  '{"hello":"world"}',
  function(code, data)
    if (code < 0) then
      print("HTTP request failed")
    else
      print(code, data)
    end
  end)

Ale nie wiem jak to zastosować. Bede próbował.

komentarz 5 marca 2018 przez Czes Nowicjusz (160 p.)

@JSHolic, "Sprawdź po stronie serwera, czy odbierasz zapytanie POST."

Nie wiem jak  to zrobić. I co to ma dać?

Poległem.

Tak czy inaczej dziękuję Ci za pomoc. Za starania.

komentarz 5 marca 2018 przez ScriptyChris Mędrzec (190,190 p.)

@JSHolic, "Sprawdź po stronie serwera, czy odbierasz zapytanie POST."

Nie wiem jak  to zrobić. I co to ma dać?

Z przeglądarki na submit wysyłasz żądanie POST. Jest ono odbierane po stronie serwera (którego rolę pełni Twoje urządzenie w jakiś sposób) i powinieneś sprawdzić, czy odebrane żądanie zawiera dane wysłane z przeglądarki.

komentarz 5 marca 2018 przez Czes Nowicjusz (160 p.)
edycja 5 marca 2018 przez Czes

"Z przeglądarki na submit wysyłasz żądanie POST"

Nie wiem gdzie znaleźć na przeglądarce 'submit'.  Używjąc firefoksa na konsoli mam wybory, na pasku od lewej strony jest: 

inspektor, konsola, debuger, edytor stylów, wydajność, pamięć, sieć...gdzie to 'submit' (o żądaniu 'post' na razie nie wspomnę)? No jeszcze na dole okna głownego przeglądarki jest pasek gdzie mozna coś wpisać ...próbowalem wpisac tam "post" 

komentarz 6 marca 2018 przez ScriptyChris Mędrzec (190,190 p.)

Dokumentacja dev toolsów w Firefox: https://developer.mozilla.org/en-US/docs/Tools/Network_Monitor

Przykład sprawdzenia żądania POST w Firefox: https://www.youtube.com/watch?v=PUgRMRQoTq4&t=0m45s

Otwórz sobie zakładkę Sieć (z ang. Network) i wyślij ten formularz. Powinien pojawić się request w dev toolsach. Kliknij w niego i otworzy się podokienko z informacjami, a tam m.in. powód błędu (jeśli takowy jest), odpowiedź z serwera, przesłane dane i metadane nagłówka.

komentarz 9 marca 2018 przez Czes Nowicjusz (160 p.)
edycja 9 marca 2018 przez Czes
Otwieram link: http://93.180.171.10:31/ wprowadzam 'jakiśtekst', klikam 'INPUT', klikam 'SENDtoUART'
klikam F12 > sieć(network)>jedno żądanie(one request) - wtedy otwiera sie okienko  na którym klikam "prześlij ponownie" pokazuje sie komunikat:
Rozmiar:0,69KB
Czas: 0,1sek
W pamieci podręcznej: 0
Liczba żądan: 1

Nie widac żadnych komunikatow o błędach. Co zrobiłem nie tak?

Dodałem w programie wyświetlanie komunikatow zwrotnych z UART i uaktualniłem kod na forum.
Wpisanie do okienka przykładowego komunikatu 'oz'  i wklikanie tekstu do UART powinno zwrócić aktualny czas gdyby działało przekazywanie wartości ze zmiennej 'mycode'.

Sama komunikacja UART jest przetestowana, sprawna i przesyła komunikaty w obydwie strony. Jesli do zmiennej 'mycode' zada się wartość inną metodą to wartość ta po kliknieciu SENDtoUART zostaje wysłana.
komentarz 10 marca 2018 przez ScriptyChris Mędrzec (190,190 p.)

Widzę, że w formularzu nie ma atrybut action, który powinieneś wstawić jak napisałem w komentarzu wyżej. Stąd zapewne formularz nie jest wysłany POSTem.

komentarz 10 marca 2018 przez Czes Nowicjusz (160 p.)
edycja 11 marca 2018 przez Czes
Przywrócilem spowrotem w formularzu linię 53 czyli -
('<form action="http://192.168.1.175:31" onsubmit="event.preventDefault(); return false;">\n')
Usunąlem linię 54
Przywrócilem linię 59 czyli ('console.log(mycode)}\n')

Uaktualniłem kod w okienku na górze tematu.

Wystartowalem układ z tymi zmianami. Nie widzę pozytywnych efektow. Czy mozesz spróbować teraz sprawdzić zdalnie co sie dzieje w formularzu?

Z jakiej przegladarki jest ten zrzut ekranu ktory zamieściłeś? Ja mam Chrome i Firefoxa ale nie udaje mi sie zrobić ustawień takich jak u Ciebie. Chodzi o to na dole ekranu.

Układ pozostawiam załączony cały czas. Na UARcie układ ESP otrzymuje czasem komunikaty z innego urzadzenia więc są one wyswietlane na ekranie i w konsoli. Nadal mozna próbować wpisywać na UART jakieś komunikaty, ktore powinny skutkować przesłaniem komunikatu zwrotnego. Na przykład 'oz' , 'od', 'a', 's'

Podobne pytania

0 głosów
1 odpowiedź 324 wizyt
0 głosów
2 odpowiedzi 2,139 wizyt
0 głosów
0 odpowiedzi 430 wizyt

92,555 zapytań

141,402 odpowiedzi

319,544 komentarzy

61,939 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...