키넥트의 장치 ID 알아내기 (Kinect for Windows)


마이크로 소프트 키넥트 SDK 에서는 UniqueKinectId, DeviceConnectionId 를 제공한다. 

하지만  UniqueKinectId 는 거짓이다. 다중 키넥트 사용시 모두 같은 값을 반환 한다.


그렇다면 DeviceConnectionId 은 어떠한가? 

유니크 해 보이지만, USB 포트를 달리 하거나 허브, 리피터를 꼽을때마다 바뀐다. 

그래서 실제 장치의 시리얼을 뽑을 수가 없다. 사용할 컴퓨터 마다 달라지니 말이다.




하지만 각고의 노력끝에 아래와 같은 항목을 발견 하였다.


형제 라는 항목인데, 

영문 윈도우라면 정확히 어떤 속성 이름인지 알 수 있었겠지만, 일단 [형제ID] 로 지칭 하기로 하였다.

저 아이디는 컴퓨터가 바뀌어도 어떤 키넥트를 정확히 특정 지을 수 있는 ID 이다.



(Kinect for Xbox 360) 은 형제 아이디가 없어서 확인이 불확실하다.



현제 나에게는 4개의 Kinect가 있고 형제ID 는 다음과 같다.

또한 다른 컴퓨터에서도 확인 하였다. 모두 일치하는 값을 출력 하였다.






내컴퓨터 (win7 pro)

1번 Value: USB\VID_045E&PID_02C3\A22596W00092213A
2번 Value: USB\VID_045E&PID_02C3\A22597V01722314A
3번 Value: USB\VID_045E&PID_02C3\A22593W05102233A
4번 Value: USB\VID_045E&PID_02C3\A22596W02492224A



회사테스트 컴퓨터 (win7 pro)

1번 Value: USB\VID_045E&PID_02C3\A22596W00092213A
2번 Value: USB\VID_045E&PID_02C3\A22597V01722314A
3번 Value: USB\VID_045E&PID_02C3\A22593W05102233A
4번 Value: USB\VID_045E&PID_02C3\A22596W02492224A




**씨 컴퓨터 (win8,1 pro)

1번 Value: USB\VID_045E&PID_02C3\A22596W00092213A
2번 Value: USB\VID_045E&PID_02C3\A22597V01722314A
3번 Value: USB\VID_045E&PID_02C3\A22593W05102233A
4번 Value: USB\VID_045E&PID_02C3\A22596W02492224A


실장님 컴퓨터 (win8,1 pro)


1번 Value: USB\VID_045E&PID_02C3\A22596W00092213A
2번 Value: USB\VID_045E&PID_02C3\A22597V01722314A
3번 Value: USB\VID_045E&PID_02C3\A22593W05102233A
4번 Value: USB\VID_045E&PID_02C3\A22596W02492224A






그리고 ManagementObjectSearcher 를 이용하였고 (https://msdn.microsoft.com/en-us/library/aa389273(v=vs.85).aspx) 을 참고 하였다.
왠만하면 컴퓨터에 연결된 장치는 다 순회 할 수 있을듯 하다.


using Microsoft.Kinect;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Management;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Threading;

namespace USB_Detection
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();


            //속도 체크용
            int c = 0;
            DispatcherTimer timer = new DispatcherTimer();
            timer.Interval = TimeSpan.FromMilliseconds(1);
            timer.Tick += delegate {
                this.Title = c.ToString();
                ++c;
            };
            timer.Start();
        }



        /// <summary>
        /// 키넥트의 유일한  ID 를 설정 하기 위하여 "형제" 값을 불러 와야 한다.
        /// (장치관리자->Kinect Camera->자세히->형제)
        /// </summary>
        protected override void OnMouseDown(MouseButtonEventArgs e)
        {
            base.OnMouseDown(e);

            string prefix_id = "";



            //step1
            //키넥트의 DeviceConnectionId 를 불러와 아이디의 말머리를 설정한다 (USB\\VID_045E)
            foreach (var item in KinectSensor.KinectSensors)
            {
                string[] _raw = item.DeviceConnectionId.Split('&');
                prefix_id = _raw[0];
            }


            //step2
            //모든 PNP 장치 중에서 USB Composite Device 의 이름을 찾는다.
            var Win32_PnPEntity = "Win32_PnPEntity where Name like 'USB Composite Device'";
            var query = string.Format("select * from {0}", Win32_PnPEntity);
            


            using (var searcher = new ManagementObjectSearcher(query))
            {
                ManagementObjectCollection objectCollection = searcher.Get();
                ManagementBaseObject brotherKinectDev = null;

                Console.WriteLine(objectCollection.Count);
                foreach (ManagementBaseObject managementBaseObject in objectCollection)
                {
                    foreach (PropertyData propertyData in managementBaseObject.Properties)
                    {
                        //참고 : 모든 속성 가져 오기
                        //content.AppendLine(string.Format("Property:  {0}, Value: {1}", propertyData.Name, propertyData.Value));
                        if (propertyData.Name == "HardwareID")
                        {
                            foreach (var _item in (string[])propertyData.Value)
                            {

                                //그중에서 하드웨어 아이디의 값이 DeviceConnectionId 말머리가 포함된것을 찾는다.
                                if (_item.IndexOf(prefix_id) > -1)
                                {
                                    brotherKinectDev = managementBaseObject;
                                    break;
                                }
                            }
                        }
                    }
                }



                //step3
                //검색된 장치의 PNPDeviceID 를 가져온다
                if (brotherKinectDev != null)
                {
                    foreach (PropertyData propertyData in brotherKinectDev.Properties)
                    {
                        if (propertyData.Name == "PNPDeviceID")
                        {
                            tx.Text = string.Format("Value: {0}", propertyData.Value);
                        }
                    }
                }
            }

            Console.WriteLine("complete");
        }
    }
}


Yamecoder 야매코더_
C# 2015.02.05 17:00
Powerd by Tistory, designed by criuce
rss