当前位置: 首页 > news >正文

libudev 和 libusb 常见API分析

  1. libudev详解:
    libudev是Linux系统下的一个库,它提供针对内核提供的udev设备管理服务的函数库。udev是一种内核机制,用于在系统中传递解决方案的有关设备信息,以及在出现设备事件(如删除、插入设备)时触发相应的操作。
    在应用程序中使用libudev可以更方便地操作系统中的设备。

  2. libudev使用:

    1. 初始化
      函数:udev_new()
      作用:创建一个udev library context。udev library context采用引用记数机制,创建的context默认引用记数为1,使用udev_ref和udev_unref增加或减少引用记数,如果引用记数为0,则释放内部资源。

    2. 枚举设备
      函数:udev_enumerate_new(struct udev *udev)
      作用:创建一个枚举器,用于扫描系统已接设备

    3. 监控设备插拔udev的设备(插拔基于netlink实现)
      函数:udev_monitor_new_from_netlink(struct udev *udev, const char *name)
      作用:创建一个新的monitor,函数的第二个参数是事件源的名称,可选"kernel"或"udev",般应用的设计要基于"udev"进行监控。

      函数:udev_monitor_filter_add_match_subsystem_devtype(struct udev_monitor *udev_monitor, const char *subsystem, const char *devtype)
      作用:增加一个基于设备类型的udev事件过滤器,例如: "usb"设备。

      函数:udev_monitor_enable_receiving(struct udev_monitor *udev_monitor); 参数是udev_monitor_new_from_netlink函数返回值。
      作用:启动监控过程。监控可以使用udev_monitor_get_fd获取一个文件描述符,基于返回的fd可以执行poll操作,简化程序设计。

      函数:udev_monitor_get_fd(struct udev_monitor *udev_monitor);
      作用:获取一个文件描述符,基于返回的fd可以执行poll操作

    4. 热插拔事件到达后:
      函数:udev_monitor_receive_device(struct udev_monitor *udev_monitor)
      作用:获取产生事件的设备映射,获取与事件相关的设备信息,使用 udev_device_get_action() 函数来获取设备事件的动作

      函数:udev_device_get_action(struct udev_device *udev_device);
      作用:获取设备事件的动作,返回一个字符串,“add” 表示设备的添加,“remove” 表示设备的移除。

      函数:udev_device_get_sysattr_value(struct udev_device *udev_device, const char *sysattr);
      作用:获取设备的系统属性值,例如设备的制造商、型号、序列号等。

    5. 结束:
      函数:udev_device_unref(struct udev_device *udev_device);
      作用:用于减少 udev_device 结构的引用计数,当引用计数为零时,设备将被释放。

      函数:udev_monitor_unref(struct udev_monitor *udev_monitor);
      作用:减少 udev_monitor 结构的引用计数,当引用计数为零时,监视器将被释放。

  3. libusb简介 (https://blog.csdn.net/u014100559/article/details/127377498)
    libusb(Library Universal Serial Bus,通用串行总线库)是一个用于USB设备的开源软件库。它提供了一套应用程序接口(API),使开发人员能够通过USB总线与USB设备进行通信。4.

  4. libusb使用

    1.初始化
    函数:libusb_init(libusb_context **ctx)
    参数:NULL:libusb库将使用默认的上下文(context)进行初始化。这意味着每个调用libusb_init(NULL)的地方都会创建一个新的上下文。这种方式适用于简单的应用程序或者在单线程环境下使用libusb的情况。
    context:libusb_init(&context) 通过传入指向libusb_context类型指针的参数,可以在应用程序中共享同一个上下文。这意味着多个调用libusb_init(&context)的地方将共享同一个上下文,从而允许在多线程环境下使用libusb,并且共享设备列表、设备状态等信息。
    作用:初始化libusb库

    2.枚举和打开设备
    函数:libusb_get_device_list(libusb_context *ctx, libusb_device ***list);
    作用:获取已连接的设备列表。

     函数:libusb_get_device_descriptor(libusb_device *dev, struct libusb_device_descriptor *desc)作用:获取设备描述符函数:libusb_get_config_descriptor(libusb_device *dev, uint8_t config_index, struct libusb_config_descriptor **config)作用:获取设备配置描述函数:libusb_open(libusb_device *dev, libusb_device_handle **dev_handle);作用:打开设备,一般与枚举配合使用。函数:libusb_open_device_with_vid_pid(libusb_context *ctx, uint16_t vendor_id, uint16_t product_id)作用:不需要对设备进行枚举,你只需要简单的传入vid和pid信息即可函数:libusb_kernel_driver_active(libusb_device_handle *dev_handle, int interface_number)作用:用于检查内核驱动程序是否已经加载对应设备的接口,0 表示内核驱动未加载,返回 1 表示内核驱动已加载。如果出现错误,将返回一个负值函数:libusb_control_transfer();作用:是一个用于 USB 控制传输的函数,它可以在 USB 设备和主机之间进行数据传输和通信。函数:libusb_set_configuration(libusb_device_handle *dev_handle, int configuration);作用:设置设备的配置函数:libusb_claim_interface(libusb_device_handle *dev_handle, int interface_number);作用:声明设备的接口,使其能够与主机进行通信。在声明接口之前,需要确保设备已经被打开,并且已经连接到了主机。函数:libusb_detach_kernel_driver(libusb_device_handle *dev_handle, int interface_number); 作用:可以分离接口和内核驱动程序,从而能够声明接口并执行 I/O 操作。函数:libusb_set_interface_alt_setting(libusb_device_handle *dev_handle, int interface_number, int alternate_setting);参数:dev_handle: libusb_open 或者 libusb_open_device_with_vid_pid 返回的 libusb_device_handle 的句柄。interface_number: 是要设置备选设置的接口编号。alternate_setting: 是要设置的备选设置的编号作用:激活接口的备用设置,使其能够与主机进行通信。返回 0 表示成功,返回一个负值表示失败。函数:libusb_free_config_descriptor(struct libusb_config_descriptor *config);作用:用于释放配置描述符的内存函数:int libusb_release_interface(libusb_device_handle *dev_handle, int interface_number);参数:dev_handle : libusb_open 或者 libusb_open_device_with_vid_pid 返回的 libusb_device_handle 的句柄interface_number 是要释放的接口编号。作用:用于释放已声明的接口函数:libusb_close()作用:关闭与 USB 设备的连接      
    
    1. 通信:

      函数;libusb_bulk_transfer(ibusb_device_handle *dev_handle,unsigned char endpoint, unsigned char *data, int length,int *actual_length, unsigned int timeout);
      作用:传输数据

    4.退出:

     函数:libusb_free_device_list(libusb_device **list, int unref_devices);参数:list:指向通过 libusb_get_device_list 函数获取的设备列表的指针unref_devices:一个布尔值,如果为 1,则在释放设备列表的同时取消对所有设备的引用。如果为 0,则不会取消对设备的引用。作用:用于释放通过 libusb_get_device_list 函数获取的设备列表。函数:libusb_exit(libusb_context *ctx)参数:NULL:当不传入参数时,libusb库将使用默认的上下文(context)来执行退出操作。这意味着它会释放默认上下文所占用的资源。通常在使用libusb_init(NULL)初始化库时,也会使用不传入参数的方式执行退出操作。context:libusb_exit(context) 通过传入上下文参数,可以指定要退出的上下文,从而释放特定上下文所占用的资源。这种方式适用于在应用程序中使用了共享上下文的情况。作用:退出,释放资源。
    

相关文章:

libudev 和 libusb 常见API分析

libudev详解: libudev是Linux系统下的一个库,它提供针对内核提供的udev设备管理服务的函数库。udev是一种内核机制,用于在系统中传递解决方案的有关设备信息,以及在出现设备事件(如删除、插入设备)时触发相应的操作。 …...

[dasctf]misc04

与他不说一模一样吧也差不多 第三届红明谷杯CTF-【MISC】-阿尼亚_keepb1ue的博客-CSDN客flag.zip需要解压密码,在图片中发现一串密文。一串乱码,尝试进行字符编码爆破。获取到密码:简单的编码。https://blog.csdn.net/qq_36618918/article/d…...

Scala的函数式编程与高阶函数,匿名函数,偏函数,函数的闭包、柯里化,抽象控制,懒加载等

Scala的函数式编程 函数式编程 解决问题时,将问题分解成一个一个的步骤,将每个步骤进行封装(函数),通过调用这些封装好的步骤,解决问题。 例如:请求->用户名、密码->连接 JDBC->读取…...

Axure RP 8.1.0.3400(原型设计工具)

Axure RP 8是一款原型设计工具,它提供了丰富的功能和工具,帮助用户创建高质量的网页、移动应用和桌面软件原型。以下是Axure RP 8的一些特色介绍: 强大的交互设计:Axure RP 8支持创建复杂的动画和过渡效果,让你的原型更…...

企业微信、飞书、钉钉机器人消息发送工具类

1、实例化WebClient对象 其实你也可以使用RestTemplate,我这里主要是用到了webflux框架,所以需要实例化客户端请求对象 Bean public WebClient webClient(){HttpClient httpClient getHttpClient();return WebClient.builder().clientConnector(new R…...

手撕 视觉slam14讲 ch7 / pose_estimation_3d2d.cpp (1)

首先理清我们需要实现什么功能,怎么实现,提供一份整体逻辑:包括主函数和功能函数 主函数逻辑: 1. 读图,两张rgb(cv::imread) 2. 找到两张rgb图中的特征点匹配对 2.1定义所需要的参数:keypoints…...

Mac安装Dart时,Homebrew报错 Error: Failure while executing

前言: 最近准备开发Flutter项目时,在安装环境时,安装Homebew时遇到了以下报错信息,在这里分享一下。 报错信息: ~ % brew tap dart-lang/dart > Tapping dart-lang/dart Cloning into /opt/homebrew/Library/Tap…...

SSM整合~

构建并配置项目: 第一步:创建maven项目 第二步:配置pom.xml文件 设置打包方式: 为了方便部署,我们通常情况下,将项目打包为WAR,因为WAR文件是一种可执行的压缩文件,它可以将项目…...

Self-supervised 3D Human Pose Estimation from a Single Image

基于单幅图像的自监督三维人体姿态估计 主页: https://josesosajs.github.io/ imagepose/ 源码:未开源 摘要 我们提出了一种新的自我监督的方法预测三维人体姿势从一个单一的图像。预测网络是从描绘处于典型姿势的人的未标记图像的数据集和一组未配对…...

ubuntu下cups部分场景

第一章:部分操作指令 在计算机领域中,cups 是“通用UNIX打印系统”(Common UNIX Printing System)的缩写,它是一种用于在UNIX-like操作系统上管理打印任务的开源打印系统。cups 提供了一个框架,允许用户和…...

通过geoserver imageMosic发布多张tif数据

通过geoserver imageMosic发布多张tif数据 reference: https://zhuanlan.zhihu.com/p/132388558 https://zhuanlan.zhihu.com/p/103674876 https://docs.geoserver.org/latest/en/user/tutorials/imagemosaic_timeseries/imagemosaic_timeseries.html 步骤 下载数据 http…...

输出图元(四)8-2 OpenGL画点函数、OpenGL画线函数

4.3 OpenGL画点函数 要描述一个点的几何要素,我们只需在世界坐标系中指定一个位置。然后该坐标位置和场景中已有的其他几何描述一起被传递给观察子程序。除非指定其他属性值,OpenGL 图元按默认的大小和颜色来显示。默认的图元颜色是白色&#x…...

java八股文

6. 如何保证消息的可靠性? 在RabbitMq的整个消息投递过程中,有三种情况下,会存在消息丢失的问题: 6. RabbitMq如何保证消息的可靠性? 所以从这三个维度保证消息的可靠性去可靠性传递就可以了,从生产者发送…...

算法通关村——解析堆的应用

在数组中找第K大的元素 LeetCode21 Medium 我们要找第 K 大的元素,如果我们找使用大堆的话那么就会造成这个堆到底需要多大的,而且哪一个是第 K 的的元素我们不知道是哪一个索引,我们更想要的结果就是根节点就是我们要找的值,所以…...

爬虫源码---爬取小猫猫交易网站

前言: 本片文章主要对爬虫爬取网页数据来进行一个简单的解答,对与其中的数据来进行一个爬取。 一:环境配置 Python版本:3.7.3 IDE:PyCharm 所需库:requests ,parsel 二:网站页面 我们需要…...

Python的由来和基础语法(一)

目录 一、Python 背景知识 1.1Python 是咋来的? 1.2Python 都能干啥? 1.3Python 的优缺点 二、基础语法 2.1常量和表达式 2.2变量和类型 变量的语法 (1) 定义变量 (2) 使用变量 变量的类型 (1) 整数 (2) 浮点数(小数) (3) 字符串 (4) 布尔 (5) 其他 动态类型…...

使用maven创建springboot项目

创建maven快速启动项目 命令行或者idea、eclipse快捷创建也可以 pom.xml下project项目下导入springboot 父工程 <!--导入springboot 父工程--> <parent><artifactId>spring-boot-starter-parent</artifactId><groupId>org.springframework.bo…...

MySQL 基本操作1

目录 Create insert 插入跟新 1 插入跟新 2 Retrive select where 子句查询 1.查找数学成绩小于 80 的同学。 2.查询数学成绩等于90分的同学。 3.查询总分大于240 的学生 4.查询空值或者非空值 5.查询语文成绩在70~80之间的同学 6.查询英语成绩是99 和 93 和 19 和…...

linux内网yum源服务器搭建

1.nginx: location / {root /usr/local/Kylin-Server-V10-SP3-General-Release-2303-X86_64;autoindex on;autoindex_localtime on;autoindex_exact_size off; } 注:指定到镜像的包名 2.修改yum源地址 cd /etc/yum.repos.d/vim kylin_x86_64.repo 注: --enabled设置为1 3.重…...

机器学习与数据分析

【数据清洗】 异常检测 孤立森林&#xff08;Isolation Forest&#xff09;从原理到实践 效果评估&#xff1a;F-score 【1】 保护隐私的时间序列异常检测架构 概率后缀树 PST – &#xff08;异常检测&#xff09; 【1】 UEBA架构设计之路5&#xff1a; 概率后缀树模型 【…...

Arduino智能小车避坑指南:从TB6612驱动到HC-05蓝牙,新手最容易搞错的5个硬件连接点

Arduino智能小车避坑实战&#xff1a;5个硬件连接致命细节与示波器级调试方案 刚拿到Arduino套件的新手们&#xff0c;总会在论坛里发出同样的灵魂拷问&#xff1a;"为什么我的小车要么瘫着不动&#xff0c;要么像醉汉一样乱撞&#xff1f;"这个问题背后&#xff0c;…...

S2-Pro模型管理利器:Ollama国内镜像源加速下载与使用

S2-Pro模型管理利器&#xff1a;Ollama国内镜像源加速下载与使用 1. 为什么需要国内镜像源 如果你在国内使用Ollama管理S2-Pro等大模型&#xff0c;可能经常遇到下载速度慢、连接不稳定甚至完全无法拉取模型的问题。这是因为默认的模型仓库位于海外服务器&#xff0c;受网络环…...

如何在A100显卡上快速部署Wan2.1图生视频API(含FastAPI配置详解)

高性能显卡实战&#xff1a;A100部署Wan2.1图生视频API全流程解析 当NVIDIA A100显卡遇上Wan2.1图生视频模型&#xff0c;会碰撞出怎样的创意火花&#xff1f;作为当前最先进的生成式AI视频工具之一&#xff0c;Wan2.1凭借其14B参数的强大模型&#xff0c;正在改变内容创作的工…...

百川2-13B-4bits模型调优:OpenClaw任务响应速度提升50%的3个技巧

百川2-13B-4bits模型调优&#xff1a;OpenClaw任务响应速度提升50%的3个技巧 1. 问题背景与优化动机 去年冬天&#xff0c;当我第一次将百川2-13B-4bits模型接入OpenClaw时&#xff0c;发现一个奇怪现象&#xff1a;同样的自动化任务&#xff0c;在本地测试时响应飞快&#x…...

3D建模快速上手:零门槛掌握TripoSR AI驱动开源工具

3D建模快速上手&#xff1a;零门槛掌握TripoSR AI驱动开源工具 【免费下载链接】TripoSR 项目地址: https://gitcode.com/GitHub_Trending/tr/TripoSR 在数字创作领域&#xff0c;3D建模曾是专业人士的专属技能&#xff0c;需要掌握复杂的软件操作和几何知识。但今天&a…...

分布式存储的监控与告警:从理论到实践

分布式存储的监控与告警&#xff1a;从理论到实践 引言 作为一名在数据深渊里捞了十几年 Bug 的女码农&#xff0c;我见过太多因为监控不到位导致的生产事故。在分布式存储系统中&#xff0c;监控与告警是确保系统稳定运行的关键因素之一。今天&#xff0c;我们来聊聊分布式存储…...

【LangGraph】 官方demo调整为本地大模型实现

官网文档链接&#xff1a; https://docs.langchain.com/oss/python/langgraph/quickstart#full-code-example 样例代码&#xff1a; # 第一步&#xff1a;定义工具与大模型 # 导入LangChain工具装饰器&#xff0c;用于将普通函数封装为Agent可调用的工具 from langchain.tool…...

打造高效离线文字识别系统:Umi-OCR插件深度应用指南

打造高效离线文字识别系统&#xff1a;Umi-OCR插件深度应用指南 【免费下载链接】Umi-OCR_plugins Umi-OCR 插件库 项目地址: https://gitcode.com/gh_mirrors/um/Umi-OCR_plugins 在数字化办公与信息处理领域&#xff0c;离线OCR技术正成为保护数据隐私与提升处理效率的…...

OpenClaw+GLM-4.7-Flash:个人研究助手实战

OpenClawGLM-4.7-Flash&#xff1a;个人研究助手实战 1. 为什么需要AI研究助手&#xff1f; 作为一名经常需要查阅文献的研究者&#xff0c;我发现自己每天要花费大量时间在重复性劳动上&#xff1a;打开十几个浏览器标签页查找资料、手动整理参考文献格式、从零开始撰写综述…...

SRS (Simple Realtime Server) 实战:从SFU到大规模互动直播架构

1. SRS与SFU&#xff1a;互动直播的基石架构 第一次接触SRS时&#xff0c;我被它简洁的配置方式惊艳到了。这个看似轻量级的服务器&#xff0c;竟然能支撑起我们平台日均百万级的直播流量。作为选择性转发单元&#xff08;SFU&#xff09;&#xff0c;SRS的核心价值在于它解决了…...