#include <WiFi.h>
#include <WebServer.h>
//http://192.168.1.10/send?char=B
const char* ssid = "CapiBara";
const char* password = "77779999";
String gtw = "192.168.1.1";
WebServer server(80);
String lastReceivedFromAndroid = "";
String charToSendToAndroid = "Z";
void handleSend() {
if (server.hasArg("char")) {
lastReceivedFromAndroid = server.arg("char");
Serial.println("Received from Android: " + lastReceivedFromAndroid);
// Contoh: ubah respons
if (lastReceivedFromAndroid == "A") {charToSendToAndroid = "X";}
else if (lastReceivedFromAndroid == "B") {charToSendToAndroid = "Y";}
else if (lastReceivedFromAndroid == "C") {charToSendToAndroid = "Z";}
else{charToSendToAndroid = "@"+lastReceivedFromAndroid+"#";}
server.send(200, "text/plain", "OK");
} else {
server.send(400, "text/plain", "Missing char param");
}
}
void handleStatus() {
server.send(200, "text/plain", charToSendToAndroid);
Serial.println("Sent to Android: " + charToSendToAndroid);
}
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
Serial.print("Connecting");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nConnected to WiFi. IP: ");
Serial.println(WiFi.localIP());
gtw= WiFi.gatewayIP().toString();
Serial.print("Gateway (Access Point IP): ");
Serial.println(gtw);
server.on("/send", handleSend);
server.on("/status", handleStatus);
server.begin();
}
void loop() {
server.handleClient();
}
package com.appsensor.geminillmjava;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
public class WebServerAA extends AppCompatActivity {
//http://192.168.1.10/send?char=B
private TextView txtheader;
private EditText etQuestion;
private Button btnSubmit;
private TextView tvAnswer;
String IP="http://192.168.1.3/";
private final android.os.Handler handler = new android.os.Handler();
private final int POLLING_INTERVAL = 2000; // tiap 2 detik
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.geminillm);
setTitle("WebServer Android Arduino");
txtheader = findViewById(R.id.tvTitle);
txtheader.setText("Aplikasi RX / TX Pesan AA");
etQuestion = findViewById(R.id.etQuestion);
etQuestion.setText(IP+"A");
btnSubmit = findViewById(R.id.btnSubmit);
btnSubmit.setText("Sent WebServer");
tvAnswer = findViewById(R.id.tvAnswer);
tvAnswer.setText("");
btnSubmit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String question = etQuestion.getText().toString().trim();
if (!question.isEmpty()) {
String[]parts=question.split("/");
if(parts.length>1) {
IP = parts[0];
String message = parts[parts.length - 1];
sendCharToESP32(message);
}
else{
Toast.makeText(WebServerAA.this, "Gunakan Pola IP/PESAN, \nmisal: http://192.168.1.3/", Toast.LENGTH_SHORT).show();
}
} else {
Toast.makeText(WebServerAA.this, "Pesan tidak boleh kosong!", Toast.LENGTH_SHORT).show();
}
}
});
tvAnswer.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
getCharFromESP32();
}
});
startAutoPolling();
}
private final Runnable pollingRunnable = new Runnable() {
@Override
public void run() {
getCharFromESP32(); // Panggil fungsi yang sudah ada
handler.postDelayed(this, POLLING_INTERVAL); // Jadwalkan lagi
}
};
private void startAutoPolling() {
handler.postDelayed(pollingRunnable, POLLING_INTERVAL);
}
private void stopAutoPolling() {
handler.removeCallbacks(pollingRunnable);
}
@Override
protected void onPause() {
super.onPause();
stopAutoPolling();
}
@Override
protected void onResume() {
super.onResume();
startAutoPolling();
}
public void sendCharToESP32(String character) {
String url = IP+"send?char=" + character;
new Thread(() -> {
try {
URL obj = new URL(url);
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
con.getInputStream().close(); // Eksekusi
} catch (Exception e) {
e.printStackTrace();
}
}).start();
}
public void getCharFromESP32() {
String url = IP+"status";
new Thread(() -> {
try {
HttpURLConnection con = (HttpURLConnection) new URL(url).openConnection();
con.setRequestMethod("GET");
BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
String response = in.readLine();
in.close();
runOnUiThread(() -> {
tvAnswer.setText("ESP32 Sent: " + response);
});
} catch (Exception e) {
e.printStackTrace();
}
}).start();
}
}
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp"
tools:context=".GeminiLLMJava">
<TextView
android:id="@+id/tvTitle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="Asisten Pribadi ISTN Kampus DKI Jakarta"
android:textSize="20sp"
android:textStyle="bold"
android:gravity="center"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:layout_marginBottom="16dp"/>
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/tilQuestion"
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:hint="Masukkan pertanyaan Anda"
app:layout_constraintTop_toBottomOf="@id/tvTitle"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:layout_marginTop="16dp">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/etQuestion"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="top|start"
android:inputType="textMultiLine"
android:maxLines="6"
android:minLines="3" />
</com.google.android.material.textfield.TextInputLayout>
<Button
android:id="@+id/btnSubmit"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="Tanyakan ke AI"
app:layout_constraintTop_toBottomOf="@id/tilQuestion"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:layout_marginTop="16dp" />
<TextView
android:id="@+id/tvAnswerLabel"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="Jawaban AI:"
android:textSize="16sp"
android:textStyle="bold"
app:layout_constraintTop_toBottomOf="@id/btnSubmit"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:layout_marginTop="24dp" />
<ScrollView
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintTop_toBottomOf="@id/tvAnswerLabel"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:layout_marginTop="8dp">
<TextView
android:id="@+id/tvAnswer"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/rounded_border"
android:padding="12dp"
android:text="Jawaban akan muncul di sini..."
android:textSize="16sp"
android:textColor="@android:color/black"
android:fontFamily="monospace"
android:lineSpacingExtra="4dp"
android:scrollbars="vertical" />
</ScrollView>
</androidx.constraintlayout.widget.ConstraintLayout>