按钮源码
//作者:HZF
package com.ff.access;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EdgeToEdge.enable(this);
setContentView(R.layout.activity_main);
Button buttonSend = findViewById(R.id.button_one);
buttonSend.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
sendDataAsync("这里填你要输入的指令");
}
});
}
private void sendDataAsync(String zf) {
new SendDataAsyncTask().execute(zf);
}
private class SendDataAsyncTask extends AsyncTask<String, Void, Boolean> {
@Override
protected Boolean doInBackground(String... params) {
DatagramSocket udpClient = null;
try {
udpClient = new DatagramSocket();
InetAddress serverAddress = InetAddress.getByName("125.88.11.6");
// InetAddress serverAddress = InetAddress.getByName("10.10.2.21");
final int serverPort = 8002;
// final int serverPort = 60000;
byte[] sendData = hexStringToByteArray(params[0]);
DatagramPacket packet = new DatagramPacket(sendData, sendData.length,
serverAddress, serverPort);
udpClient.send(packet);
return true;
} catch (IOException e) {
e.printStackTrace();
return false;
} finally {
if (udpClient != null && !udpClient.isClosed()) {
udpClient.close();
}
}
}
@Override
protected void onPostExecute(Boolean success) {
if (success) {
showToast("开锁成功,已发送指令");
} else {
showToast("开锁失败,请检查网络连接或服务器设置或重启软件");
}
}
}
private void showToast(String zf) {
Toast.makeText(this, zf, Toast.LENGTH_SHORT).show();
}
//转换十六进制发送
public static byte[] hexStringToByteArray(String s) {
int len = s.length();
byte[] data = new byte[len / 2];
for (int i = 0; i < len; i += 2) {
data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
+ Character.digit(s.charAt(i + 1), 16));
}
return data;
}
}
Layout的源码
<?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:background="@color/white"
android:orientation="vertical"> <!-- 表示视图的子元素将在垂直方向上进行排列-->
<TextView
android:background="#FFB5B5"
android:layout_width="match_parent"
android:layout_height="200dp"
android:text="@string/logo"
android:textSize="50sp"
android:textStyle="bold"
android:gravity="center"
android:shadowDx="2.0"
android:shadowRadius="3.0"
android:shadowColor="#FFBFFF"
/>
<Button
android:id="@+id/button_one"
android:layout_width="match_parent"
android:layout_height="100dp"
android:gravity="center"
android:text="@string/key"
android:textSize="35sp"
/>
<!-- <Button-->
<!-- android:id="@+id/button_two"-->
<!-- android:layout_width="match_parent"-->
<!-- android:layout_height="100dp"-->
<!-- android:gravity="center"-->
<!-- android:text="@string/key2"-->
<!-- android:textSize="35sp"-->
<!-- />-->
</LinearLayout>
AndroidManifesh源码
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<application
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher"
android:supportsRtl="true"
android:theme="@style/Theme.Access"
tools:targetApi="31">
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
注意事项
门禁指令是需要你通过网络抓包进行查看,需要知道门禁设备的固定ip地址访问的端口
然后去路由器虚拟网络映射到外网,如果没有路由器访问设置只能做到内网访问。