jenya7 0 28 января, 2019 Опубликовано 28 января, 2019 · Жалоба Не нашел куда воткнуть тему. Попробую тут. Я хочу со стороны эмбедед поставить модуль ESP8266 и со стороны телефона управлять устройством. Первый вопрос – какое подключение лучше выбрать со строны ESP8266? Сейчас я делаю так – со стороны эмбедед конфигурирую ESP8266 // Set wifi mode AT+CWMODE=3 // softAP+station mode // Enable multiple connection AT+CIPMUX=1 // Setup server AT+CIPSERVER=1 // default port = 333 На компьютере открываю Hercules подключаюсь и посылаю команды. Вобщем то работает надежно, сбоев пока не замечал. Мне кажется это самый простой способ. Вопрос в надежности. Как проверять живое ли соединение? Вопрос второй – каким способом подключиться к ESP8266 через андроид. Они предоставляют класс WiFi Direct но я как то не понял - через него можно подключиться к серверу? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
twix 0 28 января, 2019 Опубликовано 28 января, 2019 (изменено) · Жалоба На смартфоне поднимается точка доступа, она там есть по умолчанию, и вот к ней подключается ESP8266 автоматом. После чего ESP8266 становится доступной для приложения на смартфоне по IP адресу. Затем поднимаете веб сервер на ESP8266 и в самом простом случае выводите данные в виде HTML. Ее можно посмотреть либо браузером, либо приложение по тому же IP адресу читает страничку и парсит если надо. Изменено 28 января, 2019 пользователем twix Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 28 января, 2019 Опубликовано 28 января, 2019 · Жалоба 6 minutes ago, twix said: На смартфоне поднимается точка доступа, она там есть по умолчанию, и вот к ней подключается ESP8266 автоматом. После чего ESP8266 становится доступной для приложения на смартфоне по IP адресу. Затем поднимаете веб сервер на ESP8266 и в самом простом случае выводите данные в виде HTML. Ее можно посмотреть либо браузером, либо приложение по тому же IP адресу читает страничку и парсит если надо. Мне нужно проще. Без веб сервер и HTML. Мне нужно просто получить строку (команду). И потом смартфон является мастером по отношению к ESP8266. Он посылает команды. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_pv 49 28 января, 2019 Опубликовано 28 января, 2019 · Жалоба 1 hour ago, twix said: На смартфоне поднимается точка доступа, она там есть по умолчанию, и вот к ней подключается ESP8266 автоматом. имхо проще всё-таки тупо подключаться к точке доступа, а не поднимать её на смартфоне, ну с точки зрения пользователя. тем более что веб страницу можно сразу же автоматически показывать при подключении к точке доступа. 1 hour ago, jenya7 said: Мне нужно проще. Без веб сервер и HTML. Мне нужно просто получить строку (команду). И потом смартфон является мастером по отношению к ESP8266. Он посылает команды. вот как раз проще всего будет сделать именно веб сервер на 8266, открывать эту страничку на смартфоне, любом, и через XMLHttpRequest() посылать команды. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 28 января, 2019 Опубликовано 28 января, 2019 · Жалоба 3 minutes ago, _pv said: имхо проще всё-таки тупо подключаться к точке доступа, а не поднимать её на смартфоне, ну с точки зрения пользователя. тем более что веб страницу можно сразу же автоматически показывать при подключении к точке доступа. вот как раз проще всего будет сделать именно веб сервер на 8266, открывать эту страничку на смартфоне, любом, и через XMLHttpRequest() посылать команды. где же это проще? я тремя строчками поднял сервер. и простой функцией получаю строки с Hercules. другое дело может аксес поинт проще и надежней. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_pv 49 28 января, 2019 Опубликовано 28 января, 2019 · Жалоба 7 minutes ago, jenya7 said: где же это проще? я тремя строчками поднял сервер. и простой функцией получаю строки с Hercules. другое дело может аксес поинт проще и надежней. ну а в чём вопрос тогда, пусть пользователи (особенно айфонов) ставят себе этот ваш Hercules, и посылают текстовые строки из терминала. всё ж работает и всего три строчки. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 28 января, 2019 Опубликовано 28 января, 2019 (изменено) · Жалоба 10 minutes ago, _pv said: ну а в чём вопрос тогда, пусть пользователи (особенно айфонов) ставят себе этот ваш Hercules, и посылают текстовые строки из терминала. всё ж работает и всего три строчки. так Hercules под Windows и он навороченный. там нужно вводить ИП, порт, подключаться, печатать команду. я хочу дать пользователю три кнопки и все. Изменено 28 января, 2019 пользователем jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
twix 0 28 января, 2019 Опубликовано 28 января, 2019 (изменено) · Жалоба Тоже хотел пожелать удачи.. Изменено 28 января, 2019 пользователем twix Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_pv 49 28 января, 2019 Опубликовано 28 января, 2019 · Жалоба про Hercules, особенно для айфона, это я похоже слишком тонко пошутил. ну что ж, удачи, делайте приложение для андроида с тремя кнопками, ну а как на#$%тесь, приходите, возможно тут смогут подсказать как сделать это же с "серверной" стороны на 8266 c nodeMCU в те же несколько строчек. просто для примера, вдруг поможет, код на луа который запускает веб сервер, показывает веб страничку со слайдером, и возвращает его значение в скрипт (тут просто выводит на консоль при изменении): Spoiler local socket = require("socket.core") local s = assert(socket.tcp()) assert(s:bind("*", 80)) s:listen(1) local ip, port = s:getsockname() local value = 0 local function slider() s:settimeout(0) local conn, err = s:accept() if conn then local line, err = conn:receive() if not err then local val = line:match('^GET /(%d+) ') if val ~= nil then value = val else conn:send("HTTP/1.1 200 OK\n") conn:send("Content-Type: text/html\n\n") conn:send("<input type=range value=0 min=0 max=100 id='slider'/>") conn:send("<script>var x=0;function onchange() { if (this.value == x) return; x = this.value;") conn:send("var xhr = new XMLHttpRequest();xhr.open('GET', '/'+x, true);xhr.responseType = 'text';xhr.send({});") conn:send("}document.getElementById('slider').addEventListener('input',onchange);</script>\n") end end conn:close() end return value end local s0 = slider() while true do local s1 = slider() if s0 ~= s1 then s0 = s1; print(s0) end end Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 28 января, 2019 Опубликовано 28 января, 2019 · Жалоба 10 minutes ago, _pv said: про Hercules, особенно для айфона, это я похоже слишком тонко пошутил. ну что ж, удачи, делайте приложение для андроида с тремя кнопками, ну а как на#$%тесь, приходите, возможно тут смогут подсказать как сделать это же с "серверной" стороны на 8266 c nodeMCU в те же несколько строчек. просто для примера, вдруг поможет, код на луа который запускает веб сервер, показывает веб страничку со слайдером, и возвращает его значение в скрипт (тут просто выводит на консоль при изменении): нужно прошивку с nodeMCU прожечь? а код в какой среде пишется? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 29 января, 2019 Опубликовано 29 января, 2019 · Жалоба я когда открываю в телефоне WIFI вижу в списке мой модуль ESP8266. нажимаю Connect и он подсоединяется. то есть теперь я могу работать на уровне сокетов? try { socket = new Socket(dstAddress, dstPort); dataOutputStream = new DataOutputStream( socket.getOutputStream()); dataInputStream = new DataInputStream(socket.getInputStream()); if(msgToServer != null){ dataOutputStream.writeUTF(msgToServer); } ---------------------------------------- Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_pv 49 29 января, 2019 Опубликовано 29 января, 2019 · Жалоба можете, но чем вам http так не нравится, готовый браузер нынче в любом телевизоре, а то и холодильнике, уже есть? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 29 января, 2019 Опубликовано 29 января, 2019 · Жалоба 43 minutes ago, _pv said: можете, но чем вам http так не нравится, готовый браузер нынче в любом телевизоре, а то и холодильнике, уже есть? в данном случае не хочу усложнять. нужно сделать максимально просто и быстро для пользователя. для обслуживающего техника можно и http сделать. тут есть еще одно обстоятельство. если пользователь захотел добавить/заменить модуль - взял из коробки воткнул и работает. а в случае с nodeMCU мне нужно прошивать, потом програмировать через определенную среду, потом посылать куда то. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 29 января, 2019 Опубликовано 29 января, 2019 (изменено) · Жалоба сделал простенький тест Spoiler @Override public void onClick(View v) { switch (v.getId()) { case R.id.connect_button: DeviceConnectTask my_device_connect_task = new DeviceConnectTask(); my_device_connect_task.execute(); break; case R.id.send_button: DeviceSendDataTask my_device_data_send_task = new DeviceSendDataTask(/*txt_data.getText().toString()*/); my_device_data_send_task.execute(); break; default: break; } } public class DeviceConnectTask extends AsyncTask<Void, Void, Void> { String response; @Override protected Void doInBackground(Void... arg0) { try { socket = new Socket("192.168.4.1", 333); dataOutputStream = new DataOutputStream(socket.getOutputStream()); dataInputStream = new DataInputStream(socket.getInputStream()); if (socket.isConnected()) response = "Connected :) !"; else response = "Not Connected :( !"; } catch (Exception e) { response = e.toString(); } return null; } @Override protected void onPostExecute(Void result) { txt_status.setText(response); super.onPostExecute(result); } } public class DeviceSendDataTask extends AsyncTask<Void, Void, Void> { String data_to_send = txt_data.getText().toString(); String response; @Override protected Void doInBackground(Void... arg0) { try { if (data_to_send != null && !data_to_send.isEmpty()) { if (dataOutputStream != null) { dataOutputStream.writeUTF(data_to_send); response = "Send OK!"; } else response = "Output steam is closed!"; } } catch (Exception e) { response = e.toString(); } return null; } @Override protected void onPostExecute(Void result) { txt_status.setText(response); super.onPostExecute(result); } } Выбираю в WIFI List мой модуль, подключаюсь. При нажатии на кнопки Connect и Send таски бегут без исключений, получаю статус "Connected :) !" и "Send OK!" но дата на ESP8266 не приходит. блин. работает. нужно dataOutputStream.writeBytes(data_to_send); вместо dataOutputStream.writeUTF(data_to_send); Изменено 29 января, 2019 пользователем jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 172 29 января, 2019 Опубликовано 29 января, 2019 · Жалоба 5 часов назад, jenya7 сказал: тут есть еще одно обстоятельство. если пользователь захотел добавить/заменить модуль - взял из коробки воткнул и работает. а в случае с nodeMCU мне нужно прошивать, потом програмировать через определенную среду, потом посылать куда то. Ну так поднимите HTTP-сервер на отдельном МК, к которому подключен ESP8266. И управляйте им АТ-командами. В режиме сервера АТ-командная прошивка насколько помню может до 5 одновременно открытых сокетов поддерживать. АТ-командная прошивка идёт прошитой по умолчанию с завода - можно ничего не прошивать и не настраивать, а "просто воткнуть". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться