天天看点

android 向硬件设备发送echo命令,读取设备状态(与GPIO交互)注:

业务场景:

自己遇到的业务上的一个需求,智能硬件设备两侧有跑马灯,需要通过应用层app根据特定指定控制跑马灯的频率,状态等需求。

直接上代码吧:

往设备中写echo命令:

//往gpio写
    private boolean RootCommand(String command) {
        Process process = null;
        DataOutputStream os = null;
        try {
            process = Runtime.getRuntime().exec("su");
            os = new DataOutputStream(process.getOutputStream());
            os.writeBytes(command + "\n");
            os.writeBytes("exit\n");
            os.flush();
            process.waitFor();
        } catch (Exception e) {
            return false;
        } finally {
            try {
                if (os != null) {
                    os.close();
                }
                process.destroy();
            } catch (Exception e) {
            }
        }
        return true;
    }
           

读GPIO:

//读GPIO
    private String getGpioString(String path) {
        String defString = "0";// 默认值
        try {
            @SuppressWarnings("resource")
            BufferedReader reader = new BufferedReader(new FileReader(path));
            defString = reader.readLine();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return defString;
    }
           

使用方式:

写入:
//表示输出引脚电平正常或翻转
RootCommand("echo normal >/sys/class/pwm/pwmchip2/pwm0/polarity")
//设置pwm周期,单位纳秒
RootCommand("echo 1000 >/sys/class/pwm/pwmchip2/pwm0/period");
//设置占空比 100-1000
RootCommand("echo 1000 >/sys/class/pwm/pwmchip2/pwm0/duty_cycle");
//echo 1开启跑马灯 echo 0 关闭跑马灯 
RootCommand("echo 1 >/sys/class/pwm/pwmchip2/pwm0/enable");

读取:返回当前灯是什么状态,1/0:开启/关闭
String gpioString = getGpioString("/sys/class/pwm/pwmchip2/pwm0/enable");
           

注:

1:写入的方法会返回一个布尔值,返回true 或 false,不过我觉得并没有什么用,一直返回的都是true,特别要注意的是echo命令行要特别注意,注意空格等,我自己就遇到了,少一个空格导致控制无效果,排查半天发现少了一个空格的问题。

2:读取的方法,获取的是string字符串,如我写入的命令是

echo 1 >/sys/class/pwm/pwmchip2/pwm0/enable      

这行命令是控制灯的开关的,echo 1 是开启,echo 0 是关闭,读取灯的状态可以使用读取方法

String gpioString = getGpioString("/sys/class/pwm/pwmchip2/pwm0/enable");      

“echo (1/0) > ” 不需要写入指令。

3:读取数据会有些小的误差问题

如:设置占空比:

RootCommand("echo 1000 >/sys/class/pwm/pwmchip2/pwm0/period");

设置完占空比之后通过:getGpioString("/sys/class/pwm/pwmchip2/pwm0/period");获取当前设置的占空比,返回可能是1000 或 接近1000.

第三点的问题不知道是硬件那边在设计上的问题还是怎么,不过对我这边影响倒不是很大,读取等的状态是开启还是关闭时倒是没有误差,能够正常使用也没有去管。希望能帮到不熟悉的朋友。

-------------------------------------------------分割线--------------------------------------------------------------

在写入项目之前,最好是通过黑窗口或者开发设备的控制器,通过adb命令发送命令行试一下效果

举例:在android studio下方的 Terminal 中:

1:确保当前连接上了要调试的设备,并且只有一台设备连接电脑。

2:通过发送命令:adb shell  找到当前设备

3:直接发送echo 命令即可,如图:

android 向硬件设备发送echo命令,读取设备状态(与GPIO交互)注:

没报错没提示,就代表这行命令可行,已经写进设备中,可以时刻关注设备,看是否有效果即可。