最近的项目需要上层判断新外挂的mcu的连接状态 , 其节点自定义为 /sys/class/lgy_class/lgy/lgy。
在kernel中创建节好点的时候,其实已经有了uevent事件了。
上层需要监听的是这个节点虚拟出来的
1,在自定义的NeoManagerService.java 服务中添加监听动作;
private static final String LGY_STATE_MATCH ="DEVPATH=/devices/virtual/lgy_class/lgy";
/*
* Listens for uevent messages from the kernel to monitor the lgy state
*/
private final class LgyUEventObserver extends UEventObserver {
@Override
public void onUEvent(UEventObserver.UEvent event) {
Log.d("lgy_debug","onUEvent 1111111111111");
Log.d("lgy_debug","onUEvent 2222222222222");
String state = event.get("LGY_STATE");
Log.d("lgy_debug","onUEvent 2222222222222 state ="+state);
doSomeThing();
}
}
private static final String LGY_STATE_MATCH ="DEVPATH=/devices/virtual/lgy_class/lgy";
private static UEventObserver mUEventObserver;
public NeoManagerService(Context context) {
//super(context);
mContext = context;
try {
myService = ILgytestDevice.getService();
mLgytestCallback = new LgytestCallback();
myService.registerCallback(mLgytestCallback);
mUEventObserver = new LgyUEventObserver();
mUEventObserver.startObserving(LGY_STATE_MATCH);
} catch (Exception e) {
Log.e ("lgy_debug","ILgytestDevice getService error!");
e.printStackTrace();
}
}
kernel层使用kobject_uevent_env函数上报uevent事件
char *disconnected[2] = { "LGY_STATE=DISCONNECTED", NULL };
char *connected[2] = { "LGY_STATE=CONNECTED", NULL };
char **uevent_envp = NULL;
uevent_envp = dev->connected ? connected : disconnected;//设备连接状态
kobject_uevent_env(&dev->kobj, KOBJ_CHANGE, uevent_envp);//开始上报事件
//kobject_uevent(&dev->kobj, KOBJ_CHANGE);//这种方式上层得不到LGY_STATE的值