1.1. 按键,旋钮,继电器以及按键led灯对接
1.1.1. 概述-可对接项
a. 按键
- 监听每个按键的触发
b. 旋钮
- 监听旋钮开始旋转,结束旋转
- 监听旋钮按下,抬起
- 监听旋钮旋转进度
c. 继电器
- 获取当前继电器状态
- 控制继电器
- 接收继电器状态
d. led灯开关控制
- led灯各路节点的开关灯
1.1.2. 接入流程
准备阶段
拥有一台声必可背景音乐主机,带继电器按钮的(如M10,S10)
下载demo
链接: https://pan.baidu.com/s/179xcJ6HirWoDVofAcsJN5A 密码: 3vix,文件目录: 按键-旋钮-继电器-demo
注意事项
1. 对接旋钮时,系统的旋钮UI仍旧在,会响应旋钮事件,所以需要提前禁用系统的
2. 禁用步骤
- 第一种方式,下载集成jdcommon库,进行属性设置。点击下载jdsmart-common
在应用里调用JdSystemProperty.setString("persist.sys.jd.hideBindDev", "1"),
设置persist.sys.jd.hideBindDev的值为1(1是隐藏,0是恢复)
- 第二种方式(前提电脑有adb环境),usb连接主机和电脑,电脑上adb命令直接设置属性 adb shell setprop persist.sys.jd.hideBindDev 1 设置完,可以 getprop persist.sys.jd.hideBindDev 查看设置是否成功 设置成功再重启机器,此时对旋钮操作,不会出现系统的UI
1.1.3. 具体对接
1.AndroidManifest.xml 注册广播接收
//继电器开关状态
<action android:name="com.judian.broadcast.relay.powerStatus" />
//按键,旋钮
<!--* S10带旋钮:
* judian.intent.action.key1 //旋钮按下true,抬起flase
* judian.intent.action.key2 //旋钮上方按键按下true,抬起flase
* judian.intent.action.key3 //旋钮下方按键按下true,抬起flase
* judian.intent.action.key4 //旋钮开始旋转true,结束旋转false
*
* M10不带旋钮,三个按键:
* judian.intent.action.key1 //最上面按键1触发
* judian.intent.action.key2 //中间按键2触发
* judian.intent.action.key3 //最下面按键3触发-->
<action android:name="judian.intent.action.key1" />
<action android:name="judian.intent.action.key2" />
<action android:name="judian.intent.action.key3" />
<action android:name="judian.intent.action.key4" />
2.第三方对接控制继电器
通过广播 com.judian.broadcast.relay.control 发送
约定2路继电器id为judianRelayId-1, judianRelayId-2
广播参数 "relay":"json"
json格式如下:
{
"id": "judianRelayId-1",
"powerStatus": true
}
如: JSONObject jsonObject = new JSONObject();
jsonObject.put("id",relayDevId);
jsonObject.put("powerStatus",status);
Intent intent = new Intent();
intent.setAction("com.judian.broadcast.relay.control");
intent.putExtra("relay", jsonObject.toJSONString());
sendBroadcast(intent);
3.接收和主动查询继电器状态
主动查询继电器状态的话,可以读取节点信息 /sys/xfocus/xpower/relay1 /sys/xfocus/xpower/relay2 读取节点状态,1是打开
如: public static String readFile(String path) {
String status = "";
if(new File(path).exists()){
try {
BufferedReader reader = new BufferedReader(new FileReader(path));
status = reader.readLine();
} catch (IOException e) {
e.printStackTrace();
}
}
return status;
}
广播接收当前继电器的状态 com.judian.broadcast.relay.powerStatus 广播参数 "relay":"json",如deme中RelayReceiver接收内容
json格式如下:
{
"id": "judianRelayId-1",
"powerStatus": true
}
4.按键和旋钮只需接收对应action
action参考->"1. AndroidManifest.xml 注册广播接收"
@Override
public void onReceive(Context context, Intent intent) {
final String key = intent.getAction();
final boolean pressed = intent.getBooleanExtra("down", false);
}
5.led 灯开关控制
M10, S10有三个LED,设备节点路径位于/sys/class/leds/下 注意,以下路径中ledx是可替换的(led1,led2,led3),取决于路径下的节点
//修改写入指定节点路径的值
public static void writeFile(String path, String value) {
File modefile = new File(path);
if (modefile.exists()) {
try {
RandomAccessFile file = new RandomAccessFile(path, "rw");
file.write(value.getBytes());
file.close();
Log.d(TAG, "setString = "+value);
} catch (IOException re) {
Log.e(TAG, "setString: "+re.toString());
} catch (NumberFormatException re) {
Log.e(TAG, "setString: "+re.toString());
}
}
}
# 开灯(向brightness写1)
lily-c10-zigbee: # echo 1 > /sys/class/leds/ledx/brightness
如 writeFile("/sys/class/leds/led2/brightness","1");
# 关灯(向brightness写0)
lily-c10-zigbee: # echo 0 > /sys/class/leds/ledx/brightness
如 writeFile("/sys/class/leds/led2/brightness","0");
# 查看状态(读brightness一个字节)
lily-c10-zigbee: # cat /sys/class/leds/ledx/brightness
1
如readFile("/sys/class/leds/led2/brightness");
闪烁控制(以一定频率闪烁)
# 开始闪烁(默认以50HZ频率闪烁)
lily-c10-zigbee: # echo timer > /sys/class/leds/ledx/trigger
如 writeFile("/sys/class/leds/led2/trigger","timer");
# 关闭闪烁
lily-c10-zigbee: # echo none > /sys/class/leds/ledx/trigger
如 writeFile("/sys/class/leds/led2/trigger","none");
修改闪烁频率(在trigger设置为timer模式时才有效)
# 设置亮/灭时间(即修改闪烁频率),单位ms
lily-c10-zigbee: # echo 1000 > /sys/class/leds/ledx/delayon #亮1000ms
lily-c10-zigbee: # echo 500 > /sys/class/leds/ledx/delayoff #灭500ms
查看trigger状态 设备trigger被设置为timer,相应的应该可以看到输出有[timer],未触发[none]
lily-c10-zigbee: # cat /sys/class/leds/ledx/trigger
[none] rfkill0 mmc0 mmc1 mmc2 timer rfkill1
可以看到输出文本中的[none]被两个方括号框起来,意思时当前trigger未使用。 设备triger被设置为timer,相应的应该可以看到输出有[timer],即
none rfkill0 mmc0 mmc1 mmc2 [timer] rfkill1