{"id":370405,"date":"2024-05-21T04:24:28","date_gmt":"2024-05-21T04:24:28","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=370405"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=370405","title":{"rendered":"<span>KatWalk C2: \u04472, \u043f\u043e\u0434\u0441\u043b\u0443\u0448\u0430\u0435\u043c, \u043f\u043e\u0434\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0438 \u0440\u0430\u0437\u043d\u044e\u0445\u0430\u0435\u043c \u0438\u043b\u0438 \u043a\u0430\u043a \u043e\u0431\u0449\u0430\u0442\u044c\u0441\u044f \u0441 \u043d\u0435\u0437\u043d\u0430\u043a\u043e\u043c\u044b\u043c \u0436\u0435\u043b\u0435\u0437\u043e\u043c \u043d\u0430 \u043d\u0435\u0437\u043d\u0430\u043a\u043e\u043c\u043e\u043c \u044f\u0437\u044b\u043a\u0435<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0412 <a href=\"https:\/\/habr.com\/ru\/articles\/798029\/\" rel=\"noopener noreferrer nofollow\"><strong>\u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435<\/strong><\/a> \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u043b \u0447\u0442\u043e \u044d\u0442\u043e \u0437\u0430 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430, \u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u043b \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0441 \u043d\u0435\u0451 \u0438 \u043a\u0430\u043a \u0432\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043a\u043e\u0434 \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435.<\/p>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0432\u0438\u0441\u044f\u0449\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f (\u043d\u0430 C#), \u0438 \u043d\u0430\u0434\u043e \u043f\u043e\u043d\u044f\u0442\u044c \u0447\u0442\u043e \u0436\u0435 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e \u043e\u043d\u043e \u0434\u0435\u043b\u0430\u0435\u0442.<\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u043c\u0441\u044f \u043a\u0430\u043a \u043e\u0431\u0449\u0430\u0442\u044c\u0441\u044f \u0441 \u0436\u0435\u043b\u0435\u0437\u043e\u043c \u0438 \u0438\u0437\u0431\u0430\u0432\u0438\u043c\u0441\u044f \u043e\u0442 \u0431\u0430\u043b\u043b\u0430\u0441\u0442\u0430!.. \u041f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0432 \u043d\u0430 Kotlin. \u041f\u043e\u0447\u0435\u043c\u0443 Kotlin? \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u044f \u043d\u0430 \u043d\u0435\u043c \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u0435\u0449\u0435 \u043d\u0435 \u043f\u0438\u0441\u0430\u043b.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/webt\/tw\/om\/ej\/twomejwyq8xazkrlbpz89ebvvba.jpeg\" alt=\"\u0434\u0430 \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e!\" title=\"\u0434\u0430 \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e!\" width=\"538\" height=\"314\" data-src=\"https:\/\/habrastorage.org\/webt\/tw\/om\/ej\/twomejwyq8xazkrlbpz89ebvvba.jpeg\" data-blurred=\"true\"\/><\/p>\n<div><figcaption>\u0434\u0430 \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e!<\/figcaption><\/div>\n<\/figure>\n<h2>\u0427\u0442\u043e \u0437\u0430 extraData<\/h2>\n<p>\u041d\u0430\u0447\u043d\u0451\u043c \u0441 \u043f\u0440\u043e\u043f\u0443\u0449\u0435\u043d\u043d\u043e\u0433\u043e \u0432 \u043f\u0440\u043e\u0448\u043b\u044b\u0439 \u0440\u0430\u0437: \u0447\u0442\u043e \u0436\u0435 \u0442\u0430\u043a\u043e\u0435 \u0437\u0430 \u043c\u0430\u0441\u0441\u0438\u0432 <code>extraData<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0442\u0434\u0430\u0451\u0442 SDK.<\/p>\n<p>\u041d\u0430\u043f\u043e\u043c\u043d\u044e, \u043a\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 SDK:<\/p>\n<pre><code class=\"cpp\">struct DeviceData {     bool    btnPressed;     bool    isBatteryCharging;     float   batteryLevel;     char    firmwareVersion; };  struct TreadMillData {     char         deviceName[64];     bool         connected;     double       lastUpdateTimePoint;     Quaternion   bodyRotationRaw;     Vector3      moveSpeed; };  struct KATTreadMillMemoryData {     TreadMillData treadMillData;     DeviceData    deviceDatas[3];     char          extraData[128]; };<\/code><\/pre>\n<p>\u0412 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u043a\u0432\u0430\u0440\u0442 \u0432\u0437\u0433\u043b\u044f\u0434\u0430 (\u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0439; <s>\u0437\u0430 \u0432\u044b\u0447\u0435\u0442\u043e\u043c \u043d\u0443\u043b\u0435\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432 \u043b\u044e\u0431\u043e\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0430\u0436\u0430\u0432 \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0443 \u043a\u0430\u043b\u0438\u0431\u0440\u043e\u0432\u043a\u0438 \u0432 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0435, \u0438\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0443 \u043d\u0430 \u0441\u0435\u043d\u0441\u043e\u0440\u0435 \u0437\u0430 \u0441\u043f\u0438\u043d\u043e\u0439, \u043b\u0438\u0431\u043e \u043d\u0430\u0436\u0430\u0432 \u0434\u0432\u0430 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0430 \u043d\u0430 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430\u0445 \u0441\u0440\u0430\u0437\u0443<\/s> \u043e\u0448\u0438\u0431\u0441\u044f \u0442\u0443\u0442 &#8212; \u043a\u0432\u0430\u0440\u0442 \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b\u0439, \u043d\u043e \u043d\u0443\u043b\u0435\u0432\u043e\u0439 \u0443\u0433\u043e\u043b \u043d\u0435 \u0432\u044b\u0447\u0442\u0435\u043d, \u0435\u0433\u043e \u0432\u044b\u0447\u0438\u0442\u0430\u0435\u0442 \u0433\u0435\u0439\u0442\u0432\u0435\u0439 \u0434\u043b\u044f \u0441\u0435\u0431\u044f \u0441\u0430\u043c); \u0432\u0435\u043a\u0442\u043e\u0440 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u0438 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e\u0431 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0441\u0442\u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u043f\u043b\u044e\u0441 \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445. \u041f\u043e\u043c\u0438\u043c\u043e \u044d\u0442\u043e\u0433\u043e \u0435\u0441\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u0441\u0435\u043d\u0441\u043e\u0440\u0430\u0445 &#8212; \u0437\u0430\u0440\u044f\u0434, \u0432\u0435\u0440\u0441\u0438\u044f \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0438 \u0438 \u043d\u0430\u0436\u0430\u0442\u0430 \u043b\u0438 \u0442\u0430\u043c \u043a\u043d\u043e\u043f\u043a\u0430. \u041a\u043e\u0440\u043e\u0447\u0435, \u043d\u0438\u0447\u0435\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0433\u043e.<\/p>\n<p>\u041d\u043e \u0435\u0441\u0442\u044c \u0435\u0449\u0435 <code>extraData<\/code>, \u043c\u0430\u0441\u0441\u0438\u0432, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0447\u0442\u043e-\u0442\u043e \u0435\u0441\u0442\u044c! \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0439\u043c\u0451\u043c, \u0447\u0442\u043e \u0442\u0430\u043c. \u0412 SDK \u0444\u0430\u0439\u043b\u0430\u0445 \u0441\u0445\u043e\u0434\u0443 \u043d\u0438\u0447\u0435\u0433\u043e \u043f\u0440\u043e \u043d\u0438\u0445 \u043d\u0435\u0442, \u0442\u0430\u043a \u0447\u0442\u043e \u0433\u0440\u0443\u0437\u0438\u043c \u043e\u043f\u044f\u0442\u044c <strong>dotPeek<\/strong> (\u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0443 \u043d\u0430\u0441 \u0432\u0441\u0451 \u0435\u0449\u0435 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u044b \u0441\u0431\u043e\u0440\u043a\u0438) \u0438 \u043f\u043e\u0438\u0449\u0435\u043c (Ctrl+F) \u043f\u043e &#171;extraData&#187;. \u042d\u043c. \u041d\u0438\u0447\u0435\u0433\u043e?<\/p>\n<p>\u0422\u0430\u043a&#8230; \u0410 \u0435\u0441\u043b\u0438 <code>Navigate->Search everywhere<\/code> (Ctrl+T)..? &#171;ZipExtraData&#187; \u0432\u043d\u0443\u0442\u0440\u0438 &#171;SharpZipLib&#187;. \u0422\u043e\u0447\u043d\u043e \u043d\u0435 \u043e\u043d\u043e. \u0421\u0442\u043e\u043e\u043e\u043f&#8230; \u043f\u043e &#171;extra&#187; \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f:<\/p>\n<pre><code>extraInfo in KATSDKInterfaceHelper extraInfoLoco in KATSDKInterfaceHelper extraInfoMini in KATSDKInterfaceHelper ...<\/code><\/pre>\n<p>\u0430\u0433\u0430, \u043d\u0443, \u0447\u0442\u043e \u043f\u043e\u0434\u0435\u043b\u0430\u0442\u044c, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 copy-paste \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e. \u0422\u0430\u043a, \u0432\u043e\u0442 \u044d\u0442\u043e \u0443\u0436\u0435 \u043f\u043e\u0445\u043e\u0436\u0435 \u043d\u0430 \u043f\u0440\u0430\u0432\u0434\u0443:<\/p>\n<pre><code class=\"cs\">    [StructLayout(LayoutKind.Sequential)]     public struct extraInfo     {       [MarshalAs(UnmanagedType.U1)]       public bool isLeftGround;       [MarshalAs(UnmanagedType.U1)]       public bool isRightGround;       [MarshalAs(UnmanagedType.U1)]       public bool isLeftStatic;       [MarshalAs(UnmanagedType.U1)]       public bool isRightStatic;       [MarshalAs(UnmanagedType.U4)]       public int motionType;       public KATSDKInterfaceHelper.Vector3 skatingSpeed;       public KATSDKInterfaceHelper.Vector3 lFootSpeed;       public KATSDKInterfaceHelper.Vector3 rFootSpeed;     }      ...      public static KATSDKInterfaceHelper.extraInfo GetExtraInfoC2(       KATSDKInterfaceHelper.TreadMillData data)     {       GCHandle gcHandle = GCHandle.Alloc((object) data.extraData, GCHandleType.Pinned);       try       {         return (KATSDKInterfaceHelper.extraInfo) Marshal.PtrToStructure(gcHandle.AddrOfPinnedObject(), typeof (KATSDKInterfaceHelper.extraInfo));       }       finally       {         gcHandle.Free();       }     }<\/code><\/pre>\n<p>\u041e\u0442 \u043e\u043d\u043e \u0448\u043e, \u043c\u0430\u0441\u0441\u0438\u0432 <code>extraData<\/code> \u043f\u043e \u0441\u0443\u0442\u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 union \u0438\u0437 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 &#8212; <code>extraInfo<\/code> \/ <code>extraInfoMini<\/code> \/ <code>extraInfoLoco<\/code>, \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0442\u0438\u043f\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u0433\u043e \u043b\u043e\u043a\u043e\u043c\u043e\u0443\u0448\u0435\u043d \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043e\u0442 KAT. \u0421\u0442\u0440\u0430\u043d\u043d\u043e, \u0447\u0442\u043e C2 \u0438 C \u043d\u0435 \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u044b, \u0442\u0430\u043a \u043a\u0430\u043a C \u0431\u0430\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0430 IMU \u0441\u0435\u043d\u0441\u043e\u0440\u0430\u0445, \u0430 C2 &#8212; \u043d\u0430 \u043e\u043f\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445.<\/p>\n<p>\u0418\u0449\u0435\u043c \u043f\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044e&#8230;<\/p>\n<pre><code class=\"cs\">\/\/ ...     if (Home_Form_Walk_C2_Main.objextraInfo.isLeftGround &amp;&amp; ((double) Home_Form_Walk_C2_Main.objextraInfo.lFootSpeed.x != 0.0 || (double) Home_Form_Walk_C2_Main.objextraInfo.lFootSpeed.z != 0.0))     {         float num8 = Home_Form_Walk_C2_Main.objextraInfo.lFootSpeed.x * 3f;         float num9 = Home_Form_Walk_C2_Main.objextraInfo.lFootSpeed.z * 3f;         Home_Form_Walk_C2_Main.LF_Foot.X += num8;         Home_Form_Walk_C2_Main.LF_Foot.Y -= num9;     }     else if (!Home_Form_Walk_C2_Main.objextraInfo.isLeftGround || (double) Home_Form_Walk_C2_Main.objextraInfo.lFootSpeed.x == 0.0 &amp;&amp; (double) Home_Form_Walk_C2_Main.objextraInfo.lFootSpeed.z == 0.0 &amp;&amp; (double) Home_Form_Walk_C2_Main.objextraInfo.lFootSpeed.y == 0.0)     {         Home_Form_Walk_C2_Main.LF_Foot.X = 40f;         Home_Form_Walk_C2_Main.LF_Foot.Y = 40f;     } \/\/ ...<\/code><\/pre>\n<p>\u0410, \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u0434\u043b\u044f C2 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0432 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438 (x\/z), \u0432 \u0444\u043e\u0440\u043c\u0435 \u0434\u0435\u043b\u044c\u0442. \u041f\u0440\u0430\u0432\u0434\u0430, \u043d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u0432 \u043a\u0430\u043a\u0438\u0445 \u0432\u0435\u043b\u0438\u0447\u0438\u043d\u0430\u0445 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438. \u0418 \u0432\u043e\u043e\u0431\u0449\u0435, \u043d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u043e \u043e\u0442\u043a\u0443\u0434\u0430 \u0431\u0435\u0440\u0443\u0442\u0441\u044f \u044d\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0435.<\/p>\n<p>\u0412\u043e\u043e\u0431\u0449\u0435, \u0433\u0435\u0439\u0442\u0432\u0435\u0439 \u0440\u0438\u0441\u0443\u0435\u0442 \u0442\u0435 \u0436\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u0447\u0442\u043e \u043e\u0442\u0434\u0430\u0451\u0442 \u0442\u043e\u0442 \u0441\u0430\u043c\u044b\u0439 <code>KATNativeSDK.dll<\/code>. \u0422\u0430\u043a, \u0430 \u0433\u0434\u0435 \u043e\u043d\u0438 \u0445 \u0431\u0435\u0440\u0451\u0442? \u0413\u0440\u0443\u0437\u0438\u043c \u0435\u0451 \u0432 IDA, \u0438\u0434\u0451\u043c \u0432 <code>GetWalkStatus<\/code>&#8230;<\/p>\n<pre><code class=\"cpp\">    strcpy((char *)Buf1, \"KAT_SHARED_MEM_\"); \/\/ ...<\/code><\/pre>\n<p>\u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435. \u041e\u043a\u0435\u0439, \u0442\u043e \u0435\u0441\u0442\u044c \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\/\u043f\u043e\u0442\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0447\u0438\u0442\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435, \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 (\u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0438\u0437 \u0434\u0432\u0443\u0445 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0435\u0439 \u043d\u043e\u0433 \u043d\u0430\u0434\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043e\u0434\u043d\u0443 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0442\u0443\u0448\u043a\u0438) \u0438 \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442 \u0432 \u043e\u0431\u0449\u0435\u0435 \u043c\u0435\u0441\u0442\u043e. SDK\/\u043a\u043b\u0438\u0435\u043d\u0442\u044b\/\u0438\u0433\u0440\u044b \u0431\u0435\u0440\u0443\u0442 \u043a\u043e\u0433\u0434\u0430 \u0438\u043c \u043d\u0430\u0434\u043e (\u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e &#8212; \u043a\u0430\u0436\u0434\u044b\u0439 \u043a\u0430\u0434\u0440) \u043e\u0442\u0442\u0443\u0434\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435.<\/p>\n<p>\u0427\u0442\u043e \u0436, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0437\u0431\u0430\u0432\u0438\u0442\u044c\u0441\u044f \u043e\u0442 KATNativeSDK.dll \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e&#8230; \u0418\u0437 \u0433\u0435\u0439\u0442\u0432\u0435\u044f, \u0442\u0435\u043c \u0436\u0435 \u043f\u0443\u0442\u0451\u043c. \u041d\u0435\u0442.<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/47\/rh\/hy\/47rhhy3gkldr_8efznxtr72tori.jpeg\" alt=\"We need to go deeper!\" title=\"We need to go deeper!\" width=\"279\" height=\"181\" data-src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/47\/rh\/hy\/47rhhy3gkldr_8efznxtr72tori.jpeg\" data-blurred=\"true\"\/><\/p>\n<div><figcaption>We need to go deeper!<\/figcaption><\/div>\n<\/figure>\n<h2>\u041a\u0430\u043a \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e<\/h2>\n<p>\u0427\u0442\u043e \u0436, \u043f\u043e\u0440\u0430 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0447\u0442\u043e \u0436\u0435 \u0443 \u043d\u0435\u0435 \u0443\u043d\u0443\u0442\u0440\u0435. \u0412\u043e\u0437\u044c\u043c\u0451\u043c \u0441\u0442\u0430\u0440\u044b\u0439 \u0434\u043e\u0431\u0440\u044b\u0439 <a href=\"https:\/\/www.uwe-sieber.de\/usbtreeview_e.html\" rel=\"noopener noreferrer nofollow\">USBTreeView<\/a> (\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443 \u043c\u0435\u043d\u044f \u043b\u0435\u0436\u0438\u0442 \u0432 <code>C:\\Games\\<\/code>, \u043c\u043d\u0434\u0430) \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0447\u0442\u043e \u0438\u0437 \u0441\u0435\u0431\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e&#8230; \u0412\u0438\u0434\u0438\u043c \u0434\u0432\u0430 KAT \u0434\u0435\u0432\u0430\u0439\u0441\u0430.<\/p>\n<p>\u041e\u0434\u0438\u043d <code>KATVR walk c2 position - HID<\/code>, \u0432\u0442\u043e\u0440\u043e\u0439 <code>KATVR walk c2 receiver - HID<\/code>. \u041c\u0435\u0442\u043e\u0434\u043e\u043c \u0432\u044b\u0434\u0435\u0440\u0433\u0438\u0432\u0430\u043d\u0438\u044f USB \u043a\u0430\u0431\u0435\u043b\u044f \u0432\u044b\u044f\u0441\u043d\u044f\u0435\u043c, \u0447\u0442\u043e \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430 \u044d\u0442\u043e <code>KATVR walk c2 receiver<\/code>. \u0410, \u0434\u0430, \u0435\u0441\u0442\u044c \u0436\u0435 \u0435\u0449\u0435 \u0441\u0432\u0438\u0441\u0442\u043e\u043a \u0434\u043b\u044f \u0441\u0432\u044f\u0437\u0438 \u0441 \u0441\u0438\u0434\u0435\u043d\u044c\u0435\u043c \u043d\u0430 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435 &#8212; \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u044d\u0442\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u0438\u0437 \u043d\u0438\u0445.<\/p>\n<p>\u0427\u0442\u043e \u0436 receiver \u0438\u0437 \u0441\u0435\u0431\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442?<\/p>\n<pre><code>      ========================== Summary ========================= Vendor ID                : 0xC4F4 (Unknown Vendor) Product ID               : 0x2F37 USB Version              : 1.0 Port maximum Speed       : High-Speed Device maximum Speed     : Full-Speed Device Connection Speed  : Full-Speed Self powered             : no Demanded Current         : 160 mA Used Endpoints           : 3        ======================== USB Device ========================          +++++++++++++++++ Device Information ++++++++++++++++++ ...  Child Device 1          : HID-compliant vendor-defined device ...         ---------------- Connection Information --------------- Connection Index         : 0x01 (Port 1) Connection Status        : 0x01 (DeviceConnected) Current Config Value     : 0x01 (Configuration 1) Device Address           : 0x3D (61) Is Hub                   : 0x00 (no) Device Bus Speed         : 0x01 (Full-Speed) Number Of Open Pipes     : 0x02 (2 pipes to data endpoints) Pipe[0]                  : EndpointID=2  Direction=IN   ScheduleOffset=0  Type=Interrupt  wMaxPacketSize=0x20    bInterval=1   -> 420 Bits\/ms = 52500 Bytes\/s Pipe[1]                  : EndpointID=2  Direction=OUT  ScheduleOffset=0  Type=Interrupt  wMaxPacketSize=0x20    bInterval=1   -> 420 Bits\/ms = 52500 Bytes\/s  ...          ------------------- HID Descriptor -------------------- bLength                  : 0x09 (9 bytes) bDescriptorType          : 0x21 (HID Descriptor) bcdHID                   : 0x0100 (HID Version 1.00) bCountryCode             : 0x00 (00 = not localized) bNumDescriptors          : 0x01 Data (HexDump)           : 09 21 00 01 00 01 22 25 00                        .!....\"%. Descriptor 1: bDescriptorType          : 0x22 (Class=Report) wDescriptorLength        : 0x0025 (37 bytes) ....<\/code><\/pre>\n<p>\u0410\u0433\u0430, \u0438\u0442\u043e\u0433\u043e \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435\u0447\u0442\u043e, \u0438\u043c\u0435\u043d\u0443\u044e\u0449\u0435\u0435 \u0441\u0435\u0431\u044f HID \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e\u043c (\u0447\u0442\u043e\u0431 \u043d\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u0442\u044c \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u043e\u0432 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435), \u0441 \u0434\u0432\u0443\u043c\u044f \u0442\u0440\u0443\u0431\u0430\u043c\u0438 &#8212; \u0442\u0443\u0434\u0430 \u0438 \u043e\u0431\u0440\u0430\u0442\u043d\u043e. \u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e USB2 (\u0438 \u0437\u0430\u0447\u0435\u043c \u044f \u043f\u043e\u043a\u0443\u043f\u0430\u043b USB3 \u0443\u0434\u043b\u0438\u043d\u0438\u0442\u0435\u043b\u044c, \u043a\u0430\u043a \u0431\u044b\u043b\u043e \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u043e\u0432\u0430\u043d\u043e?), \u0438 \u043d\u0435 \u043f\u0440\u0438\u043a\u0438\u0434\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0438\u043a\u0435\u043c \u043e\u0441\u043e\u0431\u043e &#8212; \u043f\u0440\u043e\u0441\u0442\u043e vendor-defined device.<\/p>\n<p>\u041b\u0430\u0434\u043d\u043e, \u0437\u043d\u0430\u0447\u0438\u0442, \u044d\u0442\u043e \u0438 \u043d\u0435 \u043c\u044b\u0448\u044c \u0438 \u043d\u0435 \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u0430 \u0438 \u043d\u0435 \u0434\u0436\u043e\u0439\u0441\u0442\u0438\u043a, \u0437\u043d\u0430\u0447\u0438\u0442, \u0431\u0443\u0434\u0435\u043c \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c.<\/p>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u0439 \u0448\u0430\u0433 &#8212; \u0431\u0435\u0440\u0451\u043c <a href=\"https:\/\/www.wireshark.org\/\" rel=\"noopener noreferrer nofollow\"><strong>Wireshark<\/strong><\/a> \u0438 \u0441\u0442\u0430\u0432\u0438\u043c \u0435\u0433\u043e \u0441\u043e \u0432\u0441\u0435\u043c \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u043c, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e &#8212; <strong>USBPcap<\/strong>.<\/p>\n<p>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c, \u0432\u0438\u0434\u0438\u043c \u0430\u0436 \u043f\u044f\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0445 USBPcap \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 (\u043f\u043e \u0447\u0438\u0441\u043b\u0443 \u043a\u043e\u0440\u043d\u0435\u0432\u044b\u0445 \u0445\u043e\u0441\u0442-\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u0432 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435). \u041d\u0443&#8230; \u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 &#8212; \u0431\u0435\u0440\u0451\u043c \u043f\u0435\u0440\u0432\u044b\u0439, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c, \u0432\u0442\u044b\u043a\u0430\u0435\u043c \u043f\u0440\u043e\u0432\u043e\u0434, \u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0435\u0441\u0442\u044c \u0447\u0442\u043e \u0438\u043b\u0438 \u043d\u0435\u0442. \u041d\u0430\u0445\u043e\u0434\u0438\u043c \u0442\u043e\u0442, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0435\u0441\u0442\u044c \u0440\u0435\u0430\u043a\u0446\u0438\u044f. \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0433\u0435\u0439\u0442\u0432\u0435\u0439, \u0436\u0434\u0451\u043c \u043f\u043e\u043a\u0430 \u0432\u0441\u0451 \u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u0441\u044f. \u041d\u0435\u043c\u043d\u043e\u0433\u043e \u043a\u0440\u0443\u0442\u0438\u043c \u0441\u043f\u0438\u043d\u0443, \u0432\u043e\u0437\u0438\u043c \u0442\u0430\u043f\u043a\u0430\u043c\u0438 \u043f\u043e \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435, \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0437\u0430\u043f\u0438\u0441\u044c.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0434\u043e \u0431\u044b \u043e\u0442\u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0451, \u043d\u0430\u0441 \u043d\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0449\u0435\u0435. \u0423 \u043c\u0435\u043d\u044f \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0449\u0438\u0435 \u043f\u0430\u043a\u0435\u0442\u044b \u0448\u043b\u0438 \u0441 \u0430\u0434\u0440\u0435\u0441\u043e\u043c 5.9.0, \u0437\u043d\u0430\u0447\u0438\u0442 \u0444\u0438\u043b\u044c\u0442\u0440 <code>usb.addr == \"5.9.0\"<\/code>. \u0425\u043c. \u041d\u0438\u0447\u0435\u0433\u043e \u043a\u0440\u043e\u043c\u0435 DESCRIPTOR \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u043d\u0435 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c. \u042d&#8230; \u041e\u0439. \u0422\u043e\u0447\u043d\u043e! \u041d\u0430\u0441 \u0436\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0442 \u0432\u0441\u0435 endpoint&#8217;\u044b, \u043c\u0435\u043d\u044f\u0435\u043c \u0444\u0438\u043b\u044c\u0442\u0440 \u043d\u0430 <code>usb.addr ~ \"5.9.\"<\/code>.  \u0412\u043e\u0442! \u0422\u0435\u043f\u0435\u0440\u044c \u043b\u0443\u0447\u0448\u0435.<\/p>\n<p><code>GET DESCRIPTOR<\/code>, <code>SET CONFIGURATION<\/code> \u043f\u0430\u043a\u0435\u0442\u044b \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b&#8230; \u041e! <code>URB_INTERRUPT out<\/code>:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/879\/3e7\/609\/8793e7609ff37912b4a69e0823cc3344.png\" alt=\"wireshark1\" title=\"\" width=\"1162\" height=\"171\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/879\/3e7\/609\/8793e7609ff37912b4a69e0823cc3344.png\"\/><\/figure>\n<p>\u0415\u0449\u0435 \u043d\u0438\u0436\u0435 &#8212; \u0432 \u043f\u0430\u0440\u0435 \u0441 \u043d\u0438\u043c \u0435\u0449\u0435 \u0438 <code>URB_INTERRUPT in<\/code>. \u0422\u0430\u043a, \u043d\u0430\u0434\u043e \u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u044d\u0442\u043e \u043a\u0430\u043a-\u0442\u043e \u0443\u0434\u043e\u0431\u043d\u0435\u0435. \u0412\u044b\u0434\u0435\u043b\u044f\u0435\u043c &#171;HID Data&#187; \u0432 \u043e\u0431\u0437\u043e\u0440\u0435 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0432\u043d\u0438\u0437\u0443, \u043f\u0440\u0430\u0432\u043e\u0439 \u043a\u043d\u043e\u043f\u043a\u043e\u0439 => &#171;Apply as Column&#187;, \u0438 \u043f\u043e\u0434\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u0435\u043c \u0435\u0433\u043e \u043a \u043d\u0430\u0447\u0430\u043b\u0443, \u0444\u0438\u043b\u044c\u0442\u0440\u0443\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u043a\u0430\u043d\u0430\u043b \u0434\u0430\u043d\u043d\u044b\u0445 (\u0430\u0434\u0440\u0435\u0441 5.9.2)&#8230; \u041a\u0440\u0430\u0441\u043e\u0442\u0430!<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/d29\/8e9\/f74\/d298e9f744994db13e25e1c538b7ad42.png\" width=\"1298\" height=\"520\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/d29\/8e9\/f74\/d298e9f744994db13e25e1c538b7ad42.png\"\/><\/figure>\n<p>\u0418\u0442\u043e\u0433\u043e. \u0412\u0441\u0435 \u043f\u0430\u043a\u0435\u0442\u044b \u0447\u0442\u043e \u0432\u0438\u0434\u0438\u043c &#8212; \u043e\u0434\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430, 59 \u0431\u0430\u0439\u0442, \u0432\u0441\u0435 USB_INTERRUPT \u0432 \u043e\u0431\u0435 \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u0441 32 \u0431\u0430\u0439\u0442\u0430 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<p>\u041d\u0435\u0432\u043e\u043e\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u043c \u0433\u043b\u0430\u0437\u043e\u043c \u0432\u0438\u0434\u043d\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043f\u0430\u043a\u0435\u0442\u0430:<\/p>\n<pre><code>[1F] [55] [AA] [00] [00] ...<\/code><\/pre>\n<p>\u041d\u0438\u0447\u0435\u0433\u043e \u043f\u043e\u0445\u043e\u0436\u0435\u0433\u043e \u043d\u0430 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u0443\u044e \u0441\u0443\u043c\u043c\u0443 \u043d\u0435 \u0432\u0438\u0434\u0430\u0442\u044c. \u0412\u043f\u0440\u043e\u0447\u0435\u043c, USB \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442 \u043d\u0430\u043c \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0443 \u0434\u043b\u044f USB Interrupt, \u0438 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435. \u0422\u0430\u043a \u0447\u0442\u043e \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u0438 \u043d\u0435 \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u0430.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0435\u0449\u0435 \u0440\u0430\u0437 \u043f\u0440\u0438\u0441\u0442\u0430\u043b\u044c\u043d\u043e \u043d\u0430 \u043f\u0430\u043a\u0435\u0442\u044b:<\/p>\n<pre><code>(out) [1F] [55] [AA] [00] [00] [31] [ \u043d\u0443\u043b\u0438 ] (in) \u0442\u0438\u0448\u0438\u043d\u0430  (out) [1F] [55] [AA] [00] [00] [05] [ \u043d\u0443\u043b\u0438 ] (in) [1F] [55] [AA] [00] [00] [05] [00] [03] [ \u043d\u0443\u043b\u0438 ]  (out) [1F] [55] [AA] [00] [00] [21] [ \u043d\u0443\u043b\u0438 ] (in) [1f] [55] [AA] [00] [00] [21] [00] [03] [ca] [f8] ... (\u0438 \u0435\u0449\u0435 \u043c\u043d\u043e\u0433\u043e)  (out) [1F] [55] [AA] [00] [00] [A0] [00] [02] [ \u043d\u0443\u043b\u0438 ] (in) \u0442\u0438\u0448\u0438\u043d\u0430  (out) [1F] [55] [AA] [00] [00] [31] [ \u043d\u0443\u043b\u0438 ] (in) \u0442\u0438\u0448\u0438\u043d\u0430  (out) [1F] [55] [AA] [00] [00] [30] [ \u043d\u0443\u043b\u0438 ] (in) \u0442\u0438\u0448\u0438\u043d\u0430  (out) [1F] [55] [AA] [00] [00] [30] [ \u043d\u0443\u043b\u0438 ] (in) \u0442\u0438\u0448\u0438\u043d\u0430  (out) [1F] [55] [AA] [00] [00] [30] [ \u043d\u0443\u043b\u0438 ] (in) [1F] [55] [AA] [00] [00] [33] [00] [01] [00] [09] [00] [64] [ \u043d\u0443\u043b\u0438 ] (in) [1F] [55] [AA] [00] [00] [33] [00] [02] [00] [09] [00] [64] [ \u043d\u0443\u043b\u0438 ] (in) [1F] [55] [AA] [00] [00] [33] [00] [00] [00] [09] [00] [64] [ \u043d\u0443\u043b\u0438 ]  (in) [1F] [55] [AA] [00] [00] [30] [01] [01] [00] [00] [c4] [00] [ff] [ff] [ff] [ff] [ff] [ff] [ff] [ff] [ff] [00] [00] [00] [00] [00] [82] [00] [00] [00] [00] [00] ... 1f55aa000030020100006f00ffffffffffffffffff0000000000780000000000 1f55aa000030020100006f00ffffffffffffffffff0000000000780000000000 1f55aa00003001010000c400ffffffffffffffffff0000000000800000000000 1f55aa000030020100006f00ffffffffffffffffff0000000000760000000000 ... 1f55aa00003000e8000bd38a2d7e00000000000000ffffff0000000000000000 1f55aa00003001010000c400ffffffffffffffffff0000000000820000000000 1f55aa000030020100006f00ffffffffffffffffff0000000000760000000000 1f55aa00003000e8000bd38a2d7e00000000000000ffffff0000000000000000 1f55aa00003001010000c400ffffffffffffffffff0000000000810000000000 1f55aa000030020100006f00ffffffffffffffffff0000000000780000000000 1f55aa00003000e8000bd38a2d7e00000000000000ffffff0000000000000000 1f55aa00003001010000c400ffffffffffffffffff0000000000810000000000 1f55aa000030020100006f00ffffffffffffffffff0000000000770000000000 1f55aa00003000e8000bd38a2d7e00000000000000ffffff0000000000000000<\/code><\/pre>\n<p>\u0410\u0413\u0410. \u0422\u0435\u043f\u0435\u0440\u044c \u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0435\u0449\u0435 \u043f\u0440\u0438\u0441\u0442\u0430\u043b\u044c\u043d\u0435\u0435. \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f, \u0444\u043e\u0440\u043c\u0430\u0442 \u043f\u0430\u043a\u0435\u0442\u0430 \u044d\u0442\u043e:<\/p>\n<ul>\n<li>\n<p><strong>[1F]<\/strong> => \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u0430\u043a \u0434\u043b\u0438\u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0445, \u043d\u043e \u0432\u0441\u0435 \u043f\u0430\u043a\u0435\u0442\u044b \u043e\u0434\u043d\u043e\u0439 \u0434\u043b\u0438\u043d\u044b, \u0442\u0430\u043a \u0447\u0442\u043e \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0439 \u0443 \u0432\u0441\u0435\u0445.<\/p>\n<\/li>\n<li>\n<p><strong>[55] [AA]<\/strong> => \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f \u0431\u0438\u0442\u043e\u0432\u0430\u044f \u043c\u0430\u0441\u043a\u0430 10101010 \u0438 01010101 \u0434\u043b\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438.<\/p>\n<\/li>\n<li>\n<p><strong>[00] [00]<\/strong> => \u043f\u0430\u0440\u0430 \u043d\u0443\u043b\u0435\u0432\u044b\u0445 \u0431\u0430\u0439\u0442 (\u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e, \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u043f\u043e\u0441\u043b\u0435 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438?)<\/p>\n<\/li>\n<li>\n<p><strong>[XX]<\/strong> => \u043e\u0434\u0438\u043d \u0431\u0430\u0439\u0442 \u043d\u043e\u043c\u0435\u0440 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \/ \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \/ \u043e\u0442\u0432\u0435\u0442\u0430<\/p>\n<\/li>\n<li>\n<p>\u0432\u0441\u0451 \u043f\u043e\u0441\u043b\u0435 &#8212; \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b\/\u043e\u0442\u0432\u0435\u0442\u044b.<\/p>\n<\/li>\n<\/ul>\n<p>\u0418\u0437 \u0442\u043e\u0433\u043e \u0447\u0442\u043e \u0432\u0438\u0434\u0438\u043c &#8212; \u043a\u043e\u043c\u0430\u043d\u0434\u044b <strong>[05]<\/strong> \u0438 <strong>[21]<\/strong> \u0447\u0438\u0442\u0430\u044e\u0442 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u043a\u0430\u043a\u0443\u044e-\u0442\u043e. <strong>[A0]<\/strong> \u0437\u0430\u0434\u0430\u0451\u0442 \u044f\u0440\u043a\u043e\u0441\u0442\u044c \u043f\u043e\u0434\u0441\u0432\u0435\u0442\u043a\u0438 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b (\u044f \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u043b \u044d\u0442\u043e \u043f\u043e\u043a\u0440\u0443\u0442\u0438\u0432 \u0441\u043b\u0430\u0439\u0434\u0435\u0440 \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445). \u041d\u0443 \u0438 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e <strong>[30]<\/strong> \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u043f\u043e\u0442\u043e\u043a, \u0433\u0434\u0435 <strong>[33]<\/strong> \u0432\u043d\u0430\u0447\u0430\u043b\u0435 \u0434\u0430\u0451\u0442 \u043a\u0430\u043a\u0443\u044e-\u0442\u043e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e, \u0430 \u043f\u043e\u0442\u043e\u043c \u043e\u0442\u0432\u0435\u0442\u044b <strong>[30]<\/strong> \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u043e\u0433 \u0438 \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430 \u043f\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438.<\/p>\n<p>\u0418\u0442\u0430\u043a, \u0442\u0435\u043f\u0435\u0440\u044c \u0435\u0441\u0442\u044c \u043e\u0431\u0449\u0430\u044f \u0438\u0434\u0435\u044f \u0447\u0442\u043e \u043c\u044b \u0438\u0449\u0435\u043c&#8230; \u0413\u043b\u044f\u043d\u0435\u043c \u043e\u043f\u044f\u0442\u044c \u0432 \u0433\u0435\u0439\u0442\u0432\u0435\u0439, \u0447\u0442\u043e \u0442\u0430\u043c \u043f\u0440\u043e HID?<\/p>\n<pre><code class=\"cs\">\/\/...     [DllImport(\"KATDeviceSDK.dll\")]     public static extern void GetSensorInformation(       out KATSDKInterfaceHelper.sensorInformation obj,       string sn);      [DllImport(\"KATDeviceSDK.dll\")]     [return: MarshalAs(UnmanagedType.I1)]     public static extern bool DeepSleep(string sn, int type);      [DllImport(\"KATDeviceSDK.dll\")]     [return: MarshalAs(UnmanagedType.I1)]     public static extern bool WriteDeviceId(string sn, int id);      [DllImport(\"KATDeviceSDK.dll\")]     [return: MarshalAs(UnmanagedType.I1)]     public static extern bool ReadDeviceId(string sn, out int id);      [DllImport(\"KATDeviceSDK.dll\")]     [return: MarshalAs(UnmanagedType.I1)]     public static extern bool SendHIDCommand(       string sn,       byte[] command,       int cmdlen,       byte[] outBuffer,       int outLen); \/\/...<\/code><\/pre>\n<p>\u0410\u0433\u0430, \u0432\u0441\u0451 \u0432\u043a\u0443\u0441\u043d\u043e\u0435 &#8212; \u0432 \u043d\u0430\u0442\u0438\u0432\u043d\u043e\u043c \u043a\u043e\u0434\u0430 \u0432\u043d\u0443\u0442\u0440\u0438 <code>KATDeviceSDK.dll<\/code>.<\/p>\n<p>\u041d\u043e \u0435\u0441\u043b\u0438 \u043f\u043e\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u043f\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044e <code>SendHIDCommand<\/code>:<\/p>\n<pre><code class=\"cs\">    public static int Get_Version(string sn)     {       byte[] numArray1 = new byte[32];       byte[] numArray2 = new byte[32];       numArray1[0] = (byte) 32;       numArray1[1] = (byte) 31;       numArray1[2] = (byte) 85;       numArray1[3] = (byte) 170;       numArray1[4] = (byte) 0;       numArray1[5] = (byte) 0;       numArray1[6] = (byte) 5;       for (int index = 0; index &lt; 3; ++index)       {         if (KATSDKInterfaceHelper.SendHIDCommand(sn, numArray1, ((IEnumerable&lt;byte>) numArray1).Count&lt;byte>(), numArray2, ((IEnumerable&lt;byte>) numArray2).Count&lt;byte>()))         {           if (numArray2[0] == (byte) 0 &amp;&amp; numArray2[1] == (byte) 0 &amp;&amp; numArray2[2] == (byte) 0)           {             C2FirmwareUpdaeManager.SetFirmwareUpdaeState(sn, C2FirmwareUpdaeManager.nowVersion);             C2FirmwareUpdaeManager.nowVersion = -1;           }           else if (numArray2[0] == (byte) 31 &amp;&amp; numArray2[1] == (byte) 85 &amp;&amp; numArray2[2] == (byte) 170 &amp;&amp; numArray2[5] == (byte) 5)           {             C2FirmwareUpdaeManager.nowVersion = (int) numArray2[7];             C2FirmwareUpdaeManager.SetFirmwareUpdaeState(sn, C2FirmwareUpdaeManager.nowVersion);             return C2FirmwareUpdaeManager.nowVersion;           }         }         Thread.Sleep(10);       }       C2FirmwareUpdaeManager.nowVersion = -1;       C2FirmwareUpdaeManager.SetFirmwareUpdaeState(sn, C2FirmwareUpdaeManager.nowVersion);       return C2FirmwareUpdaeManager.nowVersion;     }<\/code><\/pre>\n<p>\u0422\u043e \u043c\u044b \u0443\u0437\u043d\u0430\u0451\u043c, \u0447\u0442\u043e:<\/p>\n<ul>\n<li>\n<p>\u043a\u043e\u043c\u0430\u043d\u0434\u0430 <strong>[05]<\/strong> &#8212; \u0447\u0438\u0442\u0430\u0435\u0442 \u043d\u043e\u043c\u0435\u0440 \u0432\u0435\u0440\u0441\u0438\u0438.<\/p>\n<\/li>\n<li>\n<p>\u043a\u043e\u043c\u0430\u043d\u0434\u0430 <strong>[07]<\/strong> &#8212; <code>Set_SN<\/code>, \u0437\u0430\u0434\u0430\u0442\u044c \u0441\u0435\u0440\u0438\u0439\u043d\u0438\u043a?<\/p>\n<\/li>\n<li>\n<p>\u043a\u043e\u043c\u0430\u043d\u0434\u0430 <strong>[A0]<\/strong> &#8212; \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u0434\u0430\u0451\u0442 \u044f\u0440\u043a\u043e\u0441\u0442\u044c \u043f\u043e\u0434\u0441\u0432\u0435\u0442\u043a\u0438, \u043d\u043e \u0438 \u0441\u0438\u043b\u0443 \u0442\u0430\u043a\u0442\u0438\u043b\u044c\u043d\u044b\u0439 \u043e\u0442\u043a\u043b\u0438\u043a<\/p>\n<\/li>\n<li>\n<p>\u043a\u043e\u043c\u0430\u0433\u0434\u0430 <strong>[21]<\/strong> &#8212; \u0447\u0438\u0442\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0441\u043f\u0430\u0440\u0438\u0432\u0430\u043d\u0438\u044f \u0441 \u0441\u0435\u043d\u0441\u043e\u0440\u0430\u043c\u0438 (\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b: 3 \u0441\u0435\u043d\u0441\u043e\u0440\u0430, \u043a\u0430\u0436\u0434\u044b\u0439 \u0441\u0435\u043d\u0441\u043e\u0440 6 \u0431\u0430\u0439\u0442, \u0430\u0433\u0430)<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u043b\u044e\u0441 \u0443\u0437\u043d\u0430\u0451\u043c \u0447\u0442\u043e Vehicle Hub (\u0441\u0432\u044f\u0437\u044c \u0441 \u0441\u0438\u0434\u0435\u043d\u044c\u0435\u043c) \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 \u0442\u0430\u043a\u0438\u0445 \u0436\u0435 \u043f\u0430\u043a\u0435\u0442\u0430\u0445.<\/p>\n<p>\u0417\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u044d\u0442\u0438 \u0437\u043d\u0430\u043d\u0438\u044f \u0432 \u0444\u0430\u0439\u043b\u0438\u043a, \u0438 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0441 dotPeek \u043d\u0430 IDA. \u0412\u0440\u0435\u043c\u044f \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c <code>KATDeviceSDK.dll<\/code>.<\/p>\n<p>\u041f\u0440\u043e\u0431\u0435\u0433\u0430\u0435\u043c\u0441\u044f \u043f\u043e \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c (\u0438 \u0440\u0430\u0437\u043c\u0435\u0447\u0430\u0435\u043c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435 \u043f\u043e \u0432\u043a\u0443\u0441\u0443):<\/p>\n<pre><code class=\"cpp\">char __fastcall ReadDeviceId(char *a1, byte *a2, __int64 a3) { \/\/ ...   KatBySN = (HANDLE **)FindKatBySN(a1, a2, a3, a1);   v5 = (__int64 *)KatBySN;   if ( !KatBySN )     return 0;   v6 = *KatBySN;   memset(v16, 0, sizeof(v16));   if ( (int)hid_read_timeout(v6, (byte *)v16, 0x20ui64, 100) &lt; 0 )     return 0;   v11 = 0xAA551F20;   v12 = 0;   v13 = 3;   v14 = 0i64;   v15 = 0i64;   hid_write(*v5, (char *)&amp;v11, 0x1Fui64);   timeout = hid_read_timeout((HANDLE *)*v5, (byte *)v16, 0x20ui64, 100);   v8 = (HANDLE *)*v5;   v9 = timeout;   if ( v8 )   {     CancelIo(*v8);     CloseHandle(v8[9]);     CloseHandle(*v8);     LocalFree(v8[3]);     free(v8[5]);     free(v8);   }   if ( v9 &lt; 0 )     return 0;   *(_DWORD *)a2 = (unsigned __int8)v16[7];   return 1; }<\/code><\/pre>\n<p>\u0423\u0437\u043d\u0430\u0451\u043c \u0435\u0449\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b:<\/p>\n<ul>\n<li>\n<p><strong>[23]<\/strong> &#8212; \u0443\u0441\u044b\u043f\u0438\u0442\u044c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e<\/p>\n<\/li>\n<li>\n<p><strong>[08]<\/strong> &#8212; \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c ID \u0441\u0435\u043d\u0441\u043e\u0440\u0430 (6 \u0431\u0430\u0439\u0442, MAC?)<\/p>\n<\/li>\n<li>\n<p><strong>[31]<\/strong> &#8212; <code>MCUStopSend<\/code>. \u0430\u0433\u0430, \u0442\u043e \u0435\u0441\u0442\u044c 31 \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u043f\u043e\u0442\u043e\u043a \u0434\u0430\u043d\u043d\u044b\u0445, \u043c\u043d\u0435 \u043d\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c<\/p>\n<\/li>\n<li>\n<p><strong>[03]<\/strong> &#8212; <code>ReadDeviceId<\/code>, \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u043f\u043e\u043d\u044f\u0442\u043d\u043e \u0447\u0442\u043e \u0437\u0430 ID, \u043d\u043e \u0437\u0430\u043f\u043e\u043c\u043d\u0438\u043c<\/p>\n<\/li>\n<li>\n<p><strong>[04]<\/strong> &#8212; <code>WriteDeviceId<\/code><\/p>\n<\/li>\n<li>\n<p><strong>[20]<\/strong> &#8212; <code>WriteSensorPair<\/code>. \u0430\u0433\u0430, \u0430 <strong>[21]<\/strong>, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u0432\u0438\u0434\u0435\u043b\u0438 \u0432\u044b\u0448\u0435, \u0437\u043d\u0430\u0447\u0438\u0442, &#8212; \u0447\u0438\u0442\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0441\u043f\u0430\u0440\u0438\u0432\u0430\u043d\u0438\u044f.<\/p>\n<\/li>\n<\/ul>\n<p>\u0412\u0441\u0451 \u0445\u043e\u0440\u043e\u0448\u043e, \u043d\u043e \u043a\u0430\u043a \u043f\u043e\u043d\u044f\u0442\u044c \u043f\u0430\u043a\u0435\u0442\u044b <strong>[30]<\/strong>? (\u0434\u0430 \u0438 <strong>[33]<\/strong> \u0435\u0441\u043b\u0438 \u0443\u0436 \u043d\u0430 \u0442\u043e \u043f\u043e\u0448\u043b\u043e)&#8230; \u0422\u0430\u043a, \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0435\u0449\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u044f  <code>StartListen<\/code>, \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 (\u043f\u043e \u043b\u043e\u0433\u0438\u043a\u0435) \u0434\u043e\u043b\u0436\u043d\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c\u0441\u044f \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u043f\u043e\u0442\u043e\u043a\u0430. \u0427\u0442\u043e \u0443 \u043d\u0430\u0441 \u0432 \u043d\u0435\u0439?<\/p>\n<pre><code class=\"cpp\">\/\/ ...   if ( ((v13 - 12087) &amp; 0xFFFFEFFF) == 0 )   {     v18[1] = (__crt_strtox *)'lld.2Cr';     v19 = 15i64;     goto LABEL_32;   }   switch ( v13 )   {     case 12070:       strcpy((char *)&amp;v18[1], \"rC.dll\");       v19 = 14i64; LABEL_32:       v18[0] = (__crt_strtox *)'evirDTAK';       goto LABEL_33;     case 12053:     case 12069:     case 12176:       sub_7FF8E66F7000(v18, 18i64, v3, \"KATDriverLocoS.dll\");       goto LABEL_33;     case 3855:       sub_7FF8E66F7000(v18, 21i64, v3, \"KATDriverWalkMini.dll\"); LABEL_33:       v14 = (__crt_strtox *)v18;       if ( v20 >= 0x10 )         v14 = v18[0];       __crt_strtox::multiply_by_power_of_ten(v14, a1, (unsigned int)v3);       goto LABEL_36;     case 40741:       sub_7FF8E66F7000(v18, 16i64, v3, \"KATDriver3DT.dll\");       goto LABEL_33;   }   sub_7FF8E66F1090(\"Device Not Implement!\\n\"); \/\/ ...<\/code><\/pre>\n<p>\u041e\u0445 \u0443\u0436 \u044d\u0442\u0438 \u0432\u043e\u0441\u0445\u0438\u0442\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 inline&#8217;\u043e\u0432 \u0438 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0445 std::string&#8217;\u043e\u0432! \u041d\u043e \u0438\u0434\u0435\u044f, \u0432 \u043e\u0431\u0449\u0435\u043c-\u0442\u043e, \u043f\u043e\u043d\u044f\u0442\u043d\u0430. \u041c\u044b \u0431\u0435\u0440\u0451\u043c <code>KATDrvier{\u0442\u0438\u043f}.dll<\/code> \u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u0442\u0443\u0434\u044b\u0442\u044c.<\/p>\n<p>\u0421\u0442\u043e\u043f \u0441\u0442\u043e\u043f&#8230; \u0447\u0442 \u0437\u0430 Case&#8217;\u044b \u0442\u0430\u043a\u0438\u0435? \u0410 \u043d\u0443-\u043a\u0430, \u0432 HEX \u0438\u0445:<\/p>\n<pre><code class=\"cpp\">  if ( ((v13 - 0x2F37) &amp; 0xFFFFEFFF) == 0 )   {     v18[1] = (__crt_strtox *)'lld.2Cr';     v19 = 15i64;     goto LABEL_32;   }   switch ( v13 )   {     case 0x2F26:       strcpy((char *)&amp;v18[1], \"rC.dll\");       v19 = 14i64; ...<\/code><\/pre>\n<p>\u041e, \u0442\u0430\u043a \u044d\u0442\u043e \u0436\u0435 \u043d\u0430\u0448 USB PID &#8212; 0x2F37 \u044d\u0442\u043e C2. \u041f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u043e. \u041d\u043e, \u0432 \u043e\u0431\u0449\u0435\u043c-\u0442\u043e, \u043d\u0435 \u0432\u0430\u0436\u043d\u043e. \u0412\u0430\u0436\u043d\u043e \u0447\u0442\u043e \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0435\u043c\u0441\u044f \u043d\u0430  <code>KATDriverC2.dll<\/code>.<\/p>\n<p>\u0412\u043d\u0443\u0442\u0440\u0438 \u0443 \u043d\u0430\u0441 \u0432\u0441\u0451 \u0442\u0435 \u0436\u0435 hid_* \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0447\u0442\u043e \u0438 \u0432 \u0434\u0440\u0443\u0433\u0438\u0445 \u0444\u0430\u0439\u043b\u0430\u0445, \u043f\u043b\u044e\u0441 <code>LED()<\/code>, <code>Vibrate()<\/code>, \u0438 <code>StartListen()<\/code>\/<code>StopListen()<\/code>.<\/p>\n<p><code>StartListen<\/code> \u044d\u0442\u043e \u043d\u0435\u0447\u0442\u043e \u043e\u0433\u0440\u043e\u043c\u0435\u043d\u043d\u043e\u0435, \u043d\u043e \u0437\u0430\u0442\u043e \u0441 \u043e\u0442\u043b\u0430\u0434\u043e\u0447\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439, \u0447\u0442\u043e \u0443\u0441\u043a\u043e\u0440\u044f\u0435\u0442 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0438 \u043d\u0435\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0445 \u0447\u0430\u0441\u0442\u0435\u0439.<\/p>\n<p>\u0412\u044b\u044f\u0441\u043d\u044f\u0435\u043c \u043b\u043e\u0433\u0438\u043a\u0443:<\/p>\n<ul>\n<li>\n<p>\u0413\u0440\u0443\u0437\u0438\u043c <code>KatWalkerBase.dll<\/code>, \u043e\u0442\u043a\u0443\u0434\u0430 \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u043f\u0430\u0447\u043a\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 (<code>InitAlgorithm<\/code>, <code>ShutDownAlgorithm<\/code>, <code>UpdateIMU<\/code>, <code>SensorDataUpdated<\/code>, <code>UpdateExtension<\/code>, <code>UpdateOpticalSensor<\/code>).<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c\u0441\u044f (\u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c HID \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e)<\/p>\n<\/li>\n<li>\n<p>\u0411\u0435\u0440\u0451\u043c \u0442\u0438\u043f \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"cpp\">    if ( v65 == 0x2F37 )     {       v66 = \"KATVR Walk Coord2\";       v67 = 17i64;     }     else     {       if ( v65 != 0x3F37 )       {         sub_180001050(\"Invaild Device! 0x%x\\n\", v65);         goto LABEL_321;       }       v66 = \"KATVR Walk Coord2 Core\";       v67 = 22i64;     }<\/code><\/pre>\n<p>(\u0430\u0433\u0430, \u0442\u043e \u0435\u0441\u0442\u044c C2 \u0438 C2Core \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0440\u0430\u0437\u043d\u044b\u0439 PID \u0443 \u0447\u0438\u043f\u0430&#8230; \u0412\u043e\u043e\u043e\u0442 \u0437\u0430\u0447\u0435\u043c \u0442\u0430\u043c \u0432\u044b\u0448\u0435 \u0431\u044b\u043b\u043e <code>(v13 - 0x2F37) &amp; 0xFFFFEFFF)<\/code>)<\/p>\n<ul>\n<li>\n<p>\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c\u0441\u044f: <\/p>\n<ul>\n<li>\n<p>\u041a\u043e\u043c\u0430\u043d\u0434\u0430 <strong>[31]<\/strong><\/p>\n<\/li>\n<li>\n<p>\u0441\u043f\u0438\u043c \u0441\u0435\u043a\u0443\u043d\u0434\u0443<\/p>\n<\/li>\n<li>\n<p>\u041a\u043e\u043c\u0430\u043d\u0434\u0430 <strong>[30]<\/strong><\/p>\n<\/li>\n<li>\n<p>\u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c shared memory <code>KAT_DEVICE_CONNECTION_<\/code><\/p>\n<\/li>\n<li>\n<p>\u0438 \u0443\u0445\u043e\u0434\u0438\u043c \u0432 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u0447\u0442\u0435\u043d\u0438\u044f.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>\u041e\u0442\u043b\u0438\u0447\u043d\u043e! \u041c\u044b \u043d\u0430\u0448\u043b\u0438 \u0447\u0442\u043e \u0445\u043e\u0442\u0435\u043b\u0438. \u0412\u043d\u0443\u0442\u0440\u0438 \u044d\u0442\u043e\u0433\u043e \u043c\u0435\u0433\u0430\u0446\u0438\u043a\u043b\u0430 \u0440\u0430\u0437\u043d\u0430\u044f \u043b\u043e\u0433\u0438\u043a\u0430 \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043e\u0448\u0438\u0431\u043e\u043a, \u0435\u0441\u043b\u0438 \u043e\u0442\u0432\u0430\u043b\u0438\u043b\u043e\u0441\u044c, \u0442\u0438\u0448\u0438\u043d\u0430 \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435. \u041f\u043e\u043a\u0430 \u044d\u0442\u043e \u043d\u0435 \u0432\u0430\u0436\u043d\u043e. \u041b\u0438\u0441\u0442\u0430\u0435\u043c \u0432\u043d\u0438\u0437&#8230; \u0432\u043d\u0438\u0437&#8230; \u0432\u043d\u0438\u0437&#8230; \u041e! \u0412\u043e\u0442, \u043d\u0430\u0447\u0430\u043b\u043e\u0441\u044c!<\/p>\n<pre><code class=\"cpp\">\/\/ ...     if ( cmdPtr[4] == 0x33 )     {         if ( ansLen &lt; 11 )         goto LABEL_277;         sub_1800063F0(&amp;Buf2);         ansLen = *(&amp;v250[64] + 4);     }     if ( cmdPtr[4] == 0x32 )     { \/\/ ...<\/code><\/pre>\n<p>\u0418\u0442\u0430\u043a, \u043f\u0430\u043a\u0435\u0442 <strong>[33]<\/strong>&#8230; \u041f\u0440\u043e\u0441\u0442\u043e \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f. \u0429_\u0429 \u043d\u0443, \u0448\u0442\u043e\u0448\u0448.<\/p>\n<p>\u041f\u0430\u043a\u0435\u0442 <strong>[32]<\/strong> \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e\/\u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0441\u0435\u043d\u0441\u043e\u0440\u0430: ID (\u0430\u0433\u0430! \u0432\u043e\u0442 \u043e\u043d!), \u0432\u0435\u0440\u0441\u0438\u044e \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0438, \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0437\u0430\u0440\u044f\u0434\u0430 \u0438 \u0444\u0430\u043a\u0442 \u0437\u0430\u0440\u044f\u0436\u0430\u0435\u0442\u0441\u044f \u043b\u0438. \u041f\u0440\u0438\u0447\u0435\u043c, \u0432 \u043f\u0430\u043a\u0435\u0442\u0435 <strong>[32]<\/strong> \u043d\u043e\u043c\u0435\u0440 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d: 1 == \u0441\u043f\u0438\u043d\u0430, 2 == \u043b\u0435\u0432\u0430\u044f \u043d\u043e\u0433\u0430, 3 == \u043f\u0440\u0430\u0432\u0430\u044f \u043d\u043e\u0433\u0430.<\/p>\n<p>\u041f\u0430\u043a\u0435\u0442 <strong>[30]<\/strong> \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445, \u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0435 \u0441 ID \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u043c \u0438\u0437 \u043f\u0430\u043a\u0435\u0442\u0430 <strong>[32]<\/strong>.<\/p>\n<p>\u0412 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435, \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u043e\u0433 \u043f\u0440\u043e\u0441\u0442\u044b \u043a\u0430\u043a \u043f\u0440\u043e\u0431\u043a\u0430:<\/p>\n<pre><code class=\"cpp\">float __fastcall parseFootSensor(char *cmdBuf, FOOT_SENSOR_DATA *sensorDataOut, int sensorPacketNo) { \/\/ ...   sensorDataOut->packetNo = sensorPacketNo;   timestamp_us = sensorDataOut->timestamp_us;   v8.x = *(cmdBuf + 10) \/ 59055.117;   v8.y = *(cmdBuf + 11) \/ 59055.117;   sensorDataOut->vec = v8;   sensorDataOut->status = cmdBuf[25];   sensorDataOut->something = *(cmdBuf + 4);   result = -5.1896949e11;   current_us = Xtime_get_ticks() \/ 10000000.0;   sensorDataOut->timestamp_us = current_us;   v7 = current_us - timestamp_us;   sensorDataOut->timedelta_us = v7;   if ( v7 &lt; 0.004 )     sensorDataOut->timedelta_us = 0.004;   return result; }<\/code><\/pre>\n<p>\u0410 \u0432\u043e\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0441\u043f\u0438\u043d\u044b \u0443\u0436\u0435 \u043d\u0435 \u0442\u0430\u043a \u043f\u0440\u0438\u044f\u0442\u043d\u044b \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f:<\/p>\n<pre><code class=\"cpp\">__int64 __fastcall parseDirection(char *cmdBuf, _DIR_SENSOR_DATA *sensorDataOut) { \/\/ \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0437\u0430 \u0437\u0434\u0440\u0430\u0432\u0438\u0435:   sensorDataOut->packet_no = dir_packet_count;   v4 = COERCE_UNSIGNED_INT(-*(cmdBuf + 7));   v4.m128_f32[0] = v4.m128_f32[0] * 0.00390625;   v5 = COERCE_UNSIGNED_INT(*(cmdBuf + 9));   v5.m128_f32[0] = v5.m128_f32[0] * 0.00390625;   v6 = *(cmdBuf + 8) * 0.00390625;   *&amp;sensorDataOut->in_vel.X = _mm_unpacklo_ps(v4, v5).m128_u64[0];   sensorDataOut->in_vel.Z = v6;   qq2 = pow(2.0, -14.0) * *(cmdBuf + 4);   qq3 = pow(2.0, -14.0) * *(cmdBuf + 5);   qq4 = pow(2.0, -14.0) * *(cmdBuf + 6);   qq1 = pow(2.0, -14.0) * *(cmdBuf + 3);   sensorDataOut->in_dir.X = qq1;   sensorDataOut->in_dir.Y = qq2;   sensorDataOut->in_dir.Z = qq3;   sensorDataOut->in_dir.W = qq4; \/\/ \u0412\u043e\u0442 \u0442\u0443\u0442 \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u0438 \u043b\u043e\u0433\u0438\u0447\u043d\u043e\u0435 \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f, \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0442\u0440\u0435\u0448\u0430\u043a:   if ( 0.0 > 2.0 )     sqrt2 = sqrtf(2.0);   else     sqrt2 = fsqrt(2.0);   sin45 = -(sqrt2 * 0.5);   v13 = ((sin45 * sin45) + 0.0) + ((sin45 * sin45) + 0.0);\/\/ 1   VERTICAL.X = -0.0 \/ v13;                      \/\/ 0   VERTICAL.Y = -sin45 \/ v13;                    \/\/ 1\/sqrt(2)   VERTICAL.Z = -0.0 \/ v13;                      \/\/ 0   VERTICAL.W = sin45 \/ v13;                     \/\/ -1\/sqrt(2)   quaternion_multiply(&amp;a1, &amp;VERTICAL, &amp;sensorDataOut->in_dir);   v14 = sinf(0.78539819);                       \/\/ sin(45deg)=1\/sqrt(2)   *&amp;v15 = 0x3F490FDBu;   *&amp;v15 = cosf(0.78539819);                     \/\/ cos(45)=1\/sqrt(2)   v16 = *&amp;v15;   __zero_0 = (v14 * 0.0) * a1.Z;   __zero_1 = (v14 * 0.0) * a1.X;   __zero_2 = (v14 * 0.0) * a1.Y;   __zero_3 = (v14 * 0.0) * a1.W;   v16.m128_f32[0] = (((*&amp;v15 * a1.W) - __zero_1) - __zero_2) - (v14 * a1.Z);\/\/ v16 = (v16, 0, 0, 0)   v21 = _mm_shuffle_ps(v16, v16, 0);            \/\/ v21 = (v16, v16, v16, v16)   v21.m128_f32[0] = (((*&amp;v15 * a1.X) + __zero_3) + __zero_0) - (v14 * a1.Y);\/\/ v21 = (v21, v16, v16, v16)   v22 = _mm_shuffle_ps(v21, v21, 225);          \/\/ v22 = (v16, v21, v16, v16)   v22.m128_f32[0] = (((*&amp;v15 * a1.Y) + __zero_3) + (v14 * a1.X)) - __zero_0;\/\/ v22 = (v22, v21, v16, v16)   v23 = _mm_shuffle_ps(v22, v22, 198);          \/\/ \/\/ v23 = (v16, v21, v22, v16)   v23.m128_f32[0] = (((*&amp;v15 * a1.Z) + (v14 * a1.W)) + __zero_2) - __zero_1;\/\/ \/\/ v23 = (v23, v21, v22, v16)   sensorDataOut->in_dir = _mm_shuffle_ps(v23, v23, 201);\/\/ res = (v21, v22, v23, v16)   Y = sensorDataOut->in_dir.Y;   v25 = -sensorDataOut->in_dir.Z;   W = sensorDataOut->in_dir.W;   sensorDataOut->in_dir.X = -sensorDataOut->in_dir.X;\/\/ -v21 => -a1.x\/sqrt(2) + a1.y\/sqrt(2)   sensorDataOut->in_dir.Y = Y;                  \/\/ +v22 => a1.y\/sqrt(2) + a1.x\/sqrt(2)   sensorDataOut->in_dir.Z = v25;                \/\/ -v22 => -a1.z\/sqrt(2) - a1.w\/sqrt(2)   sensorDataOut->in_dir.W = W;                  \/\/ +v16 => a1.w\/sqrt(2) - a1.z\/sqrt(2)   timestamp_us = sensorDataOut->timestamp_us;   *&amp;sensorDataOut->field_1C = _mm_unpacklo_ps(0i64, 0i64).m128_u64[0];   *&amp;sensorDataOut->field_34 = _mm_unpacklo_ps(0i64, 0i64).m128_u64[0];   sensorDataOut->field_3C = 0;   sensorDataOut->field_24 = 0;   v15 = Xtime_get_ticks() \/ 10000000.0;   sensorDataOut->timestamp_us = v15;   sensorDataOut->timedelta_us = v15 - timestamp_us;   result = cmdBuf[24] >> 7;   sensorDataOut->gap60 = result;   return result; }<\/code><\/pre>\n<p>\u042f \u0440\u0430\u0441\u0441\u0442\u0430\u0432\u0438\u043b \u043c\u043e\u0440\u0435 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u0432, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043f\u043e\u0442\u0435\u0440\u044f\u0442\u044c \u043d\u0438\u0442\u044c \u0440\u0430\u0441\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u0439&#8230; \u041d\u043e \u0438\u0442\u043e\u0433\u043e\u0432\u044b\u0439 \u043a\u0432\u0430\u0440\u0442 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0438\u0437 4\u0445 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0445 x\/y\/z\/w \u0432\u043e\u0442 \u0432 \u0442\u0430\u043a\u043e\u0439 \u0444\u043e\u0440\u043c\u0435:<\/p>\n<pre><code class=\"cpp\">  out.x = in.x\/sqrt(2) + in.y\/sqrt(2);   out.y = in.y\/sqrt(2) + in.x\/sqrt(2);   out.z = -in.z\/sqrt(2) - in.w\/sqrt(2);   out.w = in.w\/sqrt(2) - in.z\/sqrt(2);<\/code><\/pre>\n<p>\u042f\u0432\u043d\u043e \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f, \u043d\u043e \u0434\u043b\u044f \u0447\u0435\u0433\u043e \u0438 \u043a\u0443\u0434\u0430 &#8212; \u043d\u0435 \u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0439\u0442\u0435. \u042f \u0437\u0430\u043f\u0438\u0441\u0430\u043b \u0432 \u0431\u043b\u043e\u043a\u043d\u043e\u0442\u0438\u043a \u0438 \u043f\u043e\u0448\u0435\u043b \u0434\u0430\u043b\u044c\u0448\u0435.<\/p>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u0432 \u043a\u043e\u0434\u0435 \u0441\u0442\u043e\u044f\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0438\u0434\u0435\u043b\u0438 \u043f\u0430\u043a\u0435\u0442\u043e\u0432, \u0438 \u0435\u0441\u043b\u0438 \u043c\u0435\u043d\u044c\u0448\u0435 \u0447\u0435\u043c 40 \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0441\u0435\u043d\u0441\u043e\u0440 \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0443 &#8212; \u043e\u043f\u044f\u0442\u044c \u043f\u043e\u0441\u044b\u043b\u0430\u0435\u043c 0x31 \u0438 \u043f\u043e\u0442\u043e\u043c 0x30 (\u043f\u044b\u0442\u0430\u0435\u043c\u0441\u044f \u043f\u0435\u0440\u0435\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f).<\/p>\n<p>\u041f\u0430\u043a\u0435\u0442\u044b \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u0441\u043a\u0430\u0440\u043c\u043b\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 <code>UpdateOpticalSensor<\/code> \u0438 \u043f\u0440\u043e\u0447\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 \u0438\u0445 &#171;\u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c&#187;, \u043d\u043e \u044d\u0442\u043e \u0443\u0436\u0435 \u043d\u0435 \u0432\u0430\u0436\u043d\u043e. \u0412\u0430\u0436\u043d\u043e, \u0447\u0442\u043e \u043c\u044b \u0442\u0435\u043f\u0435\u0440\u044c \u0437\u043d\u0430\u0435\u043c \u0432\u0441\u0451, \u0447\u0442\u043e \u0445\u043e\u0442\u0435\u043b\u0438 \u0443\u0437\u043d\u0430\u0442\u044c:<\/p>\n<details class=\"spoiler\">\n<summary>Hidden text<\/summary>\n<div class=\"spoiler__content\">\n<pre><code>Kat Walk C2 Receiver USB HID protocol:  HID Vendor 0xC4F4, PID 0x2F37 for C2, 0x3F37 for C2Core, 0x8F37 for C2+ Seat receiver    Command format:         prefix: 0x1F 0x55 0xAA 0x00 0x00 {command} {arguments, 32bytes total}                   31   85  170    0    0             Command:      GetFirmwareVersion {Command=0x05}: {no args}      SetSN              {Command=0x07}: {Args = Serial number as ascii string}      CloseVibration     {Command=0xA0}: 0x00 0x02 0x00 x00      SetLED{Command=0xA1}: 0x01 0x02 {HIGH(LED * 1000)} {LOW(LED*1000)}      SetVibration       {Command=0xA1}: 0x00 0x02 {HIGH(Vibr*1000)} {LOW(Vibr*1000)}      StartRead          {Command=0x30}: {no args, start listen to updates}      StopRead           {Command=0x31}: {no args, stop listen to updates}      WritePairing       {Command=0x20}: Cnt 0x00 0x00 {Mac0} ... {MacN}  \/\/ Write $Cnt MACs of sensors, 6 bytes each      ReadPairing        {Command=0x21}: Cnt 0x00 0x00 {Mac0} ... {MacN}  \/\/ Write $Cnt MACs of sensors, 6 bytes each      GetSensorInformation{Command=0x08}: {no args}  \/\/ Read MAC of device (receiver\/sensor on usb)      ReadDeviceId       {Command=0x03}: {no args}  \/\/ Read ID of device (receiver\/sensor on usb) anwser in byte 7 (offset 5)      DeepSleep          {Command=0x23}: SleepType 0 0 0 0  \/\/ SleepType==0 => off; 1=>on (put to sleep? or disable sleep? dunno)      WriteDeviceId      {Command=0x04}: ID 0 0 0 \/\/ Write ID of device (via USB; left\/right\/body etc}    Answer format:         prefix: 0x1F 0x0x55 0xAA 0x00 0x00 {Command No}      GetSN {Command=0x06}: 0x?? {Version}    Stream Updates:        len  0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 30:  main update? expected len >= 26 0000   1f 55 aa 00 00 30 01 01 00 00 c4 00 ff ff ff ff ff ff ff ff ff 00 00 00 00 00 82 00 00 00 00 00 0000   1f 55 aa 00 00 30 01 01 00 00 c4 00 ff ff ff ff ff ff ff ff ff 00 00 00 00 00 80 00 00 00 00 00 0000   1f 55 aa 00 00 30 01 01 00 00 c4 00 ff ff ff ff ff ff ff ff ff 00 00 00 00 00 81 00 00 00 00 00  0000   1f 55 aa 00 00 30 02 01 00 00 6f 00 ff ff ff ff ff ff ff ff ff 00 00 00 00 00 78 00 00 00 00 00 0000   1f 55 aa 00 00 30 02 01 00 00 6f 00 ff ff ff ff ff ff ff ff ff 00 00 00 00 00 76 00 00 00 00 00 0000   1f 55 aa 00 00 30 02 01 00 00 6f 00 ff ff ff ff ff ff ff ff ff 00 00 00 00 00 78 00 00 00 00 00   feet sensors:                                       ^^ [5] sensor id                                   ^^^^^ [8-9, short => HZ] ??                                                                       ^^^^^ [20-21, short => X] Speed X\/59055.117                                                                             ^^^^^ [22-23, short => Y] Speed Y\/59055.117                                                                                      ^^ [25, byte] status?        len  0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 30:  ?!??! main update? expected len >= 26 0000   1f 55 aa 00 00 30 00 e8 00 0b d3 8a 2d 7e 00 00 00 00 00 00 00 ff ff ff 00 00 00 00 00 00 00 00                          ^^ [5] sensor id   direction sensor: Q1-Q4 is source for quarterion, A\/B\/C at the end -- dunno (yet)                             ^^^^^ [6-7, short => Q1] (2^-14) * Q1                                   ^^^^^ [8-9, short => Q2] (2^-14) * Q2                                         ^^^^^ [10-11, short => Q3] (2^-14) * Q3                                               ^^^^^ [12-13, short => Q4] (2^-14) * Q4                                                      ^^^^^ [14-15, short => A]  (-A) * (1\/256)                                                           ^^^^^ [16-17, short => C]  (+C) * (1\/256)                                                                 ^^^^^ [18-19, short => B]  (+B) * (1\/256)                                                                                   ^^ [24, bool] bit7: button pressed status         len  0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 32:  ?!??! configuration\/state? expecteed len >= 11 0000   1f 55 aa 00 00 32 00 01 02 00 64 04 00 00 00 00 00 00 00 ff ff ff 00 00 00 00 00 00 00 00 00 00 0000   1f 55 aa 00 00 32 01 02 02 00 64 05 ff ff ff ff ff ff ff 00 00 00 00 00 81 00 00 00 00 00 00 00 0000   1f 55 aa 00 00 32 02 03 02 00 64 05 ff ff ff ff ff ff ff 00 00 00 00 00 75 00 00 00 00 00 00 00                                         ^^ [10] firmware version                                   ^^^^^ [8-9, short] charge level                                ^^ [7] bit 0: connected; bit 1: ?                             ^^ [6] sensor type: 1 == direction; 2 == left; 3==right                          ^^ [5] sensor id   33:  ?!??! [KATDriverC2 ignores packets, expects ansLen >= 11] 0000   1f 55 aa 00 00 33 00 00 00 09 00 64 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0000   1f 55 aa 00 00 33 00 01 00 09 00 64 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0000   1f 55 aa 00 00 33 00 02 00 09 00 64 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <\/code><\/pre>\n<p>\u0412\u0441\u0435\u0433\u0434\u0430 \u0432\u0435\u0434\u0443 \u0437\u0430\u043f\u0438\u0441\u0438 \u0442\u0438\u043f\u0430 \u0442\u0430\u043a\u043e\u0433\u043e \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u0430, \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u044f \u0441 \u043a\u0430\u0436\u0434\u043e\u0439 \u043d\u043e\u0432\u043e\u0439 \u043a\u0440\u0443\u043f\u0438\u0446\u0435\u0439 \u0437\u043d\u0430\u043d\u0438\u0439 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u0442\u043e \u0442\u0430\u043c \u0442\u043e \u0441\u044f\u043c&#8230;<\/p>\n<\/div>\n<\/details>\n<h2>\u041d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 Gateway &#8212; \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e!<\/h2>\n<p>\u0427\u0442\u043e \u0436. \u041c\u044b \u0437\u043d\u0430\u0435\u043c \u043a\u0430\u043a \u0438\u0434\u0451\u0442 \u043e\u0431\u0449\u0435\u043d\u0438\u0435, \u043d\u043e \u0447\u0442\u043e \u0441 \u043d\u0438\u043c \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c? \u041c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u0432\u043e\u0439 SDK, \u0441\u043e \u0441\u0432\u043e\u0438\u043c \u043b\u0443\u043d\u043d\u044b\u043c \u043c\u043e\u0434\u0443\u043b\u0435\u043c!<\/p>\n<p>\u041d\u043e \u0437\u0430\u0447\u0435\u043c? \u0427\u0442\u043e\u0431\u044b \u0432\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0432 \u0438\u0433\u0440\u0443. \u042f, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0438\u0433\u0440\u044b \u043d\u0435 \u043f\u0438\u0448\u0443, \u043d\u043e \u0432 \u043a\u043e\u043c\u044c\u044e\u043d\u0438\u0442\u0438 \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0447\u0435\u043b\u043e\u0432\u0435\u043a, \u043a\u0442\u043e \u0438\u0445 \u043f\u0438\u0448\u0443\u0442. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <a href=\"https:\/\/youtu.be\/wnwEsriAFrs?si=ogjeMZ6zYYwN9m2i\" rel=\"noopener noreferrer nofollow\">Utopia Machina<\/a> \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u043a\u0430\u043a \u0440\u0430\u0437 \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u043d\u0438\u0445. \u0423 \u043d\u0435\u0433\u043e \u0431\u044b\u043b \u0432\u043e\u043f\u0440\u043e\u0441 &#8212; \u0430 \u043d\u0443\u0436\u0435\u043d \u043b\u0438 \u043d\u0430\u043c Gateway, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e, \u0434\u043b\u044f Standalone Game?<\/p>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u043e \u0443\u0437\u043d\u0430\u043b \u043a\u0430\u043a \u043e\u0431\u0449\u0430\u0442\u044c\u0441\u044f \u0431\u0435\u0437 \u043d\u0435\u0433\u043e, \u043c\u043d\u0435 \u0441\u0442\u0430\u043b\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e &#8212; \u0430 \u043c\u043e\u0436\u043d\u043e \u043b\u0438 \u0441\u0432\u044f\u0437\u0430\u0442\u044c\u0441\u044f \u043f\u0440\u044f\u043c\u043e \u0441 \u0445\u0435\u0434\u0441\u0435\u0442\u0430?<\/p>\n<p>\u0427\u0442\u043e \u0436, \u043f\u043e\u0434 Android \u044f \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u043f\u0438\u0441\u0430\u043b (<a href=\"https:\/\/github.com\/datacompboy\/em86-3g\" rel=\"noopener noreferrer nofollow\">\u043c\u0438\u043a\u0440\u043e\u0441\u043a\u043e\u043f\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430<\/a>) \u043d\u0435 \u0432 \u0441\u0447\u0435\u0442, \u043f\u043e\u0447\u0435\u043c\u0443 \u0431\u044b \u0438 \u043d\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c!<\/p>\n<h3>\u041f\u0440\u043e\u0442\u043e\u0442\u0438\u043f: \u0444\u0435\u0439\u0441\u043b\u0438\u0444\u0442\u0438\u043d\u0433 \u0440\u0430\u043d\u0434\u043e\u043c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0441\u0442\u0443\u0434\u0438\u0438.<\/h3>\n<p>\u0420\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f, \u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u0434\u0435\u043b\u0430\u0442\u044c \u0441\u0432\u043e\u0451 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u0431\u0435\u0440\u0451\u043c \u043a\u0430\u043a\u043e\u0439-\u043b\u0438\u0431\u043e \u0438\u043c\u0435\u044e\u0449\u0438\u0439\u0441\u044f \u0433\u043e\u0442\u043e\u0432\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442, \u044f \u0431\u0440\u0430\u043b \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 <a href=\"https:\/\/github.com\/452\/USBHIDTerminal\/\" rel=\"noopener noreferrer nofollow\">USBHIDTerminal<\/a>, \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043f\u0440\u043e\u0432\u0435\u0441\u0442\u0438 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0444\u0435\u0439\u0441\u043b\u0438\u0444\u0442\u0438\u043d\u0433, \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438, \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435.<\/p>\n<p>\u0421\u043f\u0435\u0440\u0432\u0430 \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c <a href=\"https:\/\/developer.android.com\/studio\/install\" rel=\"noopener noreferrer nofollow\"><strong>Android Studio<\/strong><\/a>.<\/p>\n<p>\u0410 \u0437\u0430\u0442\u0435\u043c \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u043c \u0444\u0435\u0439\u0441\u043b\u0438\u0444\u0442\u0438\u043d\u0433. \u0414\u043b\u044f \u0442\u0435\u0445, \u043a\u0442\u043e, \u043a\u0430\u043a \u0438 \u044f, \u0434\u0435\u043b\u0430\u0435\u0442 \u044d\u0442\u043e \u0432\u043f\u0435\u0440\u0432\u044b\u0435, \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0441\u043e\u0432\u0435\u0442\u044b:<\/p>\n<ul>\n<li>\n<p>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c\u0441\u044f \u0441 \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0435\u0439 Android SDK. 22\u0439, \u043f\u043e\u0434 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043b\u0435\u0436\u0438\u0442 \u043f\u0440\u043e\u0435\u043a\u0442, \u0443\u0436\u0435 \u0443\u0441\u0442\u0430\u0440\u0435\u043b. Quest 3, \u043d\u0430 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043c\u043e\u043c\u0435\u043d\u0442, \u0442\u0440\u0435\u0431\u0443\u0435\u0442 Android 12L \u043e\u043d\u043e \u0436\u0435 SDK 32. \u0422\u0435\u043b\u0435\u0444\u043e\u043d, \u0447\u0442\u043e \u0443 \u043c\u0435\u043d\u044f \u0435\u0441\u0442\u044c, \u043d\u0430 Android 14, \u043e\u043d \u043d\u0430 SDK 34. \u0422\u0430\u043a \u0447\u0442\u043e \u0432 Android Studio \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0432 \u0434\u043e\u0432\u0435\u0441\u043e\u043a \u043a \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u043c\u0443 \u0435\u0449\u0435 \u0438 32\u0439 SDK.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u0438 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u0438 \u0441\u0442\u0430\u0440\u044b\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432, Android Studio \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0435\u0433\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0438 \u0440\u0443\u0433\u0430\u0435\u0442\u0441\u044f, \u0438\u043d\u043e\u0433\u0434\u0430 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044f \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0430\u043f\u0433\u0440\u0435\u0439\u0434 \u0441\u043a\u0440\u0438\u043f\u0442, \u0438\u043d\u043e\u0433\u0434\u0430 \u043d\u0435\u0442. \u0421\u043e\u0433\u043b\u0430\u0448\u0430\u0435\u043c\u0441\u044f \u0441\u043e \u0432\u0441\u0435\u043c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u043c: \u043d\u0430\u043c \u043d\u0435 \u043d\u0430\u0434\u043e \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e, \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u0430\u0431\u044b \u043e\u043d\u043e \u043c\u043e\u0433\u043b\u043e \u0441\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0435\u0440\u0432\u044b\u043c \u0434\u0435\u043b\u043e\u043c \u043c\u0435\u043d\u044f\u0435\u043c \u0432\u0435\u0440\u0441\u0438\u044e Gradle (\u0435\u0441\u043b\u0438 \u043d\u0435 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u043b\u043e \u0441\u0430\u043c\u043e) \u0432 <code>build.gradle<\/code> \u0441 3.6.3 \u043d\u0430 8.2.1 (\u0438\u043b\u0438 \u0447\u0442\u043e \u0442\u0430\u043c \u043d\u043e\u043d\u0447\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0435), \u043f\u043e\u0442\u043e\u043c \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0438\u043c \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 (\u0438\u043a\u043e\u043d\u043a\u0430 \u0441\u043e \u0441\u043b\u043e\u043d\u043e\u043c \u0432 \u043f\u0440\u0430\u0432\u043e\u043c \u0432\u0435\u0440\u0445\u043d\u0435\u043c \u0443\u0433\u043b\u0443, &#171;Sync Project with Gradle Files&#187;, Ctrl+Shift+O). \u041d\u0430\u0447\u0438\u043d\u0430\u044e\u0442 \u043f\u0440\u043e\u043a\u043b\u0435\u0432\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u0435\u0440\u0432\u044b\u0435 \u0440\u043e\u0431\u043a\u0438\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 \u0438 \u0432\u043e\u0440\u043d\u0438\u043d\u0433\u0438.<\/p>\n<\/li>\n<li>\n<p>\u041c\u0435\u043d\u044f\u0435\u043c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0438 \u0446\u0435\u043b\u0435\u0432\u043e\u0439 SDK \u0432\u043e \u0432\u0441\u0451 \u0442\u043e\u043c \u0436\u0435 <code>build.gradle<\/code>, \u044f \u0432\u0441\u0451 \u0437\u0430\u0442\u0430\u0447\u0438\u0432\u0430\u044e \u043f\u043e\u0434 \u0445\u0435\u0434\u0441\u0435\u0442, \u0442\u0430\u043a \u0447\u0442\u043e \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u044e compileSdkVersion \u0432 32, minSdkVersion \u0442\u043e\u0436\u0435 32, targetSdkVerison, \u0432\u044b \u043d\u0435 \u043f\u043e\u0432\u0435\u0440\u0438\u0442\u0435, \u0442\u043e\u0436\u0435 32.<\/p>\n<\/li>\n<li>\n<p>\u0417\u0430\u0442\u0435\u043c &#171;\u043c\u0438\u0433\u0440\u0438\u0440\u0443\u0435\u043c&#187; (\u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0442\u0430\u043a \u043d\u0430\u0437\u0432\u0430\u0442\u044c) \u043d\u0430 androidx, \u0432\u043e \u0432\u0441\u0451 \u0442\u043e\u043c \u0436\u0435 <code>build.gradle<\/code>: <\/p>\n<ul>\n<li>\n<p><code>implementation 'androidx.legacy:legacy-support-v4:1.0.0'<\/code> \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0430 <code>implementation 'androidx.appcompat:appcompat:1.0.2'<\/code><\/p>\n<\/li>\n<li>\n<p>\u0432 <code>android<\/code> \u0441\u0435\u043a\u0446\u0438\u044e \u0434\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c <code>namespace \"com.appspot.usbhidterminal\"<\/code><\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>\u0414\u043b\u044f \u0440\u0430\u0434\u043e\u0441\u0442\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 \u0443\u0434\u043e\u0431\u0441\u0442\u0432 \u0435\u0449\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c Java: &#171;JavaVersion.VERSION_1_8&#187; \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f &#171;JavaVersion.VERSION_17&#187;.<\/p>\n<\/li>\n<li>\n<p>\u041e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c <code>AndroidManifest.xml<\/code>: <\/p>\n<ul>\n<li>\n<p>\u0432\u044b\u043a\u0438\u0434\u044b\u0432\u0430\u0435\u043c <code>targetSdkVersion<\/code>, \u043e\u043d \u0431\u043e\u043b\u044c\u0448\u0435 \u0437\u0434\u0435\u0441\u044c \u043d\u0435 \u0437\u0430\u0434\u0430\u0451\u0442\u0441\u044f,<\/p>\n<\/li>\n<li>\n<p>\u0432\u044b\u043a\u0438\u0434\u044b\u0432\u0430\u0435\u043c \u043d\u0435\u043d\u0443\u0436\u043d\u044b\u0435 <code>uses-permission<\/code>,<\/p>\n<\/li>\n<li>\n<p>\u0434\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0441\u0442\u0430\u0432\u0448\u0438\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c\u0438 <code>android:exported=\"true\"<\/code> \u043a\u043e \u0432\u0441\u0435\u043c <code>&lt;activity\/><\/code>.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>\u042f \u0435\u0449\u0435 \u0432\u044b\u043a\u0438\u043d\u0443\u043b httpd \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438, \u0442\u0430\u043a \u043a\u0430\u043a \u0434\u043b\u044f \u043c\u043e\u0438\u0445 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u043e\u0432 \u043e\u043d\u0438 \u043d\u0435 \u043d\u0443\u0436\u043d\u044b.<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u043e\u0441\u043b\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0446\u0438\u043a\u043b\u043e\u0432 \u043f\u043e\u043f\u044b\u0442\u043e\u043a \u043f\u0435\u0440\u0435\u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0438 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0435\u0449\u0435 \u043e\u0448\u0438\u0431\u043e\u043a \u0437\u0434\u0435\u0441\u044c \u0438 \u0442\u0443\u0442 &#8212; \u043f\u0440\u043e\u0435\u043a\u0442 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0438 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0432 \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0435. \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0432 \u0442\u0435\u043b\u0435\u0444\u043e\u043d \u043f\u0440\u043e\u0432\u043e\u0434\u043e\u043c, \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0434\u0430\u0436\u0435 \u043d\u0430 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0435 &#8212; \u0438 \u043e\u043d\u043e \u0434\u0430\u0436\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442! \u0412 \u0441\u043c\u044b\u0441\u043b\u0435, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0438 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e.<\/p>\n<h3>\u041f\u0440\u043e\u0442\u043e\u0442\u0438\u043f: \u0438\u0437\u0443\u0447\u0430\u0435\u043c \u043a\u0430\u043a \u043f\u0438\u0448\u0443\u0442\u0441\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/h3>\n<p>\u041a\u0430\u043a \u044f \u0441\u043a\u0430\u0437\u0430\u043b \u0432\u044b\u0448\u0435, \u044f \u043d\u0435 \u043f\u0438\u0441\u0430\u043b \u043f\u043e\u0434 Android, \u0442\u0430\u043a \u0447\u0442\u043e \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u043a\u0430\u043a \u0441\u0434\u0435\u043b\u0430\u043d USBHIDTerminal. \u0412\u043f\u0440\u043e\u0447\u0435\u043c, \u0431\u044b\u0441\u0442\u0440\u043e \u0441\u0442\u0430\u043b\u043e \u044f\u0441\u043d\u043e, \u0447\u0442\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u0434 \u043b\u0443\u043d\u043e\u0439 \u043d\u0435 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u043e: \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043e\u0447\u0435\u043d\u044c \u0441\u0438\u043b\u044c\u043d\u043e \u043d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u0442 \u0442\u043e, \u043a\u0430\u043a \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f UI \u043f\u043e\u0434 GTK, \u0430 <a href=\"https:\/\/github.com\/datacompboy\/pygtk-gui\/\" rel=\"noopener noreferrer nofollow\">\u044d\u0442\u043e\u0433\u043e \u043a\u0430\u0440\u0430\u0441\u044f \u044f \u0443\u0436\u0435 \u0436\u0430\u0440\u0438\u043b<\/a>.<\/p>\n<p>\u0417\u043d\u0430\u0447\u0438\u0442, \u0432 <code>res\/layout\/$Activity.xml<\/code> \u043b\u0435\u0436\u0438\u0442 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 GUI &#8212; \u043a\u0430\u043a\u0438\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0437\u0430\u0441\u0443\u043d\u0443\u0442\u044b \u0432 \u043a\u0430\u043a\u0438\u0435 \u0434\u0440\u0443\u0433\u0438\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b. 1-\u0432-1 \u043a\u0430\u043a \u0432 <a href=\"https:\/\/help.gnome.org\/users\/glade3\/3.8\/glade3.html\" rel=\"noopener noreferrer nofollow\">glade<\/a>. \u041a \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u043c \u043f\u0440\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0441\u0438\u0433\u043d\u0430\u043b\u044b, \u043d\u0430 \u044d\u0442\u0438 \u0441\u0438\u0433\u043d\u0430\u043b\u044b \u0432\u0435\u0448\u0430\u044e\u0442\u0441\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0447\u0442\u043e-\u0442\u043e \u0442\u0430\u043c \u0434\u0435\u043b\u0430\u044e\u0442. \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043a\u043d\u043e\u043f\u043a\u0443 \u0434\u043b\u044f \u043f\u043e\u0438\u0433\u0440\u0430\u0442\u044c\u0441\u044f:<\/p>\n<pre><code class=\"xml\">    &lt;Button         android:id=\"@+id\/btnLedOn\"         android:layout_width=\"wrap_content\"         android:layout_height=\"wrap_content\"         android:layout_toRightOf=\"@id\/btnClear\"         android:minHeight=\"36dip\"         android:text=\"Led ON\"         android:textAppearance=\"?android:attr\/textAppearanceSmallInverse\" \/><\/code><\/pre>\n<p>\u041d\u0435, \u043f\u0443\u0441\u0442\u044c \u0431\u0443\u0434\u0435\u0442 4 \u043a\u043d\u043e\u043f\u043a\u0438 (&#8230;). \u0417\u0430\u0442\u0435\u043c \u0438\u0434\u0451\u043c \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043a\u043e\u0434 \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0431\u043e\u0439\u043b\u0435\u0440\u043f\u043b\u0435\u0439\u0442\u0430:<\/p>\n<pre><code class=\"java\">public class USBHIDTerminal extends Activity implements View.OnClickListener { \/\/ ...     private Button btnInit;     private Button btnStop;     private Button btnLedOn;     private Button btnLedOff; \/\/ ...      private void initUI() { \/\/ ...         btnLedOn = (Button) findViewById(R.id.btnLedOn);         btnLedOn.setOnClickListener(this); \/\/ ... \u0438 \u0435\u0449\u0435 3 \u0448\u0442\u0443\u043a\u0438     }      public void onClick(View v) { \/\/ ...         } else if (v == btnInit) {             eventBus.post(new USBDataSendTypedEvent(\"0x1F 0x55 0xAA 0x00 0x00 0x30 0x00 0x00 0x00 0x00\", true));         } else if (v == btnStop) {             eventBus.post(new USBDataSendTypedEvent(\"0x1F 0x55 0xAA 0x00 0x00 0x31 0x00 0x00 0x00 0x00\", true));         } else if (v == btnLedOn) {             eventBus.post(new USBDataSendTypedEvent(\"0x1F 0x55 0xAA 0x00 0x00 0xA1 0x01 0x02 0x03 0x8F\", true));         } else if (v == btnLedOff) {             eventBus.post(new USBDataSendTypedEvent(\"0x1F 0x55 0xAA 0x00 0x00 0xA1 0x01 0x02 0x00 0x00\", true));         } \/\/ ...    }  public void onEvent(DeviceAttachedEvent event) { \/\/ ...         btnLedOn.setEnabled(true);         btnLedOff.setEnabled(true);         btnStop.setEnabled(true);         btnInit.setEnabled(true); \/\/ ...         \/\/ \u0438 \u0442\u0430\u043a\u043e\u0435 \u0436\u0435 \u0432 DeviceDetachedEvent     }<\/code><\/pre>\n<p>\u041f\u0435\u0440\u0435\u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0432 \u043e\u0442\u043b\u0430\u0434\u0447\u0438\u043a\u0435 &#8212; \u043a\u043d\u043e\u043f\u043a\u0438 \u0435\u0441\u0442\u044c, \u043d\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u043d\u0435 \u0432\u0438\u0434\u043d\u043e. \u041b\u043e\u0433\u0438\u0447\u043d\u043e, \u043d\u0430\u0434\u043e \u043a\u0430\u043a-\u0442\u043e \u043f\u0440\u043e\u0431\u0440\u043e\u0441\u0438\u0442\u044c usb \u0432\u043d\u0443\u0442\u0440\u044c. \u0411\u0435\u0433\u043b\u044b\u0439 \u043f\u043e\u0438\u0441\u043a &#8212; \u043d\u0435\u0442 \u043e\u0442\u0432\u0435\u0442\u0430. \u0423\u0433\u043b\u0443\u0431\u043b\u0435\u043d\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a &#8212; \u0447\u0442\u043e-\u0442\u043e \u043a\u0430\u043a-\u0442\u043e \u0442\u043e\u0436\u0435 \u043d\u0435\u0442. \ud83d\ude41<\/p>\n<p>\u0427\u0442\u043e \u0436, \u0431\u0443\u0434\u0435\u043c \u0442\u0435\u0441\u0442\u0438\u0442\u044c \u043d\u0430 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0435. \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043f\u0440\u043e\u0432\u043e\u0434\u043e\u043c, \u0441\u0442\u0430\u0432\u0438\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043f\u0440\u043e\u0432\u043e\u0434, \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043f\u0440\u043e\u0432\u043e\u0434 \u043e\u0442 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c, \u0443\u0440\u0430! \u041c\u043e\u0436\u043d\u043e \u043f\u043e\u043c\u0438\u0433\u0430\u0442\u044c \u043b\u0430\u043c\u043f\u043e\u0447\u043a\u043e\u0439! \u0418 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043f\u043e\u0442\u043e\u043a. \u041d\u0443, \u0434\u0430, \u0432\u0441\u0451 \u043a\u0430\u043a \u043c\u044b \u0445\u043e\u0442\u0438\u043c.<\/p>\n<p>\u041f\u0440\u0430\u0432\u0434\u0430, \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0435\u0443\u0434\u043e\u0431\u043d\u043e, \u043d\u0430\u0434\u043e \u0432\u0441\u0451 \u0436\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u0432\u043e\u0451 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435.<\/p>\n<h3>\u041f\u0440\u043e\u0442\u043e\u0442\u0438\u043f: \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u0432\u0441\u0451 \u0441\u0432\u043e\u0451<\/h3>\n<p>\u0425\u043e\u0440\u043e\u0448\u043e, \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u043d\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442. \u0411\u0435\u0440\u0451\u043c \u0432\u0441\u0451 \u0441\u0432\u0435\u0436\u0435\u0435 \u0438 \u043c\u043e\u0434\u043d\u043e\u0435, \u0432\u043a\u043b\u044e\u0447\u0430\u044f kotlin (\u0445\u043e\u0442\u044c \u0443\u0437\u043d\u0430\u044e, \u0447\u0442\u043e \u044d\u0442\u043e \u0442\u0430\u043a\u043e\u0435).<\/p>\n<p>UI \u043f\u0443\u0441\u0442\u044c \u0431\u0443\u0434\u0435\u0442 \u0430-\u043b\u044f \u0433\u0435\u0439\u0442\u0432\u0435\u0439: \u043d\u0430\u0440\u0438\u0441\u0443\u0435\u043c \u0441\u0442\u0440\u0435\u043b\u043a\u0443 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0442\u0435\u043b\u0430 \u0438 \u0434\u0432\u0430 \u043f\u043e\u043b\u044f \u0441 \u0442\u043e\u0447\u043a\u0430\u043c\u0438 \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u0432 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0435\u0439 \u043d\u043e\u0433.<\/p>\n<p>\u0417\u043d\u0430\u0447\u0438\u0442, \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u0434\u0432\u0430 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430: \u0434\u043b\u044f \u043d\u043e\u0433 \u0438 \u0434\u043b\u044f \u0441\u0442\u0440\u0435\u043b\u043a\u0438. \u0421\u043e\u0437\u0434\u0430\u0451\u043c \u043d\u043e\u0432\u044b\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442, <code>ArrowView<\/code>.<\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u0448\u0430\u0431\u043b\u043e\u043d \u0440\u0430\u0434\u0443\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u043c\u0438 \u0432\u0441\u0435\u0433\u043e, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e: \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0438 \u0438\u0445 \u0433\u0435\u0442\u0442\u0435\u0440\u043e\u0432 \u0438 \u0441\u0435\u0442\u0442\u0435\u0440\u043e\u0432, \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0430, \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430 \u0438 \u0433\u043e\u0442\u043e\u0432\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438. \u0422\u0430\u043a \u0447\u0442\u043e \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u044b\u0432\u0430\u0435\u043c, \u043a\u043e\u043f\u0438-\u043f\u0430\u0441\u0442\u0438\u043c \u0438 \u043f\u0440\u043e\u0447\u0435\u0435, \u0434\u043b\u044f \u0441\u0442\u0440\u0435\u043b\u043a\u0438 \u043d\u0430\u0434\u043e:<\/p>\n<ul>\n<li>\n<p>\u0443\u0433\u043e\u043b \u044d\u0442\u043e\u0439 \u0441\u0430\u043c\u043e\u0439 \u0441\u0442\u0440\u0435\u043b\u043a\u0438,<\/p>\n<\/li>\n<li>\n<p>\u0442\u0435\u043a\u0441\u0442 \u0434\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430 (\u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0435\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u044b \u0434\u043b\u044f \u0446\u0435\u043d\u0442\u0440\u043e\u0432\u043a\u0438),<\/p>\n<\/li>\n<li>\n<p>\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 (\u0432\u044b\u0441\u043e\u0442\u0430-\u0448\u0438\u0440\u0438\u043d\u0430, \u0438\u0431\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0440\u0435\u0437\u0438\u043d\u043e\u0432\u044b\u0439).<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440\u044b \u0434\u043b\u044f \u0432\u0441\u0435\u0433\u043e \u0443\u0436\u0435 \u0432 \u043d\u0430\u043b\u0438\u0447\u0438\u0438, \u0438 \u0434\u0430\u0436\u0435 \u043f\u0440\u0438\u043c\u0435\u0440 onDraw \u0435\u0441\u0442\u044c. \u0414\u0430, \u0433\u0434\u0435-\u0442\u043e \u044f \u044d\u0442\u043e \u0443\u0436\u0435 \u0432\u0438\u0434\u0435\u043b &#8212; \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0445\u043e\u0436\u0435 \u043d\u0430 <a href=\"https:\/\/www.cairographics.org\/\" rel=\"noopener noreferrer nofollow\">cairo<\/a> \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u043b\u043e\u0441\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 GTK. \u0418\u0434\u0435\u044f \u043f\u0440\u043e\u0441\u0442\u0430: \u0440\u0438\u0441\u0443\u0435\u043c \u0441\u0442\u0440\u0435\u043b\u043a\u0443 \u043a\u0430\u043a \u0434\u043b\u0438\u043d\u043d\u044b\u0439 \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a, \u043f\u043e\u0442\u043e\u043c \u043d\u0430\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u043c \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430 \u0432 \u043e\u0434\u043d\u0443 \u0441\u0442\u043e\u0440\u043e\u043d\u0443, \u0440\u0438\u0441\u0443\u0435\u043c \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a, \u043d\u0430\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u043c \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430 \u0432 \u0434\u0440\u0443\u0433\u0443\u044e \u0441\u0442\u043e\u0440\u043e\u043d\u0443 &#8212; \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043d\u0435\u0447\u0442\u043e \u043d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u044e\u0449\u0435\u0435 \u0441\u0442\u0440\u0435\u043b\u043a\u0443.<\/p>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u0435\u0440\u0435\u0434 \u044d\u0442\u0438\u043c \u0432\u0441\u0435\u043c \u043f\u043e\u0432\u043e\u0440\u043e\u0442 \u043d\u0430 \u0443\u0433\u043e\u043b \u0432\u0441\u0435\u0439 \u0441\u0442\u0440\u0435\u043b\u043a\u0438 &#8212; \u0438 <a href=\"https:\/\/github.com\/datacompboy\/android_native_kat_gateway\/blob\/main\/app\/src\/main\/java\/com\/datacompboy\/nativekatgateway\/components\/ArrowView.kt\" rel=\"noopener noreferrer nofollow\">\u0432\u0443\u0430\u043b\u044f, \u0433\u043e\u0442\u043e\u0432\u043e<\/a>. \u0412\u044b\u0432\u043e\u0434 \u0442\u0435\u043a\u0441\u0442\u0430 \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u043a\u0430\u043a\u043e\u0439 \u0431\u044b\u043b.<\/p>\n<p>\u041f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0434\u043b\u044f \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 \u0442\u043e\u0447\u043a\u0438 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u043e\u0433, \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0438\u0441\u0443\u0435\u043c \u043a\u0440\u0443\u0436\u043e\u0447\u043a\u0438 \u043f\u043e \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c.<\/p>\n<p>\u0417\u0430\u0442\u0435\u043c \u0440\u0443\u0433\u0430\u0435\u043c\u0441\u044f \u0442\u0438\u0445\u043e\u043d\u0435\u0447\u043a\u043e \u043f\u0440\u043e \u0441\u0435\u0431\u044f, \u0438 \u043f\u0440\u0430\u0432\u0438\u043c <code>res\/values\/attrs.xml<\/code> \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u043d\u043e \u043d\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0438\u0437-\u0437\u0430 \u0434\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432. \u0421\u0442\u0440\u0430\u043d\u043d\u043e, \u0432 \u043e\u0431\u0449\u0435\u043c, \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043c\u0430\u0441\u0442\u0435\u0440 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u0438\u0437 \u0448\u0430\u0431\u043b\u043e\u043d\u0430. \u041d\u043e \u0431\u044b\u0441\u0442\u0440\u044b\u0439 \u0433\u0443\u0433\u043b\u0438\u043d\u0433 \u0434\u0430\u0451\u0442 \u043e\u0442\u0432\u0435\u0442, \u043a\u0430\u043a \u0441\u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b:<\/p>\n<pre><code class=\"xml\">&lt;resources>     &lt;attr name=\"text\" format=\"string\" \/>     &lt;attr name=\"textSize\" format=\"dimension\" \/>     &lt;attr name=\"textColor\" format=\"color\" \/>      &lt;declare-styleable name=\"FeetDotView\">         &lt;attr name=\"text\" \/>         &lt;attr name=\"textSize\" \/>         &lt;attr name=\"textColor\" \/>     &lt;\/declare-styleable>      &lt;declare-styleable name=\"ArrowView\">         &lt;attr name=\"textSize\" \/>         &lt;attr name=\"textColor\" \/>     &lt;\/declare-styleable> &lt;\/resources><\/code><\/pre>\n<p>\u0427\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u044a\u044f\u0432\u0438\u0442\u044c \u043a\u0430\u043a\u043e\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u043a \u043a\u043e\u043c\u0443 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u0438\u0445 \u0442\u0438\u043f\u044b \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0442. \u0412\u0441\u0451, \u0443\u0440\u0430.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u043f\u0440\u0430\u0432\u0438\u0442\u044c <code>res\/layout\/activity_main.xml<\/code>, \u043a\u0443\u0434\u0430 \u043d\u0430\u0434\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c <s>VBox c \u0434\u0432\u0443\u043c\u044f HBox \u0432\u043d\u0443\u0442\u0440\u0438 <\/s> \u0432 \u0441\u043c\u044b\u0441\u043b\u0435, <br \/><code>&lt;LinearLayout android:orientation=\"vertical\"><\/code> <br \/>\u0432\u043d\u0443\u0442\u0440\u044c \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u043f\u0430\u0440\u043e\u0447\u043a\u0443 <br \/><code>&lt;LinearLayout android:orientation=\"horizontal\"><\/code>.<\/p>\n<p>\u0412 \u043f\u0435\u0440\u0432\u044b\u0439 \u043a\u043b\u0430\u0434\u0451\u043c \u043a\u043d\u043e\u043f\u043a\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f, \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u0439 &#8212; \u0441\u0432\u0435\u0436\u0435\u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0430\u0438 ArrowView \u0438 \u0434\u0432\u0430 FeetDotView.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c, \u043a \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435 \u0441\u0430\u043c\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u041d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f:<\/p>\n<ul>\n<li>\n<p>\u041f\u043e\u0442\u043e\u043a \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u043e\u0442 USB \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f, \u0435\u0433\u043e \u0437\u0430\u0434\u0430\u0447\u0430 &#8212; \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043f\u0430\u043a\u0435\u0442\u044b.<\/p>\n<\/li>\n<li>\n<p>\u0414\u0440\u0430\u0439\u0432\u0435\u0440 \u0441\u0430\u043c\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b, \u0437\u0430\u0434\u0430\u0447\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u043f\u0430\u043a\u0435\u0442\u044b \u0432 \u0440\u0430\u0437\u0443\u043c\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e.<\/p>\n<\/li>\n<li>\n<p>\u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043f\u043e\u0442\u043e\u043a UI, \u0437\u0430\u0434\u0430\u0447\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0444\u043e\u043d\u043e\u0432\u044b\u0435 \u043f\u043e\u0442\u043e\u043a\u0438 \u0438 \u043f\u043e\u0442\u043e\u043c \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432.<\/p>\n<\/li>\n<li>\n<p>\u041f\u043b\u044e\u0441 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0447\u0442\u043e-\u0442\u043e \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u043c\u0435\u0436\u0434\u0443 \u0444\u043e\u043d\u043e\u0432\u044b\u043c \u043f\u043e\u0442\u043e\u043a\u043e\u043c \u0438 UI. \u0422\u0443\u0442 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438 (\u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u043a\u0430\u0434\u0440) \u0447\u0438\u0442\u0430\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u043b\u0438\u0431\u043e \u043c\u043e\u0436\u043d\u043e \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0443 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0438 \u043f\u0443\u0441\u0442\u044c \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u043a\u0430\u043a \u043f\u0440\u0438\u0434\u0451\u0442 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 &#8212; \u043c\u044b \u0435\u0433\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0434\u0438\u043c.<\/p>\n<\/li>\n<\/ul>\n<p>\u0412\u0440\u043e\u0434\u0435 \u0431\u044b \u0432\u0441\u0451 \u043f\u0440\u043e\u0441\u0442\u043e. \u0412 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435, USBHIDTerminal \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u043d \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u043c \u0436\u0435 \u043e\u0431\u0440\u0430\u0437\u043e\u043c &#8212; \u043e\u0442\u043a\u0443\u0434\u0430 \u0443\u0437\u043d\u0430\u0435\u043c, \u0447\u0442\u043e \u0444\u043e\u043d\u043e\u0432\u044b\u0435 \u043f\u043e\u0442\u043e\u043a\u0438 \u0432 \u0430\u043d\u0434\u0440\u043e\u0438\u0434\u0435 \u044d\u0442\u043e Service, \u0430 \u0434\u043b\u044f \u043e\u0431\u043c\u0435\u043d\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0438 \u0443\u0434\u043e\u0431\u043d\u044b\u0439 <a href=\"https:\/\/greenrobot.org\/eventbus\/\" rel=\"noopener noreferrer nofollow\">eventbus<\/a>. \u041f\u043e\u043f\u0440\u0430\u0432\u043a\u0430: Thread() \u043d\u0438\u043a\u0443\u0434\u0430 \u043d\u0435 \u0434\u0435\u043b\u0438\u0441\u044c, \u043d\u043e Service \u044d\u0442\u043e \u043d\u0435\u0447\u0442\u043e \u0434\u0435\u043b\u0430\u044e\u0449\u0435\u0435 \u0431\u0435\u0437 \u0443\u0447\u0430\u0441\u0442\u0438\u044f \u0432 \u043f\u0440\u044f\u043c\u043e\u043c UI \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u0442\u043e\u0433\u0434\u0430 \u043a\u0430\u043a \u0432\u0441\u0435 Activity \u0438 \u043f\u0440\u043e\u0447\u0438\u0435 \u043c\u043e\u0433\u0443\u0442 \u0438 \u0431\u0443\u0434\u0443\u0442 \u043d\u0435\u0449\u0430\u0434\u043d\u043e \u0443\u0431\u0438\u0432\u0430\u0442\u044c\u0441\u044f. (\u0414\u0430, \u043d\u0430\u0434\u043e \u0431\u044b <a href=\"https:\/\/developer.android.com\/develop\/background-work\/services\" rel=\"noopener noreferrer nofollow\">\u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435<\/a>, \u0435\u0441\u043b\u0438 \u0432\u0434\u0440\u0443\u0433 \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u043e \u0437\u0430\u043d\u044f\u0442\u044c\u0441\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u043f\u043e\u0434 Android).<\/p>\n<p>\u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u0432\u0435\u0440\u0441\u0438\u044e eventbus&#8217;\u0430 \u0438 \u0447\u0435\u0440\u0435\u0437 [\u0431\u0443\u0442\u0435\u0440\u0431\u0440\u043e\u0434]=>File=>New=>Service \u0441\u043e\u0437\u0434\u0430\u0451\u043c <code>KatGatewayService<\/code>.<\/p>\n<p>\u0418\u0442\u0430\u043a, \u0441\u0435\u0440\u0432\u0438\u0441 \u0434\u043e\u043b\u0436\u0435\u043d \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0434\u0432\u0435 \u0432\u0435\u0449\u0438: \u043d\u0430\u0439\u0442\u0438 USB \u0445\u0432\u043e\u0441\u0442 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b (\u0438\/\u0438\u043b\u0438 \u043f\u043e\u0439\u043c\u0430\u0442\u044c \u043c\u043e\u043c\u0435\u043d\u0442 \u0435\u0433\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f) \u0438 \u043e\u0431\u0449\u0430\u0442\u044c\u0441\u044f \u0441 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u043e\u0439 \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e. \u0414\u043b\u044f &#171;\u043d\u0430\u0439\u0442\u0438 \u0445\u0432\u043e\u0441\u0442&#187; \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0447\u0442\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f USB Host \u0444\u0438\u0447\u0430 \u0447\u0435\u0440\u0435\u0437 <code>&lt;uses-feature android:name=\"android.hardware.usb.host\" \/><\/code>. \u0410 \u0434\u043b\u044f &#171;\u043f\u043e\u0439\u043c\u0430\u0442\u044c \u0435\u0433\u043e \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f&#187; (\u0442\u043e \u0435\u0441\u0442\u044c \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u043b\u043e\u0441\u044c \u043f\u0440\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438 \u0445\u0432\u043e\u0441\u0442\u0430) \u043d\u0430\u0434\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 Mainactivity \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0444\u0438\u043b\u044c\u0442\u0440 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u044b\u0435 \u043d\u0430\u043c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b, \u043f\u043b\u044e\u0441 \u0432 <code>&lt;intent-filter\/><\/code> \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0447\u0442\u043e \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0440\u0435\u0430\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u0435:<\/p>\n<pre><code class=\"xml\">    &lt;activity         android:name=\".MainActivity\"         android:exported=\"true\"         android:screenOrientation=\"landscape\">         &lt;intent-filter>             &lt;action android:name=\"android.intent.action.MAIN\" \/>             &lt;action android:name=\"android.hardware.usb.action.USB_DEVICE_ATTACHED\" \/> &lt;!-- !!!!! -->             &lt;category android:name=\"android.intent.category.LAUNCHER\" \/>         &lt;\/intent-filter>          &lt;meta-data             android:name=\"android.hardware.usb.action.USB_DEVICE_ATTACHED\"             android:resource=\"@xml\/usb_device_filter\" \/> &lt;!-- !!!!! -->     &lt;\/activity><\/code><\/pre>\n<p>\u0421\u0430\u043c \u0444\u0430\u0439\u043b <code>xml\/usb_device_filter.xml<\/code>  \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0441\u043f\u0438\u0441\u043e\u043a VID+PID \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432:<\/p>\n<pre><code class=\"xml\">&lt;?xml version=\"1.0\" encoding=\"utf-8\"?> &lt;resources>     &lt;!-- in hex: USB\\VID_C4F4&amp;PID_3F37 = C2 Core Receiver -->     &lt;usb-device vendor-id=\"50420\" product-id=\"16183\" \/>     &lt;!-- in hex: USB\\VID_C4F4&amp;PID_2F37 = C2\/C2+ Receiver -->     &lt;usb-device vendor-id=\"50420\" product-id=\"12087\" \/> &lt;\/resources><\/code><\/pre>\n<p>\u0421\u043f\u0438\u0441\u043e\u043a \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0440\u0435\u0430\u043a\u0446\u0438\u044e \u043d\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0445\u0432\u043e\u0441\u0442\u0430, \u043d\u043e \u0435\u0449\u0435 \u0438 \u0432 \u043e\u043a\u043d\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043d\u0430 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0447\u0435\u043a\u0431\u043e\u043a\u0441 &#171;\u0412\u0441\u0435\u0433\u0434\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u044d\u0442\u0438\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e\u043c \u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e&#187;.<\/p>\n<p>\u0418\u0442\u0430\u043a, \u0442\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u0432 <code>class MainActivity<\/code> \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e eventBus \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c USB Service:<\/p>\n<pre><code class=\"kotlin\">class MainActivity : AppCompatActivity(), View.OnClickListener {     protected var eventBus = EventBus.getDefault()      override fun onCreate(savedInstanceState: Bundle?) {         super.onCreate(savedInstanceState)         eventBus.register(this)         katGatewayService = Intent(this, KatGatewayService::class.java)         startService(katGatewayService)         setContentView(R.layout.activity_main)         initUI()     } \/\/...<\/code><\/pre>\n<p>\u0412 \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0432 <code>initUI<\/code> \u043c\u044b \u0443\u0436\u0435 \u0437\u043d\u0430\u0435\u043c, <code>onClick<\/code> \u0442\u043e\u0436\u0435 \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u0435\u043d. \u041d\u043e\u0432\u044b\u0439 EventBus \u0435\u0449\u0435 \u043f\u0435\u0440\u0435\u0448\u0435\u043b \u043d\u0430 \u0434\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440\u044b, \u0442\u0430\u043a \u0447\u0442\u043e \u043d\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0434\u0435\u043b\u0430\u0442\u044c <code>onEvent<\/code>, \u0432\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u0434\u0435\u043b\u0430\u0435\u043c <code>on\u0427\u0442\u043e\u0443\u0433\u043e\u0434\u043d\u043e<\/code> \u0438 \u043f\u043e\u043c\u0435\u0447\u0430\u0435\u043c \u0435\u0433\u043e \u0447\u0435\u0440\u0435\u0437 <code>@Subscribe()<\/code>.<\/p>\n<p>\u0418\u0442\u0430\u043a, \u0441 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c \u0438 UI \u0432\u0441\u0451 \u0433\u043e\u0442\u043e\u0432\u043e, \u0441\u043e\u043e\u0440\u0443\u0434\u0438\u043c \u0441\u0435\u0440\u0432\u0438\u0441.<\/p>\n<p>\u0421\u0435\u0440\u0432\u0438\u0441\u0443 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0432\u043e-1\u0445 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u0442\u044c\u0441\u044f \u043d\u0430 USB \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u0432\u043e-2\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u0438\u0442\u044c \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0430 \u0441\u0432\u044f\u0437\u044c. \u0420\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043f\u043e \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0443 \u043e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u043f\u043b\u044e\u0441 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0435\u0441\u0442\u044c \u043b\u0438 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0432\u0441\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0435 (\u0438 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0438\/\u0438\u043b\u0438 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u043e\u0442 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f).<\/p>\n<p>\u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0441\u0435\u0440\u0432\u0438\u0441 \u043d\u0430 \u0441\u0442\u0430\u0440\u0442\u0435 \u043f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u0438 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0438\u0442 \u043f\u043e\u0438\u0441\u043a \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430, \u043d\u0430 \u0441\u043b\u0443\u0447\u0430\u0439 \u0435\u0441\u043b\u0438 \u043e\u043d\u043e \u0443\u0436\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043e:<\/p>\n<pre><code class=\"kotlin\">    override fun onCreate() {         super.onCreate()         usbManager = getSystemService(USB_SERVICE) as UsbManager         permissionIntent = PendingIntent.getBroadcast(             this,             0,             Intent(ACTION_USB_PERMISSION),             PendingIntent.FLAG_MUTABLE         )         filter = IntentFilter(ACTION_USB_PERMISSION)         filter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED)         filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED)         registerReceiver(usbPermissionReceiver, filter)         eventBus.register(this)         scanUsb()     }      fun scanUsb() {         if (usbConnectedDevice != null) {             disconnectDevice()         }         usbManager.deviceList.values.forEach {             if (it.vendorId == 0xC4F4 &amp;&amp; (it.productId == 0x2F37 || it.productId == 0x3F37)) {                 usbManager.requestPermission(it, permissionIntent)                 return@forEach             }         }     } <\/code><\/pre>\n<p><code>requestPermission<\/code> \u043b\u0438\u0431\u043e \u043f\u043e\u043a\u0430\u0436\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u043e\u043a\u043e\u0448\u043a\u043e \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f, \u043b\u0438\u0431\u043e \u043f\u0440\u0438\u043c\u0435\u0442 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u044d\u0442\u043e \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0438 \u0441\u0440\u0430\u0437\u0443 \u0432\u044b\u0434\u0430\u0442\u044c (\u0438\u043b\u0438 \u043d\u0435 \u0432\u044b\u0434\u0430\u0442\u044c). \u0422\u0430\u043a \u043a\u0430\u043a \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u043b\u0438 IntentFilter \u0434\u043b\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u0431\u0440\u043e\u0430\u0434\u043a\u0430\u0441\u0442\u043e\u0432 (\u0438 \u043d\u0430\u0448\u0435\u0433\u043e PendingIntent), \u0442\u043e \u043a\u0430\u043a \u0447\u0442\u043e-\u043b\u0438\u0431\u043e \u0438\u0437 \u0432\u044b\u0448\u0435\u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0451\u0442, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u043d\u0430\u043c\u0438 <code>usbPermissionReceiver()<\/code> \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u0432\u0430\u043d:<\/p>\n<pre><code class=\"kotlin\">    private val usbPermissionReceiver = object : BroadcastReceiver() {         override fun onReceive(context: Context?, intent: Intent) {             val action = intent.action             if (ACTION_USB_PERMISSION == action) {                 connectDevice(intent)             }             if (UsbManager.ACTION_USB_DEVICE_ATTACHED == action) {                 connectDevice(intent)             }             if (UsbManager.ACTION_USB_DEVICE_DETACHED == action) {                 disconnectDevice(intent)             }         }     }<\/code><\/pre>\n<p>\u0418 \u0432\u043e\u0442 \u043a\u043e\u0433\u0434\u0430 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0431\u044b\u043b\u043e \u0432\u044b\u0434\u0430\u043d\u043e \u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0442\u043e\u0436\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043e, \u0442\u043e <code>connectDevice<\/code> \u0442\u0430\u043a\u0438 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u0432\u0430\u043d. \u0412\u0430\u0436\u043d\u043e: Service \u044d\u0442\u043e \u043d\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u0442\u043e\u043a, \u044d\u0442\u043e \u043e\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043d\u043e \u043e\u043d\u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0438\u0437 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u0437\u044f\u0442\u044c \u0438 \u043f\u0440\u044f\u043c\u043e \u0437\u0434\u0435\u0441\u044c \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u043f\u0440\u0438\u0451\u043c\u0430. \u0422\u0430\u043a \u0447\u0442\u043e \u043c\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0447\u0442\u043e \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0435\u0441\u0442\u044c, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c endpoint&#8217;\u044b \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043f\u043e\u0442\u043e\u043a:<\/p>\n<pre><code class=\"kotlin\">    fun connectDevice(intent: Intent) {         val device = intent.getParcelableExtra&lt;UsbDevice>(UsbManager.EXTRA_DEVICE)         if (device != null &amp;&amp; intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {             usbConnectedDeviceConnection = usbManager.openDevice(device)             if (usbConnectedDeviceConnection == null) {                 return             }             usbConnectedDevice = device             for (i in 0..usbConnectedDevice!!.interfaceCount - 1) {                 usbConnectedDevice!!.getInterface(i).let { intf ->                     for (j in 0..intf.endpointCount - 1) {                         intf.getEndpoint(j).also {                             if ((it.direction == UsbConstants.USB_DIR_OUT)) {                                 if (usbSendEndpoint == null) {                                     usbSendEndpoint = it                                     usbConnectedDeviceConnection!!.claimInterface(intf, true)                                 }                             } else if ((it.direction == UsbConstants.USB_DIR_IN)) {                                 if (usbReadEndpoint == null) {                                     usbReadEndpoint = it                                     usbConnectedDeviceConnection!!.claimInterface(intf, true)                                 }                             }                         }                     }                 }             }             if (usbReadEndpoint == null || usbSendEndpoint == null) {                 disconnectDevice()                 return             }             usbReaderThread = USBReaderThread()             usbReaderThread!!.start()             eventBus.post(KatDeviceConnectedEvent(katWalk))         }     }<\/code><\/pre>\n<p>\u0412\u043e\u043e\u0431\u0449\u0435, \u043a\u043e\u0434 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f \u043f\u0435\u0440\u0435\u0443\u0441\u043b\u043e\u0436\u043d\u0451\u043d\u043d\u044b\u043c: \u043c\u044b \u0442\u043e\u0447\u043d\u043e \u0437\u043d\u0430\u0435\u043c \u0441 \u043a\u0430\u043a\u0438\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c, \u043c\u044b \u0437\u043d\u0430\u0435\u043c \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0442\u0430\u043c endpoint&#8217;\u043e\u0432 \u0438 \u0432 \u043a\u0430\u043a\u043e\u043c \u043e\u043d\u0438 \u0438\u0434\u0443\u0442 \u043f\u043e\u0440\u044f\u0434\u043a\u0435. \u0422\u0430\u043a \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0443\u0436\u0430\u0442\u044c \u043a\u043e\u0434.<\/p>\n<p><code>disconnectDevice<\/code> \u0435\u0449\u0435 \u043f\u0440\u043e\u0449\u0435 &#8212; \u0432\u0437\u0432\u043e\u0434\u0438\u043c \u0444\u043b\u0430\u0433 &#171;\u0432\u0441\u0451, \u0431\u0430\u0441\u0442\u0430&#187;, \u0436\u0434\u0451\u043c \u043f\u043e\u043a\u0430 \u043f\u043e\u0442\u043e\u043a \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u0441\u044f \u0438 \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u043c\u0441\u044f.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043e \u0441\u0430\u043c\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u0435 USB \u043e\u0431\u043c\u0435\u043d\u0430:<\/p>\n<ul>\n<li>\n<p>\u0427\u0438\u0442\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435, \u0441 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u043c \u0442\u0430\u0439\u043c\u0430\u0443\u0442\u043e\u043c.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0435\u0440\u0435\u0434\u0430\u0451\u043c \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u0430\u043a\u0435\u0442\u0430.<\/p>\n<\/li>\n<li>\n<p>_ \u0415\u0441\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0435\u0442 &#8212; \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u043c \u043e\u0448\u0438\u0431\u043a\u0443 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u0430\u043a\u0435\u0442\u0430.<\/p>\n<\/li>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u0430\u043a\u0435\u0442\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u043b\u0430 \u043d\u0430\u043c \u0447\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 &#8212; \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c.<\/p>\n<\/li>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u0430\u043a\u0435\u0442\u0430 \u0441\u043e\u043e\u0431\u0449\u0438\u043b\u0430 \u043e \u0441\u043e\u0431\u044b\u0442\u0438\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 &#8212; \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u0432 eventBus.<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0432\u0442\u043e\u0440\u044f\u0442\u044c, \u043f\u043e\u043a\u0430 \u043c\u043e\u0436\u043d\u043e.<\/p>\n<\/li>\n<\/ul>\n<p>\u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0432\u0435\u0441\u044c &#171;\u0438\u043d\u0442\u0435\u043b\u043b\u0435\u043a\u0442&#187; \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u0432 &#171;\u0434\u0440\u0430\u0439\u0432\u0435\u0440&#187; \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b. \u0418\u043d\u0442\u0435\u043b\u043b\u0435\u043a\u0442, \u0432\u043f\u0440\u043e\u0447\u0435\u043c, \u043e\u0441\u043e\u0431\u044b\u0439 \u0438 \u043d\u0435 \u043d\u0443\u0436\u0435\u043d:<\/p>\n<ul>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u043f\u0440\u0438\u0448\u0435\u043b \u043f\u0430\u043a\u0435\u0442 &#8212; \u0437\u043d\u0430\u0447\u0438\u0442, \u0441\u0432\u044f\u0437\u044c \u0435\u0441\u0442\u044c;<\/p>\n<\/li>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u043f\u0440\u0438\u0448\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0430 \u0438\u043b\u0438 \u043f\u0430\u043a\u0435\u0442\u0430 \u043d\u0435\u0442 (\u0442\u0430\u0439\u043c\u0430\u0443\u0442 \u043d\u0430 \u0447\u0442\u0435\u043d\u0438\u0438) &#8212; \u0447\u0442\u043e-\u0442\u043e \u043f\u043e\u0448\u043b\u043e \u043d\u0435 \u0442\u0430\u043a.<\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u043b\u044f &#171;\u0447\u0442\u043e-\u0442\u043e \u043d\u0435 \u0442\u0430\u043a&#187; \u0431\u0435\u0440\u0451\u043c \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u043f\u043b\u043e\u0445\u0438\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432, \u0438 \u0435\u0441\u043b\u0438 \u0438\u0445 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e &#8212; \u0441\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u043c \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 (\u0432\u044b\u043a\u043b, \u043f\u043e\u0442\u043e\u043c \u0432\u043a\u043b).<\/p>\n<p>\u0414\u043b\u044f \u0440\u0430\u0437\u0431\u043e\u0440\u0430 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u043f\u043e\u0433\u0440\u044b\u0437\u0442\u044c \u043a\u0430\u043a\u0442\u0443\u0441: \u0432 Kotlin \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 unsigned, \u043d\u043e \u043a\u0430\u043a-\u0442\u043e \u0441\u0442\u0440\u0430\u043d\u043d\u043e. \u041b\u0438\u0442\u0435\u0440\u0430\u043b\u043e\u0432 \u043d\u0435\u0442, \u0442\u043e\u0447\u043d\u0435\u0435 \u043e\u043d\u0438 \u0435\u0441\u0442\u044c, \u043d\u043e \u0432\u0441\u0451 \u043a\u0430\u043a-\u0442\u043e \u043a\u043e\u0441\u043e \u0438 \u043a\u0440\u0438\u0432\u043e. \u0412 \u0438\u0442\u043e\u0433\u0435 \u0447\u0442\u043e\u0431\u044b \u0432\u0441\u0451 \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e \u043d\u0430\u0434\u043e \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u044c Byte \u043a UByte, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u043b\u0438\u0442\u0435\u0440\u0430\u043b\u044b: <code>(bytes[2].toUByte() == 0xAAu.toUByte())<\/code>. \u0412\u044b\u043d\u043e\u0441\u0438\u043c \u044d\u0442\u0438 \u043d\u0435\u043f\u0440\u0438\u044f\u0442\u043d\u043e\u0441\u0442\u0438 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0440\u0430\u0437\u043c\u0430\u0442\u044b\u0432\u0430\u0435\u043c Quaternion \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0438 \u043b\u0430\u043a\u043e\u043d\u0438\u0447\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0442\u0438\u043f\u0430:<\/p>\n<pre><code class=\"kotlin\">    class DirectionSensor : Sensor() {         protected var _direction: Quaternion = Quaternion.identity()         protected var _angleDeg: Float = 0f         protected var _angleZero: Float = 0f          var direction: Quaternion             get() = _direction             set(value) {                 _direction = value                 val _angle = atan2(2 * (value.w * value.y - value.x * value.z), (value.w*value.w + value.x*value.x - value.y*value.y - value.z*value.z))                 _angleDeg = (_angle  * 180.0f \/ Math.PI).toFloat()             }          val angleDeg: Float             get() = normalAngle(_angleDeg - _angleZero)          fun normalAngle(x: Float): Float {             if (x > 360f) {                 return x - 360f             }             if (x &lt; 0f) {                 return x + 360f             }             return x         }          override fun parsePacket(packet: ByteArray) {             val m15 = 0.000030517578125f \/\/ 2^-15             val q1 = readShort(packet, 7)             val q2 = readShort(packet, 9)             val q3 = readShort(packet, 11)             val q4 = readShort(packet, 13)             direction = Quaternion(                 (+ q1 - q2 - q3 + q4) * m15,                 (- q1 - q2 + q3 + q4) * m15,                 (+ q1 + q2 + q3 + q4) * m15,                 (+ q1 - q2 + q3 - q4) * m15             ).normalized()             if (packet[25].toInt() &lt; 0) {                 _angleZero = _angleDeg             }         }     }      class FootSensor : Sensor() {         protected var _move_x: Float = 0f         val move_x: Float             get() = _move_x          protected var _move_y: Float = 0f         val move_y: Float             get() = _move_y          protected var _shade: Float = 0f         val shade: Float             get() = _shade          protected var _ground: Boolean = false         val ground: Boolean             get() = _ground          override fun parsePacket(packet: ByteArray) {             _move_x = readShort(packet, 21) \/ 59055.117f             _move_y = readShort(packet, 23) \/ 59055.117f             _shade = packet[26].toInt() \/ 127f             _ground = (packet[9] == 0.toByte())         }     }<\/code><\/pre>\n<p>\u0414\u043b\u044f \u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0441 \u043a\u043e\u0434\u043e\u043c USB \u043e\u0431\u043c\u0435\u043d\u0430 \u0432\u0432\u043e\u0434\u0438\u043c \u0435\u0449\u0435 Queue \u0432 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0431\u0443\u0434\u0435\u043c \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0442\u044c \u043f\u0430\u043a\u0435\u0442\u044b \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0435\u0441\u043b\u0438 \u043d\u0430\u0434\u043e (\u0442\u0435 \u0441\u0430\u043c\u044b\u0435 \u0441\u0442\u043e\u043f, \u0441\u0442\u0430\u0440\u0442, \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c-\u0432\u044b\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0441\u0432\u0435\u0442), \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c <a href=\"https:\/\/github.com\/datacompboy\/android_native_kat_gateway\/blob\/main\/app\/src\/main\/java\/com\/datacompboy\/nativekatgateway\/driver\/KatWalkC2.kt#L146\" rel=\"noopener noreferrer nofollow\">\u0438\u0442\u043e\u0433\u043e\u0432\u044b\u0439 \u043a\u043e\u0434 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430<\/a>.<\/p>\n<p>\u041a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u043c, \u0437\u0430\u043b\u0438\u0432\u0430\u0435\u043c \u043d\u0430 \u0442\u0435\u043b\u0435\u0444\u043e\u043d, \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043f\u0440\u043e\u0432\u043e\u0434, \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0434\u0440\u0443\u0433\u043e\u0439&#8230; \u0418\u0437\u0443\u0447\u0430\u0435\u043c \u043a\u0430\u043a \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c <a href=\"https:\/\/d.android.com\/r\/studio-ui\/wifi-pairing\" rel=\"noopener noreferrer nofollow\">wifi debug<\/a>, \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c\u0441\u044f. \u041d\u0435 \u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0439\u0442\u0435, \u043d\u043e \u0438\u043d\u043e\u0433\u0434\u0430 wifi pairing \u043e\u0442\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c, \u043b\u0435\u0447\u0438\u0442\u0441\u044f \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043b\u0438\u0431\u043e \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u043e\u0439 \u043b\u0438\u0431\u043e \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u0438 <br \/>  <code>adb pair $IP:$pairport $code<\/code><br \/>  <code>adb connect $IP:$connport<\/code><br \/>\u041f\u043e\u0440\u0442\u044b \u0434\u043b\u044f \u0441\u043f\u0430\u0440\u0438\u0432\u0430\u043d\u0438\u044f \u0438 \u0441\u043e\u0435\u0434\u043d\u0435\u043d\u0438\u044f \u0440\u0430\u0437\u043d\u044b\u0435, \u0442\u0435\u043b\u0435\u0444\u043e\u043d \u0432\u043e \u0432\u043a\u043b\u0430\u0434\u043a\u0435 wifi debugging \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043f\u043e\u0440\u0442 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f, \u043d\u043e \u0435\u0441\u043b\u0438 \u0437\u0430\u0439\u0442\u0438 \u0432 \u0441\u043f\u0430\u0440\u0438\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u043a\u0430\u0436\u0435\u0442 \u0432\u0442\u043e\u0440\u043e\u0439 \u0438 \u043a\u043e\u0434 \u0441\u0432\u044f\u0437\u0438), \u0441\u043e\u0435\u0434\u0438\u043d\u044f\u0435\u043c\u0441\u044f \u0438 \u0443\u0440\u0430 &#8212; \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043a\u0430\u0431\u0435\u043b\u044c \u043a \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0443 \u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0438 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u044c \u043f\u0440\u044f\u043c\u043e \u0438\u0437 \u0441\u0442\u0443\u0434\u0438\u0438. \u0423\u0434\u043e\u0431\u043d\u043e!<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043a\u043e\u0433\u0434\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0435, \u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u044c \u0432\u0441\u0451 \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435 \u043d\u0430 \u0445\u0435\u0434\u0441\u0435\u0442\u0435 &#8212; \u0438, \u043e \u0447\u0443\u0434\u043e, \u0442\u0430\u043c \u043e\u043d\u043e \u0442\u043e\u0436\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442!<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/4b6\/5c7\/a86\/4b65c7a86927bb38ac06b18c593f4596.png\" alt=\"Native Gateway on Quest 3\" width=\"1371\" height=\"942\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/4b6\/5c7\/a86\/4b65c7a86927bb38ac06b18c593f4596.png\"\/><\/p>\n<div><figcaption>Native Gateway on Quest 3<\/figcaption><\/div>\n<\/figure>\n<p>\u041f\u043e\u0434\u0435\u043b\u0438\u043b\u0441\u044f \u043d\u0430\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u0441 \u0432\u044b\u0448\u0435\u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u044b\u043c \u0441\u0442\u0440\u0438\u043c\u0435\u0440\u043e\u043c, \u043a\u0442\u043e \u043e\u0431\u0435\u0449\u0430\u0435\u0442 \u0432\u0441\u0442\u0440\u043e\u0438\u0442\u044c &#171;\u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u0433\u0435\u0439\u0442\u0432\u0435\u0439&#187; \u0432 \u0441\u0432\u043e\u044e \u0438\u0433\u0440\u0443, \u0430 \u043f\u043e\u043a\u0430 \u043f\u0440\u043e\u0441\u0442\u043e <a href=\"https:\/\/www.youtube.com\/watch?v=XGgTHTETRUY\" rel=\"noopener noreferrer nofollow\">\u0437\u0430\u043f\u0438\u043b\u0438\u043b \u0440\u043e\u043b\u0438\u043a \u0441 \u0433\u0440\u0430\u043d\u0434\u0438\u043e\u0437\u043d\u044b\u043c\u0438 \u043f\u043b\u0430\u043d\u0430\u043c\u0438<\/a>, \u0447\u0442\u043e\u0431 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0432 Community.<\/p>\n<div class=\"tm-iframe_temp\" data-src=\"https:\/\/embedd.srv.habr.com\/iframe\/65ee0f152331bb9d71a83b8c\" data-style=\"\" id=\"65ee0f152331bb9d71a83b8c\" width=\"\"><\/div>\n<p>&#8230; \u041e\u043d \u0436\u0435 \u0443\u0436\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u043b \u043c\u043d\u0435 \u0431\u0430\u0433\u0438 \u044d\u0442\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438: \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0432\u0441\u0451 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u043e, \u043d\u043e \u0435\u0441\u043b\u0438 \u043e\u0442\u043b\u043e\u0436\u0438\u0442\u044c \u0438 \u0434\u0430\u0442\u044c \u0435\u043c\u0443 \u0443\u0441\u043d\u0443\u0442\u044c, \u0442\u043e \u043f\u043e\u0442\u043e\u043c \u043d\u0435 \u0443\u0434\u0430\u0451\u0442\u0441\u044f \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u0432\u044f\u0437\u044c, \u043d\u0430\u0434\u043e \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435. \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e, \u043d\u0430\u0434\u043e \u0442\u0430\u043a\u0438 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e \u043d\u0430 \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u0438 \u0442\u0440\u0435\u0434\u044b&#8230; \u041d\u043e \u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u0436\u0435\u043b\u0430\u044e\u0449\u0438\u0435 \u043f\u043e\u043f\u0440\u0430\u0432\u0438\u0442\u044c &#8212; \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e <a href=\"https:\/\/github.com\/datacompboy\/android_native_kat_gateway\/pulls\" rel=\"noopener noreferrer nofollow\">\u043f\u0443\u043b\u0440\u0435\u043a\u0432\u0435\u0441\u0442\u044b<\/a>!<\/p>\n<h2>\u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0441\u0435\u0440\u0438\u0438<\/h2>\n<p>\u0427\u0442\u043e \u0436, \u0440\u0430\u0437 \u0435\u0441\u0442\u044c \u043f\u043b\u0430\u043d\u044b &#8212; \u0431\u0443\u0434\u0435\u043c \u0434\u0435\u043b\u0430\u0442\u044c! \u041d\u043e \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u0434\u043e \u0438\u0437\u0431\u0430\u0432\u0438\u0442\u044c\u0441\u044f \u043e\u0442 \u043f\u0440\u043e\u0432\u043e\u0434\u0430 &#8212; \u043d\u0435 \u0434\u043b\u044f \u0442\u043e\u0433\u043e \u0436\u0435 Standalone \u0438\u0433\u0440\u044b, \u0447\u0442\u043e\u0431\u044b \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0432\u043e\u0434. \u0422\u0430\u043a \u043b\u0438 \u043d\u0443\u0436\u0435\u043d \u043f\u0440\u043e\u0432\u043e\u0434? \u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0441\u0435\u043d\u0441\u043e\u0440\u044b? \u041c\u044b \u043f\u0440\u043e\u043f\u0430\u0442\u0447\u0438\u043c \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0438, \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0434\u043e\u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0435\u0434\u043e\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0435 \u0438, \u0440\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f, \u043f\u043e\u0439\u0434\u0451\u043c \u043d\u0430 \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u043d\u0438\u0436\u0435!<\/p>\n<p><a href=\"https:\/\/habr.com\/ru\/articles\/802125\/\" rel=\"noopener noreferrer nofollow\">\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u0441\u0435\u0440\u0438\u044f \u0442\u0443\u0442.<\/a><\/p>\n<h2>\u0421\u0441\u044b\u043b\u043a\u0438<\/h2>\n<ul>\n<li>\n<p>\u0427\u0430\u0441\u0442\u044c 1: &#171;\u0418\u0433\u0440\u0430\u0435\u043c \u0441 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u043e\u0439&#187; \u043d\u0430 [<a href=\"https:\/\/habr.com\/ru\/articles\/798029\/\" rel=\"noopener noreferrer nofollow\">Habr<\/a>], [<a href=\"https:\/\/medium.com\/@datacompboy\/3364c324e710?source=friends_link&amp;sk=5535c9f1c834b35af2ac1d282fd41826\" rel=\"noopener noreferrer nofollow\">Medium<\/a>] \u0438 [<a href=\"https:\/\/www.linkedin.com\/pulse\/playing-kat-walk-c2-part-1-actually-anton-fedorov-frtwe\/\" rel=\"noopener noreferrer nofollow\">LinkedIn<\/a>].<\/p>\n<\/li>\n<li>\n<p>\u0427\u0430\u0441\u0442\u044c 2: &#171;\u041d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u043f\u043e\u0433\u0440\u0443\u0436\u0435\u043d\u0438\u0435&#187; \u043d\u0430 [<a href=\"https:\/\/habr.com\/ru\/articles\/799197\/\" rel=\"noopener noreferrer nofollow\">Habr<\/a>], [<a href=\"https:\/\/medium.com\/@datacompboy\/katwalk-c2-part-2-peeking-eavesdropping-sniffing-and-learning-how-to-communicate-with-unknown-bb390c089a00\" rel=\"noopener noreferrer nofollow\">Medium<\/a>] \u0438 [<a href=\"https:\/\/www.linkedin.com\/pulse\/katwalk-c2-part-2-peeking-eavesdropping-sniffing-learning-fedorov-bcbme\" rel=\"noopener noreferrer nofollow\">LinkedIn<\/a>].<\/p>\n<\/li>\n<li>\n<p>\u0427\u0430\u0441\u0442\u044c 3: &#171;\u041e\u0442\u0440\u0435\u0437\u0430\u0435\u043c \u043f\u0440\u043e\u0432\u043e\u0434&#187; \u043d\u0430 [<a href=\"https:\/\/habr.com\/ru\/articles\/802125\/\" rel=\"noopener noreferrer nofollow\">Habr<\/a>], [<a href=\"https:\/\/medium.com\/@datacompboy\/katwalk-c2-p-3-cutting-the-wire-987753f49da8?source=friends_link&amp;sk=a4e0e2d3f71be681bc206b1d9a3d307a\" rel=\"noopener noreferrer nofollow\">Medium<\/a>] \u0438 [<a href=\"https:\/\/www.linkedin.com\/pulse\/katwalk-c2-p3-cutting-wire-anton-fedorov-4abae\/\" rel=\"noopener noreferrer nofollow\">LinkedIn<\/a>].<\/p>\n<\/li>\n<li>\n<p>\u0427\u0430\u0441\u0442\u044c 4: &#171;\u0418\u0433\u0440\u0430\u0435\u043c\u0441\u044f \u0441 \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u043e\u0439&#187; \u043d\u0430 [<a href=\"https:\/\/habr.com\/ru\/articles\/804327\/\" rel=\"noopener noreferrer nofollow\">Habr<\/a>], [<a href=\"https:\/\/medium.com\/@datacompboy\/katwalk-c2-p-4-playing-with-firmware-ccad00d9eeeb?source=friends_link&amp;sk=3b0779685140b65e84d667950f07f7d6\" rel=\"noopener noreferrer nofollow\">Medium<\/a>] \u0438 [<a href=\"https:\/\/www.linkedin.com\/pulse\/katwalk-c2-p4-playing-firmware-anton-fedorov-wirce\/\" rel=\"noopener noreferrer nofollow\">LinkedIn<\/a>].<\/p>\n<\/li>\n<li>\n<p>\u0427\u0430\u0441\u0442\u044c 5: &#171;\u041e\u0432\u0435\u0440\u043a\u043b\u043e\u043a\u0438\u043d\u0433 \u0438 \u0431\u0430\u0433\u0444\u0438\u043a\u0441\u0438\u043d\u0433&#187; \u043d\u0430 [<a href=\"https:\/\/habr.com\/ru\/articles\/805747\/\" rel=\"noopener noreferrer nofollow\">Habr<\/a>], [<a href=\"https:\/\/medium.com\/@datacompboy\/katwalk-c2-p-5-overclocking-and-bugfixing-0ff1fd853e49?source=friends_link&amp;sk=4f44bf29291c8c3ad1b2522c5fd2d3a9\" rel=\"noopener noreferrer nofollow\">Medium<\/a>] \u0438 [<a href=\"https:\/\/www.linkedin.com\/pulse\/katwalk-c2-p5-overclocking-bugfixing-how-use-ghidra-analyse-fedorov-5nome\/\" rel=\"noopener noreferrer nofollow\">LinkedIn<\/a>].<\/p>\n<\/li>\n<\/ul>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/799197\/\"> https:\/\/habr.com\/ru\/articles\/799197\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0412 <a href=\"https:\/\/habr.com\/ru\/articles\/798029\/\" rel=\"noopener noreferrer nofollow\"><strong>\u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435<\/strong><\/a> \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u043b \u0447\u0442\u043e \u044d\u0442\u043e \u0437\u0430 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430, \u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u043b \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0441 \u043d\u0435\u0451 \u0438 \u043a\u0430\u043a \u0432\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043a\u043e\u0434 \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435.<\/p>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0432\u0438\u0441\u044f\u0449\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f (\u043d\u0430 C#), \u0438 \u043d\u0430\u0434\u043e \u043f\u043e\u043d\u044f\u0442\u044c \u0447\u0442\u043e \u0436\u0435 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e \u043e\u043d\u043e \u0434\u0435\u043b\u0430\u0435\u0442.<\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u043c\u0441\u044f \u043a\u0430\u043a \u043e\u0431\u0449\u0430\u0442\u044c\u0441\u044f \u0441 \u0436\u0435\u043b\u0435\u0437\u043e\u043c \u0438 \u0438\u0437\u0431\u0430\u0432\u0438\u043c\u0441\u044f \u043e\u0442 \u0431\u0430\u043b\u043b\u0430\u0441\u0442\u0430!.. \u041f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0432 \u043d\u0430 Kotlin. \u041f\u043e\u0447\u0435\u043c\u0443 Kotlin? \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u044f \u043d\u0430 \u043d\u0435\u043c \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u0435\u0449\u0435 \u043d\u0435 \u043f\u0438\u0441\u0430\u043b.<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u0434\u0430 \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e!<\/figcaption><\/div>\n<\/figure>\n<h2>\u0427\u0442\u043e \u0437\u0430 extraData<\/h2>\n<p>\u041d\u0430\u0447\u043d\u0451\u043c \u0441 \u043f\u0440\u043e\u043f\u0443\u0449\u0435\u043d\u043d\u043e\u0433\u043e \u0432 \u043f\u0440\u043e\u0448\u043b\u044b\u0439 \u0440\u0430\u0437: \u0447\u0442\u043e \u0436\u0435 \u0442\u0430\u043a\u043e\u0435 \u0437\u0430 \u043c\u0430\u0441\u0441\u0438\u0432 <code>extraData<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0442\u0434\u0430\u0451\u0442 SDK.<\/p>\n<p>\u041d\u0430\u043f\u043e\u043c\u043d\u044e, \u043a\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 SDK:<\/p>\n<pre><code class=\"cpp\">struct DeviceData {     bool    btnPressed;     bool    isBatteryCharging;     float   batteryLevel;     char    firmwareVersion; };  struct TreadMillData {     char         deviceName[64];     bool         connected;     double       lastUpdateTimePoint;     Quaternion   bodyRotationRaw;     Vector3      moveSpeed; };  struct KATTreadMillMemoryData {     TreadMillData treadMillData;     DeviceData    deviceDatas[3];     char          extraData[128]; };<\/code><\/pre>\n<p>\u0412 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u043a\u0432\u0430\u0440\u0442 \u0432\u0437\u0433\u043b\u044f\u0434\u0430 (\u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0439; <s>\u0437\u0430 \u0432\u044b\u0447\u0435\u0442\u043e\u043c \u043d\u0443\u043b\u0435\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432 \u043b\u044e\u0431\u043e\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0430\u0436\u0430\u0432 \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0443 \u043a\u0430\u043b\u0438\u0431\u0440\u043e\u0432\u043a\u0438 \u0432 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0435, \u0438\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0443 \u043d\u0430 \u0441\u0435\u043d\u0441\u043e\u0440\u0435 \u0437\u0430 \u0441\u043f\u0438\u043d\u043e\u0439, \u043b\u0438\u0431\u043e \u043d\u0430\u0436\u0430\u0432 \u0434\u0432\u0430 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0430 \u043d\u0430 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430\u0445 \u0441\u0440\u0430\u0437\u0443<\/s> \u043e\u0448\u0438\u0431\u0441\u044f \u0442\u0443\u0442 &#8212; \u043a\u0432\u0430\u0440\u0442 \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b\u0439, \u043d\u043e \u043d\u0443\u043b\u0435\u0432\u043e\u0439 \u0443\u0433\u043e\u043b \u043d\u0435 \u0432\u044b\u0447\u0442\u0435\u043d, \u0435\u0433\u043e \u0432\u044b\u0447\u0438\u0442\u0430\u0435\u0442 \u0433\u0435\u0439\u0442\u0432\u0435\u0439 \u0434\u043b\u044f \u0441\u0435\u0431\u044f \u0441\u0430\u043c); \u0432\u0435\u043a\u0442\u043e\u0440 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u0438 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e\u0431 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0441\u0442\u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u043f\u043b\u044e\u0441 \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445. \u041f\u043e\u043c\u0438\u043c\u043e \u044d\u0442\u043e\u0433\u043e \u0435\u0441\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u0441\u0435\u043d\u0441\u043e\u0440\u0430\u0445 &#8212; \u0437\u0430\u0440\u044f\u0434, \u0432\u0435\u0440\u0441\u0438\u044f \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0438 \u0438 \u043d\u0430\u0436\u0430\u0442\u0430 \u043b\u0438 \u0442\u0430\u043c \u043a\u043d\u043e\u043f\u043a\u0430. \u041a\u043e\u0440\u043e\u0447\u0435, \u043d\u0438\u0447\u0435\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0433\u043e.<\/p>\n<p>\u041d\u043e \u0435\u0441\u0442\u044c \u0435\u0449\u0435 <code>extraData<\/code>, \u043c\u0430\u0441\u0441\u0438\u0432, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0447\u0442\u043e-\u0442\u043e \u0435\u0441\u0442\u044c! \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0439\u043c\u0451\u043c, \u0447\u0442\u043e \u0442\u0430\u043c. \u0412 SDK \u0444\u0430\u0439\u043b\u0430\u0445 \u0441\u0445\u043e\u0434\u0443 \u043d\u0438\u0447\u0435\u0433\u043e \u043f\u0440\u043e \u043d\u0438\u0445 \u043d\u0435\u0442, \u0442\u0430\u043a \u0447\u0442\u043e \u0433\u0440\u0443\u0437\u0438\u043c \u043e\u043f\u044f\u0442\u044c <strong>dotPeek<\/strong> (\u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0443 \u043d\u0430\u0441 \u0432\u0441\u0451 \u0435\u0449\u0435 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u044b \u0441\u0431\u043e\u0440\u043a\u0438) \u0438 \u043f\u043e\u0438\u0449\u0435\u043c (Ctrl+F) \u043f\u043e &#171;extraData&#187;. \u042d\u043c. \u041d\u0438\u0447\u0435\u0433\u043e?<\/p>\n<p>\u0422\u0430\u043a&#8230; \u0410 \u0435\u0441\u043b\u0438 <code>Navigate->Search everywhere<\/code> (Ctrl+T)..? &#171;ZipExtraData&#187; \u0432\u043d\u0443\u0442\u0440\u0438 &#171;SharpZipLib&#187;. \u0422\u043e\u0447\u043d\u043e \u043d\u0435 \u043e\u043d\u043e. \u0421\u0442\u043e\u043e\u043e\u043f&#8230; \u043f\u043e &#171;extra&#187; \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f:<\/p>\n<pre><code>extraInfo in KATSDKInterfaceHelper extraInfoLoco in KATSDKInterfaceHelper extraInfoMini in KATSDKInterfaceHelper ...<\/code><\/pre>\n<p>\u0430\u0433\u0430, \u043d\u0443, \u0447\u0442\u043e \u043f\u043e\u0434\u0435\u043b\u0430\u0442\u044c, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 copy-paste \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e. \u0422\u0430\u043a, \u0432\u043e\u0442 \u044d\u0442\u043e \u0443\u0436\u0435 \u043f\u043e\u0445\u043e\u0436\u0435 \u043d\u0430 \u043f\u0440\u0430\u0432\u0434\u0443:<\/p>\n<pre><code class=\"cs\">    [StructLayout(LayoutKind.Sequential)]     public struct extraInfo     {       [MarshalAs(UnmanagedType.U1)]       public bool isLeftGround;       [MarshalAs(UnmanagedType.U1)]       public bool isRightGround;       [MarshalAs(UnmanagedType.U1)]       public bool isLeftStatic;       [MarshalAs(UnmanagedType.U1)]       public bool isRightStatic;       [MarshalAs(UnmanagedType.U4)]       public int motionType;       public KATSDKInterfaceHelper.Vector3 skatingSpeed;       public KATSDKInterfaceHelper.Vector3 lFootSpeed;       public KATSDKInterfaceHelper.Vector3 rFootSpeed;     }      ...      public static KATSDKInterfaceHelper.extraInfo GetExtraInfoC2(       KATSDKInterfaceHelper.TreadMillData data)     {       GCHandle gcHandle = GCHandle.Alloc((object) data.extraData, GCHandleType.Pinned);       try       {         return (KATSDKInterfaceHelper.extraInfo) Marshal.PtrToStructure(gcHandle.AddrOfPinnedObject(), typeof (KATSDKInterfaceHelper.extraInfo));       }       finally       {         gcHandle.Free();       }     }<\/code><\/pre>\n<p>\u041e\u0442 \u043e\u043d\u043e \u0448\u043e, \u043c\u0430\u0441\u0441\u0438\u0432 <code>extraData<\/code> \u043f\u043e \u0441\u0443\u0442\u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 union \u0438\u0437 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 &#8212; <code>extraInfo<\/code> \/ <code>extraInfoMini<\/code> \/ <code>extraInfoLoco<\/code>, \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0442\u0438\u043f\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u0433\u043e \u043b\u043e\u043a\u043e\u043c\u043e\u0443\u0448\u0435\u043d \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043e\u0442 KAT. \u0421\u0442\u0440\u0430\u043d\u043d\u043e, \u0447\u0442\u043e C2 \u0438 C \u043d\u0435 \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u044b, \u0442\u0430\u043a \u043a\u0430\u043a C \u0431\u0430\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0430 IMU \u0441\u0435\u043d\u0441\u043e\u0440\u0430\u0445, \u0430 C2 &#8212; \u043d\u0430 \u043e\u043f\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445.<\/p>\n<p>\u0418\u0449\u0435\u043c \u043f\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044e&#8230;<\/p>\n<pre><code class=\"cs\">\/\/ ...     if (Home_Form_Walk_C2_Main.objextraInfo.isLeftGround &amp;&amp; ((double) Home_Form_Walk_C2_Main.objextraInfo.lFootSpeed.x != 0.0 || (double) Home_Form_Walk_C2_Main.objextraInfo.lFootSpeed.z != 0.0))     {         float num8 = Home_Form_Walk_C2_Main.objextraInfo.lFootSpeed.x * 3f;         float num9 = Home_Form_Walk_C2_Main.objextraInfo.lFootSpeed.z * 3f;         Home_Form_Walk_C2_Main.LF_Foot.X += num8;         Home_Form_Walk_C2_Main.LF_Foot.Y -= num9;     }     else if (!Home_Form_Walk_C2_Main.objextraInfo.isLeftGround || (double) Home_Form_Walk_C2_Main.objextraInfo.lFootSpeed.x == 0.0 &amp;&amp; (double) Home_Form_Walk_C2_Main.objextraInfo.lFootSpeed.z == 0.0 &amp;&amp; (double) Home_Form_Walk_C2_Main.objextraInfo.lFootSpeed.y == 0.0)     {         Home_Form_Walk_C2_Main.LF_Foot.X = 40f;         Home_Form_Walk_C2_Main.LF_Foot.Y = 40f;     } \/\/ ...<\/code><\/pre>\n<p>\u0410, \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u0434\u043b\u044f C2 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0432 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438 (x\/z), \u0432 \u0444\u043e\u0440\u043c\u0435 \u0434\u0435\u043b\u044c\u0442. \u041f\u0440\u0430\u0432\u0434\u0430, \u043d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u0432 \u043a\u0430\u043a\u0438\u0445 \u0432\u0435\u043b\u0438\u0447\u0438\u043d\u0430\u0445 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438. \u0418 \u0432\u043e\u043e\u0431\u0449\u0435, \u043d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u043e \u043e\u0442\u043a\u0443\u0434\u0430 \u0431\u0435\u0440\u0443\u0442\u0441\u044f \u044d\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0435.<\/p>\n<p>\u0412\u043e\u043e\u0431\u0449\u0435, \u0433\u0435\u0439\u0442\u0432\u0435\u0439 \u0440\u0438\u0441\u0443\u0435\u0442 \u0442\u0435 \u0436\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u0447\u0442\u043e \u043e\u0442\u0434\u0430\u0451\u0442 \u0442\u043e\u0442 \u0441\u0430\u043c\u044b\u0439 <code>KATNativeSDK.dll<\/code>. \u0422\u0430\u043a, \u0430 \u0433\u0434\u0435 \u043e\u043d\u0438 \u0445 \u0431\u0435\u0440\u0451\u0442? \u0413\u0440\u0443\u0437\u0438\u043c \u0435\u0451 \u0432 IDA, \u0438\u0434\u0451\u043c \u0432 <code>GetWalkStatus<\/code>&#8230;<\/p>\n<pre><code class=\"cpp\">    strcpy((char *)Buf1, \"KAT_SHARED_MEM_\"); \/\/ ...<\/code><\/pre>\n<p>\u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435. \u041e\u043a\u0435\u0439, \u0442\u043e \u0435\u0441\u0442\u044c \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\/\u043f\u043e\u0442\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0447\u0438\u0442\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435, \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 (\u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0438\u0437 \u0434\u0432\u0443\u0445 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0435\u0439 \u043d\u043e\u0433 \u043d\u0430\u0434\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043e\u0434\u043d\u0443 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0442\u0443\u0448\u043a\u0438) \u0438 \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442 \u0432 \u043e\u0431\u0449\u0435\u0435 \u043c\u0435\u0441\u0442\u043e. SDK\/\u043a\u043b\u0438\u0435\u043d\u0442\u044b\/\u0438\u0433\u0440\u044b \u0431\u0435\u0440\u0443\u0442 \u043a\u043e\u0433\u0434\u0430 \u0438\u043c \u043d\u0430\u0434\u043e (\u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e &#8212; \u043a\u0430\u0436\u0434\u044b\u0439 \u043a\u0430\u0434\u0440) \u043e\u0442\u0442\u0443\u0434\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435.<\/p>\n<p>\u0427\u0442\u043e \u0436, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0437\u0431\u0430\u0432\u0438\u0442\u044c\u0441\u044f \u043e\u0442 KATNativeSDK.dll \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e&#8230; \u0418\u0437 \u0433\u0435\u0439\u0442\u0432\u0435\u044f, \u0442\u0435\u043c \u0436\u0435 \u043f\u0443\u0442\u0451\u043c. \u041d\u0435\u0442.<\/p>\n<figure class=\"\">\n<div><figcaption>We need to go deeper!<\/figcaption><\/div>\n<\/figure>\n<h2>\u041a\u0430\u043a \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e<\/h2>\n<p>\u0427\u0442\u043e \u0436, \u043f\u043e\u0440\u0430 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0447\u0442\u043e \u0436\u0435 \u0443 \u043d\u0435\u0435 \u0443\u043d\u0443\u0442\u0440\u0435. \u0412\u043e\u0437\u044c\u043c\u0451\u043c \u0441\u0442\u0430\u0440\u044b\u0439 \u0434\u043e\u0431\u0440\u044b\u0439 <a href=\"https:\/\/www.uwe-sieber.de\/usbtreeview_e.html\" rel=\"noopener noreferrer nofollow\">USBTreeView<\/a> (\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443 \u043c\u0435\u043d\u044f \u043b\u0435\u0436\u0438\u0442 \u0432 <code>C:\\Games\\<\/code>, \u043c\u043d\u0434\u0430) \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0447\u0442\u043e \u0438\u0437 \u0441\u0435\u0431\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e&#8230; \u0412\u0438\u0434\u0438\u043c \u0434\u0432\u0430 KAT \u0434\u0435\u0432\u0430\u0439\u0441\u0430.<\/p>\n<p>\u041e\u0434\u0438\u043d <code>KATVR walk c2 position - HID<\/code>, \u0432\u0442\u043e\u0440\u043e\u0439 <code>KATVR walk c2 receiver - HID<\/code>. \u041c\u0435\u0442\u043e\u0434\u043e\u043c \u0432\u044b\u0434\u0435\u0440\u0433\u0438\u0432\u0430\u043d\u0438\u044f USB \u043a\u0430\u0431\u0435\u043b\u044f \u0432\u044b\u044f\u0441\u043d\u044f\u0435\u043c, \u0447\u0442\u043e \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430 \u044d\u0442\u043e <code>KATVR walk c2 receiver<\/code>. \u0410, \u0434\u0430, \u0435\u0441\u0442\u044c \u0436\u0435 \u0435\u0449\u0435 \u0441\u0432\u0438\u0441\u0442\u043e\u043a \u0434\u043b\u044f \u0441\u0432\u044f\u0437\u0438 \u0441 \u0441\u0438\u0434\u0435\u043d\u044c\u0435\u043c \u043d\u0430 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435 &#8212; \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u044d\u0442\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u0438\u0437 \u043d\u0438\u0445.<\/p>\n<p>\u0427\u0442\u043e \u0436 receiver \u0438\u0437 \u0441\u0435\u0431\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442?<\/p>\n<pre><code>      ========================== Summary ========================= Vendor ID                : 0xC4F4 (Unknown Vendor) Product ID               : 0x2F37 USB Version              : 1.0 Port maximum Speed       : High-Speed Device maximum Speed     : Full-Speed Device Connection Speed  : Full-Speed Self powered             : no Demanded Current         : 160 mA Used Endpoints           : 3        ======================== USB Device ========================          +++++++++++++++++ Device Information ++++++++++++++++++ ...  Child Device 1          : HID-compliant vendor-defined device ...         ---------------- Connection Information --------------- Connection Index         : 0x01 (Port 1) Connection Status        : 0x01 (DeviceConnected) Current Config Value     : 0x01 (Configuration 1) Device Address           : 0x3D (61) Is Hub                   : 0x00 (no) Device Bus Speed         : 0x01 (Full-Speed) Number Of Open Pipes     : 0x02 (2 pipes to data endpoints) Pipe[0]                  : EndpointID=2  Direction=IN   ScheduleOffset=0  Type=Interrupt  wMaxPacketSize=0x20    bInterval=1   -> 420 Bits\/ms = 52500 Bytes\/s Pipe[1]                  : EndpointID=2  Direction=OUT  ScheduleOffset=0  Type=Interrupt  wMaxPacketSize=0x20    bInterval=1   -> 420 Bits\/ms = 52500 Bytes\/s  ...          ------------------- HID Descriptor -------------------- bLength                  : 0x09 (9 bytes) bDescriptorType          : 0x21 (HID Descriptor) bcdHID                   : 0x0100 (HID Version 1.00) bCountryCode             : 0x00 (00 = not localized) bNumDescriptors          : 0x01 Data (HexDump)           : 09 21 00 01 00 01 22 25 00                        .!....\"%. Descriptor 1: bDescriptorType          : 0x22 (Class=Report) wDescriptorLength        : 0x0025 (37 bytes) ....<\/code><\/pre>\n<p>\u0410\u0433\u0430, \u0438\u0442\u043e\u0433\u043e \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435\u0447\u0442\u043e, \u0438\u043c\u0435\u043d\u0443\u044e\u0449\u0435\u0435 \u0441\u0435\u0431\u044f HID \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e\u043c (\u0447\u0442\u043e\u0431 \u043d\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u0442\u044c \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u043e\u0432 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435), \u0441 \u0434\u0432\u0443\u043c\u044f \u0442\u0440\u0443\u0431\u0430\u043c\u0438 &#8212; \u0442\u0443\u0434\u0430 \u0438 \u043e\u0431\u0440\u0430\u0442\u043d\u043e. \u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e USB2 (\u0438 \u0437\u0430\u0447\u0435\u043c \u044f \u043f\u043e\u043a\u0443\u043f\u0430\u043b USB3 \u0443\u0434\u043b\u0438\u043d\u0438\u0442\u0435\u043b\u044c, \u043a\u0430\u043a \u0431\u044b\u043b\u043e \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u043e\u0432\u0430\u043d\u043e?), \u0438 \u043d\u0435 \u043f\u0440\u0438\u043a\u0438\u0434\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0438\u043a\u0435\u043c \u043e\u0441\u043e\u0431\u043e &#8212; \u043f\u0440\u043e\u0441\u0442\u043e vendor-defined device.<\/p>\n<p>\u041b\u0430\u0434\u043d\u043e, \u0437\u043d\u0430\u0447\u0438\u0442, \u044d\u0442\u043e \u0438 \u043d\u0435 \u043c\u044b\u0448\u044c \u0438 \u043d\u0435 \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u0430 \u0438 \u043d\u0435 \u0434\u0436\u043e\u0439\u0441\u0442\u0438\u043a, \u0437\u043d\u0430\u0447\u0438\u0442, \u0431\u0443\u0434\u0435\u043c \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c.<\/p>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u0439 \u0448\u0430\u0433 &#8212; \u0431\u0435\u0440\u0451\u043c <a href=\"https:\/\/www.wireshark.org\/\" rel=\"noopener noreferrer nofollow\"><strong>Wireshark<\/strong><\/a> \u0438 \u0441\u0442\u0430\u0432\u0438\u043c \u0435\u0433\u043e \u0441\u043e \u0432\u0441\u0435\u043c \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u043c, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e &#8212; <strong>USBPcap<\/strong>.<\/p>\n<p>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c, \u0432\u0438\u0434\u0438\u043c \u0430\u0436 \u043f\u044f\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0445 USBPcap \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 (\u043f\u043e \u0447\u0438\u0441\u043b\u0443 \u043a\u043e\u0440\u043d\u0435\u0432\u044b\u0445 \u0445\u043e\u0441\u0442-\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u0432 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435). \u041d\u0443&#8230; \u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 &#8212; \u0431\u0435\u0440\u0451\u043c \u043f\u0435\u0440\u0432\u044b\u0439, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c, \u0432\u0442\u044b\u043a\u0430\u0435\u043c \u043f\u0440\u043e\u0432\u043e\u0434, \u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0435\u0441\u0442\u044c \u0447\u0442\u043e \u0438\u043b\u0438 \u043d\u0435\u0442. \u041d\u0430\u0445\u043e\u0434\u0438\u043c \u0442\u043e\u0442, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0435\u0441\u0442\u044c \u0440\u0435\u0430\u043a\u0446\u0438\u044f. \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0433\u0435\u0439\u0442\u0432\u0435\u0439, \u0436\u0434\u0451\u043c \u043f\u043e\u043a\u0430 \u0432\u0441\u0451 \u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u0441\u044f. \u041d\u0435\u043c\u043d\u043e\u0433\u043e \u043a\u0440\u0443\u0442\u0438\u043c \u0441\u043f\u0438\u043d\u0443, \u0432\u043e\u0437\u0438\u043c \u0442\u0430\u043f\u043a\u0430\u043c\u0438 \u043f\u043e \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435, \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0437\u0430\u043f\u0438\u0441\u044c.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0434\u043e \u0431\u044b \u043e\u0442\u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0451, \u043d\u0430\u0441 \u043d\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0449\u0435\u0435. \u0423 \u043c\u0435\u043d\u044f \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0449\u0438\u0435 \u043f\u0430\u043a\u0435\u0442\u044b \u0448\u043b\u0438 \u0441 \u0430\u0434\u0440\u0435\u0441\u043e\u043c 5.9.0, \u0437\u043d\u0430\u0447\u0438\u0442 \u0444\u0438\u043b\u044c\u0442\u0440 <code>usb.addr == \"5.9.0\"<\/code>. \u0425\u043c. \u041d\u0438\u0447\u0435\u0433\u043e \u043a\u0440\u043e\u043c\u0435 DESCRIPTOR \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u043d\u0435 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c. \u042d&#8230; \u041e\u0439. \u0422\u043e\u0447\u043d\u043e! \u041d\u0430\u0441 \u0436\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0442 \u0432\u0441\u0435 endpoint&#8217;\u044b, \u043c\u0435\u043d\u044f\u0435\u043c \u0444\u0438\u043b\u044c\u0442\u0440 \u043d\u0430 <code>usb.addr ~ \"5.9.\"<\/code>.  \u0412\u043e\u0442! \u0422\u0435\u043f\u0435\u0440\u044c \u043b\u0443\u0447\u0448\u0435.<\/p>\n<p><code>GET DESCRIPTOR<\/code>, <code>SET CONFIGURATION<\/code> \u043f\u0430\u043a\u0435\u0442\u044b \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b&#8230; \u041e! <code>URB_INTERRUPT out<\/code>:<\/p>\n<figure class=\"full-width\"><\/figure>\n<p>\u0415\u0449\u0435 \u043d\u0438\u0436\u0435 &#8212; \u0432 \u043f\u0430\u0440\u0435 \u0441 \u043d\u0438\u043c \u0435\u0449\u0435 \u0438 <code>URB_INTERRUPT in<\/code>. \u0422\u0430\u043a, \u043d\u0430\u0434\u043e \u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u044d\u0442\u043e \u043a\u0430\u043a-\u0442\u043e \u0443\u0434\u043e\u0431\u043d\u0435\u0435. \u0412\u044b\u0434\u0435\u043b\u044f\u0435\u043c &#171;HID Data&#187; \u0432 \u043e\u0431\u0437\u043e\u0440\u0435 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0432\u043d\u0438\u0437\u0443, \u043f\u0440\u0430\u0432\u043e\u0439 \u043a\u043d\u043e\u043f\u043a\u043e\u0439 => &#171;Apply as Column&#187;, \u0438 \u043f\u043e\u0434\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u0435\u043c \u0435\u0433\u043e \u043a \u043d\u0430\u0447\u0430\u043b\u0443, \u0444\u0438\u043b\u044c\u0442\u0440\u0443\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u043a\u0430\u043d\u0430\u043b \u0434\u0430\u043d\u043d\u044b\u0445 (\u0430\u0434\u0440\u0435\u0441 5.9.2)&#8230; \u041a\u0440\u0430\u0441\u043e\u0442\u0430!<\/p>\n<figure class=\"full-width\"><\/figure>\n<p>\u0418\u0442\u043e\u0433\u043e. \u0412\u0441\u0435 \u043f\u0430\u043a\u0435\u0442\u044b \u0447\u0442\u043e \u0432\u0438\u0434\u0438\u043c &#8212; \u043e\u0434\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430, 59 \u0431\u0430\u0439\u0442, \u0432\u0441\u0435 USB_INTERRUPT \u0432 \u043e\u0431\u0435 \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u0441 32 \u0431\u0430\u0439\u0442\u0430 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<p>\u041d\u0435\u0432\u043e\u043e\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u043c \u0433\u043b\u0430\u0437\u043e\u043c \u0432\u0438\u0434\u043d\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043f\u0430\u043a\u0435\u0442\u0430:<\/p>\n<pre><code>[1F] [55] [AA] [00] [00] ...<\/code><\/pre>\n<p>\u041d\u0438\u0447\u0435\u0433\u043e \u043f\u043e\u0445\u043e\u0436\u0435\u0433\u043e \u043d\u0430 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u0443\u044e \u0441\u0443\u043c\u043c\u0443 \u043d\u0435 \u0432\u0438\u0434\u0430\u0442\u044c. \u0412\u043f\u0440\u043e\u0447\u0435\u043c, USB \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442 \u043d\u0430\u043c \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0443 \u0434\u043b\u044f USB Interrupt, \u0438 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435. \u0422\u0430\u043a \u0447\u0442\u043e \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u0438 \u043d\u0435 \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u0430.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0435\u0449\u0435 \u0440\u0430\u0437 \u043f\u0440\u0438\u0441\u0442\u0430\u043b\u044c\u043d\u043e \u043d\u0430 \u043f\u0430\u043a\u0435\u0442\u044b:<\/p>\n<pre><code>(out) [1F] [55] [AA] [00] [00] [31] [ \u043d\u0443\u043b\u0438 ] (in) \u0442\u0438\u0448\u0438\u043d\u0430  (out) [1F] [55] [AA] [00] [00] [05] [ \u043d\u0443\u043b\u0438 ] (in) [1F] [55] [AA] [00] [00] [05] [00] [03] [ \u043d\u0443\u043b\u0438 ]  (out) [1F] [55] [AA] [00] [00] [21] [ \u043d\u0443\u043b\u0438 ] (in) [1f] [55] [AA] [00] [00] [21] [00] [03] [ca] [f8] ... (\u0438 \u0435\u0449\u0435 \u043c\u043d\u043e\u0433\u043e)  (out) [1F] [55] [AA] [00] [00] [A0] [00] [02] [ \u043d\u0443\u043b\u0438 ] (in) \u0442\u0438\u0448\u0438\u043d\u0430  (out) [1F] [55] [AA] [00] [00] [31] [ \u043d\u0443\u043b\u0438 ] (in) \u0442\u0438\u0448\u0438\u043d\u0430  (out) [1F] [55] [AA] [00] [00] [30] [ \u043d\u0443\u043b\u0438 ] (in) \u0442\u0438\u0448\u0438\u043d\u0430  (out) [1F] [55] [AA] [00] [00] [30] [ \u043d\u0443\u043b\u0438 ] (in) \u0442\u0438\u0448\u0438\u043d\u0430  (out) [1F] [55] [AA] [00] [00] [30] [ \u043d\u0443\u043b\u0438 ] (in) [1F]<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-370405","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/370405","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=370405"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/370405\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=370405"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=370405"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=370405"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}