上层监听Kernel上报的UEvent事件Demo

最近的项目需要上层判断新外挂的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的值

 

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux操作系统是一种开放源代码的操作系统,其用户空间可以通过使用netlink来监听uevent(用户事件)。netlink是一种用于内核和用户空间之间进行通信的机制,可以实现内核对用户空间事件的广播。 在Linux中,用户空间使用netlink来监听uevent的主要目的是为了获取与设备相关的信息和事件通知。通过监听uevent,用户空间可以获得设备的插拔状态、设备的属性变化、系统的电源管理事件等等。 使用netlink监听uevent的过程一般包括以下几个步骤: 1. 创建与内核通信的socket:用户空间需要创建一个socket,并使用socket系统调用将其与netlink协议相关联。 2. 绑定socket到uevent通信组:调用bind系统调用将socket绑定到uevent通信组,以便接收与设备相关的事件通知。 3. 接收并处理uevent:使用recv系统调用从socket中接收uevent消息,并在用户空间中对其进行处理。用户空间可以根据收到的uevent消息来进行相应的操作,例如更新设备列表、触发相关动作等。 需要注意的是,使用netlink监听uevent需要具备相应的权限。一般情况下,只有具有管理员权限的用户或特定的用户组才能够进行这类操作。 在Linux中,用户空间使用netlink监听uevent是实现设备管理和与设备相关的操作的重要手段之一。它可以使用户空间获取到内核层面的设备信息,并根据这些信息做出相应的响应和决策。这对于开发系统工具、设备驱动程序以及一些需要实时监控设备状态的应用程序非常有用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值