Arduino IDE ESP32-CAM WiFi 创建Web服务器 Android APP控制LED开关_ardiuno wifi控制led


### 手机连接ESP32-CAM WiFi


这块板子上还有个wifi,把它利用起来,如果手机能连上这个wifi,那不就相当于可以通过wifi控制这块板子了吗?


WiFi得有个名字,连接wifi的密码  
 给wifi分配一个ip地址  
 让他作为网关  
 再配个子网掩码  
 WiFi网络建立完成了


`WiFi的AP模式`:AccessPoint就是接入点的意思,就是把自己共享出来允许别人连接访问接入



#include <WiFi.h>

// 替换成你喜欢的网络名称和密码
const char* ssid = “ESP32_Wifi”;
const char* password = “12345678”;
IPAddress local_IP(192, 168, 1, 1); // 设置本地IP地址
IPAddress gateway(192, 168, 1, 1); // 设置网关
IPAddress subnet(255, 255, 255, 0); // 设置子网掩码

void setup()
{
pinMode(4, OUTPUT); // 设置GPIO4为输出模式
digitalWrite(4, LOW); // 关闭LED灯
Serial.begin(115200); // 初始化串口通信,波特率为115200

// 配置静态IP地址
if (!WiFi.config(local_IP, gateway, subnet)) {
Serial.println(“配置失败”);
}

// 建立Wi-Fi网络
WiFi.mode(WIFI_AP);
boolean result = WiFi.softAP(ssid, password);

if (result == true) {
Serial.print("网络名 SSID: ");
Serial.println(ssid);
Serial.print("IP 地址: ");
Serial.println(WiFi.softAPIP());
} else {
Serial.println(“Wifi启动失败.”);
}
}

void loop() {
// 其他代码
}


这样手机就可以连接上ESP32-CAM的WiFi了


### ESP32-CAM建立Web服务器


ESP32已经共享在网络上了,  
 IP地址是:192.168.1.1  
 用http协议访问通常是80端口  
 我们要提前对这个端口做一下监听,当别人访问我们的时候,我们要给出响应  
 http://192.168.1.1/  
 访问地址就是这个格式  
 所以这就是web服务这就算建立起了一个web服务器  
 服务器就是干活的  
 它负责监听端口,并且做出响应,这就叫做通讯。  
 对方发送请求,服务器给他反馈。



#include <WiFi.h>
#include <ESPAsyncWebServer.h>

const char* ssid = “ESP32”;
const char* password = “12345678”;
IPAddress local_IP(192, 168, 1, 1); // 设置本地IP地址
IPAddress gateway(192, 168, 1, 1); // 设置网关
IPAddress subnet(255, 255, 255, 0); // 设置子网掩码

AsyncWebServer server(80); // 创建服务器对象,指定监听端口80

void setup()
{
pinMode(4, OUTPUT); // 设置GPIO4为输出模式
digitalWrite(4, LOW); // 关闭LED灯
Serial.begin(115200); // 初始化串口通信,波特率为115200

// 配置静态IP地址
if (!WiFi.config(local_IP, gateway, subnet)) {
Serial.println(“STA Failed to configure”);
}

// 建立Wi-Fi网络
WiFi.mode(WIFI_AP);
boolean result = WiFi.softAP(ssid, password);

if (result == true) {
Serial.print("网络名 SSID: ");
Serial.println(ssid);
Serial.print("IP地址: ");
Serial.println(WiFi.softAPIP());
} else {
Serial.println(“Wifi启动失败.”);
}

// 响应网站根路径的请求
server.on(“/”, HTTP_GET, [](AsyncWebServerRequest *request){
request->send(200, “text/plain”, “Hello, World!”);
});

server.begin(); // 启动服务器
}

void loop() {
// 其他代码
}


以上是一个根路径请求,当有人通过浏览器访问http://192.168.1.1的时候,我们就给他返回一个字符串"`Hello, World!`"


### 手机浏览器访问ESP32-CAM Web服务器控制LED开关


同样,我们建立起来了web服务,手机连接上了我们的网络,对于手机的请求,我们也可以做相应的动作,从而实现手机控制ESP32-CAM



#include <WiFi.h>
#include <ESPAsyncWebServer.h>

const char* ssid = “ESP32_Wifi”;
const char* password = “12345678”;
IPAddress local_IP(192, 168, 1, 1); // 设置本地IP地址
IPAddress gateway(192, 168, 1, 1); // 设置网关
IPAddress subnet(255, 255, 255, 0); // 设置子网掩码

AsyncWebServer server(80); // 创建服务器对象,指定监听端口80

