Android的AsyncTask的发送UDP数据包 [英] Android AsyncTask sending UDP packet
问题描述
我想使用的AsyncTask发送数据报包,但它不工作!
我补充一点,可能需要的所有的权限!
我认为问题可能出在的AsyncTask的
socket.send(数据包);
请帮我解决这个:)
以我的XML文件
<使用许可权
机器人:名字=android.permission.INTERNET对>< /使用许可权>
<使用许可权的android:NAME =android.permission.ACCESS_NETWORK_STATE>< /使用说明 - 许可>
<使用许可权的android:NAME =android.permission.CHANGE_WIFI_MULTICAST_STATE>< /使用许可权>公共类DroneMain延伸活动{
串at_cmd =;
字符串行动=;
FloatBuffer FB = NULL;
IntBuffer IB = NULL;
INT PORT = 5556;
浮速度=(浮点)0.1;
INT SEQ = 1;
公开处理程序处理程序;
InetAddress类inet_addr;
DatagramSocket的插座;
公共按钮btnForward,btnBackward,btnLeft,btnRight
,btnEmrgency,btnTakeoff,btnLanding,btnUp,btnDown;
///////////////////////////////////////主要////////// ////////////////////////////
@覆盖
公共无效的onCreate(捆绑savedInstanceState){
super.onCreate(savedInstanceState);
的setContentView(R.layout.activity_drone_main); /////////////////////按钮取景器//////////////////////
btnForward =(按钮)findViewById(R.id.forwardBtn);
btnBackward =(按钮)findViewById(R.id.backwardBtn);
btnLeft =(按钮)findViewById(R.id.LeftBtn);
btnRight =(按钮)findViewById(R.id.downBtn);
btnUp =(按钮)findViewById(R.id.upBtn);
btnDown =(按钮)findViewById(R.id.downBtn);
btnEmrgency =(按钮)findViewById(R.id.emergencyBtn);
btnTakeoff =(按钮)findViewById(R.id.takeoffBtn);
btnLanding =(按钮)findViewById(R.id.LandingBtn);
/////////////////////按钮侦听///////////////////////
btnForward.setOnClickListener(btnForwardListener);
btnBackward.setOnClickListener(BackwardListener);
btnLeft.setOnClickListener(btnLeftListener);
btnRight.setOnClickListener(btnRightListener);
btnUp.setOnClickListener(btnUpListener);
btnDown.setOnClickListener(btnDownListener);
btnEmrgency.setOnClickListener(btnEmrgencyListener);
btnTakeoff.setOnClickListener(btnTakeoffListener);
btnLanding.setOnClickListener(btnLandingListener);
Log.e(///,关于创建结束);
}
///////////////////////////////////////对创建结束
公众诠释intOfFloat(浮点六){
/*fb.put(0,F);
返回ib.get(0); * /
如果(FB!= NULL)fb.put(0,f)项;
如果(IB =空!)返回ib.get(0);
否则返回0;
} 公共Button.OnClickListener btnForwardListener =
新Button.OnClickListener(){
@覆盖
公共无效的onClick(查看为arg0){
Log.e(///键,forward_enter1);
行动=继续前进(间距+);
at_cmd =AT * PCMD =+(SEQ ++)+,1,+ intOfFloat(速度)+,0,0,0;
新ATcommandThread()执行();
}};公共Button.OnClickListener BackwardListener =
新Button.OnClickListener(){
@覆盖
公共无效的onClick(查看为arg0){
行动=留后路(俯仰);
at_cmd =AT * PCMD =+(SEQ ++)+,1,+ intOfFloat( - 速度)+,0,0,0;
// AT * PCMD = 1,0,1036831949,0,0落后
新ATcommandThread()执行(); }};公共Button.OnClickListener btnLeftListener =
新Button.OnClickListener(){
@覆盖
公共无效的onClick(查看为arg0){
行动=转到左(卷子);
// at_cmd =AT * PCMD =+(SEQ ++)+,1,0,+ intOfFloat( - 速度)+,0,0;
at_cmd =AT * PCMD =+(SEQ ++)+,1,+ intOfFloat( - 速度)+,0,0,0;
// AT * PCMD = 1,-1110651699,0,0,0'左安全
新ATcommandThread()执行();
}};公共Button.OnClickListener btnRightListener =
新Button.OnClickListener(){
@覆盖
公共无效的onClick(查看为arg0){
行动=向右走(卷+);
at_cmd =AT * PCMD =+(SEQ ++)+,1,+ intOfFloat(+速度)+0,0,0;
// AT * PCMD = 1,1036831949,0,0,0安全权
Log.e(AT * PCMD,at_cmd);
新ATcommandThread()执行(); }};公共Button.OnClickListener btnUpListener =
新Button.OnClickListener(){
@覆盖
公共无效的onClick(查看为arg0){
行动=上(GAZ +);
at_cmd =AT * PCMD =+(SEQ ++)+,1,0,0,+ intOfFloat(速度)+,0;
新ATcommandThread()执行();
}};公共Button.OnClickListener btnDownListener =
新Button.OnClickListener(){
@覆盖
公共无效的onClick(查看为arg0){
行动=下去(gaz-);
at_cmd =AT * PCMD =+(SEQ ++)+,1,0,0,+ intOfFloat( - 速度)+,0;
//移动无人机设置水平面参考
新ATcommandThread()执行(); }};公共Button.OnClickListener btnEmrgencyListener =
新Button.OnClickListener(){
@覆盖
公共无效的onClick(查看为arg0){
行动=紧急情况;
at_cmd =AT * REF =+(SEQ ++)+,290717952;
新ATcommandThread()执行(); }};公共Button.OnClickListener btnTakeoffListener =
新Button.OnClickListener(){
@覆盖
公共无效的onClick(查看为arg0){
行动=起飞
at_cmd =AT * REF =+(SEQ ++)+,290718208;
新ATcommandThread()执行(); }};公共Button.OnClickListener btnLandingListener = 新Button.OnClickListener(){
@覆盖
公共无效的onClick(查看为arg0){
行动=落地;
at_cmd =AT * REF =+(SEQ ++)+,290717696;
新ATcommandThread()执行(); }};
@覆盖
公共布尔onCreateOptionsMenu(菜单菜单){
。getMenuInflater()膨胀(R.menu.activity_drone_main,菜单);
返回true;
}公共类ATcommandThread扩展的AsyncTask<字符串,整数,布尔> { @覆盖
保护布尔doInBackground(字符串...为arg0){
字节[] = ip_bytes新的字节[] {(字节)192,(字节)168(字节)1,(字节)1};
尝试{
inet_addr = InetAddress.getByAddress(ip_bytes);
}赶上(UnknownHostException异常五){
// TODO自动生成catch块
e.printStackTrace();
}
Log.e(AT命令,at_cmd));
。字节[]缓冲=(at_cmd +\\ r)的getBytes();
DatagramPacket类包=新的DatagramPacket(缓冲,buffer.length,inet_addr,PORT);
尝试{
socket.send(包);
}赶上(IOException异常五){
// TODO自动生成catch块
e.printStackTrace();
}
Log.e(///在命令发送,在命令主题);
返回null;
}
}
}
10月1日至24日:57:26.449:E /跟踪(1356):错误打开跟踪文件:没有这样的文件或目录(2)
10月1日至24日:57:26.948:电子////(1356):对创建结束
10月1日至24日:57:27.109:D / gralloc_goldfish(1356):无仿真模拟GPU检测。
10月1日至24日:57:27.189:I / ActivityManager(160):显示com.example.dronedivideandroid / .DroneMain:+ 1s232ms
10月1日至24日:57:36.419:电子////按钮(1356):forward_enter1
10月1日至24日:57:36.419:E / AT命令:(1356):at_cmd)
10月1日至24日:57:36.429:W / dalvikvm(1356):主题ID = 11:螺纹未捕获的异常退出(组= 0x40a13300)
10月1日至24日:57:36.439:E / AndroidRuntime(1356):致命异常:AsyncTask的#1
10月1日至24日:57:36.439:E / AndroidRuntime(1356):了java.lang.RuntimeException:执行doInBackground发生错误()
10月1日至24日:57:36.439:E / AndroidRuntime(1356):在android.os.AsyncTask $ 3.done(AsyncTask.java:299)
10月1日至24日:57:36.439:E / AndroidRuntime(1356):在java.util.concurrent.FutureTask中$ Sync.innerSetException(FutureTask.java:273)
10月1日至24日:57:36.439:E / AndroidRuntime(1356):在java.util.concurrent.FutureTask.setException(FutureTask.java:124)
10月1日至24日:57:36.439:E / AndroidRuntime(1356):在java.util.concurrent.FutureTask中$ Sync.innerRun(FutureTask.java:307)
10月1日至24日:57:36.439:E / AndroidRuntime(1356):在java.util.concurrent.FutureTask.run(FutureTask.java:137)
10月1日至24日:57:36.439:E / AndroidRuntime(1356):在android.os.AsyncTask $ SerialExecutor $ 1.run(AsyncTask.java:230)
10月1日至24日:57:36.439:E / AndroidRuntime(1356):在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
10月1日至24日:57:36.439:E / AndroidRuntime(1356):在java.util.concurrent.ThreadPoolExecutor中的$ Worker.run(ThreadPoolExecutor.java:569)
10月1日至24日:57:36.439:E / AndroidRuntime(1356):在java.lang.Thread.run(Thread.java:856)
10月1日至24日:57:36.439:E / AndroidRuntime(1356):因:显示java.lang.NullPointerException
10月1日至24日:57:36.439:E / AndroidRuntime(1356):在com.example.dronedivideandroid.DroneMain $ ATcommandThread.doInBackground(DroneMain.java:201)
10月1日至24日:57:36.439:E / AndroidRuntime(1356):在com.example.dronedivideandroid.DroneMain $ ATcommandThread.doInBackground(DroneMain.java:1)
10月1日至24日:57:36.439:E / AndroidRuntime(1356):在android.os.AsyncTask $ 2.call(AsyncTask.java:287)
10月1日至24日:57:36.439:E / AndroidRuntime(1356):在java.util.concurrent.FutureTask中$ Sync.innerRun(FutureTask.java:305)
10月1日至24日:57:36.439:E / AndroidRuntime(1356):... 5个
是的,那么你需要实际分配插槽,异常是空指针,因为你声明的插槽,但在使用前没有分配它。现在,这应该工作,但你会不断地分配一个新的套接字。你应该采取的路线:我下面插入插座=新的DatagramSocket(),并把那在OnCreate最有可能的
保护布尔doInBackground(字符串...为arg0){
字节[] = ip_bytes新的字节[] {(字节)192,(字节)168(字节)1,(字节)1};
尝试{
inet_addr = InetAddress.getByAddress(ip_bytes);
}赶上(UnknownHostException异常五){
// TODO自动生成catch块
e.printStackTrace();
}
Log.e(AT命令,at_cmd));
。字节[]缓冲=(at_cmd +\\ r)的getBytes();
DatagramPacket类包=新的DatagramPacket(缓冲,buffer.length,inet_addr,PORT);
尝试{
插座=新的DatagramSocket();
socket.send(包);
}赶上(IOException异常五){
// TODO自动生成catch块
e.printStackTrace();
}
Log.e(///在命令发送,在命令主题);
返回null;
}
I want to use asynctask to send a datagram packet, but it not work!!
I have add all permission that may need!
I think that the problem may be in the asynctask of
socket.send(packet);
please help me solve this :)
"In my XML file"
<uses-permission
android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses- permission>
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"></uses-permission>
public class DroneMain extends Activity {
String at_cmd = "";
String action = "";
FloatBuffer fb=null;
IntBuffer ib=null;
int PORT=5556;
float speed = (float)0.1;
int seq = 1;
public Handler handler ;
InetAddress inet_addr;
DatagramSocket socket;
public Button btnForward,btnBackward,btnLeft,btnRight
,btnEmrgency,btnTakeoff,btnLanding,btnUp,btnDown;
///////////////////////////////////////MAIN//////////////////////////////////////
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_drone_main);
/////////////////////Button Finder//////////////////////
btnForward=(Button)findViewById(R.id.forwardBtn);
btnBackward=(Button)findViewById(R.id.backwardBtn);
btnLeft=(Button)findViewById(R.id.LeftBtn);
btnRight=(Button)findViewById(R.id.downBtn);
btnUp=(Button)findViewById(R.id.upBtn);
btnDown=(Button)findViewById(R.id.downBtn);
btnEmrgency=(Button)findViewById(R.id.emergencyBtn);
btnTakeoff=(Button)findViewById(R.id.takeoffBtn);
btnLanding=(Button)findViewById(R.id.LandingBtn);
/////////////////////Button Listener///////////////////////
btnForward.setOnClickListener(btnForwardListener);
btnBackward.setOnClickListener(BackwardListener);
btnLeft.setOnClickListener(btnLeftListener);
btnRight.setOnClickListener(btnRightListener);
btnUp.setOnClickListener(btnUpListener);
btnDown.setOnClickListener(btnDownListener);
btnEmrgency.setOnClickListener(btnEmrgencyListener);
btnTakeoff.setOnClickListener(btnTakeoffListener);
btnLanding.setOnClickListener(btnLandingListener);
Log.e("///","end of on create");
}
///////////////////////////////////////end of on create
public int intOfFloat(float f) {
/*fb.put(0, f);
return ib.get(0);*/
if(fb != null) fb.put(0, f);
if(ib != null) return ib.get(0);
else return 0;
}
public Button.OnClickListener btnForwardListener=
new Button.OnClickListener(){
@Override
public void onClick(View arg0) {
Log.e("///button","forward_enter1");
action = "Go Forward (pitch+)";
at_cmd = "AT*PCMD=" + (seq++) + ",1," + intOfFloat(speed)+ ",0,0,0";
new ATcommandThread().execute();
}
};
public Button.OnClickListener BackwardListener=
new Button.OnClickListener(){
@Override
public void onClick(View arg0) {
action = "Go Backward (pitch-)";
at_cmd = "AT*PCMD=" + (seq++) + ",1," + intOfFloat(-speed) + ",0,0,0";
//AT*PCMD=1,0,1036831949,0,0 'backward
new ATcommandThread().execute();
}
};
public Button.OnClickListener btnLeftListener=
new Button.OnClickListener(){
@Override
public void onClick(View arg0) {
action = "Go Left (roll-)";
// at_cmd = "AT*PCMD=" + (seq++) + ",1,0," + intOfFloat(-speed) + ",0,0";
at_cmd = "AT*PCMD=" + (seq++) + ",1," + intOfFloat(-speed)+",0,0,0";
//AT*PCMD=1,-1110651699,0,0,0 'safe left
new ATcommandThread().execute();
}
};
public Button.OnClickListener btnRightListener=
new Button.OnClickListener(){
@Override
public void onClick(View arg0) {
action = "Go Right (roll+)";
at_cmd = "AT*PCMD=" + (seq++) + ",1," + intOfFloat(+speed) + ",0,0,0";
//AT*PCMD=1,1036831949,0,0,0 ' safe right
Log.e("AT*PCMD",at_cmd);
new ATcommandThread().execute();
}
};
public Button.OnClickListener btnUpListener=
new Button.OnClickListener(){
@Override
public void onClick(View arg0) {
action = "Go Up (gaz+)";
at_cmd = "AT*PCMD=" + (seq++) + ",1,0,0," + intOfFloat(speed) + ",0";
new ATcommandThread().execute();
}
};
public Button.OnClickListener btnDownListener=
new Button.OnClickListener(){
@Override
public void onClick(View arg0) {
action = "Go Down (gaz-)";
at_cmd = "AT*PCMD=" + (seq++) + ",1,0,0," + intOfFloat(-speed) + ",0";
//Move the drone Sets the reference for the horizontal plane
new ATcommandThread().execute();
}
};
public Button.OnClickListener btnEmrgencyListener=
new Button.OnClickListener(){
@Override
public void onClick(View arg0) {
action = "Emergency";
at_cmd = "AT*REF=" + (seq++) + ",290717952";
new ATcommandThread().execute();
}
};
public Button.OnClickListener btnTakeoffListener=
new Button.OnClickListener(){
@Override
public void onClick(View arg0) {
action = "Takeoff";
at_cmd = "AT*REF=" + (seq++) + ",290718208";
new ATcommandThread().execute();
}
};
public Button.OnClickListener btnLandingListener=
new Button.OnClickListener(){
@Override
public void onClick(View arg0) {
action = "Landing";
at_cmd = "AT*REF=" + (seq++) + ",290717696";
new ATcommandThread().execute();
}
};
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_drone_main, menu);
return true;
}
public class ATcommandThread extends AsyncTask<String, Integer, Boolean>{
@Override
protected Boolean doInBackground(String... arg0) {
byte [] ip_bytes = new byte[] {(byte)192,(byte)168,(byte)1,(byte)1};
try {
inet_addr = InetAddress.getByAddress(ip_bytes );
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Log.e("AT command: ","at_cmd)");
byte[] buffer = (at_cmd + "\r").getBytes();
DatagramPacket packet = new DatagramPacket(buffer, buffer.length, inet_addr, PORT);
try {
socket.send(packet);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Log.e("///send at command","at command topic");
return null;
}
}
}
01-24 10:57:26.449: E/Trace(1356): error opening trace file: No such file or directory (2)
01-24 10:57:26.948: E////(1356): end of on create
01-24 10:57:27.109: D/gralloc_goldfish(1356): Emulator without GPU emulation detected.
01-24 10:57:27.189: I/ActivityManager(160): Displayed com.example.dronedivideandroid/.DroneMain: +1s232ms
01-24 10:57:36.419: E////button(1356): forward_enter1
01-24 10:57:36.419: E/AT command:(1356): at_cmd)
01-24 10:57:36.429: W/dalvikvm(1356): threadid=11: thread exiting with uncaught exception (group=0x40a13300)
01-24 10:57:36.439: E/AndroidRuntime(1356): FATAL EXCEPTION: AsyncTask #1
01-24 10:57:36.439: E/AndroidRuntime(1356): java.lang.RuntimeException: An error occured while executing doInBackground()
01-24 10:57:36.439: E/AndroidRuntime(1356): at android.os.AsyncTask$3.done(AsyncTask.java:299)
01-24 10:57:36.439: E/AndroidRuntime(1356): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
01-24 10:57:36.439: E/AndroidRuntime(1356): at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
01-24 10:57:36.439: E/AndroidRuntime(1356): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
01-24 10:57:36.439: E/AndroidRuntime(1356): at java.util.concurrent.FutureTask.run(FutureTask.java:137)
01-24 10:57:36.439: E/AndroidRuntime(1356): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
01-24 10:57:36.439: E/AndroidRuntime(1356): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
01-24 10:57:36.439: E/AndroidRuntime(1356): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
01-24 10:57:36.439: E/AndroidRuntime(1356): at java.lang.Thread.run(Thread.java:856)
01-24 10:57:36.439: E/AndroidRuntime(1356): Caused by: java.lang.NullPointerException
01-24 10:57:36.439: E/AndroidRuntime(1356): at com.example.dronedivideandroid.DroneMain$ATcommandThread.doInBackground(DroneMain.java:201)
01-24 10:57:36.439: E/AndroidRuntime(1356): at com.example.dronedivideandroid.DroneMain$ATcommandThread.doInBackground(DroneMain.java:1)
01-24 10:57:36.439: E/AndroidRuntime(1356): at android.os.AsyncTask$2.call(AsyncTask.java:287)
01-24 10:57:36.439: E/AndroidRuntime(1356): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
01-24 10:57:36.439: E/AndroidRuntime(1356): ... 5 more
Yes, well you need to actually allocate the socket, the exception is a null pointer because you declared the socket but did not allocate it before using it. Now, this should work, but you will be constantly allocating a new socket. You should take the line: socket = new DatagramSocket() that I inserted below and put that in the onCreate most likely.
protected Boolean doInBackground(String... arg0) {
byte [] ip_bytes = new byte[] {(byte)192,(byte)168,(byte)1,(byte)1};
try {
inet_addr = InetAddress.getByAddress(ip_bytes );
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Log.e("AT command: ","at_cmd)");
byte[] buffer = (at_cmd + "\r").getBytes();
DatagramPacket packet = new DatagramPacket(buffer, buffer.length, inet_addr, PORT);
try {
socket= new DatagramSocket();
socket.send(packet);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Log.e("///send at command","at command topic");
return null;
}
这篇关于Android的AsyncTask的发送UDP数据包的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!