Hi guys. I have been trying to connect my Android Device (Moto G4 Plus) with my ESP8266 NodeMCU v3 by Access Point, but the first time works fine, but after this never work again, i don't know if some kind of "trash" is leave behind... or some bug.
I'm using Arduino IDE to program, the code is:
#define D1 10
#define D2 2
#define D3 0
#define D4 4
#define D5 5
#define D6 9
#define D7 13
#define D8 12
#define D9 14
#define D10 16
char flag1;
String esid;
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <EEPROM.h>
#include <WiFiUDP.h>
String s = "";
String s0 = "";
String string1 = "";
String s1 = "1";
String s2 = "2";
String s9 = "9";
String s10 = "10";
String s11 = "11";
String s12 = "12";
String s13 = "13";
String s14 = "14";
ESP8266WebServer server(8888);
unsigned int localPort = 8888;
WiFiUDP UDP;
boolean udpConnected = false;
char packetBuffer[UDP_TX_PACKET_MAX_SIZE]; //buffer to hold incoming packet,
char ReplyBuffer[] = "5"; // a string to send back
int serv0 = 0;;
int serv1 = 0;;
int serv = 0;
int serv2 = 0;
int led2 = 0;
const int analogInPin = A0;
boolean connectUDP();
void handleRoot() {
server.send(200, "text/html", "<h1>You are connected</h1>");
}
void setup()
{
// delay(10);//1000
Serial.begin(115200);
EEPROM.begin(512);
Serial.println();
pinMode(D2, OUTPUT);
digitalWrite(D2, LOW);
Serial.print("Configuring access point...");
/* You can remove the password parameter if you want the AP to be open. */
//WiFi.mode(WIFI_STA);
//WiFi.softAP("RedeESP");
IPAddress myIP = WiFi.softAPIP();
Serial.print("AP IP address: ");
Serial.println(myIP);
server.on("/", handleRoot);
server.begin();
Serial.println("HTTP server started");
udpConnected = connectUDP();
if (udpConnected)
{
}
}
void loop()
{
server.handleClient();
if (udpConnected)
{
// if there’s data available, read a packet
int packetSize = UDP.parsePacket();
if (packetSize)
{
Serial.println("");
Serial.print("Received packet of size ");
Serial.print("From ");
IPAddress remote = UDP.remoteIP();
for (int i = 0; i < 4; i++)
{
Serial.print(remote[i], DEC);
if (i < 3)
{
Serial.print(".");
}
}
Serial.print(", port ");
Serial.println(UDP.remotePort());
// read the packet into packetBufffer
UDP.read(packetBuffer, UDP_TX_PACKET_MAX_SIZE);
Serial.println("Contents:");
if (packetSize > 1 && packetSize < 3)
{
serv0 = packetBuffer[0];
serv0 = serv0 - 48;
serv1 = packetBuffer[1];
serv1 = serv1 - 48;
serv = serv1 + (serv0 * 10);
}
if (packetSize > 2 && packetSize < 4)
{
serv0 = packetBuffer[0];
serv0 = serv0 - 48;
serv1 = packetBuffer[1];
serv1 = serv1 - 48;
serv2 = packetBuffer[2];
serv2 = serv2 - 48;
serv = serv2 + (serv1 * 10) + (serv0 * 100);
}
if (packetSize > 3 && packetSize < 5)
{
serv0 = packetBuffer[0];
serv0 = serv0 - 48;
serv1 = packetBuffer[1];
serv1 = serv1 - 48;
serv2 = packetBuffer[2];
serv2 = serv2 - 48;
char serv3 = packetBuffer[3];
serv3 = serv3 - 48;
serv = serv3 + (serv2 * 10) + (serv1 * 100) + (serv0 * 1000);
}
if (packetSize > 0 && packetSize < 2)
{
serv = packetBuffer[0];
serv = serv - 48;
}
s = "";
for (int j = 0; j < packetSize; j++)
{
s += (String)packetBuffer[j];
}
Serial.println("string");
Serial.println(s);
string1 = s;
s = "";
if (serv == 11)
{
led2 = 1;
digitalWrite(D2, HIGH);
UDP.println("11");
serv = 0;
}
if (serv == 12)
{
led2 = 0;
digitalWrite(D2, LOW);
UDP.println("12");
serv = 0;
}
}
}
}
boolean connectUDP() {
boolean state = false;
Serial.println("");
Serial.println("Connecting to UDP");
if (UDP.begin(localPort) == 1) {
Serial.println("Connection successful");
state = true;
}
else {
}
return state;
}
The serial monitor prints:
Configuring access point...AP IP address: 192.168.4.1
HTTP server started
Connecting to UDP
Connection successful
And the android code it's:
package com.app.esp.esp_app;
import android.content.Context;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.os.StrictMode;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Toast;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
public class MainActivity extends AppCompatActivity {
Boolean led2,flag;
static WifiManager wifiManager;
Context context;
WifiConfiguration conf;
public static String networkSSID="RedeESP";
public static String networkPass="";
byte[] buf = new byte[1024];// Utilizado para enviar informação para o ESP em forma de Byte
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
led2=flag=true;
context=this;
// this is for thread policy the AOS doesn't allow to transfer data using wifi module so we take the permission
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
}
// conected with a wifi button.. it connect to esp module when it is pressed
//remember the nework ssid and pasword needs to be the same as given here
//other it won't connect
public void wifi_connect(View v){
wifiManager = (WifiManager) context
.getSystemService(Context.WIFI_SERVICE);
if(flag){
turnOnOffWifi(context, flag);
flag=false;
Toast.makeText(getApplicationContext(), "turning on...", Toast.LENGTH_SHORT).show();
//wifi configuration .. all the code below is to explain the wifi configuration of which type the wifi is
//if it is a WPA-PSK protocol then it would work
conf = new WifiConfiguration();
conf.SSID = "\"" + networkSSID + "\"";
conf.preSharedKey = "\"" + networkPass + "\"";
conf.status = WifiConfiguration.Status.ENABLED;
conf.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
conf.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
conf.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
conf.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
conf.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
conf.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
int netid= wifiManager.addNetwork(conf);
wifiManager.disconnect();
wifiManager.enableNetwork(netid, true);
wifiManager.reconnect();
} else {
turnOnOffWifi(context, flag);
flag = true;
Toast.makeText(getApplicationContext(), "turning off...", Toast.LENGTH_SHORT).show();
}
}
// when LED 3 BUTTON is pressed
public void led_2(View v){
if(led2){
led2=false;
Client a=new Client();
buf=null;
buf=("11").getBytes();
Toast.makeText(getApplicationContext(), "turning off...", Toast.LENGTH_SHORT).show();
a.run();
Toast.makeText(MainActivity.this, "LED 2 ON", Toast.LENGTH_SHORT).show();
}else{
led2=true;
Client a=new Client();
buf=null;
buf=("12").getBytes();
a.run();
Toast.makeText(MainActivity.this, "LED 2 OFF", Toast.LENGTH_SHORT).show();
}
}
public static void turnOnOffWifi(Context context, boolean isTurnToOn) {
wifiManager = (WifiManager) context
.getSystemService(Context.WIFI_SERVICE);
wifiManager.setWifiEnabled(isTurnToOn);
}
//used to send data to esp module
public class Client implements Runnable{
private final static String SERVER_ADDRESS = "192.168.4.1";//public ip of my server
private final static int SERVER_PORT = 8888;
public void run(){
InetAddress serverAddr;
DatagramPacket packet;
DatagramSocket socket;
try {
serverAddr = InetAddress.getByName(SERVER_ADDRESS);
socket = new DatagramSocket(); //DataGram socket is created
packet = new DatagramPacket(buf, buf.length, serverAddr, SERVER_PORT);//Data is loaded with information where to send on address and port number
socket.send(packet);//Data is send in the form of packets
socket.close();//Needs to close the socket before other operation... its a good programming
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
I really need some help... Thanks guys D: