连接特定类型的USB设备时,在Mac OS X上执行应用程序?

Cha*_*har 14 macos usb

我需要实现一个Mac OS X应用程序.在我的应用程序中,我需要做两件事:

  1. 当特定类型的USB设备连接到系统时执行/打开应用程序.
  2. 从USB读取数据并将其上传到Web服务器.

我在Mac OS X开发方面没有太多经验.任何人都可以建议最好的文件来实现我的目标吗?

小智 25

你可以使用launchd.试试man launchd和man launchd.plist.

似乎launchd可以使用USB事件,即使这个功能记录很少.我发现它:man xpc_set_event_stream_handler

这是一个例子.如果将以下内容放入:~/Library/LaunchAgents/com.example.plist,则应在连接USB设备时启动程序.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC -//Apple Computer//DTD PLIST 1.0//EN http://www.apple.com/DTDs/PropertyList-1.0.dtd >
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.example.program</string>
    <key>ProgramArguments</key>
    <array>
    <string>/path/to/program</string>
    </array>
    <key>LaunchEvents</key>
    <dict>
            <key>com.apple.iokit.matching</key>
            <dict>
                    <key>com.apple.device-attach</key>
                    <dict>
                            <key>idProduct</key>
                            <integer>1234</integer>
                            <key>idVendor</key>
                            <integer>1337</integer>
                            <key>IOProviderClass</key>
                            <string>IOUSBDevice</string>
                            <key>IOMatchLaunchStream</key>
                            <true/>
                    </dict>
            </dict>
    </dict>
</dict>
</plist>
Run Code Online (Sandbox Code Playgroud)

  • 有没有办法使用这个从`launchd`而不是Xcode应用程序启动的shell脚本(例如``/ path/to/program`是一个shell脚本).shell脚本每10秒重新启动一次,我找不到命令行替代形式`xpc_set_event_stream_handler()`或以任何方式从流中删除事件. (6认同)
  • 只是确保如果你走这条路线并且不希望你的启动进程保持运行(即KeepAlive = false)你的代码调用xpc_set_event_stream_handler(),否则你会发现你的应用每10秒重生一次以响应相同的匹配事件一遍又一遍地. (2认同)

err*_*per 1

这实际上取决于您正在寻找哪种类型的应用程序。

看起来确实没有办法以类似于 udev 的方式做到这一点。

两种可能的解决方案是:

  • 为您的设备编写自定义包装驱动程序
  • 使用libusb并有一个守护进程来等待特定设备。

事实上,人们可以使用libusb编写一个程序,该程序将根据给定的配置文件处理此类任务,这也是跨平台的,因为libusb支持相当多的平台。