ESP8266:
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
const char *ssid = "dsx_zj"; //网络名称
const char *password = "dsxbs725"; //网络密码
const int pwm_pin0 = 16; // D0
const int pwm_pin1 = 5; // D1
const int pwm_pin2 = 4; // D2
const int pwm_pin3 = 0; // D3
int speed = 0;
WiFiUDP Udp;
unsigned int udpPort = 8080; // 本地端口号
char incomingPacket[128]; // 接收缓冲区
void setup()
{
Serial.begin(115200);
analogWriteFreq(1000); // 频率设置为1kHz,即周期为1ms
analogWriteRange(1024); // 范围设置为0--1024
analogWrite(pwm_pin0, 0); //初始值 0
analogWrite(pwm_pin1, 0); //初始值 0
analogWrite(pwm_pin2, 0); //初始值 0
analogWrite(pwm_pin3, 0); //初始值 0
Serial.println();
Serial.printf("Connecting to %s ", ssid);
WiFi.mode(WIFI_STA);
WiFi.setAutoConnect(false);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println(" connected!");
//以下开启UDP监听并打印输出信息
Udp.begin(udpPort);
Serial.printf("Now listening at IP %s, UDP port %d\n", WiFi.localIP().toString().c_str(), udpPort);
}
void loop()
{
int packetSize = Udp.parsePacket(); //获取当前队首数据包长度
if (packetSize) // 有数据可用
{
Serial.printf("Received %d bytes from %s, port %d\n", packetSize, Udp.remoteIP().toString().c_str(), Udp.remotePort());
int len = Udp.read(incomingPacket, 128); // 读取数据到incomingPacket
if (len > 0) // 如果正确读取
{
incomingPacket[len] = 0; //末尾补0结束字符串
Serial.printf("UDP packet contents: %s\n", incomingPacket);
String temp = String(incomingPacket);
if (temp.substring(0,5) == "speed") // 如果收到Turn off
{
speed = temp.substring(6,temp.length()).toInt();
analogWrite(pwm_pin0, speed);
analogWrite(pwm_pin1, speed);
analogWrite(pwm_pin2, speed);
analogWrite(pwm_pin3, speed);
Udp.write("The Plante Speed is:" + speed); // 回复LED has been turn off
Udp.endPacket();
}
}
}
}
APP:
Androidmanifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.feijiapp10">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.Feijiapp10">
<activity
android:name=".MainActivity"
android:exported="true"
android:screenOrientation="landscape">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-permission android:name="android.permission.INTERNET" />
</manifest>
MainActivity.java
package com.example.feijiapp10;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.text.InputType;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.SeekBar;
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 {
private SeekBar mSeekBar;
private Button btn;
private int speed; // 保存飞机速度
private String ip;
private EditText kj_ip;
private int port;
private EditText kj_port;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mSeekBar=findViewById(R.id.seekBar);
btn=findViewById(R.id.connect);
kj_ip = findViewById(R.id.ip);
kj_port = findViewById(R.id.port);
//kj_ip.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL);
kj_port.setInputType(InputType.TYPE_CLASS_NUMBER);
mSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override //当滑块进度改变时,会执行该方法下的代码
public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
speed = i;
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
new Thread((new Client())).start();
btn.setText("已连接,滑动滑块改变飞机转速");
//Toast.makeText(MainActivity.this,"滑动滑块改变飞机速度",Toast.LENGTH_LONG).show();
}
});
//new Thread((new Client())).start();
}
public class Client implements Runnable{
private DatagramPacket packet;
private DatagramSocket socket;
public Client(){
}
@Override
public void run() {
while(true){
try {
ip = kj_ip.getText().toString();
port = Integer.parseInt(String.valueOf(kj_port.getText()));
InetAddress serverAdder = InetAddress.getByName(ip);
socket = new DatagramSocket();
String tmp = "speed:" + speed;
byte[] buf = tmp.getBytes();
packet = new DatagramPacket(buf, buf.length, serverAdder, port);
socket.send(packet);
socket.close();
Thread.sleep(100);
} catch (SocketException | UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<EditText
android:id="@+id/ip"
android:layout_width="match_parent"
android:layout_height="40dp"
android:hint="IP"
android:text="192.168.0.10" />
<EditText
android:id="@+id/port"
android:layout_width="match_parent"
android:layout_height="40dp"
android:hint="PORT"
android:text="8080" />
<Button
android:id="@+id/connect"
android:layout_width="match_parent"
android:layout_height="60dp"
android:text="连接" />
<SeekBar
android:id="@+id/seekBar"
android:layout_width="match_parent"
android:layout_height="154dp"
android:max="1024"
android:progress="0" />
</LinearLayout>