Android的AsyncTask的发送UDP数据包 [英] Android AsyncTask sending UDP packet

查看:151
本文介绍了Android的AsyncTask的发送UDP数据包的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想使用的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_dron​​e_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.upB​​tn);
       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_dron​​e_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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