void setup()
{
pinMode(4, OUTPUT); // 设置GPIO4为输出模式
digitalWrite(4, LOW); // 关闭LED
Serial.begin(115200); // 初始化串口通信,波特率为115200

// 配置静态IP地址
if (!WiFi.config(local_IP, gateway, subnet)) {
Serial.println(“配置失败”);
}

// 建立Wi-Fi网络
WiFi.mode(WIFI_AP);
boolean result = WiFi.softAP(ssid, password);

if (result == true) {
Serial.print("网络名 SSID: ");
Serial.println(ssid);
Serial.print("IP地址: ");
Serial.println(WiFi.softAPIP());
} else {
Serial.println(“WiFi启动失败.”);
}

// 响应网站根路径的请求
server.on(“/”, HTTP_GET, [](AsyncWebServerRequest *request){
request->send(200, “text/plain”, “Hello, World!”);
});

// 响应打开LED的请求
server.on(“/led/on”, HTTP_GET, [](AsyncWebServerRequest *request){
digitalWrite(4, HIGH);
request->send(200);
});

// 响应关闭LED的请求
server.on(“/led/off”, HTTP_GET, [](AsyncWebServerRequest *request){
digitalWrite(4, LOW);
request->send(200);
});

server.begin(); // 启动服务器
}

void loop() {
// 其他代码
}


以上就是,手机连接ESP32-CAM的WiFi,打开手机浏览器,在地址栏  
 输入 http://192.168.1.1/ 的时候,web服务器就返回"Hello, World!"字符串  
 输入 http://192.168.1.1/led/on 的时候,将LED打开  
 输入 http://192.168.1.1/led/off 的时候,将LED关闭  
 从而实现手机控制


然而,`真正的需求`是要用


### 安卓app控制ESP32-CAM上面的LED灯开关


`通讯协议`


#### 1.ESP32-CAM通电以后建立了WiFi网络,并且启动了web服务,开始监听网络请求


此时ESP32-CAM共享出来一个网络  
 网络名:ESP32\_WiFi  
 密码:12345678  
 IP地址:192.168.1.1  
 网关:192.168.1.1  
 子网掩码:255.255.255.0


#### 2.当我们用手机去连接这个WiFi的时候,WiFi会自动分配给手机一个IP地址


**经验证发现**:  
 WiFi建立后Esp32-CAM的IP是`192.168.4.1`  
 连上他的手机的IP被分配成为了`192.168.4.2`


服务端就是上面那段代码没变


#### 3.安卓端(重点)


我用的是Java写的,没用kotlin。  
 网上找了很多段,也问了问ChatGPT,但是都没有给出正确答案。  
 `安卓比较复杂,遇到很多坑。`  
 点击`ON按钮`后给ESP32-CAM`发送HTTP_GET请求`,ESP32-CAM接收到请求后把灯`打开`  
 点击`OFF按钮`后给ESP32-CAM`发送HTTP_GET请求`,ESP32-CAM接收到请求后把灯`关闭`


先说:`app/build.gradle`文件  
 里面minSdk和targetSdk这个两是重点,因为有些时候一些语句写了由于版本的问题,他是不支持的。



plugins {
id ‘com.android.application’
}

android {
compileSdk 31

defaultConfig {
    applicationId "com.example.led"
    minSdk 23
    targetSdk 31
    versionCode 1
    versionName "1.0"

    testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}

buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
    }
}
compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}

}

dependencies {

implementation 'androidx.appcompat:appcompat:1.4.1'
implementation 'com.google.android.material:material:1.4.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
implementation 'com.amitshekhar.android:android-networking:1.0.2'
implementation 'com.squareup.okhttp3:okhttp:4.10.0'
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'

}


再说:`app/src/main/AndroidManifest.xml`文件  
 这三句是开启网络访问权限,这是大家已经共识的了,不开这个手机app就没有连接wifi的权限。




其实我开了以后也不行,弄了好久,结果找到了这一句  
 就写在application  
 因为安卓9.0以后升级了,直接明文发送请求不让发送了,加上以下这句就行了  
 `限制明文请求`



android:usesCleartextTraffic=“true”


困扰了我好久,555



<?xml version="1.0" encoding="utf-8"?>







    <category android:name="android.intent.category.LAUNCHER"/>
  </intent-filter>
</activity>

主界面:`app/src/main/res/layout/activity_main.xml`文件



<?xml version="1.0" encoding="utf-8"?>

<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android=“http://schemas.android.com/apk/res/android”
xmlns:tools=“http://schemas.android.com/tools”
xmlns:app=“http://schemas.android.com/apk/res-auto”
android:orientation=“vertical”
android:layout_width=“match_parent”
android:layout_height=“match_parent”

<LinearLayout
android:orientation=“vertical”
android:layout_width=“wrap_content”
android:layout_height=“wrap_content” app:layout_constraintTop_toTopOf=“parent”
app:layout_constraintStart_toStartOf=“parent”
app:layout_constraintBottom_toBottomOf=“parent”
app:layout_constraintEnd_toEndOf=“parent”>
<Button
android:id=“@+id/onLED”
android:layout_width=“match_parent”
android:layout_height=“wrap_content”
android:text=“ON”
tools:ignore=“HardcodedText”/>

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年嵌入式&物联网开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新!!

转存中…(img-YbK2FFv8-1715539380581)]

[外链图片转存中…(img-wN2Lyhlg-1715539380581)]

[外链图片转存中…(img-PUsq0eZ6-1715539380582)]

[外链图片转存中…(img-ELPKZj4T-1715539380582)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值