mirror of
https://github.com/0015/ThatProject.git
synced 2026-01-12 09:17:42 +03:00
ESP32 | FLUTTER | BLE | WIFI - HOW TO UPDATE WIFI SSID & PW VIA BLE in ESP32
This commit is contained in:
197
Esp32_wifi_ssid_pw_via_ble/Esp32_WIFI_BLE/Esp32_WIFI_BLE.ino
Normal file
197
Esp32_wifi_ssid_pw_via_ble/Esp32_WIFI_BLE/Esp32_WIFI_BLE.ino
Normal file
@@ -0,0 +1,197 @@
|
||||
#include "EEPROM.h"
|
||||
#define EEPROM_SIZE 128
|
||||
|
||||
#include <WiFi.h>
|
||||
#include <ESP32Ping.h>
|
||||
const char* remote_host = "www.google.com";
|
||||
|
||||
#include <BLEDevice.h>
|
||||
#include <BLEServer.h>
|
||||
#include <BLEUtils.h>
|
||||
#include <BLE2902.h>
|
||||
#define SERVICE_UUID "4fafc201-1fb5-459e-8fcc-c5c9c331914b"
|
||||
#define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8"
|
||||
|
||||
BLEServer* pServer = NULL;
|
||||
BLECharacteristic* pCharacteristic = NULL;
|
||||
bool deviceConnected = false;
|
||||
bool oldDeviceConnected = false;
|
||||
|
||||
const int ledPin = 22;
|
||||
const int modeAddr = 0;
|
||||
const int wifiAddr = 10;
|
||||
|
||||
int modeIdx;
|
||||
|
||||
class MyServerCallbacks: public BLEServerCallbacks {
|
||||
void onConnect(BLEServer* pServer) {
|
||||
deviceConnected = true;
|
||||
BLEDevice::startAdvertising();
|
||||
};
|
||||
|
||||
void onDisconnect(BLEServer* pServer) {
|
||||
deviceConnected = false;
|
||||
}
|
||||
};
|
||||
|
||||
class MyCallbacks: public BLECharacteristicCallbacks {
|
||||
void onWrite(BLECharacteristic *pCharacteristic){
|
||||
std::string value = pCharacteristic->getValue();
|
||||
|
||||
if(value.length() > 0){
|
||||
Serial.print("Value : ");
|
||||
Serial.println(value.c_str());
|
||||
writeString(wifiAddr, value.c_str());
|
||||
}
|
||||
}
|
||||
|
||||
void writeString(int add, String data){
|
||||
int _size = data.length();
|
||||
for(int i=0; i<_size; i++){
|
||||
EEPROM.write(add+i, data[i]);
|
||||
}
|
||||
EEPROM.write(add+_size, '\0');
|
||||
EEPROM.commit();
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
void setup() {
|
||||
// put your setup code here, to run once:
|
||||
Serial.begin(115200);
|
||||
pinMode(ledPin, OUTPUT);
|
||||
|
||||
if(!EEPROM.begin(EEPROM_SIZE)){
|
||||
delay(1000);
|
||||
}
|
||||
|
||||
modeIdx = EEPROM.read(modeAddr);
|
||||
Serial.print("modeIdx : ");
|
||||
Serial.println(modeIdx);
|
||||
|
||||
EEPROM.write(modeAddr, modeIdx !=0 ? 0 : 1);
|
||||
EEPROM.commit();
|
||||
|
||||
if(modeIdx != 0){
|
||||
//BLE MODE
|
||||
digitalWrite(ledPin, true);
|
||||
Serial.println("BLE MODE");
|
||||
bleTask();
|
||||
}else{
|
||||
//WIFI MODE
|
||||
digitalWrite(ledPin, false);
|
||||
Serial.println("WIFI MODE");
|
||||
wifiTask();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void bleTask(){
|
||||
// Create the BLE Device
|
||||
BLEDevice::init("ESP32 THAT PROJECT");
|
||||
|
||||
// Create the BLE Server
|
||||
pServer = BLEDevice::createServer();
|
||||
pServer->setCallbacks(new MyServerCallbacks());
|
||||
|
||||
// Create the BLE Service
|
||||
BLEService *pService = pServer->createService(SERVICE_UUID);
|
||||
|
||||
// Create a BLE Characteristic
|
||||
pCharacteristic = pService->createCharacteristic(
|
||||
CHARACTERISTIC_UUID,
|
||||
BLECharacteristic::PROPERTY_READ |
|
||||
BLECharacteristic::PROPERTY_WRITE |
|
||||
BLECharacteristic::PROPERTY_NOTIFY |
|
||||
BLECharacteristic::PROPERTY_INDICATE
|
||||
);
|
||||
|
||||
pCharacteristic->setCallbacks(new MyCallbacks());
|
||||
// https://www.bluetooth.com/specifications/gatt/viewer?attributeXmlFile=org.bluetooth.descriptor.gatt.client_characteristic_configuration.xml
|
||||
// Create a BLE Descriptor
|
||||
pCharacteristic->addDescriptor(new BLE2902());
|
||||
|
||||
// Start the service
|
||||
pService->start();
|
||||
|
||||
// Start advertising
|
||||
BLEAdvertising *pAdvertising = BLEDevice::getAdvertising();
|
||||
pAdvertising->addServiceUUID(SERVICE_UUID);
|
||||
pAdvertising->setScanResponse(false);
|
||||
pAdvertising->setMinPreferred(0x0); // set value to 0x00 to not advertise this parameter
|
||||
BLEDevice::startAdvertising();
|
||||
Serial.println("Waiting a client connection to notify...");
|
||||
}
|
||||
|
||||
void wifiTask() {
|
||||
String receivedData;
|
||||
receivedData = read_String(wifiAddr);
|
||||
|
||||
if(receivedData.length() > 0){
|
||||
String wifiName = getValue(receivedData, ',', 0);
|
||||
String wifiPassword = getValue(receivedData, ',', 1);
|
||||
|
||||
if(wifiName.length() > 0 && wifiPassword.length() > 0){
|
||||
Serial.print("WifiName : ");
|
||||
Serial.println(wifiName);
|
||||
|
||||
Serial.print("wifiPassword : ");
|
||||
Serial.println(wifiPassword);
|
||||
|
||||
WiFi.begin(wifiName.c_str(), wifiPassword.c_str());
|
||||
Serial.print("Connecting to Wifi");
|
||||
while(WiFi.status() != WL_CONNECTED){
|
||||
Serial.print(".");
|
||||
delay(300);
|
||||
}
|
||||
Serial.println();
|
||||
Serial.print("Connected with IP: ");
|
||||
Serial.println(WiFi.localIP());
|
||||
|
||||
|
||||
Serial.print("Ping Host: ");
|
||||
Serial.println(remote_host);
|
||||
|
||||
if(Ping.ping(remote_host)){
|
||||
Serial.println("Success!!");
|
||||
}else{
|
||||
Serial.println("ERROR!!");
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
String read_String(int add){
|
||||
char data[100];
|
||||
int len = 0;
|
||||
unsigned char k;
|
||||
k = EEPROM.read(add);
|
||||
while(k != '\0' && len< 500){
|
||||
k = EEPROM.read(add+len);
|
||||
data[len] = k;
|
||||
len++;
|
||||
}
|
||||
data[len] = '\0';
|
||||
return String(data);
|
||||
}
|
||||
|
||||
String getValue(String data, char separator, int index){
|
||||
int found = 0;
|
||||
int strIndex[] = {0, -1};
|
||||
int maxIndex = data.length()-1;
|
||||
|
||||
for(int i=0; i<=maxIndex && found <=index; i++){
|
||||
if(data.charAt(i)==separator || i==maxIndex){
|
||||
found++;
|
||||
strIndex[0] = strIndex[1]+1;
|
||||
strIndex[1] = (i==maxIndex) ? i+1 : i;
|
||||
}
|
||||
}
|
||||
return found>index ? data.substring(strIndex[0], strIndex[1]) : "";
|
||||
}
|
||||
|
||||
void loop() {
|
||||
// put your main code here, to run repeatedly:
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user