{"id":659,"date":"2021-07-15T12:13:59","date_gmt":"2021-07-15T04:13:59","guid":{"rendered":"http:\/\/www.wayln.com\/?p=659"},"modified":"2021-07-15T12:13:59","modified_gmt":"2021-07-15T04:13:59","slug":"qt-mac-%e4%bd%bf%e7%94%a8libusb","status":"publish","type":"post","link":"https:\/\/www.wayln.com\/?p=659","title":{"rendered":"qt mac \u4f7f\u7528libusb"},"content":{"rendered":"<div id=\"toc_container\" class=\"toc_transparent no_bullets\"><p class=\"toc_title\">Contents<\/p><ul class=\"toc_list\"><li><a href=\"#libusb\"><span class=\"toc_number toc_depth_1\">1<\/span> libusb \u4ecb\u7ecd<\/a><\/li><li><a href=\"#i\"><span class=\"toc_number toc_depth_1\">2<\/span> \u94fe\u63a5\u5e93<\/a><ul><li><a href=\"#i-2\"><span class=\"toc_number toc_depth_2\">2.1<\/span> \u521b\u5efa\u9759\u6001\u94fe\u63a5\u5e93<\/a><\/li><li><a href=\"#i-3\"><span class=\"toc_number toc_depth_2\">2.2<\/span> \u521b\u5efa\u52a8\u6001\u94fe\u63a5\u5e93<\/a><\/li><\/ul><\/li><li><a href=\"#_QT_libusb\"><span class=\"toc_number toc_depth_1\">3<\/span> \u5728 QT \u4e2d\u4f7f\u7528 libusb<\/a><\/li><\/ul><\/div>\n<p>\u6700\u8fd1\u5728\u7528 QT \u505a\u4e00\u4e2a MAC \u4e0a\u7684 Kindle \u6279\u6ce8\u7ba1\u7406\u8f6f\u4ef6\uff0c\u9047\u5230\u7684\u7b2c\u4e00\u4e2a\u95ee\u9898\u5c31\u662f\u68c0\u6d4b MAC \u4e0a\u8fde\u63a5\u7684 USB \u8bbe\u5907\u7684\u72b6\u6001\u3002\u5982\u679c\u662f\u5728 Cocoa \u8fdb\u884c\u5f00\u53d1\uff0c\u4f1a\u6709\u5bf9\u5e94\u7684\u7cfb\u7edf API \u53ef\u4f9b\u4f7f\u7528\uff0c\u4f46\u662f\u7531\u4e8e\u6211\u662f\u5728 QT \u5e73\u53f0\u8fdb\u884c\u7684\u5f00\u53d1\uff0c\u6240\u4ee5\u65e0\u5f62\u4e2d\u52a0\u5927\u4e86\u4e00\u70b9\u96be\u5ea6\u3002\u5c31\u5728\u8fd9\u65f6\uff0c\u6211\u53d1\u73b0\u4e86\u4e00\u4e2a\u5e93\uff1alibusb<\/p>\n<h1><span id=\"libusb\">libusb \u4ecb\u7ecd<\/span><\/h1>\n<p>libusb \u8bbe\u8ba1\u4e86\u4e00\u7cfb\u5217\u7684\u5916\u90e8API \u4e3a\u5e94\u7528\u7a0b\u5e8f\u6240\u8c03\u7528\uff0c\u901a\u8fc7\u8fd9\u4e9bAPI\u5e94\u7528\u7a0b\u5e8f\u53ef\u4ee5\u64cd\u4f5c\u786c\u4ef6\uff0c\u4ecelibusb\u7684\u6e90\u4ee3\u7801\u53ef\u4ee5\u770b\u51fa\uff0c\u8fd9\u4e9bAPI \u8c03\u7528\u4e86\u5185\u6838\u7684\u5e95\u5c42\u63a5\u53e3\uff0c\u548ckernel driver\u4e2d\u6240\u7528\u5230\u7684\u51fd\u6570\u6240\u5b9e\u73b0\u7684\u529f\u80fd\u5dee\u4e0d\u591a\uff0c\u53ea\u662flibusb\u66f4\u52a0\u63a5\u8fd1USB \u89c4\u8303\u3002\u4f7f\u5f97libusb\u7684\u4f7f\u7528\u4e5f\u6bd4\u5f00\u53d1\u5185\u6838\u9a71\u52a8\u76f8\u5bf9\u5bb9\u6613\u7684\u591a\u3002\uff08From: \u767e\u5ea6\u767e\u79d1\uff09<\/p>\n<ol>\n<li>\u4e0b\u8f7d libusb<br \/>\n\u5728 libusb \u9879\u76ee\u4e3b\u9875\uff08http:\/\/libusb.info\uff09\u6211\u4eec\u53ef\u4ee5\u627e\u5230\u6700\u65b0\u7684\u6e90\u7801\uff0c\u4e0b\u8f7d\u4e0b\u6765\uff0c\u5e76\u4e14\u89e3\u538b\u3002\u8fd9\u91cc\u6211\u4e0b\u8f7d\u7684\u662f libusb-1.0.20.tar.bz2\uff0c\u628a\u5b83\u89e3\u538b\u51fa\u6765\u3002<\/p>\n<\/li>\n<li>\n<p>\u5b89\u88c5 libusb<\/p>\n<\/li>\n<\/ol>\n<pre><code class=\"language-linux line-numbers\">cd libusb-1.0.20\/\n.\/configure\nmake\nmake install\n<\/code><\/pre>\n<p>\u8fd9\u65f6\u5c31\u5df2\u7ecf\u5728\u673a\u5668\u4e0a\u7f16\u8bd1\u5b89\u88c5\u5b8c\u6210\u4e86 libusb<\/p>\n<ol start=\"3\">\n<li>\u8fd0\u884c\u793a\u4f8b\u7a0b\u5e8f<\/li>\n<\/ol>\n<pre><code class=\"line-numbers\">cd examples\/\nmake\n<\/code><\/pre>\n<p>\u7136\u540e\u6211\u4eec\u770b\u5230\u5728 examples\/ \u76ee\u5f55\u4e0b\u591a\u4e86\u51e0\u4e2a\u53ef\u6267\u884c\u7a0b\u5e8f\uff1a<\/p>\n<pre><code class=\"language-linux line-numbers\">listdevs\uff1a\u5217\u51fa\u5f53\u524d\u6240\u6709\u7684 USB \u8bbe\u5907\n\nhotplugtest\uff1aUSB \u70ed\u63d2\u62d4\u6d4b\u8bd5\n\ndpfp_threaded\uff1a\u64cd\u4f5c U.are.U 4000b \u6307\u7eb9\u91c7\u96c6\u4eea\u7684 Demo\n\ndpfp\uff1a\u521d\u59cb\u5316 U.are.U 4000b \u6307\u7eb9\u91c7\u96c6\u4eea\n\nsam3u_benchmark\uff1a\u6d4b\u8bd5 Atmel SAM3U USB \u4e3b\u63a7\u7684\u540c\u6b65\u4f20\u8f93\u7684\u6027\u80fd\u7684 Demo\n\nfxload\uff1aUSB \u56fa\u4ef6\u64cd\u4f5c\n\nUsage: fxload [-v] [-V] [-t type] [-d vid:pid] [-p bus,addr] [-s loader] -i firmware\n\n  -i &lt;path&gt;       -- Firmware to upload\n  -s &lt;path&gt;       -- Second stage loader\n  -t &lt;type&gt;       -- Target type: an21, fx, fx2, fx2lp, fx3\n  -d &lt;vid:pid&gt;    -- Target device, as an USB VID:PID\n  -p &lt;bus,addr&gt;   -- Target device, as a libusb bus number and device address path\n  -v              -- Increase verbosity\n  -q              -- Decrease verbosity (silent mode)\n  -V              -- Print program version\n\nxusb\uff1aUSB \u6d4b\u8bd5\u7a0b\u5e8f\nusage: \/Users\/jason\/Downloads\/libusb-1.0.20\/examples\/.libs\/xusb [-h] [-d] [-i] [-k] [-b file] [-l lang] [-j] [-x] [-s] [-p] [-w] [vid:pid]\n\n   -h      : display usage\n   -d      : enable debug output\n   -i      : print topology and speed info\n   -j      : test composite FTDI based JTAG device\n   -k      : test Mass Storage device\n   -b file : dump Mass Storage data to file 'file'\n   -p      : test Sony PS3 SixAxis controller\n   -s      : test Microsoft Sidewinder Precision Pro (HID)\n   -x      : test Microsoft XBox Controller Type S\n   -l lang : language to report errors in (ISO 639-1)\n   -w      : force the use of device requests when querying WCID descriptors\n\nIf only the vid:pid is provided, xusb attempts to run the most appropriate test\n<\/code><\/pre>\n<p>\u6211\u4eec\u4ee5 listdevs \u4e3a\u4f8b\uff0c\u6267\u884c\u6d4b\u8bd5\u7a0b\u5e8f\uff1a<\/p>\n<pre><code class=\"language-linux line-numbers\">.\/listdevs\n<\/code><\/pre>\n<p>1<br \/>\n\u6267\u884c\u7ed3\u679c\uff1a<\/p>\n<pre><code class=\"language-linux line-numbers\">05ac:8406 (bus 20, device 3) path: 7\n05ac:828f (bus 20, device 20) path: 3.3\n0a5c:4500 (bus 20, device 27) path: 3\n05ac:8005 (bus 20, device 0)\n<\/code><\/pre>\n<h1><span id=\"i\">\u94fe\u63a5\u5e93<\/span><\/h1>\n<p>\u5728Windows\u5e73\u53f0\u3001MAC \u5e73\u53f0\u548cLinux\u5e73\u53f0\u4e0b\u90fd\u5927\u91cf\u5b58\u5728\u7740\u5e93\u3002\u672c\u8d28\u4e0a\u6765\u8bf4\u5e93\u662f\u4e00\u79cd\u53ef\u6267\u884c\u4ee3\u7801\u7684\u4e8c\u8fdb\u5236\u5f62\u5f0f\uff0c\u53ef\u4ee5\u88ab\u64cd\u4f5c\u7cfb\u7edf\u8f7d\u5165\u5185\u5b58\u6267\u884c\u3002<br \/>\n\u7531\u4e8eWindows\u3001MAC\u548cLinux\u7684\u5e73\u53f0\u4e0d\u540c\uff08\u4e3b\u8981\u662f\u7f16\u8bd1\u5668\u3001\u6c47\u7f16\u5668\u548c\u8fde\u63a5\u5668\u7684\u4e0d\u540c\uff09\uff0c\u56e0\u6b64\u4e8c\u8005\u5e93\u7684\u4e8c\u8fdb\u5236\u662f\u4e0d\u517c\u5bb9\u7684\u3002<\/p>\n<p>Linux\u4e0b\u7684\u5e93\u6709\u4e24\u79cd\uff1a\u9759\u6001\u5e93\u548c\u5171\u4eab\u5e93\uff08\u52a8\u6001\u5e93\uff09\u3002\u4e8c\u8005\u7684\u4e0d\u540c\u70b9\u5728\u4e8e\u4ee3\u7801\u88ab\u8f7d\u5165\u7684\u65f6\u523b\u4e0d\u540c\u3002<\/p>\n<p>\u9759\u6001\u5e93\u7684\u4ee3\u7801\u5728\u7f16\u8bd1\u8fc7\u7a0b\u4e2d\u5df2\u7ecf\u88ab\u8f7d\u5165\u53ef\u6267\u884c\u7a0b\u5e8f\uff0c\u56e0\u6b64\u4f53\u79ef\u8f83\u5927\u3002<\/p>\n<p>\u5171\u4eab\u5e93\u7684\u4ee3\u7801\u662f\u5728\u53ef\u6267\u884c\u7a0b\u5e8f\u8fd0\u884c\u65f6\u624d\u8f7d\u5165\u5185\u5b58\u7684\uff0c\u5728\u7f16\u8bd1\u8fc7\u7a0b\u4e2d\u4ec5\u7b80\u5355\u7684\u5f15\u7528\uff0c\u56e0\u6b64\u4ee3\u7801\u4f53\u79ef\u8f83\u5c0f\u3002<\/p>\n<h2><span id=\"i-2\">\u521b\u5efa\u9759\u6001\u94fe\u63a5\u5e93<\/span><\/h2>\n<ol>\n<li>\u5199\u4e00\u4e2a\u9759\u6001\u94fe\u63a5\u5e93<br \/>\nhello.h<\/li>\n<\/ol>\n<pre><code class=\"language-c line-numbers\">#ifndef HELLO_H \n#define HELLO_H \nvoid hello(const char *name); \n#endif\n<\/code><\/pre>\n<p>hello.c<\/p>\n<pre><code class=\"language-c line-numbers\">#include &lt;stdio.h&gt; \nvoid hello(const char *name) { \n        printf(\"Hello %s!\\n\", name); \n}\n<\/code><\/pre>\n<p>main.c<\/p>\n<pre><code class=\"language-c line-numbers\">#include \"hello.h\" \nint main() \n{ \n    hello(\"world\"); \n    return 0; \n}\n<\/code><\/pre>\n<ol start=\"2\">\n<li>\u521b\u5efa\u76ee\u6807\u4ee3\u7801<\/li>\n<\/ol>\n<pre><code class=\"language-linux line-numbers\">gcc -c hello.c\n<\/code><\/pre>\n<p>gcc \u4e2d -c \u7684\u7f16\u8bd1\u9009\u9879\u7684\u610f\u601d\u662f\u4f7f\u7528GNU\u6c47\u7f16\u5668\u5c06\u6e90\u6587\u4ef6\u8f6c\u5316\u4e3a\u76ee\u6807\u4ee3\u7801\u4e4b\u540e\u5c31\u7ed3\u675f\uff0c\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b,\u53ea\u8c03\u7528\u4e86C\u7f16\u8bd1\u5668\uff08ccl\uff09\u548c\u6c47\u7f16\u5668\uff08as\uff09\uff0c\u800c\u8fde\u63a5\u5668(ld)\u5e76\u6ca1\u6709\u88ab\u6267\u884c\uff0c\u6240\u4ee5\u8f93\u51fa\u7684\u76ee\u6807\u6587\u4ef6\u4e0d\u4f1a\u5305\u542b\u4f5c\u4e3a\u7a0b\u5e8f\u5728\u88ab\u88c5\u8f7d\u548c\u6267\u884c\u65f6\u6240\u5fc5\u987b\u7684\u5305\u542b\u4fe1\u606f\uff0c\u4f46\u5b83\u53ef\u4ee5\u5728\u4ee5\u540e\u88ab\u8fde\u63a5\u5230\u4e00\u4e2a\u7a0b\u5e8f\u3002<\/p>\n<p>\u6211\u4eec\u6267\u884c ls \u547d\u4ee4\u4f1a\u770b\u5230\u76ee\u5f55\u4e0b\u591a\u4e86\u4e00\u4e2a hello.o \u6587\u4ef6\uff0c\u5b83\u5c31\u662f hello.c \u7f16\u8bd1\u7684\u76ee\u6807\u4ee3\u7801<\/p>\n<ol start=\"3\">\n<li>\u521b\u5efa\u9759\u6001\u94fe\u63a5\u5e93<\/li>\n<\/ol>\n<pre><code class=\"language-linux line-numbers\">ar rcs libhello.a hello.o\n<\/code><\/pre>\n<p>\u521b\u5efa\u9759\u6001\u5e93\u7528ar\u547d\u4ee4\u3002<\/p>\n<p>\u9759\u6001\u5e93\u6587\u4ef6\u540d\u7684\u547d\u540d\u89c4\u8303\u662f\u4ee5lib\u4e3a\u524d\u7f00\uff0c\u7d27\u63a5\u7740\u8ddf\u9759\u6001\u5e93\u540d\uff0c\u6269\u5c55\u540d\u4e3a.a\u3002<\/p>\n<p>\u4f8b\u5982\uff1a\u6211\u4eec\u5c06\u521b\u5efa\u7684\u9759\u6001\u5e93\u540d\u4e3ahello\uff0c\u5219\u9759\u6001\u5e93\u6587\u4ef6\u540d\u5c31\u662flibhello.a\u3002\u5728\u521b\u5efa\u548c\u4f7f\u7528\u9759\u6001\u5e93\u65f6\uff0c\u9700\u8981\u6ce8\u610f\u8fd9\u70b9\u3002<\/p>\n<p>\u6211\u4eec\u6267\u884c ls \u547d\u4ee4,\u53ef\u4ee5\u770b\u5230\u76ee\u5f55\u4e0b\u591a\u4e86\u4e00\u4e2a\u9759\u6001\u94fe\u63a5\u5e93 libhello.a<\/p>\n<ol start=\"4\">\n<li>\u94fe\u63a5\u9759\u6001\u94fe\u63a5\u5e93<br \/>\n\u9759\u6001\u5e93\u5236\u4f5c\u5b8c\u4e86\uff0c\u5982\u4f55\u4f7f\u7528\u5b83\u5185\u90e8\u7684\u51fd\u6570\u5462\uff1f<\/li>\n<\/ol>\n<p>\u53ea\u9700\u8981\u5728\u4f7f\u7528\u5230\u8fd9\u4e9b\u516c\u7528\u51fd\u6570\u7684\u6e90\u7a0b\u5e8f\u4e2d\u5305\u542b\u8fd9\u4e9b\u516c\u7528\u51fd\u6570\u7684\u539f\u578b\u58f0\u660e\uff0c\u7136\u540e\u5728\u7528gcc\u547d\u4ee4\u751f\u6210\u76ee\u6807\u6587\u4ef6\u65f6\u6307\u660e\u9759\u6001\u5e93\u540d\uff0cgcc\u5c06\u4f1a\u4ece\u9759\u6001\u5e93\u4e2d\u5c06\u516c\u7528\u51fd\u6570\u8fde\u63a5\u5230\u76ee\u6807\u6587\u4ef6\u4e2d\u3002<\/p>\n<p>\u6ce8\u610f\uff0cgcc\u4f1a\u5728\u9759\u6001\u5e93\u540d\u524d\u52a0\u4e0a\u524d\u7f00lib\uff0c\u7136\u540e\u8ffd\u52a0\u6269\u5c55\u540d.a\u5f97\u5230\u7684\u9759\u6001\u5e93\u6587\u4ef6\u540d\u6765\u67e5\u627e\u9759\u6001\u5e93\u6587\u4ef6,\u56e0\u6b64\uff0c\u6211\u4eec\u5728\u5199\u9700\u8981\u8fde\u63a5\u7684\u5e93\u65f6\uff0c\u53ea\u5199\u540d\u5b57\u5c31\u53ef\u4ee5\uff0c\u5982libhello.a\u7684\u5e93\uff0c\u53ea\u5199: -lhello<\/p>\n<pre><code class=\"language-linux line-numbers\">gcc -o main main.c -L. -lhello\n<\/code><\/pre>\n<p>1<br \/>\n\u6267\u884c\u7a0b\u5e8f<\/p>\n<pre><code class=\"language-linux line-numbers\">.\/main\nHello world!\n<\/code><\/pre>\n<h2><span id=\"i-3\">\u521b\u5efa\u52a8\u6001\u94fe\u63a5\u5e93<\/span><\/h2>\n<ol>\n<li>\u521b\u5efa\u52a8\u6001\u94fe\u63a5\u5e93<\/li>\n<\/ol>\n<pre><code class=\"language-linux line-numbers\">gcc -dynamiclib -o hello.dylib hello.o\n<\/code><\/pre>\n<p>\u6211\u4eec\u4f7f\u7528 ls \u547d\u4ee4\u53ef\u4ee5\u770b\u5230\u76ee\u5f55\u4e0b\u591a\u4e86 hello.dylib,\u5b83\u5c31\u662f\u521b\u5efa\u7684\u52a8\u6001\u94fe\u63a5\u5e93\uff08.dylib\u662f MAC \u7cfb\u7edf\u4e0b\u7684\uff0cWindows \u4e0b\u662f.dll, Linux \u4e0b\u662f.so\uff09<\/p>\n<ol start=\"2\">\n<li>\u94fe\u63a5\u52a8\u6001\u94fe\u63a5\u5e93<\/li>\n<\/ol>\n<pre><code class=\"language-linux line-numbers\">gcc -o main1 main.c -L. -lhello\n<\/code><\/pre>\n<p>\u6267\u884c\u7a0b\u5e8f<\/p>\n<pre><code class=\"language-linux line-numbers\">.\/main1\nHello world!\n<\/code><\/pre>\n<h1><span id=\"_QT_libusb\">\u5728 QT \u4e2d\u4f7f\u7528 libusb<\/span><\/h1>\n<ol>\n<li>\u5c06 libusb \u52a8\u6001\u94fe\u63a5\u5e93\u52a0\u5165 QT \u9879\u76ee<br \/>\n\u6211\u4eec\u9996\u5148\u5728 QT5 \u4e2d\u65b0\u5efa\u4e00\u4e2a\u9879\u76ee Testlibusb,\u7136\u540e\u5728\u9879\u76ee\u76ee\u5f55\u4e0b\u65b0\u5efa\u4e00\u4e2a\u76ee\u5f55 lib \u7528\u6765\u5b58\u653e libusb \u7684\u5e93\u6587\u4ef6\u3002<\/li>\n<\/ol>\n<p>\u5c06 libusb \u5bf9\u5e94\u7684\u5e93\u6587\u4ef6\u590d\u5236\u5230\u8be5\u76ee\u5f55\u4e0b\uff0c\u56e0\u4e3a\u6211\u6240\u4f7f\u7528\u7684\u5e73\u53f0\u662f MAC OS X\uff0c\u6240\u5bf9\u5e94\u7684\u5e93\u6587\u4ef6\u5e94\u5f53\u662f\u4ee5 .dylib \u4e3a\u6269\u5c55\u540d\u7684\uff0c\u6211\u4eec\u5728 libusb \u6e90\u7801\u6587\u4ef6\u5939\u4e0b\u7684 \/libusb\/.libs\/ \u76ee\u5f55\u4e0b\u627e\u5230 libusb-1.0.0.dylib \u7136\u540e\u590d\u5236\u5230\u521a\u521a\u521b\u5efa\u7684\u76ee\u5f55\u4e0b<\/p>\n<p>\u5e76\u4e14\u5c06 libusb \u7684\u5934\u6587\u4ef6 libusb.h \u52a0\u5165\u5230\u9879\u76ee\u4e2d<\/p>\n<ol start=\"2\">\n<li>\u4fee\u6539 QT \u9879\u76ee\u7f16\u8bd1\u9009\u9879<br \/>\n\u4fee\u6539 QT \u9879\u76ee\u4e2d\u7684 .pro \u6587\u4ef6\uff0c\u52a0\u5165\u4e0b\u9762\u51e0\u884c\uff1a<\/li>\n<\/ol>\n<pre><code class=\"language-cpp line-numbers\">macx: LIBS += -L<span class=\"katex math multi-line\">PWD\/lib\/ -lusb-1.0.0\nINCLUDEPATH +=<\/span>PWD\/.\nDEPENDPATH += $$PWD\/.\n<\/code><\/pre>\n<ol start=\"3\">\n<li>\u7f16\u5199 libusb \u6d4b\u8bd5\u7a0b\u5e8f<br \/>\ngetusbinfo.h<\/li>\n<\/ol>\n<pre><code class=\"language-cpp line-numbers\">#ifndef GETUSBINFO\n#define GETUSBINFO\n#include &lt;QString&gt;\n#include &lt;QObject&gt;\n#include &lt;QList&gt;\n#include &lt;QThread&gt;\n#include &lt;libusb.h&gt;\nstruct STUUSBDevices{\n    QString idProduct;\n    QString idVendor;\n    QString iManufacturer;\n    QString iSerialNumber;\n};\nclass GetUsbInfo :  QThread{\npublic:\n    GetUsbInfo(QObject *parent);\n    ~GetUsbInfo();\n    int initUsbDevices();\n    QString getVidPid(libusb_device **devs);\n    void showAllUsbDevices(QList&lt;STUUSBDevices&gt; lst);\n    void setRunStatus();\n    void run();\n    bool isStop;\n};\n#endif \/\/ GETUSBINFO\n<\/code><\/pre>\n<p>getusbinfo.cpp<\/p>\n<pre><code class=\"language-cpp line-numbers\">#include \"getusbinfo.h\"\n#include &lt;QThread&gt;\n#include &lt;QDebug&gt;\n#include &lt;QString&gt;\n\n\nGetUsbInfo::GetUsbInfo(QObject *parent) :\n    QThread(parent),isStop(false)\n{\n}\n\nGetUsbInfo::~GetUsbInfo()\n{\n    qDebug()&lt;&lt;\"GetUsbInfo::~GetUsbInfo \"&lt;&lt;endl;\n}\n\nint GetUsbInfo::initUsbDevices()\n{\n    libusb_device **devs;\n    int r;\n    ssize_t cnt;\n\n    r = libusb_init(NULL);\n    if (r &lt; 0)\n        return r;\n\n    cnt = libusb_get_device_list(NULL, &amp;devs);\n    if (cnt &lt; 0)\n        return (int) cnt;\n\n    getVidPid(devs);\n    libusb_free_device_list(devs, 1);\n\n    libusb_exit(NULL);\n    return 0;\n}\n\nQString GetUsbInfo::getVidPid(libusb_device **devs)\n{\n    libusb_device *dev;\n    int i = 0;\n    QList&lt;STUUSBDevices&gt; lstUsb;\n    while ((dev = devs[i++]) != NULL) {\n        struct libusb_device_descriptor desc;\n        int r = libusb_get_device_descriptor(dev, &amp;desc);\n        if (r &lt; 0) {\n            qDebug()&lt;&lt;\"failed to get device descriptor\"&lt;&lt;stderr;\n            return \"\";\n        }\n        printf(\"%04x:%04x (bus %d, device %d)\\n\",\n            desc.idVendor, desc.idProduct,\n            libusb_get_bus_number(dev), libusb_get_device_address(dev));\n        STUUSBDevices stu;\n        stu.idProduct = QString::number(desc.idProduct);\n        stu.idVendor = QString::number(desc.idVendor);\n        stu.iManufacturer = QString::number(desc.iManufacturer);\n        stu.iSerialNumber = QString::number(desc.iSerialNumber);\n\n        lstUsb.append(stu);\n    }\n    showAllUsbDevices(lstUsb);\n    return QString(lstUsb[0].idProduct);\n}\n\nvoid GetUsbInfo::showAllUsbDevices(QList&lt;STUUSBDevices&gt; lst)\n{\n    for(int i=0;i&lt;lst.count();i++)\n    {\n        qDebug()&lt;&lt;\"vid: \"&lt;&lt;lst.at(i).idVendor&lt;&lt;\"\\n\"\n               &lt;&lt;\"pid:\"&lt;&lt;lst.at(i).idProduct&lt;&lt;\"\\n\"\n                &lt;&lt;\"serNumber:\"&lt;&lt;lst.at(i).iSerialNumber&lt;&lt;\"\\n\"\n                  &lt;&lt;\"Manufacturer:\"&lt;&lt;lst.at(i).iManufacturer&lt;&lt;\"\\n\";\n    }\n}\n\nvoid GetUsbInfo::setRunStatus()\n{\n    isStop = true;\n}\n\nvoid GetUsbInfo::run()\n{\n    qDebug()&lt;&lt;\"GetUsbInfo::run() \"&lt;&lt;endl;\n    while (!isStop)\n    {\n       initUsbDevices();\n       sleep(10);\n    }\n}\n<\/code><\/pre>\n<p>main.cpp<\/p>\n<pre><code class=\"language-cpp line-numbers\">#include \"mainwindow.h\"\n#include &lt;QApplication&gt;\n#include \"getusbinfo.h\"\n\n#include &lt;QLibrary&gt;\n\nint main(int argc, char *argv[])\n{\n    QApplication a(argc, argv);\n    MainWindow w;\n    w.show();\n\n    QThread t;\n\n    GetUsbInfo info(&amp;t);\n\n    info.initUsbDevices();\n\n    return a.exec();\n}\n<\/code><\/pre>\n<ol start=\"4\">\n<li>\u6267\u884c libusb \u6d4b\u8bd5\u7a0b\u5e8f<\/li>\n<\/ol>\n<pre><code class=\"language-linux line-numbers\">Starting \/Users\/jason\/Project\/QTDemos\/build-Testlibusb-Desktop_Qt_5_5_1_clang_64bit-Debug\/Testlibusb.app\/Contents\/MacOS\/Testlibusb...\nvid:  \"1452\" \n pid: \"33798\" \n serNumber: \"5\" \n Manufacturer: \"3\" \n\n     vid:  \"1452\" \n pid: \"33423\" \n serNumber: \"0\" \n Manufacturer: \"1\" \n\n     vid:  \"2652\" \n pid: \"17664\" \n serNumber: \"0\" \n Manufacturer: \"1\" \n\n     vid:  \"1452\" \n pid: \"32773\" \n serNumber: \"0\" \n Manufacturer: \"0\" \n<\/code><\/pre>\n<p>\u6700\u7ec8\u6211\u4eec\u83b7\u5f97\u4e86\u5f53\u524d MAC \u4e0a\u7684 USB \u8bbe\u5907\u5217\u8868<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Contents1 libusb \u4ecb\u7ecd2 \u94fe\u63a5\u5e932.1 \u521b\u5efa\u9759\u6001\u94fe\u63a5\u5e932.2 \u521b\u5efa\u52a8\u6001\u94fe\u63a5\u5e933 \u5728 QT \u4e2d\u4f7f [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[11,7,1,2],"tags":[],"class_list":["post-659","post","type-post","status-publish","format-standard","hentry","category-mac","category-qt","category-1","category-2"],"_links":{"self":[{"href":"https:\/\/www.wayln.com\/index.php?rest_route=\/wp\/v2\/posts\/659","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.wayln.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.wayln.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.wayln.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.wayln.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=659"}],"version-history":[{"count":1,"href":"https:\/\/www.wayln.com\/index.php?rest_route=\/wp\/v2\/posts\/659\/revisions"}],"predecessor-version":[{"id":660,"href":"https:\/\/www.wayln.com\/index.php?rest_route=\/wp\/v2\/posts\/659\/revisions\/660"}],"wp:attachment":[{"href":"https:\/\/www.wayln.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=659"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.wayln.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=659"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.wayln.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=659"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}