другой адрес - потому что страница на отдельном сервере лежит. еще у меня было подозрение, что ардуина должна что-то отвечать на запрос. может такое быть?
другой адрес - потому что страница на отдельном сервере лежит.
Ну да... и есть подозрение, что вы шлете свой запрос этому серверу, а не ардуине. Если тестить не через F12, а с помощью Fiddler2, то подозреваю что мы увидим два запроса :) Один сгенерированный jQuery кодом, а второй - сабмитом формы. Просто F12 с помощью вы не успеваете увидить первый. Второй запрос вам очищает лог вызовов и зависает сам (Fiddle2 - избавлен от недостатка "очистки", поэтому через него картина выглядит полнее).
А еще - стоит на вкладочку Console заглянуть. Убедится что там никаких ошибок не светится. Вдруг браузер срубил запрос по соображениям секьюрности? Заодно убедится проверить что "MK Updated" вывеслось. Если вывелось, значит запрос к арудине у нас прошол нормально, а кипишь поднимает второй, мусорный запрос. Которого вообще быть не должно.
alexey_and пишет:
что ардуина должна что-то отвечать на запрос. может такое быть?
Правильное подозрение.
Строка:
client.println("HTTP/1.1 200 OK"); //send new page
Это и есть, то что должна минимально должна ответить ардуина, что-бы браузер понял что "с запросом все хорошо".
Standard response for successful HTTP requests. The actual response will depend on the request method used. In a GET request, the response will contain an entity corresponding to the requested resource. In a POST request the response will contain an entity describing or containing the result of the action.[2]
не не. запрос точно ардуине. я конечно бамбук, но не до такой степени :)
А вот скриншот говорит что бамбук :)
Вы не путайте "что вы хотели сделать" и "что вышло" ;)
Кнопка у вас типа submit? А что происходит при нажатии такой кнопки? А формочка отправляется на адресс который указан в качестве action, у тега form. Если там ничего не указанно, то... на адресс текущей страницы (и происходит перезагрузка страницы). А текущая страница - у вас "на другом сервере".
Вот вы... и стали бамбуком ;) Отправили запрос на адресс текущей страницы, на "другой сервер", а не ардуины.
Вернее скорее всего на ардуину вы тоже успеле отправить, своим jQuery кодом. Но вот "дождатся ответа" - уже некому. Страница перегрузилас.
Вообщем вам нужно, либо менить тип кнопки (что я предложил в "попробуйте..."), либо пытатся "задавить" дефолтную логику кнопки типа submit. Вешатся не на событеие onClick, а на submit и не кнопки, а формы... как-то так:
Перед тем как добавалять - попробуте, все-таки, вначале руками урл дернуть. Велика вероятность что вы уже отвечаете OK-ями. Строчку "как отвечать", а копировал из кода выше по ветке. Так что - вероятно что вы уже отвечаете. По крайней мере "иногда" (не вникал, всегда ли отвечаете).
Вот последнее - уже больше похоже на правду. По крайней мере видно, что ваш javascript пытается дергать ардуину, а вот ее ответ - обрезается из секьюрных соображений.
Это как раз случай: "А еще - стоит на вкладочку Console заглянуть. Убедится что там никаких ошибок не светится. Вдруг браузер срубил запрос по соображениям секьюрности"
Вообщем это означает что мы пытаемся сделать "кросс-доменный запрос". Когда html/javascript у нас загружены с одного домена (192.168.1.1), а запрос мы пытаемся сделать к другому домену (192.168.1.177). Упоминал и про это в сообщении #4 :) К javascript-ту это ограничение -тоже относится.
Вообщем тут у вас есть два пути:
1. Ответом дуины должен быть не html, а JSONP (JSON - тоже не пропустит, нужно именно JSONP). Впрочем если мы не анализуем что ответила дуина, возможно "ответ и не важен", главное "попросить у нее именно JSONP. Скажем с помощью jQuery.getJSON() | jQuery API Documentation и не забыть добавить в запрашиваемый URL "callback=?" - что-бы поняло что мы ждем не JSON, а JSONP
Можно еще попробовать jQuery.ajax() | jQuery API Documentation, у него в опциях есть "crossDomain (default: false for same-domain requests, true for cross-domain requests)" - но, если честно не пробовал никогда.
2. Вторым вариантом - это что-бы в ответе дуины, кроме HTTP200 был еще тот самый заголовок:
"Access-Control-Allow-Origin: *" - разрешить кросс доменный запросы с любых доменов
Или
"Access-Control-Allow-Origin: http://192.168.1.1" - разрешить с конкретного домена (так безопасней)
Возможно еще потребуется что-то типа
"Access-Control-Allow-Methods: GET,OPTIONS"
В этом варианте - внесения изменений в клиентскую часть - не должно потребоваться.
теперь никаких ошибок. но вот еще один блудняк: у меня сделано 2 таба с помощью navbar. по дефолту у меня таб "Control". открываю index.html. все работает. перехожу на другой таб, и кнопки там не работают. как только обновляю страницу - начинают работать. до перехода на другой таб. в чем может быть загвоздка? сделал видео чтоб было понятней что я имею ввиду. там видно реакцию на нажатие кнопок - появляются строки внизу экрана, и при переходе на другой таб - не появляются. потом обновляю страницу и все начинает работать в пределах текущего таба
и еще вопросик. можно ведь каким-то способом передавать значения с ардуины в jquery? например, для светильника у меня сделаны и физические кнопки (простые тактовые на цифровой вход + реле на вкл светильника), и toggle switch на странице. можно сделать так, чтоб ардуина при включении-выключении света с физ. кнопки двигала и переключатель на странице. заодно таким способом была бы обеспечена синхронизация состояния на всех клиентских планшетах/телефонах/компах
Ага. А загуглили эту ошибку - то и сами бы нашли ответ :)
alexey_and пишет:
у меня сделано 2 таба с помощью navbar. по дефолту у меня таб "Control". открываю index.html. все работает. перехожу на другой таб, и кнопки там не работают. как только обновляю страницу -
Простите. Но это уже "работа над проектом" :) Отлов багов и поиск "почему не работает" это, зачастую, 80% всей работы. А когда "поймал", то исправить уже дело одной строчки (как прошлая проблема).
Тем более что вам - это намного проще сделать. Не буду же я у себя все это поднимать. А вам - открываете консольку, смотрите есть ли какие-то ошибки в ней, смотрите нет ли где 404 ошибок, натыкиваете console.log в свои скрипты, смотрите "куда доходит выполнение, куда нет". не срабатывает обработчик кнопки или уже ajax код, пошагово дебагером проходите и смотрите соотвествуетли реальныей процесс тому что ожидалось.... вообщем место-то "много". Описать все возможные причины в режиме "проверте то, провертье это..." - это очень долго.
Да и, в конце концов - это уже все довольно далеко от тематики форума :)
alexey_and пишет:
и еще вопросик. можно ведь каким-то способом передавать значения с ардуины в jquery?
Вот прямо так "взять и передать" -нет. jQuery умеет только отсылать запросы.
Конечно обходные пути возможны (и все они будут, в какой-то степени компромисами, имеют свои недостатки. особенно учитывая ограниченность дуины): long polling, web-sokets, тупо часто опрашивать дуину, завести промежуточный сервер, на которые дуина будет слать отчеты...
Вообщем это задача на порядок сложней. Требует и "натурных эксперементов" и с большой вероятностью пересмотра всей архитектуры решения.
А по вашему коду. Вы программист или где? Где же здоровая лень? Это для бухгалтера нераздумчивая усидчивость - благо. А девиз програмера "компьютер должен работать, а человек - думать".
Ну вот не лень вам было набивать столько однотипных
Ну хоте-бы "192.168.1.177" - можно было вынести в отдельную переменную что-бы если дуина сменит адресс - менять его в одом месте, а не 50-ти.
....
var arduinoUrl="htt_p://192.168.177"
...
// где-то в обработчике
$.get(arduinoUrl+"/?sceneBLABLA",....)
А потом увидить, что отличие всех обработчиков, вообщем-то уже толкко в имени параметра передаваемого. Ну значит вместо 10-тка обработчиков можно один использовать.
Присвоить всем своим кнопкам какой-то класс, скажем <a class="arduinoButton"
Самой же кнопке, сразу прописать "что там нужно дуине передевать. Получится
<a class="arduinoButton" data-command="stopALL"
Ну и обработчик вешать уже по селектору класса. Один - сразу на все.
Простите. Но это уже "работа над проектом" :) Отлов багов и поиск "почему не работает" это, зачастую, 80% всей работы. А когда "поймал", то исправить уже дело одной строчки (как прошлая проблема).
ясненько, значит буду тыкаться. попробую заново сгенерить эти страницы, может поможет...
Цитата:
А по вашему коду. Вы программист или где? Где же здоровая лень?
вообще ни разу не программист. если б я им был - то вряд ли что-нибудь спрашивал бы. а учиться видимо уже поздно, либо вообще не дано - я просто физически не воспринимаю это. ну зато с железом у меня нет проблем :)
за ценные замечания огромное спасибо, обязательно буду применять :)
Цитата:
И еще - опять у вас <input type="submit" видно. Зачем вам submit-ы? Вы отправляете формочку на сервер и что-то там с ней делаете?
это так конструктор сгенерил. как бы оно работало - и внимания не обращал...
Вообщем попробуйте
сделать.
мне это самым вероятным кажется.
спасибо, вечером попробую :)
другой адрес - потому что страница на отдельном сервере лежит. еще у меня было подозрение, что ардуина должна что-то отвечать на запрос. может такое быть?
другой адрес - потому что страница на отдельном сервере лежит.
Ну да... и есть подозрение, что вы шлете свой запрос этому серверу, а не ардуине. Если тестить не через F12, а с помощью Fiddler2, то подозреваю что мы увидим два запроса :) Один сгенерированный jQuery кодом, а второй - сабмитом формы. Просто F12 с помощью вы не успеваете увидить первый. Второй запрос вам очищает лог вызовов и зависает сам (Fiddle2 - избавлен от недостатка "очистки", поэтому через него картина выглядит полнее).
А еще - стоит на вкладочку Console заглянуть. Убедится что там никаких ошибок не светится. Вдруг браузер срубил запрос по соображениям секьюрности? Заодно убедится проверить что "MK Updated" вывеслось. Если вывелось, значит запрос к арудине у нас прошол нормально, а кипишь поднимает второй, мусорный запрос. Которого вообще быть не должно.
что ардуина должна что-то отвечать на запрос. может такое быть?
Правильное подозрение.
Строка:
Это и есть, то что должна минимально должна ответить ардуина, что-бы браузер понял что "с запросом все хорошо".
List of HTTP status codes - Wikipedia, the free encyclopedia
не не. запрос точно ардуине. я конечно бамбук, но не до такой степени :)
ардуина имеет адрес 192.168.1.177, а сервер, где крутится страница - 192.168.1.1
потестю вдоль и поперек вечером, mk updated ни разу в консоли не видел
попробую со стороны ардуины отвечать ок-ями :)
не не. запрос точно ардуине. я конечно бамбук, но не до такой степени :)
А вот скриншот говорит что бамбук :)
Вы не путайте "что вы хотели сделать" и "что вышло" ;)
Кнопка у вас типа submit? А что происходит при нажатии такой кнопки? А формочка отправляется на адресс который указан в качестве action, у тега form. Если там ничего не указанно, то... на адресс текущей страницы (и происходит перезагрузка страницы). А текущая страница - у вас "на другом сервере".
Вот вы... и стали бамбуком ;) Отправили запрос на адресс текущей страницы, на "другой сервер", а не ардуины.
Вернее скорее всего на ардуину вы тоже успеле отправить, своим jQuery кодом. Но вот "дождатся ответа" - уже некому. Страница перегрузилас.
Вообщем вам нужно, либо менить тип кнопки (что я предложил в "попробуйте..."), либо пытатся "задавить" дефолтную логику кнопки типа submit. Вешатся не на событеие onClick, а на submit и не кнопки, а формы... как-то так:
Но... это если вам уж реально нужна форма-сабмиты и т.п. Лично я - не вижу зачем. Проще сделать кнопку "простой кнопкой".
попробую со стороны ардуины отвечать ок-ями :)
Перед тем как добавалять - попробуте, все-таки, вначале руками урл дернуть. Велика вероятность что вы уже отвечаете OK-ями. Строчку "как отвечать", а копировал из кода выше по ветке. Так что - вероятно что вы уже отвечаете. По крайней мере "иногда" (не вникал, всегда ли отвечаете).
проблему примерно понял... ошибку в типе кнопки осознаю :)
Велика вероятность что вы уже отвечаете OK-ями.
мне кажется не отвечаю. вот на всякий случай текущий код
изменил тип кнопки - ничего не поменялось.
добавил посылку ок - тоже никакого эффекта
https://dl.dropboxusercontent.com/u/28876156/Screen%20Shot%202013-07-15%20at%2010.19.34%20PM.png
дергал руками - вот что кажет:
https://dl.dropboxusercontent.com/u/28876156/Screen%20Shot%202013-07-15%20at%2010.11.03%20PM.png
НО при этом ардуина воспринимает команду и делает что от нее требуется
вот еще кое-что новое заметил:
https://dl.dropboxusercontent.com/u/28876156/Screen%20Shot%202013-07-16%...
вот еще кое-что новое заметил:
https://dl.dropboxusercontent.com/u/28876156/Screen%20Shot%202013-07-16%...
Вот последнее - уже больше похоже на правду. По крайней мере видно, что ваш javascript пытается дергать ардуину, а вот ее ответ - обрезается из секьюрных соображений.
Это как раз случай: "А еще - стоит на вкладочку Console заглянуть. Убедится что там никаких ошибок не светится. Вдруг браузер срубил запрос по соображениям секьюрности"
Вообщем это означает что мы пытаемся сделать "кросс-доменный запрос". Когда html/javascript у нас загружены с одного домена (192.168.1.1), а запрос мы пытаемся сделать к другому домену (192.168.1.177). Упоминал и про это в сообщении #4 :) К javascript-ту это ограничение -тоже относится.
Вообщем тут у вас есть два пути:
1. Ответом дуины должен быть не html, а JSONP (JSON - тоже не пропустит, нужно именно JSONP). Впрочем если мы не анализуем что ответила дуина, возможно "ответ и не важен", главное "попросить у нее именно JSONP. Скажем с помощью jQuery.getJSON() | jQuery API Documentation и не забыть добавить в запрашиваемый URL "callback=?" - что-бы поняло что мы ждем не JSON, а JSONP
Можно еще попробовать jQuery.ajax() | jQuery API Documentation, у него в опциях есть "crossDomain (default: false for same-domain requests, true for cross-domain requests)" - но, если честно не пробовал никогда.
2. Вторым вариантом - это что-бы в ответе дуины, кроме HTTP200 был еще тот самый заголовок:
"Access-Control-Allow-Origin: *" - разрешить кросс доменный запросы с любых доменов
Или
"Access-Control-Allow-Origin: http://192.168.1.1" - разрешить с конкретного домена (так безопасней)
Возможно еще потребуется что-то типа
"Access-Control-Allow-Methods: GET,OPTIONS"
В этом варианте - внесения изменений в клиентскую часть - не должно потребоваться.
ура! спасибо leshak огромное!
помог вариант "Access-Control-Allow-Origin: *"
теперь никаких ошибок. но вот еще один блудняк: у меня сделано 2 таба с помощью navbar. по дефолту у меня таб "Control". открываю index.html. все работает. перехожу на другой таб, и кнопки там не работают. как только обновляю страницу - начинают работать. до перехода на другой таб. в чем может быть загвоздка? сделал видео чтоб было понятней что я имею ввиду. там видно реакцию на нажатие кнопок - появляются строки внизу экрана, и при переходе на другой таб - не появляются. потом обновляю страницу и все начинает работать в пределах текущего таба
http://www.youtube.com/watch?v=UmXx18QtnM8&feature=youtu.be
вот коды обеих страниц
index.html
scenario.html
и еще вопросик. можно ведь каким-то способом передавать значения с ардуины в jquery? например, для светильника у меня сделаны и физические кнопки (простые тактовые на цифровой вход + реле на вкл светильника), и toggle switch на странице. можно сделать так, чтоб ардуина при включении-выключении света с физ. кнопки двигала и переключатель на странице. заодно таким способом была бы обеспечена синхронизация состояния на всех клиентских планшетах/телефонах/компах
ура! спасибо leshak огромное!
помог вариант "Access-Control-Allow-Origin: *"
Ага. А загуглили эту ошибку - то и сами бы нашли ответ :)
Простите. Но это уже "работа над проектом" :) Отлов багов и поиск "почему не работает" это, зачастую, 80% всей работы. А когда "поймал", то исправить уже дело одной строчки (как прошлая проблема).
Тем более что вам - это намного проще сделать. Не буду же я у себя все это поднимать. А вам - открываете консольку, смотрите есть ли какие-то ошибки в ней, смотрите нет ли где 404 ошибок, натыкиваете console.log в свои скрипты, смотрите "куда доходит выполнение, куда нет". не срабатывает обработчик кнопки или уже ajax код, пошагово дебагером проходите и смотрите соотвествуетли реальныей процесс тому что ожидалось.... вообщем место-то "много". Описать все возможные причины в режиме "проверте то, провертье это..." - это очень долго.
Да и, в конце концов - это уже все довольно далеко от тематики форума :)
и еще вопросик. можно ведь каким-то способом передавать значения с ардуины в jquery?
Вот прямо так "взять и передать" -нет. jQuery умеет только отсылать запросы.
Конечно обходные пути возможны (и все они будут, в какой-то степени компромисами, имеют свои недостатки. особенно учитывая ограниченность дуины): long polling, web-sokets, тупо часто опрашивать дуину, завести промежуточный сервер, на которые дуина будет слать отчеты...
Вообщем это задача на порядок сложней. Требует и "натурных эксперементов" и с большой вероятностью пересмотра всей архитектуры решения.
А по вашему коду. Вы программист или где? Где же здоровая лень? Это для бухгалтера нераздумчивая усидчивость - благо. А девиз програмера "компьютер должен работать, а человек - думать".
Ну вот не лень вам было набивать столько однотипных
Ну хоте-бы "192.168.1.177" - можно было вынести в отдельную переменную что-бы если дуина сменит адресс - менять его в одом месте, а не 50-ти.
А потом увидить, что отличие всех обработчиков, вообщем-то уже толкко в имени параметра передаваемого. Ну значит вместо 10-тка обработчиков можно один использовать.
Присвоить всем своим кнопкам какой-то класс, скажем <a class="arduinoButton"
Самой же кнопке, сразу прописать "что там нужно дуине передевать. Получится
<a class="arduinoButton" data-command="stopALL"
Ну и обработчик вешать уже по селектору класса. Один - сразу на все.
Вообщем "меньше кода" - меньше шансов на ошибку. Меньше хадкодинга - больше шансов на повторное использование кода.
И еще - опять у вас <input type="submit" видно. Зачем вам submit-ы? Вы отправляете формочку на сервер и что-то там с ней делаете?
Простите. Но это уже "работа над проектом" :) Отлов багов и поиск "почему не работает" это, зачастую, 80% всей работы. А когда "поймал", то исправить уже дело одной строчки (как прошлая проблема).
ясненько, значит буду тыкаться. попробую заново сгенерить эти страницы, может поможет...
А по вашему коду. Вы программист или где? Где же здоровая лень?
вообще ни разу не программист. если б я им был - то вряд ли что-нибудь спрашивал бы. а учиться видимо уже поздно, либо вообще не дано - я просто физически не воспринимаю это. ну зато с железом у меня нет проблем :)
за ценные замечания огромное спасибо, обязательно буду применять :)
И еще - опять у вас <input type="submit" видно. Зачем вам submit-ы? Вы отправляете формочку на сервер и что-то там с ней делаете?
это так конструктор сгенерил. как бы оно работало - и внимания не обращал...
проблему с навбаром решил путем объединения двух страниц в одну