Android 如何通过udp发送传感器值

Android 如何通过udp发送传感器值,android,asynchronous,udp,sensors,Android,Asynchronous,Udp,Sensors,我是个彻头彻尾的傻瓜。我的目标是通过udp发送传感器数据(陀螺仪acc磁铁)。另一方面,matlab将接收数据 如果传感器未注册,我可以发送udp数据包 如果不使用udp发送数据,我可以显示传感器 我不能同时做这两件事 该代码应该读取并显示加速计,同时它尝试每2000毫秒异步发送一个预定义的udp数据包。 但它没有运行!有什么建议吗? 我的代码如下: public class udp_sensors_matlab extends Activity implements SensorEve

我是个彻头彻尾的傻瓜。我的目标是通过udp发送传感器数据(陀螺仪acc磁铁)。另一方面,matlab将接收数据

  • 如果传感器未注册,我可以发送udp数据包
  • 如果不使用udp发送数据,我可以显示传感器
  • 我不能同时做这两件事 该代码应该读取并显示加速计,同时它尝试每2000毫秒异步发送一个预定义的udp数据包。 但它没有运行!有什么建议吗? 我的代码如下:

        public class udp_sensors_matlab extends Activity implements SensorEventListener{
    /** Called when the activity is first created. */
    SensorManager sensorManager = null;
    
    //for accelerometer values
    TextView outputX;
    TextView outputY;
    TextView outputZ;
    
    String messageStr="test udp";
    String ip;
    udpOut task;
    int server_port = 12345;
    DatagramSocket s = null;
    int msg_length=messageStr.length();
    byte[] message = messageStr.getBytes();
    InetAddress local = null;
    DatagramPacket p=null;
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    
        sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);     
        //just some textviews, for data output
        outputX = (TextView) findViewById(R.id.TextView01);
        outputY = (TextView) findViewById(R.id.TextView02);
        outputZ = (TextView) findViewById(R.id.TextView03);
        try {
            s = new DatagramSocket();
        } catch (SocketException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    
        try {
            local = InetAddress.getByName("81.31.187.32");
        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        task = new udpOut();
        task.execute("g");
        timer= new Timer();
        timerTask=new TimerTask(){    @Override
        public void run() {
            // TODO Auto-generated method stub
            task = new udpOut();
            task.execute("g");
        }};
        timer.scheduleAtFixedRate(timerTask, 2000, 2000);
    }
    @Override
    protected void onResume() {
       super.onResume();
       sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_GAME);
    }
    @Override
    protected void onStop() {
       super.onStop();
       sensorManager.unregisterListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER));
    }
    synchronized public void onSensorChanged(SensorEvent event) {
    
            switch (event.sensor.getType()){
                case Sensor.TYPE_ACCELEROMETER:
                    outputX.setText("\tx:"+Float.toString(event.values[0]));
                    outputY.setText("\ty:"+Float.toString(event.values[1]));
                    outputZ.setText("\tz:"+Float.toString(event.values[2]));
                break;
        }
     }
    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {} 
    
    class udpOut extends AsyncTask <String, Integer, Long> {
    
        protected Long doInBackground(String... messageStr) {
            p = new DatagramPacket(message, msg_length,local,server_port);
            try {
                s.send(p);
            } catch (IOException e) {
            // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        protected void onProgressUpdate() {
        }
    }
    
    public类udp\u sensors\u matlab扩展活动实现SensorEventListener{
    /**在首次创建活动时调用*/
    SensorManager SensorManager=null;
    //对于加速计值
    文本视图输出;
    文本视图输出;
    文本视图输出;
    String messageStr=“测试udp”;
    字符串ip;
    udpOut任务;
    int server_port=12345;
    DatagramSocket s=null;
    int msg_length=messageStr.length();
    byte[]message=messageStr.getBytes();
    InetAddress local=null;
    DatagramPacket p=null;
    @凌驾
    创建时的公共void(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    sensorManager=(sensorManager)getSystemService(传感器服务);
    //只是一些文本视图,用于数据输出
    outputX=(TextView)findViewById(R.id.TextView01);
    outputY=(TextView)findViewById(R.id.TextView02);
    outputZ=(TextView)findViewById(R.id.TextView03);
    试一试{
    s=新的DatagramSocket();
    }捕获(SocketException e){
    //TODO自动生成的捕捉块
    e、 printStackTrace();
    }
    试一试{
    local=InetAddress.getByName(“81.31.187.32”);
    }捕获(未知后异常e){
    //TODO自动生成的捕捉块
    e、 printStackTrace();
    }
    任务=新的udpOut();
    任务。执行(“g”);
    定时器=新定时器();
    timerTask=new timerTask(){@Override
    公开募捐{
    //TODO自动生成的方法存根
    任务=新的udpOut();
    任务。执行(“g”);
    }};
    timer.scheduleAtFixedRate(timerTask,20002000);
    }
    @凌驾
    受保护的void onResume(){
    super.onResume();
    sensorManager.registerListener(这是sensorManager.getDefaultSensor(Sensor.TYPE\u Accelerator)、sensorManager.Sensor\u DELAY\u游戏);
    }
    @凌驾
    受保护的void onStop(){
    super.onStop();
    sensorManager.unregisterListener(这是sensorManager.getDefaultSensor(Sensor.TYPE_Accelerator));
    }
    传感器更改时同步的公共无效(传感器事件){
    开关(event.sensor.getType()){
    外壳传感器.U型加速计:
    outputX.setText(“\tx:”+Float.toString(event.values[0]);
    outputY.setText(“\ty:”+Float.toString(event.values[1]);
    outputZ.setText(“\tz:”+Float.toString(event.values[2]);
    打破
    }
    }
    @凌驾
    精度已更改(传感器,int精度){}
    类udpOut扩展了异步任务{
    受保护的长doInBackground(字符串…messageStr){
    p=新数据包(消息、消息长度、本地、服务器端口);
    试一试{
    s、 发送(p);
    }捕获(IOE异常){
    //TODO自动生成的捕捉块
    e、 printStackTrace();
    }
    }
    受保护的void onProgressUpdate(){
    }
    }
    
    我建议使用调试器逐步检查您的代码,看看这是否为您提供了关于正在发生/未发生的事情的更具体信息。当您尝试同时执行这两项操作时,是否会出现异常

    您还应该使用
    AlarmManager
    而不是
    TimerTask
    。@commonware有很多关于
    AlarmManager
    的好信息,例如:

    下面是一个使用Eclipse调试器的教程:


    根据我对Android的经验,最好是在异常发生之前设置一个断点,然后从那里逐步执行。否则,如果在异常发生时只进入调试器,则很难破译异常。

    我建议使用调试器逐步执行代码,看看这是否能为您提供更具体的信息关于正在发生/未发生的事情。当您尝试同时执行这两项操作时,是否会出现任何异常

    您还应该使用
    AlarmManager
    而不是
    TimerTask
    。@commonware有很多关于
    AlarmManager
    的好信息,例如:

    下面是一个使用Eclipse调试器的教程:


    根据我对Android的经验,最好是在异常发生之前设置一个断点,然后从那里逐步执行。否则,如果在异常发生时只进入调试器,则很难破译异常。

    感谢您的重播。是否有关于如何使用eclipse和monitor异常进行调试的教程?(我对matlab有相当多的经验,但我很惭愧,我不知道如何在eclipse中调试。)添加了上面的链接,如果您搜索这些链接,还有更多内容。还添加了一些额外的建议。@elevine想知道您是否能够修复代码?我也在做同样的事情,如果您能分享您修复代码的方式,那会很好:)谢谢buddy@TinaJasmin这不是我的代码,misalu2001问了这个问题。谢谢你的重播。有没有关于如何使用eclipse和monitor示例进行调试的教程?(我对matlab有相当多的经验,但我很惭愧,我不知道如何在eclipse中进行调试。)在上面添加了一个链接,如果你在谷歌上搜索的话,会有更多的链接。还添加了一些额外的建议。@elevine想知道你是否能够修复你的代码?我也在做同样的事情,如果你能分享你是如何修复的,那会很好:)谢谢buddy@TinaJasmin这不是我的代码,misalu2001问了这个问题。嗨,想知道你是否能修复你的code?我正在做同样的事情,如果你能分享你是如何修复它的,那就太好了;谢谢,巴迪:)嗨,想知道你是否能修复你的代码?我正在做同样的事情,如果你能分享你是如何修复它的,那就太好了;谢谢,巴迪:)