diff --git a/src/sixaunyi/app/src/main/AndroidManifest.xml b/src/sixaunyi/app/src/main/AndroidManifest.xml index afb4a7a..a874084 100644 --- a/src/sixaunyi/app/src/main/AndroidManifest.xml +++ b/src/sixaunyi/app/src/main/AndroidManifest.xml @@ -22,7 +22,7 @@ android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" - android:theme="@style/Theme.Sixaunyi" + android:theme="@style/Theme.Sixaunyi.NoActionBar" tools:targetApi="31"> 180) { + lngDelta -= Math.signum(lngDelta) * 360; + } + + double lng = lngDelta * fraction + a.longitude; + return new LatLng(lat, lng); + } + } + } + } + /** * 清空地图Marker * @param view @@ -401,6 +518,12 @@ public class MainActivity extends AppCompatActivity implements AMapLocationListe ClearMarker_btn.hide(); } + public void moveDrone(){ + SmoothMoveUtil moveUtil = new SmoothMoveUtil(droneMarker); + long time = (long) MonitorDistance/2*1000; + moveUtil.moveDroneMarker(Monitorlatlng,time); + } + public void changeAct(View view) { udpReceiveThread.stopListening(); Intent intent = new Intent(MainActivity.this, VideoActivity.class); @@ -496,7 +619,7 @@ public class MainActivity extends AppCompatActivity implements AMapLocationListe public class UdpReceiveThread extends Thread { private static final String TAG = "UdpReceiveThread"; - private static final int RECEIVE_PORT = 9999; + private static final int mRECEIVE_PORT = RECEIVE_PORT; private boolean mRunning; private String mReceiveIp = Recieve_IP; private String mExpectedData = "Motion detected!"; @@ -506,17 +629,25 @@ public class MainActivity extends AppCompatActivity implements AMapLocationListe @Override public void run() { try { - DatagramSocket socket = new DatagramSocket(RECEIVE_PORT); + DatagramSocket socket = new DatagramSocket(mRECEIVE_PORT); byte[] buffer = new byte[1024]; DatagramPacket packet = new DatagramPacket(buffer, buffer.length); while (mRunning) { + Log.i(TAG, "run: 111111111111111111"); socket.receive(packet); byte[] data = packet.getData(); String receivedString = new String(data, 0, packet.getLength()); Log.d(TAG, "Received data: " + receivedString); if (receivedString.equals(mExpectedData)) { + Log.i(TAG, "run: 222222222222222222222222222"); sendCommand("WARNING"); + Context context = MainActivity.this; + showAlert(context,"传感器报警"); + addDroneMarker(); + moveDrone(); mRunning = false; + + } } socket.close(); @@ -527,6 +658,16 @@ public class MainActivity extends AppCompatActivity implements AMapLocationListe e.printStackTrace(); } } + public void showAlert(Context context, String message) { + AlertDialog.Builder builder = new AlertDialog.Builder(context); + builder.setTitle("警告"); + builder.setMessage(message); + builder.setIcon(R.drawable.warning); + builder.setPositiveButton("确定", null); + + AlertDialog dialog = builder.create(); + dialog.show(); + } public void startListening() { mRunning = true; @@ -595,7 +736,9 @@ public class MainActivity extends AppCompatActivity implements AMapLocationListe } return String.valueOf(angle); } - //UDP发送线程 + /* + *UDP发送线程 + */ class SendRunnable implements Runnable { byte[] mData; InetAddress mAddress; diff --git a/src/sixaunyi/app/src/main/java/com/example/sixaunyi/SettingActivity.java b/src/sixaunyi/app/src/main/java/com/example/sixaunyi/SettingActivity.java index 8ec28ba..fc201aa 100644 --- a/src/sixaunyi/app/src/main/java/com/example/sixaunyi/SettingActivity.java +++ b/src/sixaunyi/app/src/main/java/com/example/sixaunyi/SettingActivity.java @@ -1,14 +1,181 @@ package com.example.sixaunyi; +import static androidx.constraintlayout.motion.utils.Oscillator.TAG; + import androidx.appcompat.app.AppCompatActivity; +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; import android.os.Bundle; +import android.os.Handler; +import android.os.Message; +import android.preference.PreferenceManager; +import android.util.Log; +import android.view.View; +import android.widget.Button; +import android.widget.CompoundButton; +import android.widget.ImageButton; +import android.widget.ImageView; +import android.widget.SeekBar; +import android.widget.Switch; +import android.widget.TextView; +import android.widget.Toast; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.net.DatagramPacket; +import java.net.DatagramSocket; +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; public class SettingActivity extends AppCompatActivity { - private boolean if_jiankong; + + private final static String SEND_to_IP = "192.168.39.47"; + private SeekBar Speed_btn; + private Switch Battery_btn; + private ImageButton return_btn; + private final static int SEND_PORT = 8888; + private ExecutorService mThreadPool = Executors.newCachedThreadPool(); + private Switch photo_btn; + private Context context; + private SharedPreferences sharedPreferences; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_setting); + Speed_btn= findViewById(R.id.speed); + return_btn=findViewById(R.id.returns); + photo_btn = findViewById(R.id.photo); + Battery_btn = findViewById(R.id.Battery_warning); + TextView tvProgress = (TextView) findViewById(R.id.tvProgress); + sharedPreferences = getSharedPreferences("control_state", MODE_PRIVATE); + boolean photo_btn_state= sharedPreferences.getBoolean("photo_btn_state", false); + photo_btn.setChecked(photo_btn_state); + // 恢复SeekBar状态 + int speedProgress = sharedPreferences.getInt("speed_progress", 0); + Speed_btn.setProgress(speedProgress); + tvProgress.setText(String.valueOf(speedProgress+10)); + photo_btn.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + // 保存Switch状态 + SharedPreferences.Editor editor = sharedPreferences.edit(); + editor.putBoolean("photo_btn_state", isChecked); + editor.apply(); + } + }); + Speed_btn.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { + @Override + public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { + tvProgress.setText(String.valueOf(progress+10)); + int speed=progress+10; + String s = "SPEED " + Integer.toString(speed); + try { + sendCommand(s); + } catch (UnknownHostException e) { + e.printStackTrace(); + } + + SharedPreferences.Editor editor = sharedPreferences.edit(); + editor.putInt("speed_progress", progress); + editor.apply(); + + } + @Override + public void onStartTrackingTouch(SeekBar seekBar) {} + + @Override + public void onStopTrackingTouch(SeekBar seekBar) {} + + }); + Battery_btn.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (Battery_btn.isChecked()) { + try { + sendCommand("battery_warning"); + } catch (UnknownHostException e) { + e.printStackTrace(); + } + }else + { + try { + sendCommand("warning_cancel"); + } catch (UnknownHostException e) { + e.printStackTrace(); + } + } + } + }); + return_btn.setOnClickListener(new View.OnClickListener(){ + public void onClick(View v) { + Intent intent = new Intent(SettingActivity.this, VideoActivity.class); + // 启动目标 Activity + finish(); + } + }); + photo_btn.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (photo_btn.isChecked()) { + try { + sendCommand("photo_high"); + } catch (UnknownHostException e) { + e.printStackTrace(); + } + }else + { + try { + sendCommand("photo_low"); + } catch (UnknownHostException e) { + e.printStackTrace(); + } + } + } + }); } + /* + * UDP数据发送线程 + * */ + class SendRunnable implements Runnable { + byte[] mData; + InetAddress mAddress; + int mPort; + public SendRunnable(byte[] data, InetAddress address, int port) { + mData = data; + mAddress = address; + mPort = port; + } + + @Override + public void run() { + try { + // 创建发送数据报文 + DatagramPacket packet = new DatagramPacket(mData, mData.length, mAddress, mPort); + // 创建 DatagramSocket 对象并发送数据报文 + DatagramSocket socket = new DatagramSocket(); + socket.send(packet); + + // 关闭 DatagramSocket 对象 + socket.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + /*封装函数*/ + private void sendCommand(String str) throws UnknownHostException { + byte[] sendData = str.getBytes(); + InetAddress address = InetAddress.getByName(SEND_to_IP); + SendRunnable sendRunnable1 = new SendRunnable(sendData, address, SEND_PORT); + mThreadPool.execute(sendRunnable1); + } + + } \ No newline at end of file diff --git a/src/sixaunyi/app/src/main/java/com/example/sixaunyi/VideoActivity.java b/src/sixaunyi/app/src/main/java/com/example/sixaunyi/VideoActivity.java index 50b91af..28d4e07 100644 --- a/src/sixaunyi/app/src/main/java/com/example/sixaunyi/VideoActivity.java +++ b/src/sixaunyi/app/src/main/java/com/example/sixaunyi/VideoActivity.java @@ -26,6 +26,8 @@ import android.util.Log; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; +import android.view.animation.AlphaAnimation; +import android.view.animation.Animation; import android.widget.Button; import android.widget.CompoundButton; import android.widget.ImageButton; @@ -78,6 +80,8 @@ public class VideoActivity extends AppCompatActivity { private float mdistance; // 创建一个可缓存的线程池 private ExecutorService mThreadPool = Executors.newCachedThreadPool(); + private UdpDataThread warning_thread; + private TextView battery_warning; //ReceiveData()显示到imageView //manager部分:打开线程,接收 //model部分:发送视频流 @@ -99,9 +103,19 @@ public class VideoActivity extends AppCompatActivity { TakeOff_btn = findViewById(R.id.takeoff_button); Mode_btn = findViewById(R.id.toggleButton2); Setting_btn = findViewById(R.id.setting_button); + battery_warning =findViewById(R.id.warning); + battery_warning.setTextColor(Color.RED); + Animation anim = new AlphaAnimation(0.0f, 1.0f); + anim.setDuration(500); // 闪烁时间间隔 + anim.setStartOffset(20); + anim.setRepeatMode(Animation.REVERSE); + anim.setRepeatCount(Animation.INFINITE); + battery_warning.startAnimation(anim); Intent i = getIntent(); mdistance = i.getFloatExtra("Distance",0); mangle = i.getStringExtra("Angle"); + warning_thread = new UdpDataThread(); + warning_thread.start(); try { Condition_Init(); } catch (UnknownHostException e) { @@ -267,7 +281,7 @@ public class VideoActivity extends AppCompatActivity { } private void changetoManual() throws UnknownHostException { - sendCommand("MAN"); + sendCommand("STOP"); } class ReceiveHandler extends Handler{ @@ -378,6 +392,49 @@ public class VideoActivity extends AppCompatActivity { mThreadPool.execute(sendRunnable1); } + /* + *UDP数据接收线程 + */ + public class UdpDataThread extends Thread { + private DatagramSocket socket; + private boolean running; + private byte[] buffer; + private static final int BUFFER_SIZE = 1024; // 设置接收缓冲区大小 + + public UdpDataThread() { + buffer = new byte[BUFFER_SIZE]; + } + + @Override + public void run() { + running = true; + + try { + socket = new DatagramSocket(6666); // 设置接收端口号 + while (running) { + DatagramPacket packet = new DatagramPacket(buffer, buffer.length); + socket.receive(packet); + String receivedData = new String(packet.getData(), 0, packet.getLength()); + if (receivedData.equals("电量低于10%")) { + battery_warning.setText(receivedData);}else{ + battery_warning.setText(""); + } + System.out.println("接收到数据:" + receivedData); + // 在这里处理收到的数据,可以根据实际需求进行解析或其他操作 + } + } catch (IOException e) { + e.printStackTrace(); + } finally { + if (socket != null) { + socket.close(); + } + } + } + + public void stopThread() { + running = false; + } + } //初始化UDP发送线程 // private static void sendCommand(String Sendstr) throws UnknownHostException { // InetAddress sendIP = InetAddress.getByName(SEND_to_IP); // 目标 IP 地址 diff --git a/src/sixaunyi/app/src/main/res/drawable-v24/returns.png b/src/sixaunyi/app/src/main/res/drawable-v24/returns.png new file mode 100644 index 0000000..dbf7443 Binary files /dev/null and b/src/sixaunyi/app/src/main/res/drawable-v24/returns.png differ diff --git a/src/sixaunyi/app/src/main/res/drawable-v24/warning.png b/src/sixaunyi/app/src/main/res/drawable-v24/warning.png new file mode 100644 index 0000000..7b4eb89 Binary files /dev/null and b/src/sixaunyi/app/src/main/res/drawable-v24/warning.png differ diff --git a/src/sixaunyi/app/src/main/res/drawable/drone.png b/src/sixaunyi/app/src/main/res/drawable/drone.png new file mode 100644 index 0000000..f70e2ad Binary files /dev/null and b/src/sixaunyi/app/src/main/res/drawable/drone.png differ diff --git a/src/sixaunyi/app/src/main/res/drawable/sensor.png b/src/sixaunyi/app/src/main/res/drawable/sensor.png new file mode 100644 index 0000000..8df9504 Binary files /dev/null and b/src/sixaunyi/app/src/main/res/drawable/sensor.png differ diff --git a/src/sixaunyi/app/src/main/res/drawable/txt_radiuborder.xml b/src/sixaunyi/app/src/main/res/drawable/txt_radiuborder.xml new file mode 100644 index 0000000..add562e --- /dev/null +++ b/src/sixaunyi/app/src/main/res/drawable/txt_radiuborder.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/sixaunyi/app/src/main/res/layout-land/activity_control.xml b/src/sixaunyi/app/src/main/res/layout-land/activity_control.xml index f81124b..e57105c 100644 --- a/src/sixaunyi/app/src/main/res/layout-land/activity_control.xml +++ b/src/sixaunyi/app/src/main/res/layout-land/activity_control.xml @@ -61,7 +61,7 @@ android:background="@null" android:contentDescription="@string/turn_left_button" android:src="@drawable/turnleft" - android:scaleType="centerInside" + android:scaleType="centerCrop" /> @@ -199,11 +199,10 @@ android:id="@+id/setting_button" android:layout_width="50dp" android:layout_height="50dp" - android:src="@drawable/setting" android:background="@null" android:contentDescription="@string/setting_button" android:scaleType="centerInside" - /> + android:src="@drawable/setting" /> + diff --git a/src/sixaunyi/app/src/main/res/layout/activity_main.xml b/src/sixaunyi/app/src/main/res/layout/activity_main.xml index 2d5b35b..0620642 100644 --- a/src/sixaunyi/app/src/main/res/layout/activity_main.xml +++ b/src/sixaunyi/app/src/main/res/layout/activity_main.xml @@ -22,7 +22,7 @@ android:layout_alignParentBottom="true" android:layout_margin="20dp" android:clickable="true" - + android:onClick="moveDrone" android:src="@drawable/icon_favorite_red" android:visibility="gone" app:backgroundTint="#FFF" diff --git a/src/sixaunyi/app/src/main/res/layout/activity_setting.xml b/src/sixaunyi/app/src/main/res/layout/activity_setting.xml index 80e5d0b..fa7367f 100644 --- a/src/sixaunyi/app/src/main/res/layout/activity_setting.xml +++ b/src/sixaunyi/app/src/main/res/layout/activity_setting.xml @@ -1,5 +1,6 @@ @@ -16,34 +17,67 @@ android:background="#80FFFFFF" android:orientation="vertical" android:padding="16dp"> + + android:text="电量预警" + android:textColor="@color/white" + android:textSize="28dp" + android:background="@drawable/txt_radiuborder"/> + android:textSize="28dp" + android:textColor="@color/white" + android:background="@drawable/txt_radiuborder"/> - - - + android:layout_marginTop="10dp" + android:orientation="horizontal" + android:background="@drawable/txt_radiuborder"> + + + + + + + + + + +