获取连接的 USB 设备的 /dev 设备路径

Posted

技术标签:

【中文标题】获取连接的 USB 设备的 /dev 设备路径【英文标题】:Get /dev device path of attached USB device 【发布时间】:2018-04-03 22:25:09 【问题描述】:

我在 Raspberry Pi 上安装了 android Things Developer Preview 5.1 (OIR1.170720.017)。

该应用是使用 Xamarin 针对 Android 8 平台 API 级别 26 创建的。 我想在连接 USB 拇指驱动器时检测热插拔事件。我通过在我的代码中使用广播接收器来归档这个:

[BroadcastReceiver(Enabled = true)]
[IntentFilter(new[]  UsbManager.ActionUsbDeviceAttached, UsbManager.ActionUsbDeviceDetached )]
public class MyBroadCastReceiver : BroadcastReceiver

    public event EventHandler UsbDeviceAttached;
    public event EventHandler UsbDeviceDetached;

    public override void OnReceive(Context context, Intent intent)
    
        if (intent.Action.Equals(UsbManager.ActionUsbDeviceDetached)) UsbDeviceDetached?.Invoke(this, new EventArgs());
        if (intent.Action.Equals(UsbManager.ActionUsbDeviceAttached)) UsbDeviceAttached?.Invoke(this, new EventArgs());
    

主要活动:

    private MyBroadCastReceiver receiver;
    protected override void OnCreate(Bundle savedInstanceState)
    
        base.OnCreate(savedInstanceState);
        SetContentView(Resource.Layout.Main);

        this.receiver = new MyBroadCastReceiver();
    

    protected override void OnResume()
    
        base.OnResume();
        RegisterReceiver(this.receiver, new IntentFilter(UsbManager.ActionUsbDeviceAttached));
    

    protected override void OnPause()
    
        UnregisterReceiver(this.receiver);
        base.OnPause();
    

现在,我有一个空的 U 盘,上面没有分区或文件系统,只是普通的块存储。附加或分离驱动器时,会调用OnReceive(Context, Intent) 方法。我查看了contextintent 参数,但无法确定有关附加设备的更多信息。许多属性似乎更多为空: 我想获取设备的 /dev 节点(不是 /mnt 或当驱动器上有文件系统时可以使用的任何挂载点)。查看dmesg,我可以看到块设备已分配给节点/dev/sda。有没有办法从代码中获取节点名称/路径?我需要一些额外的权限吗? 谢谢

【问题讨论】:

***.com/a/42474815/3290339 谢谢,但这并不能回答我的问题:如何找出所连接设备的 /dev/ 节点? 看看this问答。 谢谢,这很有帮助。 libaums 为非 root 设备提供对 USB 大容量存储设备和 fat32 文件系统(如果可用)的访问。但是,我搜索了如何将原始数据读/写到块设备以及如何创建新的分区和文件系统。使用 dd 命令和 mkfs 非常简单。但恐怕我找不到在我的应用程序中以编程方式做这些事情的方法...... 【参考方案1】:

Android 的安全模型可防止应用访问原始设备资源,例如连接的 USB 设备的 /dev 节点。您需要通过 USB API 与设备进行通信。

您可能需要查看 Android Things 的 USB Enumerator sample,以更好地了解如何使用 Android USB API 来检测设备插入并打开与设备的通信通道。

具体来说,USB 设备附件不会被应用作为广播处理。它作为在给定设备类型上过滤的应用程序的活动意图触发。 USB Host API Guide 还可以为您提供有关所有这些工作原理的更多详细信息。

【讨论】:

非常感谢您的笔记。

以上是关于获取连接的 USB 设备的 /dev 设备路径的主要内容,如果未能解决你的问题,请参考以下文章

ubuntu 下如何获取USB接口相机的uri路径

linux / libusb 获取usb设备路径

windows - 如何枚举所有连接的 USB 设备的设备路径?

在 C Linux 上检查某个 USB 端口以获取设备 fd

如何在 Linux 下的 C 中确定 USB 存储(USB 闪存驱动器)“设备路径”

通过设备路径或句柄获取 U 盘盘符