키넥트의 장치 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

댓글을 달아 주세요

  1. 匿名 2015.02.11 14:03  수정/삭제  댓글쓰기

    메그永恒之塔服务端传奇服务端密传-服务端QQ西游私服务端天堂1私服务端

    千年服务端蜀门服务端征途服务端机战服务端神泣服务端醉西游服务端

    天堂I服务端挑战OL服务端剑侠情缘-服务端奇侠XIAH服务端挑战服务端


    传世开私服一条龙服务-

    传奇开私服一条龙开区服务-


    传奇广告代理-

    IDC服务器以及空间租用-

    魔兽世界sf开服一条龙服务-


    客服咨询QQ(企鹅扣扣)1285574370

    Email:1285574370@qq.com

    更多商业版本免费开放下载




    天恒科技1.95皓月终极12星座道士加强升级版



    天恒科技1.85荣耀必杀极限之地广寒宫泡点元素PK版



    天恒科技1.85无特戒无英雄轻中变魔神唯我独尊麻痹宝宝



    天恒科技独家1.85恶魔世界装备分身15转八钻靓装元素中变版다에

Powerd by Tistory, designed by criuce
rss