Как да генерирам персонализирани MTP event-и от Андроид устройство и да ги хвана в Windows?

+4 гласа
85 прегледа
попитан 2016 април 20 в .NET от Nikoleta.V. (4,090 точки)

Как да генерирам персонализирани MTP event-и от Андроид устройство и да ги хвана в Windows 

Какво искам да направя: 

  • Да генерирам персонализирани event-и от Responder-а(Beaglebone Black с андроид) и да получа известие за това в инициатора 

Какво използвам: 

  • Инициатор- C# .Net приложение на Windows 7 с portabledeviceapilib.dll (COM interop) библиотека. 
  • Тестов Responder 1- MTP Simulator 3.0 на Microsoft 
  • Тестов Responder 2- Beaglebone Black с Android Jelly Bean 4.1.1 

Какво подкарах досега: 

Имам успешна комуникация между инициатора и Responder-а. Мога да изпращам MTP команди и да получавам MTP  отговори. Също така успешно получавам стандартни известия за event-и от responder-а 

Какъв е проблемът: 

Не виждам кодовете на MTP event-ите в USB пакетите,идващи от Андроид, дори когато тези event-и са изпратени и получени успешно от инициатора. Когато променя стандартните кодове за event-и в персонализирани кодове, пак получавам подходящото съобщение. 

Какво направих досега 

От страната на responder-а, когато разглеждах сорс кода на Андроида, намерих MTP event кодовете дефинирани в /frameworks/av/media/mtp/mtp.h. 

Това са кодовете за добавяне/премахване на обект 

#define MTP_EVENT_OBJECT_ADDED                      0x4002 

#define MTP_EVENT_OBJECT_REMOVED                    0x4003 

Те са дефинирани в спецификацията на MTP. 

За да се абонирам към event-ите от страна на инициатора, следвам насоките от тази статия : 

https://blogs.msdn.microsoft.com/dimeby8/2006/10/06/listening-to-mtp-events/ 

Изполвам GUID за event-ите от константите показани тук: 

https://code.google.com/archive/p/gzune/source 

Когато се добави или премахне файл от устройството се пуска MTP event известие, което инициатора получава и то свързва eventID-то с една от константите. Доколкото разбирам, първите 4 байта от GUID-а съответстват на eventID-то. 

Това са GUID-ите на event за добавен/премахнат файл: 

public static Guid WPD_EVENT_OBJECT_ADDED  = new Guid( 0xA726DA95, 0xE207, 0x4B02, 0x8D, 0x44, 0xBE, 0xF2, 0xE8, 0x6C, 0xBF, 0xFC  );         

public static Guid WPD_EVENT_OBJECT_REMOVED  = new Guid( 0xBE82AB88, 0xA52C, 0x4823, 0x96, 0xE5, 0xD0, 0x27, 0x26, 0x71, 0xFC, 0x38  ); 

Тестването ми е състоеше в добавяне и премахване на файлове от устройството. 

Докато ползвах симулатора, инициатора успешно получаваше известията и те правилно свързваха с правилните WPD event-и. И потвърдих, че кодовете на event-ите се показват в USB пакетите. 

Когато използвам Андроид устройството, инициатора успешно получава известията и те правилно свързват с правилните WPD event-и. Обаче, не виждам кодовете на event-ите никъде в USB пакетите. 

Не разбирам как COM interop библиотеката успешно известява за event-и, дори и без да се показват MTP event кодовете. 

Тъй като не мога да видя тези кодове в пакетите, не мога да тествам изпращането на персонализирани кодове от устройството към инициатора. 

Накратко казано, когато използвам Андроинд не виждам MTP event кодовете в USB съобщенията, и все пак инициатора по някакъв начин получава известията успешно. Когато използвам MTP симулатора, виждам тези кодове в USB съобщенията. 

1 отговор

0 гласа
отговорени 2016 април 21 от valeri.hristov (7,340 точки)
Доколкото знам, когато се използва LIBMTP на операционната система, добавяне и премахване на обекти от устройството не генерира MTP event, който се изпраща от устройството до компютъра. Това е защото компютъра вече знае,че обектът е добавен/премахнат и би било излишно да се получава отговор „успешно добавен/премахнат обект“. Това обяснява защо не си видял нищо през USB-то. Просто не е имало какво да видиш.
коментиран 2016 април 27 от Nikoleta.V. (4,090 точки)
Благодаря за отговора :)
...