按键,旋钮,继电器以及按键led灯对接

概述-可对接项

a. 按键

  1. 监听每个按键的触发

b. 旋钮

  1. 监听旋钮开始旋转,结束旋转
  2. 监听旋钮按下,抬起
  3. 监听旋钮旋转进度

c. 继电器

  1. 获取当前继电器状态
  2. 控制继电器
  3. 接收继电器状态

d. led灯开关控制

  1. led灯各路节点的开关灯

接入流程

准备阶段

  拥有一台声必可背景音乐主机,带继电器按钮的(如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.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

6.M20旋钮灯光设置

  M20旋钮可以设置不同灯效,节点路径位于/sys/class/leds/light下。 注意:设置灯效前需要把系统的灯效禁用,然后断电重新上电后生效。

  禁用步骤

  • 第一种方式,下载集成jdcommon库,进行属性设置。jdsmart-common 点击下载 在应用里调用JdSystemProperty.setString("persist.sys.jd.lightswitch", "1"), 设置persist.sys.jd.lightswitch的值为1(1是禁用,0是恢复)
  • 第二种方式(前提电脑有adb环境),usb连接主机和电脑,电脑上adb命令直接设置属性 adb shell setprop persist.sys.jd.lightswitch 1 设置完,可以 getprop persist.sys.jd.lightswitch 查看设置是否成功 设置成功再重启机器,此时对旋钮操作,不会出现系统的UI

设置颜色写入节点对应值,共12颗灯珠,12组rgb值

//修改写入指定节点路径的值
    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());
            }
        }
    }
# 设置红色(adb调试命令+实际传参数)
adb shell "echo 255,0,0,255,0,0,255,0,0,255,0,0,255,0,0,255,0,0,255,0,0,255,0,0,255,0,0,255,0,0,255,0,0,255,0,0 > /sys/class/led/light"

writeFile("/sys/class/led/light","255,0,0,255,0,0,255,0,0,255,0,0,255,0,0,255,0,0,255,0,0,255,0,0,255,0,0,255,0,0,255,0,0,255,0,0");
# 设置绿色
adb shell "echo 0,255,0,0,255,0,0,255,0,0,255,0,0,255,0,0,255,0,0,255,0,0,255,0,0,255,0,0,255,0,0,255,0,0,255,0 > /sys/class/led/light"

writeFile("/sys/class/led/light","0,255,0,0,255,0,0,255,0,0,255,0,0,255,0,0,255,0,0,255,0,0,255,0,0,255,0,0,255,0,0,255,0,0,255,0");
# 设置蓝色
adb shell "echo 0,0,255,0,0,255,0,0,255,0,0,255,0,0,255,0,0,255,0,0,255,0,0,255,0,0,255,0,0,255,0,0,255,0,0,255 > /sys/class/led/light"

writeFile("/sys/class/led/light","0,0,255,0,0,255,0,0,255,0,0,255,0,0,255,0,0,255,0,0,255,0,0,255,0,0,255,0,0,255,0,0,255,0,0,255");

results matching ""

    No results matching ""