Как да генерирам персонализирани 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 съобщенията.