<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_何文西的体感技术小屋</title><subtitle type="text"/><id>http://feed.cnblogs.com/blog/u/64851/rss</id><updated>2012-05-25T09:37:10Z</updated><author><name>何文西</name><uri>http://www.cnblogs.com/TravelingLight/</uri></author><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/TravelingLight/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/64851/rss"/><entry><id>http://www.cnblogs.com/TravelingLight/archive/2012/05/22/2513265.html</id><title type="text">体感技术：DIY Kinect Hacking（三）（原创）</title><summary type="text">10. Command #1 &amp; 2 - LED blinky!我们会编写发送命令#1的python代码，来观察会发生什么。从我们的日志中，我们知道发送命令是从host-to-device, 我们应该设置bRequestType值为0x40 (验证这个值，可以查看the bmRequestType bits of the command packets), wIndex and wLength of zeroFor command #1, set bRequest to 0x06 and a wValue to 0x4. 最后一个参数是一个空数组[ ]，表示没有数据传输。ret = d</summary><published>2012-05-22T06:08:00Z</published><updated>2012-05-22T06:08:00Z</updated><author><name>何文西</name><uri>http://www.cnblogs.com/TravelingLight/</uri></author><link rel="alternate" href="http://www.cnblogs.com/TravelingLight/archive/2012/05/22/2513265.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/TravelingLight/archive/2012/05/22/2513265.html"/><content type="html">&lt;p&gt;&lt;span style="color: #800000;"&gt;&lt;strong&gt;&lt;span style="font-size: 12px;"&gt;10. Command #1 &amp;amp; 2 - LED blinky!&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;我们会编写发送命令#1的python代码，来观察会发生什么。从我们的日志中，我们知道发送命令是从host-to-device, 我们应该设置&lt;strong&gt;bRequestType&lt;/strong&gt;值为0x40 (验证这个值，可以查看the &lt;strong&gt;bmRequestType&lt;/strong&gt; bits of the command packets), &lt;strong&gt;wIndex&lt;/strong&gt; and &lt;strong&gt;wLength&lt;/strong&gt; of zero&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;For command #1, set &lt;strong&gt;bRequest&lt;/strong&gt; to 0x06 and a &lt;strong&gt;wValue&lt;/strong&gt; to &lt;strong&gt;0x4&lt;/strong&gt;. 最后一个参数是一个空数组[ ]，表示没有数据传输。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;&lt;span style="font-size: 12px;"&gt;&lt;strong&gt;&lt;span style="font-size: 12px;"&gt;&lt;strong&gt;ret = dev.ctrl_transfer(0x40, 0x6, 0x4, 0, [])&lt;/strong&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;我们运行Python代码，结果....什么都没发生！&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;也许这只是一个初始化的命令。Lets replace it with the next command #2, set &lt;strong&gt;bRequest&lt;/strong&gt; to 0x06 and a &lt;strong&gt;wValue&lt;/strong&gt; to &lt;strong&gt;0x1&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;&lt;strong&gt;&lt;span style="font-size: 12px;"&gt;&lt;strong&gt;ret = dev.ctrl_transfer(0x40, 0x6, 0x1, 0, [])&lt;/strong&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="font-size: 12px;"&gt;import usb.core&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;import usb.util&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;import sys&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span style="font-size: 12px;"&gt;# find our device&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;dev = usb.core.find(idVendor=&lt;span style="color: #800080;"&gt;0x045e&lt;/span&gt;, idProduct=&lt;span style="color: #800080;"&gt;0x02B0&lt;/span&gt;)&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span style="font-size: 12px;"&gt;# was it found?&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; dev &lt;span style="color: #0000ff;"&gt;is&lt;/span&gt; None:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;    raise ValueError(&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;Device not found&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;)&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span style="font-size: 12px;"&gt;# &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt; the active configuration. With no arguments, the first&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;# configuration will be the active one&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;dev.set_configuration()&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span style="font-size: 12px;"&gt;ret = dev.ctrl_transfer(&lt;span style="color: #800080;"&gt;0x40&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0x6&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0x1&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, [])&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;print ret&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;我们运行这个命令，马达还是没有转动，但是LED灯却停止了闪烁。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;为了好玩，我们再次运行之前的命令，结果LED灯又开始闪烁了。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;现在我们有了一个想法：也许&lt;strong&gt;bRequest&lt;/strong&gt; &lt;strong&gt;0x6&lt;/strong&gt; 用于控制LED灯。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;On your own, continue this line of thought by trying different &lt;strong&gt;wValue&lt;/strong&gt;s from 0 on up to see what other &lt;strong&gt;wValues&lt;/strong&gt; do, keep track of them all in a notebook or project file.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #800000; font-size: 12px;"&gt;&lt;strong&gt;11. Command #3 &amp;amp;4 - Let's move!&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;在上一节里，我们已经征服了一个命令。现在，我们将征服另一个命令。Try to replicate command #3, set &lt;strong&gt;bRequest&lt;/strong&gt; to &lt;strong&gt;0x31&lt;/strong&gt; and a &lt;strong&gt;wValue&lt;/strong&gt; to &lt;strong&gt;0xffd0&lt;/strong&gt; (also known as -48 for a 2-byte word)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;&lt;strong&gt;ret = dev.ctrl_transfer(0x40, 0x31, 0xffd0, 0, [])&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;运行Python脚本，the motor move its 'head' down.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;Now try command #4,&amp;nbsp; &lt;strong&gt;wValue&lt;/strong&gt; to &lt;strong&gt;0xfff0&lt;/strong&gt; (also known as -16 for a 2-byte word)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;&lt;strong&gt;ret = dev.ctrl_transfer(0x40, 0x31, 0xfff0, 0, [])&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;This makes the head move up. &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;现在，马达和LED都在我们的控制之下了。 Here is a video we shot a few minutes after getting the motor working, using a python script to move it up and down.（译者：视频见原文）&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #800000; font-size: 12px;"&gt;&lt;strong&gt;12. Bonus accelerometer!（奖金冲刺）&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;我们回来重温下这个神秘的读取命令&lt;strong&gt;0x31&lt;/strong&gt;，这个命令我们还有一点模糊。它也在日志里，一定要确认set your filter to show both &lt;strong&gt;Host-to-Device&lt;/strong&gt; and &lt;strong&gt;Device-to-Host&lt;/strong&gt; since its a 'read' not a 'write'&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/106434/2011092813220412.gif" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;We were pretty close with our commands, 看起来我们应该读取的只有10个字节。It also looks like the data doesn't really change much except for a bit further down&amp;hellip;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/106434/2011092813222733.gif" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;在我们发送了命令&lt;strong&gt;bRequest&lt;/strong&gt; &lt;strong&gt;0x31&lt;/strong&gt; (motor movement)之后，第七个字节改变了很多次。That implies that this data read is somehow affected by the motor, 可能是马达反馈字节？&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;&lt;a class="urlextern" title="http://www.ifixit.com/Teardown/Microsoft-Kinect-Teardown/4066/2" href="http://www.ifixit.com/Teardown/Microsoft-Kinect-Teardown/4066/2" rel="nofollow"&gt;Checking out a tear-down of the device (from iFixit)&lt;/a&gt; we see that &lt;a class="urlextern" title="http://www.kionix.com/Product%20Sheets/KXSD9%20Product%20Brief.pdf" href="http://www.kionix.com/Product%20Sheets/KXSD9%20Product%20Brief.pdf" rel="nofollow"&gt;there is an 'inclinometer'/accelerometer&lt;/a&gt; (Kionix KXSD9). The datasheet indicates it is used for image stabilization, and it has 3 axes (X Y and Z) with 10 bits of data per axis.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;让我们持续不断的读取数据.&lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="font-size: 12px;"&gt;import usb.core&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;import usb.util&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;import sys&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;import time&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span style="font-size: 12px;"&gt;# find our device&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;dev = usb.core.find(idVendor=&lt;span style="color: #800080;"&gt;0x045e&lt;/span&gt;, idProduct=&lt;span style="color: #800080;"&gt;0x02B0&lt;/span&gt;)&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span style="font-size: 12px;"&gt;# was it found?&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; dev &lt;span style="color: #0000ff;"&gt;is&lt;/span&gt; None:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;    raise ValueError(&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;Device not found&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;)&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span style="font-size: 12px;"&gt;dev.set_configuration()&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span style="font-size: 12px;"&gt;&lt;span style="color: #0000ff;"&gt;while&lt;/span&gt; True:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;    # Get data from brequest &lt;span style="color: #800080;"&gt;0x31&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;    ret = dev.ctrl_transfer(&lt;span style="color: #800080;"&gt;0xC0&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0x31&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0x0&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0x0&lt;/span&gt;, &lt;span style="color: #800080;"&gt;10&lt;/span&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;    print map(hex, ret)&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;晃动Kinect的同时运行脚本，你会清楚的看到，这个数据的变化与运动有关。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;To identify the accelerometer axes, rotate it only one way at a time and note what changes. You can also see how this data is in bytes but the accelerometer data should be a signed word because there are flips from 0xfff7 to 0x0007 which would indicate a negative to positive conversion.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/106434/2011092813230170.gif" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;We can cast two bytes to a signed value by 'hand' (in C this is a little easier, we know)&lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="font-size: 12px;"&gt;import usb.core&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;import usb.util&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;import sys&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;import time&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span style="font-size: 12px;"&gt;# find our device&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;dev = usb.core.find(idVendor=&lt;span style="color: #800080;"&gt;0x045e&lt;/span&gt;, idProduct=&lt;span style="color: #800080;"&gt;0x02B0&lt;/span&gt;)&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span style="font-size: 12px;"&gt;# was it found?&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; dev &lt;span style="color: #0000ff;"&gt;is&lt;/span&gt; None:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;    raise ValueError(&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;Device not found&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;)&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span style="font-size: 12px;"&gt;dev.set_configuration()&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span style="font-size: 12px;"&gt;&lt;span style="color: #0000ff;"&gt;while&lt;/span&gt; True:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;    # Get data from brequest &lt;span style="color: #800080;"&gt;0x31&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;    ret = dev.ctrl_transfer(&lt;span style="color: #800080;"&gt;0xC0&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0x31&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0x0&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0x0&lt;/span&gt;, &lt;span style="color: #800080;"&gt;10&lt;/span&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;    #print map(hex, ret)&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span style="font-size: 12px;"&gt;    x = (ret[&lt;span style="color: #800080;"&gt;2&lt;/span&gt;] &amp;lt;&amp;lt; &lt;span style="color: #800080;"&gt;8&lt;/span&gt;) | ret[&lt;span style="color: #800080;"&gt;3&lt;/span&gt;]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;    x = (x + &lt;span style="color: #800080;"&gt;2&lt;/span&gt; ** &lt;span style="color: #800080;"&gt;15&lt;/span&gt;) % &lt;span style="color: #800080;"&gt;2&lt;/span&gt;**&lt;span style="color: #800080;"&gt;16&lt;/span&gt; - &lt;span style="color: #800080;"&gt;2&lt;/span&gt;**&lt;span style="color: #800080;"&gt;15&lt;/span&gt;     # convert to signed 16b&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;    y = (ret[&lt;span style="color: #800080;"&gt;4&lt;/span&gt;] &amp;lt;&amp;lt; &lt;span style="color: #800080;"&gt;8&lt;/span&gt;) | ret[&lt;span style="color: #800080;"&gt;5&lt;/span&gt;]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;    y = (y + &lt;span style="color: #800080;"&gt;2&lt;/span&gt; ** &lt;span style="color: #800080;"&gt;15&lt;/span&gt;) % &lt;span style="color: #800080;"&gt;2&lt;/span&gt;**&lt;span style="color: #800080;"&gt;16&lt;/span&gt; - &lt;span style="color: #800080;"&gt;2&lt;/span&gt;**&lt;span style="color: #800080;"&gt;15&lt;/span&gt;     # convert to signed 16b&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;    z = (ret[&lt;span style="color: #800080;"&gt;6&lt;/span&gt;] &amp;lt;&amp;lt; &lt;span style="color: #800080;"&gt;8&lt;/span&gt;) | ret[&lt;span style="color: #800080;"&gt;7&lt;/span&gt;]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;    z = (z + &lt;span style="color: #800080;"&gt;2&lt;/span&gt; ** &lt;span style="color: #800080;"&gt;15&lt;/span&gt;) % &lt;span style="color: #800080;"&gt;2&lt;/span&gt;**&lt;span style="color: #800080;"&gt;16&lt;/span&gt; - &lt;span style="color: #800080;"&gt;2&lt;/span&gt;**&lt;span style="color: #800080;"&gt;15&lt;/span&gt;     # convert to signed 16b&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span style="font-size: 12px;"&gt;    print x, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;\t&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, y, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;\t&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, z&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;现在，当我们运行脚本，已经可以看到有符号的数据显示正常了。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/106434/2011092813233717.gif" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;span style="color: #800000; font-size: 12px;"&gt;&lt;strong&gt;13. More Kinect!&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;We hope you enjoyed this reverse-engineering tutorial. For more information about Open Kinect, &lt;a class="urlextern" title="https://github.com/OpenKinect/libfreenect" href="https://github.com/OpenKinect/libfreenect" rel="nofollow"&gt;please visit the github repository&lt;/a&gt; and &lt;a class="urlextern" title="http://groups.google.com/group/openkinect/" href="http://groups.google.com/group/openkinect/" rel="nofollow"&gt;google group&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/TravelingLight/aggbug/2513265.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/TravelingLight/archive/2012/05/22/2513265.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/TravelingLight/archive/2012/05/22/2513259.html</id><title type="text">体感技术：DIY Kinect Hacking（二）（原创）</title><summary type="text">7. What message to send?现在，我们可以使用Python+LibUSB来发送Control Endpoint数据包了。ctrl_transfer( bmRequestType, bmRequest, wValue, wIndex, nBytes)这个命令既可以发送数据包也可以接收数据包，这取决于bmRequestType的值（input or output）。不过，这个命令还有很多其它选项参数。所以要想发送数据需要知道bmRequestType, bmRequest, wValue, wIndex以及有多少数据用来读或者写。If we were totally on ou</summary><published>2012-05-22T06:07:00Z</published><updated>2012-05-22T06:07:00Z</updated><author><name>何文西</name><uri>http://www.cnblogs.com/TravelingLight/</uri></author><link rel="alternate" href="http://www.cnblogs.com/TravelingLight/archive/2012/05/22/2513259.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/TravelingLight/archive/2012/05/22/2513259.html"/><content type="html">&lt;p&gt;&lt;span style="color: #800000; font-size: 12px;"&gt;&lt;strong&gt;7. What message to send?&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;现在，我们可以使用Python+LibUSB来发送Control Endpoint数据包了。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;&lt;strong&gt;ctrl_transfer( bmRequestType, bmRequest, wValue, wIndex, nBytes)&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;这个命令既可以发送数据包也可以接收数据包，这取决于&lt;strong&gt;bmRequestType&lt;/strong&gt;的值（input or output）。不过，这个命令还有很多其它选项参数。所以要想发送数据需要知道bmRequestType, bmRequest, wValue, wIndex以及有多少数据用来读或者写。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;If we were totally on our own，我们可以开始尝试读取数据从设备里。这意味我们必须首先设置&lt;strong&gt;bmRequestType&lt;/strong&gt;。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/106434/2011092809310222.jpg" alt="" /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;&lt;strong&gt;bmRequestType&lt;/strong&gt;传递的值非常结构化，所以这并不难去猜测。(&lt;a class="urlextern" title="http://www.beyondlogic.org/usbnutshell/usb6.shtml" href="http://www.beyondlogic.org/usbnutshell/usb6.shtml" rel="nofollow"&gt;See lvr.com for more information&lt;/a&gt; ) &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;&amp;bull; Bits D2, D3 和 D4都是保留位置，所以这里设为0。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;&amp;bull; The direction is set by bit #7， 0值 代表&amp;ldquo;写&amp;rdquo;即向设备发送数据。1值代表&amp;ldquo;读&amp;rdquo;即从设备接收数据。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;&amp;bull; The 'type' of message is two bits（D6和D5）， 0 = Standard（标准）, 1 = Class, 2 = Vendor（供应商）, 3 = Reserved（保留选项）。对于许多非标准设备，你可能希望得到供应商的类型。如果是标准型的设备，像摄像头或麦克风，可以设置为值0或值1。值3未使用。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;&amp;bull; 最后俩个Bits（D1和D0）被用于确定接收的消息，0 = Device, 1 = Interface, 2 = Endpoint, 3 = Other。Go with 0 to start, you can try 2 if there are other endpoints。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;最安全的事情，那就是读取数据（它不会覆盖任何东西或配置），you can do that by sending packets with &lt;strong&gt;&lt;strong&gt;bmRequestType = &lt;/strong&gt;&lt;/strong&gt;0b11000000（16进制：bmRequestType&lt;strong&gt; = &lt;/strong&gt;0xC0 ）(Read Vendor data from Device) . &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;If I were to write a fuzzer：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;（1）I'd start by setting &lt;strong&gt;wIndex &lt;/strong&gt;to 0 &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;（2）Iterating through all the byte values (255 different values) of &lt;strong&gt;bmRequest&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;（3）Te first few hundred &lt;strong&gt;wValue&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;这么做是非常安全的，只是从USB设备读取随机数据。开始读取一个字节直到看到任何显示，然后增加值。&lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="font-size: 12px;"&gt;import usb.core&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;import usb.util&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;import sys&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span style="font-size: 12px;"&gt;# find our device&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;dev = usb.core.find(idVendor=&lt;span style="color: #800080;"&gt;0x045e&lt;/span&gt;, idProduct=&lt;span style="color: #800080;"&gt;0x02B0&lt;/span&gt;)&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span style="font-size: 12px;"&gt;# was it found?&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; dev &lt;span style="color: #0000ff;"&gt;is&lt;/span&gt; None:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;    raise ValueError(&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;Device not found&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;)&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span style="font-size: 12px;"&gt;# &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt; the active configuration. With no arguments, the first&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;# configuration will be the active one&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;dev.set_configuration()&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span style="font-size: 12px;"&gt;# Let&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;s fuzz around! &lt;/span&gt;&lt;span style="color: #800000;"&gt;&lt;br /&gt;&lt;/span&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;# Lets start by Reading &lt;span style="color: #800080;"&gt;1&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;byte&lt;/span&gt; from the Device &lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; different Requests&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;# bRequest &lt;span style="color: #0000ff;"&gt;is&lt;/span&gt; a &lt;span style="color: #0000ff;"&gt;byte&lt;/span&gt; so there are &lt;span style="color: #800080;"&gt;255&lt;/span&gt; different values&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt; bRequest &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt; range(&lt;span style="color: #800080;"&gt;255&lt;/span&gt;):&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;    &lt;span style="color: #0000ff;"&gt;try&lt;/span&gt;:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;        ret = dev.ctrl_transfer(&lt;span style="color: #800080;"&gt;0xC0&lt;/span&gt;, bRequest, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #800080;"&gt;1&lt;/span&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;        print &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;bRequest &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,bRequest&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;        print ret&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;    except:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;        # failed to &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt; data &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt; request&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;        pass&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/106434/2011092810224226.gif" alt="" /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;我们可以看到&lt;strong&gt;Request&lt;/strong&gt;的值0, 5, 16, 50, 54, 64, 80 和112 全都返回了一些数据。其余的值没有任何读取。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;接下来，我们会尝试读取更多的数据，通过改变最后一个参数的值为100 bytes。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/106434/2011092810230384.gif" alt="" /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;好了，有很多数据，但是这些数据代表什么意思呢？This is where some guessing based on the device itself would come in handy（一些硬件设备即将派上用场）. I'm terribly lazy though and if given an option to avoid a lot of guesswork, I'll take it!&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #800000; font-size: 12px;"&gt;&lt;strong&gt;8. USB Analyzer&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;对Kinect进行逆向工程更容易一些，因为我们有一个著名的工作系统（XBOX 360）。 取代命令猜测，我们可以看看什么命令从XBOX里发送，然后&amp;ldquo;重放这些命令&amp;rdquo;。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/106434/2011092810404698.jpg" alt="" /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;然而，我们首先需要能够监听这些命令。With protocols such as SPI, Serial（串行）, Parallel（并行） and i2c, 你可以监听这些命令，通过使用逻辑分析仪或示波器。 USB is fast/complex enough to require its own kind of logic analyzer. 我们将会使用一个被称为&lt;span style="text-decoration: underline;"&gt;&lt;span style="color: #0066cc; text-decoration: underline;"&gt;Beagle480 from TotalPhase&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;的分析仪，这是一台&amp;ldquo;高速的&amp;rdquo;USB分析仪，这次我们也要挥霍一把了。 (对于许多设备, 速度还不够快, 那些都是一些低成本的分析仪。) &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;USB分析仪扮演了一个&amp;ldquo;tap&amp;rdquo;的角色在XBOX和Kinect之间。一台电脑也需要连接好，这台电脑用于接收所有传输的数据到内存中并记录下。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/106434/2011092810584514.jpg" alt="" /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;从左至右，分别是&lt;strong&gt;DIN&lt;/strong&gt;连接口，&lt;strong&gt;USB A&lt;/strong&gt;连接口和&lt;strong&gt;USB B&lt;/strong&gt;连接口。XBOX连接到 USB B，KINECT连接到USB A。DIN connector is for other kinds of data sniffing （like SPI or i2c）&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/106434/2011092811041537.jpg" alt="" /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;在另一边，有一个单独的USB B连接口，它用来连接监听的电脑。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;The best way we've found to get the right data is to make sure to get even the 'enumeration' (initialization) packets，所以插入监听电脑并启动软件。然后在另一端插入你想侦听的设备.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/106434/2011092811125939.jpg" alt="" /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #800000; font-size: 12px;"&gt;&lt;strong&gt;9. Lookin' at logs&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;你可能没有一个USB分析仪，我们这里有一些日志，you can use to follow along with us.&amp;nbsp; &lt;a class="urlextern" title="https://github.com/adafruit/Kinect/tree/master/USBlogs/" href="https://github.com/adafruit/Kinect/tree/master/USBlogs/" rel="nofollow"&gt;Visit the GitHub repository and click the **Downloads** button&lt;/a&gt; &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;Make yourself a sandwich, its a big file!&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;&lt;a class="urlextern" title="http://www.totalphase.com/products/beagle_usb480/" href="http://www.totalphase.com/products/beagle_usb480/" rel="nofollow"&gt;Also download the Beagle Data Center software (Mac/Win/Linux)&lt;/a&gt; and install it&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;OK now that you've eaten, 让我们打开&lt;strong&gt;enuminit&lt;/strong&gt;.tdc 文件。This is the full enumeration and initialization。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/106434/2011092811234726.gif" alt="" /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;记住，当我们在记录数据的时候会有很多，不过我们可以消减这些数据。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;让我们重新回忆一下，Kinect有四个设备（hub, camera, mic, motor），但是我们只需要监听其中的一个（motor）。Click on the &lt;strong&gt;Bus &lt;/strong&gt;tab on the lower right.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/106434/2011092811285391.gif" alt="" /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;We have a few devices. Lets explore each one。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;如果你点击了&lt;strong&gt;Unconfigured device (0) ，&lt;/strong&gt;你会发现该设备还没有被捕获。这可能是因为 I jiggled the cable when inserting it so it started to create a device and then got disconnected. Its not important&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/106434/2011092811351026.gif" alt="" /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;Click on &lt;strong&gt;&amp;lt;none&amp;gt; (1)&lt;/strong&gt; This device is a &lt;strong&gt;Class&lt;/strong&gt; device type USB Hub. That's the internal hub. 我们可以忽略这一点。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/106434/2011092811401543.gif" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;Device #4 has a PID of 688, 这是个十进制的值. 如果我们把它转换为十六进制，我们会得到&lt;strong&gt;0x02b0&lt;/strong&gt; - 这个就是马达设备！&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/106434/2011092811453517.gif" alt="" /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;现在，我们可以过滤了，仅显示马达设备的日志。 &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/106434/2011092811460674.gif" alt="" /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;现在，我们的日志已经非常短了。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/106434/2011092811463852.gif" alt="" /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;你可以看到有一些初始化工作，and then just two repeating motifs：一个1字节的消息和一个10字节的消息交替出现。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;马达会根据XBOX的命令来转动，这里一定有一些从XBOX发送给KINECT的命令。 让我们在过滤下，只显示发送给KINECT的命令。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/106434/2011092811471689.gif" alt="" /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;找到&lt;strong&gt;LiveFilter&lt;/strong&gt;选项卡，然后勾上&lt;strong&gt;Host-to-Device&lt;/strong&gt;一项。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/106434/2011092811475240.gif" alt="" /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;现在，我们真的把它消减下来了（译者：列表的信息大部分被过滤了）。 这里只有四个命令发送给Kinect的马达，since the motor moves during initialization we can just try each one. 下面，让我们看下每个命令吧。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;Command 1 has a &lt;strong&gt;bRequest&lt;/strong&gt; of 0x06 and a &lt;strong&gt;wValue&lt;/strong&gt; of 4, the &lt;strong&gt;wLength &lt;/strong&gt;is 0 which means no data is written, the entire command is the &lt;strong&gt;Request&lt;/strong&gt; and &lt;strong&gt;Value&lt;/strong&gt; &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/106434/2011092811484390.gif" alt="" /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;Command #2 uses the same &lt;strong&gt;bRequest&lt;/strong&gt; but with a different &lt;strong&gt;wValue&lt;/strong&gt; of 0x01 &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/106434/2011092811490926.gif" alt="" /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;Command #3 is a different &lt;strong&gt;bRequest&lt;/strong&gt; of 0x31 and a &lt;strong&gt;wValue&lt;/strong&gt; of 0xffd0 &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/106434/2011092811493459.gif" alt="" /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;Command #4 is the same &lt;strong&gt;bRequest&lt;/strong&gt; and a &lt;strong&gt;wValue&lt;/strong&gt; of 0xfff0 &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/106434/2011092811495910.gif" alt="" /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;现在我们已经确定有俩个请求命令可以发送。一个是&lt;strong&gt;0x06&lt;/strong&gt;，另一个是&lt;strong&gt;0x31 &lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;Time to experiment!&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #800000;"&gt;&lt;strong&gt;&lt;span style="font-size: 12px;"&gt;10. Command #1 &amp;amp; 2 - LED blinky!&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;strong&gt;&lt;span style="font-size: 12px;"&gt;（续）&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/TravelingLight/aggbug/2513259.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/TravelingLight/archive/2012/05/22/2513259.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/TravelingLight/archive/2012/05/22/2513256.html</id><title type="text">体感技术：DIY Kinect Hacking（一）（原创）</title><summary type="text">1. Introduction每个人都看过 Xbox 360 Kinect hacked in a matter of days after our "open source driver" bounty- here's how we helped the winner and here's how you can reverse engineer USB devices as well! USB是一个非常复杂的协议，比Serial or Parallel, SPI and even I2C更加难懂. USB只使用2条电线，但它们不像串行一样是作为“接收”和</summary><published>2012-05-22T06:06:00Z</published><updated>2012-05-22T06:06:00Z</updated><author><name>何文西</name><uri>http://www.cnblogs.com/TravelingLight/</uri></author><link rel="alternate" href="http://www.cnblogs.com/TravelingLight/archive/2012/05/22/2513256.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/TravelingLight/archive/2012/05/22/2513256.html"/><content type="html">&lt;p&gt;&lt;span style="font-size: 12px;"&gt;&lt;strong&gt;&lt;span style="color: #800000;"&gt;1. &lt;span style="color: #800000;"&gt;Introduction&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #000000; font-size: 12px;"&gt;每个人都看过 &lt;a class="urlextern" title="http://www.adafruit.com/blog/2010/11/10/we-have-a-winner-open-kinect-drivers-released-winner-will-use-3k-for-more-hacking-plus-an-additional-2k-goes-to-the-eff/" href="http://www.adafruit.com/blog/2010/11/10/we-have-a-winner-open-kinect-drivers-released-winner-will-use-3k-for-more-hacking-plus-an-additional-2k-goes-to-the-eff/" rel="nofollow"&gt;Xbox 360 Kinect hacked in a matter of days after our "open source driver" bounty&lt;/a&gt;&amp;nbsp;- here's how we helped the winner and here's how you can reverse engineer USB devices as well! &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #000000; font-size: 12px;"&gt;USB是一个非常复杂的协议，比Serial or Parallel, SPI and even I2C更加难懂. USB只使用2条电线，但它们不像串行一样是作为&amp;ldquo;接收&amp;rdquo;和&amp;ldquo;传输&amp;rdquo;。相反，数据是bidirectional and differential - 数据发送依赖与俩根数据线D+和D-之间的电压差异。如果你想知道更多有关USB的技术，你需要阅读 &lt;a class="urlextern" title="http://lvr.com/usbc.htm" href="http://lvr.com/usbc.htm" rel="nofollow"&gt;Jan Axelson's USB Complete books&lt;/a&gt; , they're easy to follow and discuss USB in both depth and breadth. &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #000000; font-size: 12px;"&gt;USB is also very structured。这很适合逆向工程， because it means that at least the format of packets is agreed upon and you won't have to deal with check-sums. 坏消息是，你必须有软件来协助你解码这些复杂的数据包。好消息是，现在每台电脑都会有USB host core，它们会为我们做大量艰辛的工作，并且会有很多软件库可以协助我们。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #000000; font-size: 12px;"&gt;今天，我们将开始我们的逆向工程来破解Kinect的马达。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #800000; font-size: 12px;"&gt;&lt;strong&gt;2. Verify the VID &amp;amp; PID&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #000000; font-size: 12px;"&gt;首先开始的是查看USB设备有效的&amp;ldquo;接口&amp;rdquo;信息和&amp;ldquo;配置&amp;rdquo;信息。最佳方式是使用&lt;strong&gt;lsusb&lt;/strong&gt;(Linux)或者&lt;strong&gt;system_profiler&lt;/strong&gt;(Mac)，这是一个&amp;ldquo;list usb&amp;rdquo;程序可用于Linux和mac.悲剧的是，windows里并没有这些工具，所以找一台linux或mac吧，你只需要一分钟吧。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;&amp;nbsp;在linux里，运行 &lt;strong&gt;lsusb-vv&lt;/strong&gt;(ultra verbose).在mac里，运行 &lt;strong&gt;system_profiler SPUSBDataType&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/106434/2011092809061050.jpg" alt="" /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;这里有一堆的东西像USB Keys和一些安装程序，但这是一个好的开始。需要注意的是，Kinect事实上有四个USB设备-一个集线器，一个摄像头,一个麦克风(音频)和一个马达. 这个集线器只是简单的把三个独立的芯片组合为一个单一的缆线设备。我们将会研究马达设备，因为它是最简单的。请注意Vendor ID=0x045e 和 Product ID = 0x2b0. 每种USB设备都必须拥有唯一的VID和PID。VID指的是制造商。在这个例子里，VID 0x45e指的是微软。所有的微软产品都会有这个VID值。每个产品都会有不同的PID，所以所有的Kinect马达的PID值都为0x02b0，俩个Kinect的马达PID不会不同，它们都拥有同样的PID。The VID/PID are used as a way to have the proper driver find the product。这个优于串行COM接口，因为串行COM接口可以更改名称， but VID/PID are burned into the device firmware。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #800000; font-size: 12px;"&gt;&lt;strong&gt;3. Determine the Descriptors&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;你已经知道VID/PID是用来确定设备的描述符（&lt;strong&gt;descriptor&lt;/strong&gt;）。描述符是一种&amp;ldquo;菜单&amp;rdquo;，描述了设备可以做什么，设备如何传输数据。一般情况下，每个设备都有一个描述符。一些时候一个设备会有1个以上的描述符，并且你可以选择你想要的一个，但是这种情况并不多见，所以我们忽略它。一个很好的方法来获取描述符，不需要编写任何软件，你只需要在linux系统的电脑上运行 lsusb-vv。我们并没有发现同样的软件在Windows或Mac上。所以找一台朋友的Linux电脑。（Try the "USB Prober" tool from Apple for Mac OS X.）&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;这里是马达输出的&lt;strong&gt;lsusb&lt;/strong&gt;信息。&lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="font-size: 12px;"&gt;Device Descriptor:&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;  bLength                &lt;span style="color: #800080;"&gt;18&lt;/span&gt;&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;  bDescriptorType         &lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;  bcdUSB               &lt;span style="color: #800080;"&gt;2.00&lt;/span&gt;&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;  bDeviceClass            &lt;span style="color: #800080;"&gt;0&lt;/span&gt; (Defined at Interface level)&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;  bDeviceSubClass         &lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;  bDeviceProtocol         &lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;  bMaxPacketSize0        &lt;span style="color: #800080;"&gt;64&lt;/span&gt;&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;  idVendor           &lt;span style="color: #800080;"&gt;0x045e&lt;/span&gt; Microsoft Corp.&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;  idProduct          &lt;span style="color: #800080;"&gt;0x02b0&lt;/span&gt;&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;  bcdDevice            &lt;span style="color: #800080;"&gt;1.05&lt;/span&gt;&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;  iManufacturer           &lt;span style="color: #800080;"&gt;1&lt;/span&gt; Microsoft&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;  iProduct                &lt;span style="color: #800080;"&gt;2&lt;/span&gt; Xbox NUI Motor&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;  iSerial                 &lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;  bNumConfigurations      &lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;  Configuration Descriptor:&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;    bLength                 &lt;span style="color: #800080;"&gt;9&lt;/span&gt;&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;    bDescriptorType         &lt;span style="color: #800080;"&gt;2&lt;/span&gt;&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;    wTotalLength           &lt;span style="color: #800080;"&gt;18&lt;/span&gt;&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;    bNumInterfaces          &lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;    bConfigurationValue     &lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;    iConfiguration          &lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;    bmAttributes         &lt;span style="color: #800080;"&gt;0xc0&lt;/span&gt;&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;      Self Powered&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;    MaxPower              100mA&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;    Interface Descriptor:&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;      bLength                 &lt;span style="color: #800080;"&gt;9&lt;/span&gt;&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;      bDescriptorType         &lt;span style="color: #800080;"&gt;4&lt;/span&gt;&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;      bInterfaceNumber        &lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;      bAlternateSetting       &lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;      bNumEndpoints           &lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;      bInterfaceClass       &lt;span style="color: #800080;"&gt;255&lt;/span&gt; Vendor Specific Class&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;      bInterfaceSubClass      &lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;      bInterfaceProtocol      &lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;      iInterface              &lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;Device Status:     &lt;span style="color: #800080;"&gt;0x0000&lt;/span&gt;&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;  (Bus Powered)&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;让我们看看我们得到了什么。你可以在上部看到VID和PID。接下来，我们会看到&lt;strong&gt;bNumConfigurations&lt;/strong&gt;(how many different desciptors we have)，且它的数值1。Next, look at the Interface Descriptor in particular，&lt;strong&gt;bNumEndpoints&lt;/strong&gt;的值为0，这意味着马达没有端点（Endpoint）。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;Endpoint are a type of USB 'data pipe' - 这里有四种类型。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;&lt;strong&gt;Bulk Endpoints&lt;/strong&gt; are for transferring a lot of data, like a disk drive. It's OK if it takes a little longer but we want big packets. This endpoint goes only in one direction (so to read and write you'd want two)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;&lt;strong&gt;Interrupt Endpoints&lt;/strong&gt; are for transferring tiny amounts of data very quickly, like for a USB mouse. In this case, the device has to be responsive so we want fast movement. This endpoint goes only in one direction&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;&lt;strong&gt;Isochronous Endpoints（同步端点）&lt;/strong&gt; are for transferring a fair amount of data where the data must show up at the same time and if it can't it should just be dropped. This is for stuff like Audio and Video where timing is key. This endpoint goes only in one direction (so bidirectional audio for headphone and mic would have two EPs)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;&lt;strong&gt;Control Endpoints（控制端点） &lt;/strong&gt;are this weird not-quite-an-Endpoint Endpoint. They are used to transfer small amounts of data to say turn a device on or off. They're very 'cheap' to develop, and every device has one even if its not mentioned.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;举例，一个串行端口有2个Interrupt endpoints来传出数据和传入数据，然后一个control endpoint来设置传输速率。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;For more details we really do suggest reading everything at lvr.com about USB as it's complex.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;马达设备没有Endpoints，但是这并不意味着你不能与它进行通信。这只是表示它只使用一个双向的Control Endpoint。这并不意外，马达是很慢的且不需要大量的数据来控制。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;对比下 视频/摄像头 设备：&lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="font-size: 12px;"&gt;Device Descriptor:&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;  bLength                &lt;span style="color: #800080;"&gt;18&lt;/span&gt;&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;  bDescriptorType         &lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;  bcdUSB               &lt;span style="color: #800080;"&gt;2.00&lt;/span&gt;&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;  bDeviceClass            &lt;span style="color: #800080;"&gt;0&lt;/span&gt; (Defined at Interface level)&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;  bDeviceSubClass         &lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;  bDeviceProtocol         &lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;  bMaxPacketSize0        &lt;span style="color: #800080;"&gt;64&lt;/span&gt;&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;  idVendor           &lt;span style="color: #800080;"&gt;0x045e&lt;/span&gt; Microsoft Corp.&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;  idProduct          &lt;span style="color: #800080;"&gt;0x02ae&lt;/span&gt;&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;  bcdDevice            &lt;span style="color: #800080;"&gt;1&lt;/span&gt;.0b&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;  iManufacturer           &lt;span style="color: #800080;"&gt;2&lt;/span&gt; Microsoft&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;  iProduct                &lt;span style="color: #800080;"&gt;1&lt;/span&gt; Xbox NUI Camera&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;  iSerial                 &lt;span style="color: #800080;"&gt;3&lt;/span&gt; A00366A08793039A&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;  bNumConfigurations      &lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;  Configuration Descriptor:&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;    bLength                 &lt;span style="color: #800080;"&gt;9&lt;/span&gt;&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;    bDescriptorType         &lt;span style="color: #800080;"&gt;2&lt;/span&gt;&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;    wTotalLength           &lt;span style="color: #800080;"&gt;32&lt;/span&gt;&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;    bNumInterfaces          &lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;    bConfigurationValue     &lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;    iConfiguration          &lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;    bmAttributes         &lt;span style="color: #800080;"&gt;0xc0&lt;/span&gt;&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;      Self Powered&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;    MaxPower               16mA&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;    Interface Descriptor:&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;      bLength                 &lt;span style="color: #800080;"&gt;9&lt;/span&gt;&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;      bDescriptorType         &lt;span style="color: #800080;"&gt;4&lt;/span&gt;&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;      bInterfaceNumber        &lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;      bAlternateSetting       &lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;      bNumEndpoints           &lt;span style="color: #800080;"&gt;2&lt;/span&gt;&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;      bInterfaceClass       &lt;span style="color: #800080;"&gt;255&lt;/span&gt; Vendor Specific Class&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;      bInterfaceSubClass    &lt;span style="color: #800080;"&gt;255&lt;/span&gt; Vendor Specific Subclass&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;      bInterfaceProtocol    &lt;span style="color: #800080;"&gt;255&lt;/span&gt; Vendor Specific Protocol&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;      iInterface              &lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;      Endpoint Descriptor:&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;        bLength                 &lt;span style="color: #800080;"&gt;7&lt;/span&gt;&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;        bDescriptorType         &lt;span style="color: #800080;"&gt;5&lt;/span&gt;&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;        bEndpointAddress     &lt;span style="color: #800080;"&gt;0x81&lt;/span&gt;  EP &lt;span style="color: #800080;"&gt;1&lt;/span&gt; IN&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;        bmAttributes            &lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;          Transfer Type            Isochronous&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;          Synch Type               None&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;          Usage Type               Data&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;        wMaxPacketSize     &lt;span style="color: #800080;"&gt;0x0bc0&lt;/span&gt;  2x &lt;span style="color: #800080;"&gt;960&lt;/span&gt; bytes&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;        bInterval               &lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;      Endpoint Descriptor:&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;        bLength                 &lt;span style="color: #800080;"&gt;7&lt;/span&gt;&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;        bDescriptorType         &lt;span style="color: #800080;"&gt;5&lt;/span&gt;&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;        bEndpointAddress     &lt;span style="color: #800080;"&gt;0x82&lt;/span&gt;  EP &lt;span style="color: #800080;"&gt;2&lt;/span&gt; IN&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;        bmAttributes            &lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;          Transfer Type            Isochronous&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;          Synch Type               None&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;          Usage Type               Data&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;        wMaxPacketSize     &lt;span style="color: #800080;"&gt;0x0bc0&lt;/span&gt;  2x &lt;span style="color: #800080;"&gt;960&lt;/span&gt; bytes&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;        bInterval               &lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;Device Qualifier (&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt; other device speed):&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;  bLength                &lt;span style="color: #800080;"&gt;10&lt;/span&gt;&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;  bDescriptorType         &lt;span style="color: #800080;"&gt;6&lt;/span&gt;&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;  bcdUSB               &lt;span style="color: #800080;"&gt;2.00&lt;/span&gt;&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;  bDeviceClass            &lt;span style="color: #800080;"&gt;0&lt;/span&gt; (Defined at Interface level)&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;  bDeviceSubClass         &lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;  bDeviceProtocol         &lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;  bMaxPacketSize0        &lt;span style="color: #800080;"&gt;64&lt;/span&gt;&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;  bNumConfigurations      &lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;Device Status:     &lt;span style="color: #800080;"&gt;0x0001&lt;/span&gt;&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;  Self Powered&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;该设备拥有2个Isochronous Endpoints，它们都是IN类型（data going IN to the Computer）.This makes sense:Kinect有一个IR深度摄像头和一个普通的VGA摄像头。俩个摄像头对应俩个端点。当然，这里没有提到一个Control endpoint，这个Control endpoint 被用于设置光圈（aperture），伽马校正，任何内置过滤器，等等。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #800000; font-size: 12px;"&gt;&lt;strong&gt;4. Driver-maker&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;&amp;nbsp;好了，现在回到我们的马达上。我们准备开始发送数据来通过Control endpoint。对于Mac和Linux类型的电脑，驱动不需要发送或接收数据直接通过USB。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;对于Windows电脑，这里必须有某种驱动程序来为我们抢占硬件设备。通常，驱动程序是非常复杂的，就像一个插入操作系统的接口。 Like the cameras would show up as a camera device, the microphones as an audio device. 我们还没有准备一个详细的驱动程序，我们将要做的是一个&amp;ldquo;壳驱动（shell driver）&amp;rdquo;，这个壳驱动没有操作系统的能力，但可以让我们从软件发送一些命令给硬件。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;再次提醒, Mac/Linux people have this built into the &lt;acronym title="Operating System"&gt;OS&lt;/acronym&gt; kernel so skip this part if you don't use windows.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;至于我们壳驱动，我们使用一个USB库 &lt;strong&gt;libusb，&lt;/strong&gt;这是用于Windows系统的,&amp;nbsp; &lt;strong&gt;&lt;a class="urlextern" title="http://sourceforge.net/projects/libusb-win32/" href="http://sourceforge.net/projects/libusb-win32/" rel="nofollow"&gt;libusb-win32&lt;/a&gt; &lt;/strong&gt;go there and download it.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;我们运行&lt;strong&gt;inf-wizard&lt;/strong&gt; (这个会制作我们自己的壳驱动)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/106434/2011092809110863.gif" alt="" /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;最重要的部分是输入匹配的VID和PID，我们前面所发现的部分。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/106434/2011092809113544.gif" alt="" /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/106434/2011092809122888.gif" alt="" /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;现在，当你插入Kinect的时候，it will attach itself the the LibUSB-win32 device driver。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/106434/2011092809124754.gif" alt="" /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;We didn't make matching drivers for the audio or camera so those are still driver-less.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #800000; font-size: 12px;"&gt;&lt;strong&gt;5. Installing Python &amp;amp; PyUSB&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;现在我们需要开始发送命令到USB设备。我们所知道的最快最容易的方法是使用LibUSB库并结合一个脚本语言，如：Python。There are LibUSB bindings for C and C++ and Per。但我碰巧更喜欢Python。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;&lt;a class="urlextern" title="http://www.python.org/download/" href="http://www.python.org/download/" rel="nofollow"&gt;If you don't have python installed, do that now.&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;接下来， &lt;a class="urlextern" title="http://sourceforge.net/projects/pyusb/" href="http://sourceforge.net/projects/pyusb/" rel="nofollow"&gt;install PyUSB&lt;/a&gt;&amp;nbsp;by downloading it and running &lt;strong&gt;python setup.py install&lt;/strong&gt; in the expanded directory。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/106434/2011092809132552.gif" alt="" /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #800000; font-size: 12px;"&gt;&lt;strong&gt;6. Attaching to the device&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;让我们开启第一个简单的例子，这段程序将会把自己附加到有问号标志的设备上。&lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="font-size: 12px;"&gt;import usb.core&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;import usb.util&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;import sys&lt;br/&gt;&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span style="font-size: 12px;"&gt;# find our device&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;dev = usb.core.find(idVendor=&lt;span style="color: #800080;"&gt;0x045e&lt;/span&gt;, idProduct=&lt;span style="color: #800080;"&gt;0x02B0&lt;/span&gt;)&lt;br/&gt;&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span style="font-size: 12px;"&gt;# was it found?&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; dev &lt;span style="color: #0000ff;"&gt;is&lt;/span&gt; None:&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;    raise ValueError(&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;Device not found&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;)&lt;br/&gt;&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span style="font-size: 12px;"&gt;# &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt; the active configuration. With no arguments, the first&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;# configuration will be the active one&lt;br/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;dev.set_configuration()&lt;br/&gt;&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span style="font-size: 12px;"&gt;print &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;all done&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;注意，我们寻找我们之前所发现的VID/PID设备。我们不发送任何数据。当Kinect没有加入电脑时你会得到一个错误信息。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/106434/2011092809141330.gif" alt="" /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;如果Kinect已经插入，那么这里不会错误。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/106434/2011092809142540.gif" alt="" /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #800000; font-size: 12px;"&gt;&lt;strong&gt;7. What message to send?&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;&lt;strong&gt;&amp;nbsp;（续）&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/TravelingLight/aggbug/2513256.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/TravelingLight/archive/2012/05/22/2513256.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/TravelingLight/archive/2012/05/22/2512799.html</id><title type="text">体感技术：提前感受未来 LEAP让你使用体感手势控制Mac</title><summary type="text">2012-05-22 原文：http://info.china.alibaba.com/news/detail/v0-d1026922360.htmlKinect刚问世的那会，我们都觉得这货已经很好很强大，简直是科幻电影里出来的东西。但长江后浪推前浪，始终会有人做出更强力的东东来。Leap Motion已经放出了自家3D体感设备Leap的操作视频，宣称可以感应精确度可以达到0.01毫米——比Kinect要灵敏100倍。和Kinect不同，Leap的感应范围限定在一个4立方英尺（约112立方分米）的正方体中，所以要探测到你全身的动作大概有点困难，但是如果只是双手的话就应该没有什么问题。Leap使</summary><published>2012-05-22T01:57:00Z</published><updated>2012-05-22T01:57:00Z</updated><author><name>何文西</name><uri>http://www.cnblogs.com/TravelingLight/</uri></author><link rel="alternate" href="http://www.cnblogs.com/TravelingLight/archive/2012/05/22/2512799.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/TravelingLight/archive/2012/05/22/2512799.html"/><content type="html">&lt;p&gt;&lt;span style="font-size: 12px;"&gt;2012-05-22 原文：&lt;a href="http://info.china.alibaba.com/news/detail/v0-d1026922360.html"&gt;http://info.china.alibaba.com/news/detail/v0-d1026922360.html&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;Kinect刚问世的那会，我们都觉得这货已经很好很强大，简直是科幻电影里出来的东西。但长江后浪推前浪，始终会有人做出更强力的东东来。Leap Motion已经放出了自家3D体感设备Leap的操作视频，宣称可以感应精确度可以达到0.01毫米&amp;mdash;&amp;mdash;比Kinect要灵敏100倍。&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/106434/2012052209595831.jpg" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;和Kinect不同，Leap的感应范围限定在一个4立方英尺（约112立方分米）的正方体中，所以要探测到你全身的动作大概有点困难，但是如果只是双手的话就应该没有什么问题。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;Leap使用USB与电脑相连，配合传感器以及摄像头，当然还有公司自家的软件，可以追踪到多个目标以及辨认手势。在视频中，这款体感设备表现得相当灵敏以及科幻，简直可以将普通的屏幕当成触摸屏来用。Leap Motion正在开发相应的SDK，而且也正寻求Leap开发者。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/106434/2012052210002289.jpg" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;Leap系统的售价是令人惊讶的70美元，要知道就算是Kinect单买也需要从你的钱包里掏走150美元。Leap可以兼容Windows以及Mac OS X平台，并且现在在美国已经可以预定，有兴趣的朋友可以考虑一下。&lt;br /&gt;&lt;br /&gt;&lt;object width="640" height="480" data="http://player.youku.com/player.php/sid/XNDAwMjk3NTky/v.swf" type="application/x-shockwave-flash"&gt;&lt;param name="src" value="http://player.youku.com/player.php/sid/XNDAwMjk3NTky/v.swf" /&gt;&lt;/object&gt;&lt;/span&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/TravelingLight/aggbug/2512799.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/TravelingLight/archive/2012/05/22/2512799.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/TravelingLight/archive/2012/05/20/2510942.html</id><title type="text">体感技术：Kinect Accelerator 孵化项目创意一览（链接）</title><summary type="text">2012-05-18http://tech.huanqiu.com/business/2012-05/2734597.html</summary><published>2012-05-20T14:38:00Z</published><updated>2012-05-20T14:38:00Z</updated><author><name>何文西</name><uri>http://www.cnblogs.com/TravelingLight/</uri></author><link rel="alternate" href="http://www.cnblogs.com/TravelingLight/archive/2012/05/20/2510942.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/TravelingLight/archive/2012/05/20/2510942.html"/><content type="html">&lt;p&gt;2012-05-18&amp;nbsp;&lt;a href="http://tech.huanqiu.com/business/2012-05/2734597.html"&gt;http://tech.huanqiu.com/business/2012-05/2734597.html&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/TravelingLight/aggbug/2510942.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/TravelingLight/archive/2012/05/20/2510942.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/TravelingLight/archive/2012/05/16/2503408.html</id><title type="text">KinectSDK：Kinect應用程式開發入門（链接）</title><summary type="text">http://msdn.microsoft.com/zh-tw/hh367958.aspx</summary><published>2012-05-16T01:20:00Z</published><updated>2012-05-16T01:20:00Z</updated><author><name>何文西</name><uri>http://www.cnblogs.com/TravelingLight/</uri></author><link rel="alternate" href="http://www.cnblogs.com/TravelingLight/archive/2012/05/16/2503408.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/TravelingLight/archive/2012/05/16/2503408.html"/><content type="html">&lt;p&gt;&lt;a href="http://msdn.microsoft.com/zh-tw/hh367958.aspx"&gt;http://msdn.microsoft.com/zh-tw/hh367958.aspx&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/TravelingLight/aggbug/2503408.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/TravelingLight/archive/2012/05/16/2503408.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/TravelingLight/archive/2012/05/14/2499618.html</id><title type="text">体感技术：Point Cloud Library</title><summary type="text">今天大概看了一下一个开源的点云库。The Point Cloud Library (PCL) is a standalone, large scale, open project for 3D point cloud processing.下载地址：http://pointclouds.org/downloads/windows.html在安装之前，首先要安装第三方依赖库。如下：1. boostBoost库是为C++语言标准库提供扩展的一些C++程序库的总称。2. EigenEigen 是一个线性算术的C++模板库，包括：vectors, matrices, 以及相关算法。功能强大、快速、优雅</summary><published>2012-05-14T08:52:00Z</published><updated>2012-05-14T08:52:00Z</updated><author><name>何文西</name><uri>http://www.cnblogs.com/TravelingLight/</uri></author><link rel="alternate" href="http://www.cnblogs.com/TravelingLight/archive/2012/05/14/2499618.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/TravelingLight/archive/2012/05/14/2499618.html"/><content type="html">&lt;p&gt;今天大概看了一下一个开源的点云库。The Point Cloud Library (&lt;strong&gt;PCL&lt;/strong&gt;) is a &lt;strong&gt;standalone&lt;/strong&gt;, large scale, &lt;strong&gt;open project&lt;/strong&gt; for 3D point cloud processing.&lt;br /&gt;&lt;br /&gt;下载地址：&lt;a href="http://pointclouds.org/downloads/windows.html"&gt;http://pointclouds.org/downloads/windows.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;在安装之前，首先要安装第三方依赖库。如下：&lt;br /&gt;&lt;strong&gt;1. boost&lt;br /&gt;&lt;/strong&gt;Boost库是为C++语言标准库提供扩展的一些C++程序库的总称。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;2. Eigen&lt;/strong&gt;&lt;br /&gt;Eigen 是一个线性算术的C++模板库，包括：vectors, matrices, 以及相关算法。功能强大、快速、优雅以及支持多平台。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;3. FLANN&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;4. VTK&lt;/strong&gt;&lt;br /&gt;视觉化工具函式库（VTK，Visualization Toolkit）是一个开放源码，跨平台、支持并行处理的图形应用函式库。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;5. Qt&lt;/strong&gt;&lt;br /&gt;Qt是一个1991年由奇趣科技开发的跨平台C++图形用户界面应用程序开发框架。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;6. QHull&lt;/strong&gt;&lt;br /&gt;QHull是一个开源的程序软件，用来研究解决凸包问题，生成凸包形体。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;7. OpenNI&lt;/strong&gt;&lt;br /&gt;OpenNI(开放自然交互)是一个多语言，跨平台的框架，它定义了编写应用程序，并利用其自然交互的API。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/TravelingLight/aggbug/2499618.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/TravelingLight/archive/2012/05/14/2499618.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/TravelingLight/archive/2012/05/14/2499225.html</id><title type="text">体感技术：揭开体感技术的面纱，软、硬件联手缔新献（二）</title><summary type="text">其实华硕的WAVI Xtion跟微软的体感游戏机Kinect系出同源，芯片合作商都是Prime Sense。不过，WAVI Xtion是以PC为平台，且PC每年上亿台的市场规模，加上软件开发商也都在PC上开发程序，且具备升级容易等优点，因此基于PC做为体感应用平台将会是明佳策略。同时简孝坚也表示，尽管跟Kinect有竞争关系，但双方应先把市场做大，并格外看好大陆体感市场机会，加上Xbox无法在大陆销售，故华硕会先聚焦大陆。华硕预定在10月份推出体感遥控套件，今(2011)年底前预定出货10万台。运算核心与产业标准除了开发机制与联盟合作外，体感创新的核心技术也是令人关注的议题，因此本次研讨会也邀</summary><published>2012-05-14T04:57:00Z</published><updated>2012-05-14T04:57:00Z</updated><author><name>何文西</name><uri>http://www.cnblogs.com/TravelingLight/</uri></author><link rel="alternate" href="http://www.cnblogs.com/TravelingLight/archive/2012/05/14/2499225.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/TravelingLight/archive/2012/05/14/2499225.html"/><content type="html">&lt;div style="overflow: hidden; color: #000000; background-color: #ffffff; text-align: left; text-decoration: none;"&gt;&lt;span style="font-size: 12px;"&gt;其实华硕的WAVI Xtion跟微软的体感游戏机Kinect系出同源，芯片合作商都是Prime Sense。不过，WAVI Xtion是以PC为平台，且PC每年上亿台的市场规模，加上软件开发商也都在PC上开发程序，且具备升级容易等优点，因此基于PC做为体感应用平台将会是明佳策略。同时简孝坚也表示，尽管跟Kinect有竞争关系，但双方应先把市场做大，并格外看好大陆体感市场机会，加上Xbox无法在大陆销售，故华硕会先聚焦大陆。华硕预定在10月份推出体感遥控套件，今(2011)年底前预定出货10万台。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;&lt;img src="http://gb-www.digitimes.com.tw/tw/x/img/x.gif" alt="" /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;&lt;strong&gt;运算核心与产业标准&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;除了开发机制与联盟合作外，体感创新的核心技术也是令人关注的议题，因此本次研讨会也邀请到在3D感测领域拥有深厚背景的PrimeSence与会。PrimeSence业务总监尤纪凯提到：「所谓3D感测技术，即是利用光学设备撷取环境讯息，将其组合成3D模型的技术。」&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;当然，一并也赋予了机器准确的视觉能力，并具备学习使用者的设计，颠覆了现有科技产品需要由使用者去学习的使用模式。同样是摄像装置，对于一般图片所获得的是RGB三原色的讯息。当搭载3D感测技术后，则能够取得影像的深度(Depth map)信息。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;PrimeSence亦提供了完整的3D感测解决方案，除了名为NiTE的Middleware外，在硬件上涵盖了PS1080感测芯片，以及感测装置的参考设计(Reference Design)等元素。基本上，3D感测的技术架构Host端可分为驱动程序、Middleware及应用程序(Application)等部分。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;当Xtion PRO等装置撷取环境影像后，转换成深度信息，并传递到Host端由驱动程序接收并解读出来，但对软件开发而言，却无法了解这些复杂讯息所代表的意义，所以需要Middleware去分析，将有效的内容提供给应用程序使用。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;举例来说，透过Middleware将撷取到的背景、人体轮廓等多余影像去除，从中组合成所需的人体关节的节点资料。对游戏程序而言，人体关节的节点资料即可接到虚拟3D人物上。另一方面，应用程序不见得要位于Server内，亦可透过云端技术放在网络上与Middleware连结。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;不过Server端集成应用程序的作法，并不符合前述提到的Open Platform 2.0概念。因此，PrimeSence与ASUS等多个合作伙伴，共同成立了OpenNI规范，为软件开发提供了标准化的API工具，成为普及化的幕后推手。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;OpenNI最大的特色在于完全免费，不论任何技术层面均可参与，并将Compliant Hardware、Middleware及NI(Natural Interaction)Apps三方资源有效集成。若再融入之前提到的3D感测架构中，除了硬件端与Firmware完全结合外，应用程序还可藉由OpenNI存取Middleware、感测装置内部的功能，甚至是具备脸部辨识等独特设计的Middleware，搭载至系统自然也不成问题。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;对应用程序开发而言，在符合OpenNI的前提下，不需重新撰写软件，只要稍做修改即可轻松导入各种平台与Middleware。观察OpenNI的推广效益，目前具有超过2,000位的注册会员，以及10万个以上的SDK下载，同时已有上百个应用程序是采用OpenNI所开发，并以每天10个以上的速度成长，可见OpenNI的潜力无穷。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;为了激荡出创意分享的火花，OpenNI还成立了Arena机制，提供开发者一个上传成果的舞台，同时30%的Apps会公布原始码(Source code)下载。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;而OpenNI Arena的立意在于作为开发者间沟通的桥梁，进而将开发者社群与Publisher、Manufacturer、Application Store及Enthusiastic Consumer串连起来，以期达到观察创意趋势、发掘人才、加强开发者互动、将NI(Natural Interface)延伸到新领域等愿景。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;事实上，当3D摄像装置将体感影像撷取进来后，还需经过Depth Map、Middleware等一连串复杂的资料转换，这时也考验著CPU的运算能力。因此本次也邀请到业界知名的嵌入式处理器(Embedded Processor)厂商─德州仪器，为各位解说DSP(Digital Signal Processor)在体感创新硬件上所扮演的角色。德州仪器的应用协理郑曜廷提到：「由于目前Xtion的开发套件是用于PC上，故可直接使用PC的处理器计算运行。不过，开发者也可采用嵌入式的处理芯片，来减少资料传输占据带宽的问题，同时增加计算的效率。」&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;为此联盟与德州仪器合作，让开发者可在传感器上直接置入芯片，让图片资料的计算在前端就处理完毕，如此便可减少计算的时间，且传输通道也可用来传送更重要的信息或指令。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;经过实际测试，德州仪器DSP与FPGA、PC的比较结果，在SobelEdge Detector、Bayer Filter Demosacing及Gaussian Pyramid等测试项目上，均有显著突出的数据。即便PC的成绩在Bayer Filter Demosacing上较为出色，但却是配备了双核、2GHz以上的处理器，以及2GB的存储器才有如此的表现。不仅如此，德州仪器的DSP本身也采用了硬件加速器的设计，以提升在3D Point Cloud、k-means方面的运算表现。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;另外，德州仪器DSP几项的3D影像处理技术上，甚至超越PC的运算速度，且拥有小巧低耗电的嵌入式设计优势。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;针对体感需求的差异，德州仪器开发了多款DSP因应不同的市场定位，例如DM36xx系列，即是用来搭配手部体感的产品；而DM3730则是作为全身性的体感技术的运算核心，具备15个节点的侦测能力。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;为增进DSP平台上软件的开发，并充分发挥在运算效能上的优势，德州仪器还提供了Vision Software Libraries的服务。其中包括OpenCV、vLib、IMGLib及3DVLib等部分，除内容广泛外，还可开放原始码，并透过Ti E2E论坛来相互交流，以期软件能针对DSP最佳化，并与DSP缜密结合发挥最大效益。&lt;br /&gt;&lt;br /&gt;原文：&lt;a href="http://gb-www.digitimes.com.tw/tw/dt/n/shwnws.asp?CnlID=&amp;amp;id=251399&amp;amp;ct=1&amp;amp;OneNewsPage=1&amp;amp;query=&amp;amp;PAGE=1"&gt;http://gb-www.digitimes.com.tw/tw/dt/n/shwnws.asp?CnlID=&amp;amp;id=251399&amp;amp;ct=1&amp;amp;OneNewsPage=1&amp;amp;query=&amp;amp;PAGE=1&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="overflow: hidden; color: #000000; background-color: #ffffff; text-align: left; text-decoration: none;"&gt;&amp;nbsp;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/TravelingLight/aggbug/2499225.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/TravelingLight/archive/2012/05/14/2499225.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/TravelingLight/archive/2012/05/14/2499224.html</id><title type="text">体感技术：揭开体感技术的面纱，软、硬件联手缔新献（一）</title><summary type="text">对于高价值产业的发展趋势，工研院服科中心技术长吴宗和博士指出：「应朝向服务科技化、制造服务化两个方向进行，且两者相辅相成。」所谓制造服务化，即是将硬件设备结合加值服务来提升产品价值，例如Apple的App Store的成功经验，造就了iPhone不仅只是一支手机而已，背后的数码内容服务才是关键所在。有监于此，制造服务化也成为体感系统的设计策略，象是扩增实境(Augmented Reality)之类的互动体感(Interactive motion sensing)即具有相当地潜在价值，透过介于虚拟世界(如：游戏内容)与真实世界相结合的连结与互动，打造出创新的服务与应用。然而，互动体感应用前提在于</summary><published>2012-05-14T04:56:00Z</published><updated>2012-05-14T04:56:00Z</updated><author><name>何文西</name><uri>http://www.cnblogs.com/TravelingLight/</uri></author><link rel="alternate" href="http://www.cnblogs.com/TravelingLight/archive/2012/05/14/2499224.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/TravelingLight/archive/2012/05/14/2499224.html"/><content type="html">&lt;div style="overflow: hidden; color: #000000; background-color: #ffffff; text-align: left; text-decoration: none;"&gt;&lt;span style="font-size: 12px;"&gt;对于高价值产业的发展趋势，工研院服科中心技术长吴宗和博士指出：「应朝向服务科技化、制造服务化两个方向进行，且两者相辅相成。」所谓制造服务化，即是将硬件设备结合加值服务来提升产品价值，例如Apple的App Store的成功经验，造就了iPhone不仅只是一支手机而已，背后的数码内容服务才是关键所在。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;有监于此，制造服务化也成为体感系统的设计策略，象是扩增实境(Augmented Reality)之类的互动体感(Interactive motion sensing)即具有相当地潜在价值，透过介于虚拟世界(如：游戏内容)与真实世界相结合的连结与互动，打造出创新的服务与应用。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;然而，互动体感应用前提在于具备Smart endpoints with 3D display、Motion sensing、Virtual reality及feedback mechanism等装置，其次则是服务的适切性(Service usability)，特别是使用者接口(User Interface)，这将影响到客户使用感受与忠诚度。经由Xtion Store体感创新应用开放平台的机制，可将内容产业(Content provider)、软件开发(Software developer)及系统开发(System provider)等各方资源集成，让体感创新应用于运动、医疗复健、游戏、教育及电子商务等产业。至于工研院在体感创新应用联盟中所扮演的角色，则是推动规格标准化，制定平台中的有关系统、接口等条件的统一规范，让体感创新的开发获得全球化应用。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;华硕计算机多媒体事业处总经理简孝坚致词时提到：「华硕投入体感产业的原因，不外乎是周遭生活上的需求。」例如：家中小孩活拨好动，在体感技术的帮助下，将可吸引小孩的注意力，使其专注在学习上，也省下父母陪伴的时间；一般在网络上购买的衣服，时常发现样式不适合或造型不搭配，此时若能先行虚拟试衣，势必能减少这类情形发生;当家中的长辈需要肢体复健时，如果能在家中进行，将可避免往返医院的麻烦，以上这些都是体感技术的应用层面，进而让生活更美好。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;华硕不仅拥有Xtion PRO、Xtion PRO LIVE的开发成果，在Xtion Store体感创新应用开放平台(Open Platform 2.0)的推动上也不遗余力。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;简孝坚于说明时指出：「透过此平台提供更容易分享的的体感开发接口与套件，同时集成软、硬件，以及数码内容与专业的厂商或团体，共同开发体感的创新应用，加速并带动体感的产业的发展，提供消费者更精彩而愉快的便利生活。」&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;不仅如此，简孝坚同时也提到Open Platform 2.0的特色在于开放性、便利性、普及性、国际化、发展性及多元化等6大特点。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;由于开放性的特质，使得软件的撰写更为容易；而便利性与国际化，则是因为Xtion Store是建构于网络上，信息的交换省时且方便，同时有利于华硕全球品牌与通路的推广;而发展出来的体感装置，将搭配PC使用，毕竟PC拥有普及性的特质，运算效能与应用提升的支持度亦是最佳，且没有国家限制(如：大陆不能销售游戏机)，避免销售上的障碍，这就是发展性与普及性的优势所在。此外，Xtion Store可一并用于B2B、B2C方面，拥有多元化销售的优点。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;Xtion Store所具备的B2C销售功能，将藉由交互式使用者接口(Interactive UI)，让使用者可以轻松浏览下载最新的游戏或应用程序，未来将再集成更多元的体感创新数码内容象是商业应用、游戏运动、教育学习及复健医疗等产业应用，且Xtion Store预计2011年11月上线，使得体感创新迈进一大步。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;基于在体感创新联盟中的B2B定位，Xtion Store具备了Management、Resource及Library等架构，作为获得联盟集成Application Developer、Content Provider等而来的App的平台。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;至于华硕在Open Platform 2.0上所扮演的角色，则是透过Xtion PRO、Xtion PRO LIVE套件，协助软件人员透过SDK(Software Development Kit)开发出PC上的应用。接下来将扩展至机上盒(STB)市场，以因应未来Smart TV的风潮，并创造出更大的效益。此外，华硕本身所要发展的方向为WAVI Xtion，利用WAVI系统将房间内的PC影像、声音经由无线传输到客厅电视上，并透过Xtion侦测以手势直接控制PC，用来浏览照片、控制影片操作选单、上网、甚至是使用社群网站等互动操作，即是透过电视屏幕，以体感方式控制PC。当然，游戏机也是华硕在体感市场另一个着眼点，毕竟PC拥有最多的游戏支持，甚至还有网络上的Flash游戏，因此华硕期许所有的游戏都能够透过WAVI Xtion来进行。&lt;/span&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/TravelingLight/aggbug/2499224.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/TravelingLight/archive/2012/05/14/2499224.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/TravelingLight/archive/2012/03/28/2422383.html</id><title type="text">体感技术：小游戏也体感 支持Kinect体感XBLA游戏盘点</title><summary type="text">http://game.21cn.com/console/x360/news/2012/03/24/11264813.shtml</summary><published>2012-03-28T14:07:00Z</published><updated>2012-03-28T14:07:00Z</updated><author><name>何文西</name><uri>http://www.cnblogs.com/TravelingLight/</uri></author><link rel="alternate" href="http://www.cnblogs.com/TravelingLight/archive/2012/03/28/2422383.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/TravelingLight/archive/2012/03/28/2422383.html"/><content type="html">&lt;p&gt;&lt;a href="http://game.21cn.com/console/x360/news/2012/03/24/11264813.shtml"&gt;http://game.21cn.com/console/x360/news/2012/03/24/11264813.shtml&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/TravelingLight/aggbug/2422383.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/TravelingLight/archive/2012/03/28/2422383.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
