raspberry pi java {Runtime.exec(sudo hcitool lescan);}

时间:2016-12-02 14:27:17

标签: java bluetooth-lowenergy raspberry-pi3

我正在使用

Runtime.exec("sudo hcitool lescan --passive");

代码但是sudo hcitool lescan命令没有终止,因此Runtime.exec无法完成。

我还使用sudo timeout 10s hcitool lescan --passive命令完成但无法使用java code import java.io.*;上的MAC地址进行处理

我使用了这段代码

public class scan{
    public static void main(String args[]){
        String s = null;
        try {
            Process p = Runtime.getRuntime().exec("sudo hcitool lescan --passive");
            p.waitFor();
            BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream()));
            BufferedReader stdError = new BufferedReader(new InputStreamReader(p.getErrorStream()));
            System.out.println("result");
            while((s=stdInput.readLine())!=null){
                System.out.println(s);
            }
            while((s=stdError.readLine())!=null){
                System.out.println(s);
            }
            System.exit(0);
        }
        catch (IOException e){
            e.printStackTrace();
            System.exit(-1);
        }
    }
}

我希望将Beacon的MAC地址变为字符串。

我该怎么办?帮助我,谢谢。

1 个答案:

答案 0 :(得分:0)

多线程对我有用:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class LoopTest {

    class Cmd extends Thread
    {
        public Process p = null;
        public void run()
        {
            try {
                p = Runtime.getRuntime().exec("cmd");
            } catch (IOException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }

            try {
                p.waitFor();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

        public static void main(String args[]){
            String s = null;
            try {

                Cmd cmd=new LoopTest().new Cmd();
                ExecutorService es=Executors.newCachedThreadPool();
                es.submit(cmd);
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

                BufferedReader stdInput = new BufferedReader(new InputStreamReader(cmd.p.getInputStream()));
                BufferedReader stdError = new BufferedReader(new InputStreamReader(cmd.p.getErrorStream()));
                System.out.println("result");
                while((s=stdInput.readLine())!=null){
                    System.out.println(s);
                }
                while((s=stdError.readLine())!=null){
                    System.out.println(s);
                }
                System.exit(0);
            }
            catch (IOException e){
                e.printStackTrace();
                System.exit(-1);
            }
        }
}
用于Windows的

cmd命令也会阻塞,但另一个线程可以读取它。

result
Microsoft Windows [Version 10.0.14393]
(c) 2016 Microsoft Corporation. T?m haklar? sakl?d?r.

而不是Thread.sleep(2000);,您可以在使用之前检查p是否已初始化。