业务场景:
自己遇到的业务上的一个需求,智能硬件设备两侧有跑马灯,需要通过应用层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 命令即可,如图:
没报错没提示,就代表这行命令可行,已经写进设备中,可以时刻关注设备,看是否有效果即可。