Rabu, 04 Juni 2025

Arduino Web Server FULLY CODE

 #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();
}

=======

UJI:http://192.168.1.10/send?char=B



Respon: http://192.168.1.10/status



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>