Перейти к содержанию
    

Android + ESP8266

Не нашел куда воткнуть тему. Попробую тут.

Я хочу со стороны эмбедед поставить модуль 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 но я как то не понял - через него можно подключиться к серверу?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На смартфоне поднимается точка доступа, она там есть по умолчанию, и вот к ней подключается ESP8266 автоматом.

После чего ESP8266 становится доступной для приложения на смартфоне по IP адресу.

Затем поднимаете веб сервер на ESP8266 и в самом простом случае выводите данные в виде HTML.

Ее можно посмотреть либо браузером, либо приложение по тому же IP адресу читает страничку и парсит если надо.

Изменено пользователем twix

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 minutes ago, twix said:

На смартфоне поднимается точка доступа, она там есть по умолчанию, и вот к ней подключается ESP8266 автоматом.

После чего ESP8266 становится доступной для приложения на смартфоне по IP адресу.

Затем поднимаете веб сервер на ESP8266 и в самом простом случае выводите данные в виде HTML.

Ее можно посмотреть либо браузером, либо приложение по тому же IP адресу читает страничку и парсит если надо.

 

Мне нужно проще. Без веб сервер и HTML. Мне нужно просто получить строку (команду).

И потом смартфон является мастером по отношению к ESP8266. Он посылает команды.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, twix said:

На смартфоне поднимается точка доступа, она там есть по умолчанию, и вот к ней подключается ESP8266 автоматом.

имхо проще всё-таки тупо подключаться к точке доступа, а не поднимать её на смартфоне, ну с точки зрения пользователя.

тем более что веб страницу можно сразу же автоматически показывать при подключении к точке доступа.

1 hour ago, jenya7 said:

Мне нужно проще. Без веб сервер и HTML. Мне нужно просто получить строку (команду).

И потом смартфон является мастером по отношению к ESP8266. Он посылает команды.

вот как раз проще всего будет сделать именно веб сервер на 8266, открывать эту страничку на смартфоне, любом, и через XMLHttpRequest() посылать команды.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 minutes ago, _pv said:

имхо проще всё-таки тупо подключаться к точке доступа, а не поднимать её на смартфоне, ну с точки зрения пользователя.

тем более что веб страницу можно сразу же автоматически показывать при подключении к точке доступа.

вот как раз проще всего будет сделать именно веб сервер на 8266, открывать эту страничку на смартфоне, любом, и через XMLHttpRequest() посылать команды.

 

где же это проще? я тремя строчками поднял сервер. и простой функцией получаю строки с Hercules. другое дело может аксес поинт проще и надежней.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 minutes ago, jenya7 said:

где же это проще? я тремя строчками поднял сервер. и простой функцией получаю строки с Hercules. другое дело может аксес поинт проще и надежней.

ну а в чём вопрос тогда, пусть пользователи (особенно айфонов) ставят себе этот ваш Hercules, и посылают текстовые строки из терминала.

всё ж работает и всего три строчки.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

10 minutes ago, _pv said:

ну а в чём вопрос тогда, пусть пользователи (особенно айфонов) ставят себе этот ваш Hercules, и посылают текстовые строки из терминала.

всё ж работает и всего три строчки.

так Hercules под Windows и он навороченный. там нужно вводить ИП, порт, подключаться, печатать команду.  я хочу дать пользователю три кнопки и все.

Изменено пользователем jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

про 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

 

 

luasocket.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

10 minutes ago, _pv said:

про Hercules, особенно для айфона, это я похоже слишком тонко пошутил.

ну что ж, удачи, делайте приложение для андроида с тремя кнопками,

ну а как на#$%тесь, приходите, возможно тут смогут подсказать как сделать это же с "серверной" стороны на 8266 c nodeMCU в те же несколько строчек.

 

просто для примера, вдруг поможет, код на луа который запускает веб сервер, показывает веб страничку со слайдером, и возвращает его значение в скрипт (тут просто выводит на консоль при изменении):

 

нужно прошивку с nodeMCU прожечь? а код в какой среде пишется?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

я когда открываю в телефоне 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);
		}
        
        ----------------------------------------

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

можете, но чем вам http так не нравится, готовый браузер нынче в любом телевизоре, а то и холодильнике, уже есть?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

43 minutes ago, _pv said:

можете, но чем вам http так не нравится, готовый браузер нынче в любом телевизоре, а то и холодильнике, уже есть?

в данном случае не хочу усложнять. нужно сделать максимально просто и быстро для пользователя.

для обслуживающего техника можно и http сделать.

тут есть еще одно обстоятельство. если пользователь захотел добавить/заменить модуль - взял из коробки воткнул и работает. а в случае с nodeMCU мне нужно прошивать, потом програмировать через определенную среду, потом посылать куда то.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

сделал простенький тест

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);

Изменено пользователем jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 часов назад, jenya7 сказал:

тут есть еще одно обстоятельство. если пользователь захотел добавить/заменить модуль - взял из коробки воткнул и работает. а в случае с nodeMCU мне нужно прошивать, потом програмировать через определенную среду, потом посылать куда то.

Ну так поднимите HTTP-сервер на отдельном МК, к которому подключен ESP8266. И управляйте им АТ-командами. В режиме сервера АТ-командная прошивка насколько помню может до 5 одновременно открытых сокетов поддерживать. АТ-командная прошивка идёт прошитой по умолчанию с завода - можно ничего не прошивать и не настраивать, а "просто воткнуть".

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...