Smartfon z Androidem pod linux'em (MTP/PTP)
Spis treści
Wpadł mi w łapki smartfon Neffos C5 od TP-LINK, który ma
na pokładzie Androida. Chciałem nim zrobić parę fotek, tylko pojawił się problem uzyskania dostępu
do zasobów tego telefonu. Samo urządzenie pod linux'em identyfikowane jest jako idVendor=2357
oraz
idProduct=0314
ale po jego podłączeniu do portu USB komputera nie pojawiły się żadne nowe dyski,
które można by przejrzeć w celu zgania ich zawartości. Problem tkwił w konfiguracji mojego Debiana,
w którym to brakowało obsługi protokołu MTP. Po chwili rozgryzłem tę zagadkę instalując w systemie
pakiet jmtpfs
, co umożliwiło interakcję z systemem plików telefonu i zgranie zrobionych zdjęć.
USB Mass Storage i protokół MTP/PTP
W przypadku starszych telefonów i smartfonów była wykorzystywana pamięć masowa USB (USB Mass Storage) w celu przesyłania plików z i do komputera. Problem z tym rozwiązaniem był taki, że tylko jedno urządzenie mogło z tej pamięci korzystać w danym czasie. W efekcie, gdy podłączaliśmy telefon do komputera, to linux operował na zasobach urządzenia i nie mogliśmy z nimi wejść w interakcję z poziomu telefonu. Obecnie smartfony korzystają z protokółu MTP (Media Transfer Protocol) lub PTP (Picture Transfer Protocol).
Jako, że MTP operuje na poziomie plików, to nie ma potrzeby wyłączności w dostępie do zasobów. System operacyjny komputera zwyczajnie wysyła żądania do smartfona z prośbą o konkretny plik. Po zaakceptowaniu takiej prośby, plik jest przesyłany i zapisywany na dysku naszego komputera. Podobnie w drugą stronę, gdzie to nasz linux chce przesłać plik na telefon, z tym, że wtedy to system telefonu (w tym przypadku Android) decyduje, czy odebrać taki plik i gdzie go zapisać. Jeśli zaś chcemy skasować plik z telefonu, to wysyłamy jedynie prosty sygnał, który Android interpretuje jako "skasuj plik xyz" i plik ulega skasowaniu.
By wiedzieć, jakimi plikami dysponuje smartfon, po podłączeniu go do komputera jest przesyłana lista wszystkich udostępniony przez telefon plików i katalogów. Trzeba jednak pamiętać, że część plików/katalogów może być przed nami ukryta i w efekcie ich nie zobaczymy na liście. Podobnie może być z prawami do modyfikacji konkretnych plików i tak dla przykładu nie wszystkie z nich będziemy w stanie skasować czy poddać edycji.
Niewątpliwą zaletą protokołu MTP jest wyeliminowanie potrzeby wspierania systemu plików przez systemy operacyjne. Chodzi o to, że pamięć masowa USB wymaga od naszego linux'a, by ten wpierał system plików, który na takim urządzeniu się znajduje. W przypadku, gdy nasz OS nie wspiera takiego systemu plików, to nie może wejść z nim w interakcję. Dlatego z reguły na pendrive czy innych pamięciach flash wykorzystuje się dość ograniczony system plików FAT, bo jest on wspierany przez wszystkie systemy operacyjne.
W przypadku smartfonów, gdzie rozmiary kart SD i pamięci telefonu mogą iść już w setki GiB, trzeba korzystać z innego systemu plików, np. EXT4, czy NTFS. Z tym, że znowu wybór każdego z tych systemów plików będzie powodował problemy czy to pod windowsem, czy też pod linux'em. Protokół MTP uwalnia nas od potrzeby wspierania systemu plików smartfona, z którym zamierzamy wymieniać dane, mniej więcej na takiej samej zasadzie jak odbywa się nasza komunikacja z serwerami HTTP czy FTP.
Brak zasobów smartfona pod linux'em
W opcjach Androida możemy sobie wybrać czy zamierzamy korzystać z protokołu MTP czy też i PTP. W tym celu wystarczy podłączyć smartfon do portu USB komputera. Na ekranie smartfona powinna nam się pojawić poniższa wiadomość:
Jak widzimy wyżej, jeśli nasz komputer nie wspiera protokołu MTP, to wybieramy PTP. Linux'y na szczęście nie mają problemów z protokołem MTP i dlatego to on został wyżej zaznaczony.
Po podłączeniu smartfona do portu USB, za wiele w logu systemowym nie zobaczymy. Mi pojawiły się jedynie te poniższe komunikaty:
kernel: usb 2-1.3: new high-speed USB device number 69 using ehci-pci
kernel: usb 2-1.3: New USB device found, idVendor=2357, idProduct=0314
kernel: usb 2-1.3: New USB device strings: Mfr=2, Product=3, SerialNumber=4
kernel: usb 2-1.3: Product: Neffos
kernel: usb 2-1.3: Manufacturer: TP-LINK
kernel: usb 2-1.3: SerialNumber: TSL7DA69OBSO49PJ
Niemniej jednak, gdy rzucimy okiem bezpośrednio na to urządzenie przez lsusb
, to już mamy tam
informację o jakimś interfejsie MTP:
# lsusb -vvv -d 2357:0314
Bus 002 Device 069: ID 2357:0314
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 2.00
bDeviceClass 0 (Defined at Interface level)
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 64
idVendor 0x2357
idProduct 0x0314
bcdDevice ff.ff
iManufacturer 2 TP-LINK
iProduct 3 Neffos
iSerial 4 TSL7DA69OBSO49PJ
bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 39
bNumInterfaces 1
bConfigurationValue 1
iConfiguration 0
bmAttributes 0xc0
Self Powered
MaxPower 500mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 3
bInterfaceClass 255 Vendor Specific Class
bInterfaceSubClass 255 Vendor Specific Subclass
bInterfaceProtocol 0
iInterface 17 MTP
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x81 EP 1 IN
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0200 1x 512 bytes
bInterval 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x01 EP 1 OUT
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0200 1x 512 bytes
bInterval 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x82 EP 2 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x001c 1x 28 bytes
bInterval 6
Device Qualifier (for other device speed):
bLength 10
bDescriptorType 6
bcdUSB 2.00
bDeviceClass 0 (Defined at Interface level)
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 64
bNumConfigurations 1
Device Status: 0x0001
Self Powered
Zatem smartfon chce komunikować się z naszym linux'em za pomocą protokołu MTP, z tym, że ten system jeszcze nie ma zaimplementowanej obsługi tego protokołu (brak odpowiednich pakietów).
Wsparcie Debiana dla protokołu MTP (libmtp9 i mtp-tools)
Jest sporo narzędzi, które umożliwiają linux'om operowanie na
protokole MTP. Jeśli nie korzystamy z żadnych środowisk graficznych, to jest niemal pewne, że nie
mamy w systemie wymaganych pakietów. W Debianie, wsparcie dla tego protokołu jest dostarczane z
pakietem libmtp9
. Do tego są również narzędzia zawarte w pakiecie mtp-tools
. W zasadzie to te
pakiety wystarczą, by możliwa była interakcja z telefonem.
Po instalacji ww. pakietów, w systemie będziemy mieli dostęp do szeregu poleceń mtp-*
. Teraz
wystarcz podpiąć telefon do portu USB i wpisać w terminalu mtp-detect
:
$ mtp-detect
libmtp version: 1.1.12
Listing raw device(s)
Device 0 (VID=2357 and PID=0314) is UNKNOWN in libmtp v1.1.12.
Please report this VID/PID and the device model to the libmtp development team
Found 1 device(s):
2357:0314 @ bus 2, dev 69
Attempting to connect device(s)
Android device detected, assigning default bug flags
USB low-level info:
bcdUSB: 512
bDeviceClass: 0
bDeviceSubClass: 0
bDeviceProtocol: 0
idVendor: 2357
idProduct: 0314
IN endpoint maxpacket: 512 bytes
OUT endpoint maxpacket: 512 bytes
Raw device info:
Bus location: 2
Device number: 69
Device entry info:
Vendor: (null)
Vendor id: 0x2357
Product: (null)
Vendor id: 0x0314
Device flags: 0x18008106
Configuration 0, interface 0, altsetting 0:
Interface description contains the string "MTP"
Device recognized as MTP, no further probing.
Device info:
Manufacturer: TP-LINK
Model: Neffos C5
Device version: 1.0
Serial number: TSL7DA69OBSO49PJ
Vendor extension ID: 0x00000006
Vendor extension description: microsoft.com: 1.0; android.com: 1.0;
Detected object size: 64 bits
Extensions:
microsoft.com: 1.0
android.com: 1.0
Supported operations:
1001: Unknown(1001)
1002: Unknown(1002)
1003: Unknown(1003)
1004: Unknown(1004)
1005: Unknown(1005)
1006: Unknown(1006)
1007: Unknown(1007)
1008: Unknown(1008)
1009: Unknown(1009)
100a: Unknown(100a)
100b: Unknown(100b)
100c: Unknown(100c)
100d: Unknown(100d)
1014: Unknown(1014)
1015: Unknown(1015)
1016: Unknown(1016)
1017: Unknown(1017)
101b: Unknown(101b)
9801: Unknown(9801)
9802: Unknown(9802)
9803: Unknown(9803)
9804: Unknown(9804)
9805: Unknown(9805)
9810: Unknown(9810)
9811: Unknown(9811)
95c1: Unknown(95c1)
95c2: Unknown(95c2)
95c3: Unknown(95c3)
95c4: Unknown(95c4)
95c5: Unknown(95c5)
Events supported:
0x4002
0x4003
0x4004
0x4005
0x4006
0x4007
0x400c
Device Properties Supported:
0xd401: Synchronization Partner
0xd402: Friendly Device Name
0x5003: Image Size
0x5001: Battery Level
Playable File (Object) Types and Object Properties Supported:
3000: Undefined Type
dc01: Storage ID UINT32 data type ANY 32BIT VALUE form READ ONLY
dc02: Object Format UINT16 data type ANY 16BIT VALUE form READ ONLY
dc03: Protection Status UINT16 data type ANY 16BIT VALUE form READ ONLY
dc04: Object Size UINT64 data type READ ONLY
dc07: Object File Name STRING data type GET/SET
dc09: Date Modified STRING data type DATETIME FORM READ ONLY
dc0b: Parent Object UINT32 data type ANY 32BIT VALUE form READ ONLY
dc41: Persistant Unique Object Identifier UINT128 data type READ ONLY
dc44: Name STRING data type READ ONLY
dce0: Display Name STRING data type READ ONLY
dc4e: Date Added STRING data type DATETIME FORM READ ONLY
3001: Association/Directory
dc01: Storage ID UINT32 data type ANY 32BIT VALUE form READ ONLY
dc02: Object Format UINT16 data type ANY 16BIT VALUE form READ ONLY
dc03: Protection Status UINT16 data type ANY 16BIT VALUE form READ ONLY
dc04: Object Size UINT64 data type READ ONLY
dc07: Object File Name STRING data type GET/SET
dc09: Date Modified STRING data type DATETIME FORM READ ONLY
dc0b: Parent Object UINT32 data type ANY 32BIT VALUE form READ ONLY
dc41: Persistant Unique Object Identifier UINT128 data type READ ONLY
dc44: Name STRING data type READ ONLY
dce0: Display Name STRING data type READ ONLY
dc4e: Date Added STRING data type DATETIME FORM READ ONLY
3004: Text
dc01: Storage ID UINT32 data type ANY 32BIT VALUE form READ ONLY
dc02: Object Format UINT16 data type ANY 16BIT VALUE form READ ONLY
dc03: Protection Status UINT16 data type ANY 16BIT VALUE form READ ONLY
dc04: Object Size UINT64 data type READ ONLY
dc07: Object File Name STRING data type GET/SET
dc09: Date Modified STRING data type DATETIME FORM READ ONLY
dc0b: Parent Object UINT32 data type ANY 32BIT VALUE form READ ONLY
dc41: Persistant Unique Object Identifier UINT128 data type READ ONLY
dc44: Name STRING data type READ ONLY
dce0: Display Name STRING data type READ ONLY
dc4e: Date Added STRING data type DATETIME FORM READ ONLY
3005: HTML
dc01: Storage ID UINT32 data type ANY 32BIT VALUE form READ ONLY
dc02: Object Format UINT16 data type ANY 16BIT VALUE form READ ONLY
dc03: Protection Status UINT16 data type ANY 16BIT VALUE form READ ONLY
dc04: Object Size UINT64 data type READ ONLY
dc07: Object File Name STRING data type GET/SET
dc09: Date Modified STRING data type DATETIME FORM READ ONLY
dc0b: Parent Object UINT32 data type ANY 32BIT VALUE form READ ONLY
dc41: Persistant Unique Object Identifier UINT128 data type READ ONLY
dc44: Name STRING data type READ ONLY
dce0: Display Name STRING data type READ ONLY
dc4e: Date Added STRING data type DATETIME FORM READ ONLY
3008: MS Wave
dc01: Storage ID UINT32 data type ANY 32BIT VALUE form READ ONLY
dc02: Object Format UINT16 data type ANY 16BIT VALUE form READ ONLY
dc03: Protection Status UINT16 data type ANY 16BIT VALUE form READ ONLY
dc04: Object Size UINT64 data type READ ONLY
dc07: Object File Name STRING data type GET/SET
dc09: Date Modified STRING data type DATETIME FORM READ ONLY
dc0b: Parent Object UINT32 data type ANY 32BIT VALUE form READ ONLY
dc41: Persistant Unique Object Identifier UINT128 data type READ ONLY
dc44: Name STRING data type READ ONLY
dce0: Display Name STRING data type READ ONLY
dc4e: Date Added STRING data type DATETIME FORM READ ONLY
dc46: Artist STRING data type READ ONLY
dc9a: Album Name STRING data type READ ONLY
dc9b: Album Artist STRING data type READ ONLY
dc8b: Track UINT16 data type ANY 16BIT VALUE form READ ONLY
dc99: Original Release Date STRING data type DATETIME FORM READ ONLY
dc89: Duration UINT32 data type ANY 32BIT VALUE form READ ONLY
dc8c: Genre STRING data type READ ONLY
dc96: Composer STRING data type READ ONLY
de99: Audio WAVE Codec UINT32 data type ANY 32BIT VALUE form READ ONLY
de92: Bit Rate Type UINT16 data type enumeration: 1, 2, READ ONLY
de9a: Audio Bit Rate UINT32 data type range: MIN 1, MAX 1536000, STEP 1 READ ONLY
de94: Number Of Channels UINT16 data type enumeration: 1, 2, 3, 4, 5, 6, 7, 8, 9, READ ONLY
de93: Sample Rate UINT32 data type range: MIN 8000, MAX 48000, STEP 1 READ ONLY
3009: MP3
dc01: Storage ID UINT32 data type ANY 32BIT VALUE form READ ONLY
dc02: Object Format UINT16 data type ANY 16BIT VALUE form READ ONLY
dc03: Protection Status UINT16 data type ANY 16BIT VALUE form READ ONLY
dc04: Object Size UINT64 data type READ ONLY
dc07: Object File Name STRING data type GET/SET
dc09: Date Modified STRING data type DATETIME FORM READ ONLY
dc0b: Parent Object UINT32 data type ANY 32BIT VALUE form READ ONLY
dc41: Persistant Unique Object Identifier UINT128 data type READ ONLY
dc44: Name STRING data type READ ONLY
dce0: Display Name STRING data type READ ONLY
dc4e: Date Added STRING data type DATETIME FORM READ ONLY
dc46: Artist STRING data type READ ONLY
dc9a: Album Name STRING data type READ ONLY
dc9b: Album Artist STRING data type READ ONLY
dc8b: Track UINT16 data type ANY 16BIT VALUE form READ ONLY
dc99: Original Release Date STRING data type DATETIME FORM READ ONLY
dc89: Duration UINT32 data type ANY 32BIT VALUE form READ ONLY
dc8c: Genre STRING data type READ ONLY
dc96: Composer STRING data type READ ONLY
de99: Audio WAVE Codec UINT32 data type ANY 32BIT VALUE form READ ONLY
de92: Bit Rate Type UINT16 data type enumeration: 1, 2, READ ONLY
de9a: Audio Bit Rate UINT32 data type range: MIN 1, MAX 1536000, STEP 1 READ ONLY
de94: Number Of Channels UINT16 data type enumeration: 1, 2, 3, 4, 5, 6, 7, 8, 9, READ ONLY
de93: Sample Rate UINT32 data type range: MIN 8000, MAX 48000, STEP 1 READ ONLY
300b: MPEG
dc01: Storage ID UINT32 data type ANY 32BIT VALUE form READ ONLY
dc02: Object Format UINT16 data type ANY 16BIT VALUE form READ ONLY
dc03: Protection Status UINT16 data type ANY 16BIT VALUE form READ ONLY
dc04: Object Size UINT64 data type READ ONLY
dc07: Object File Name STRING data type GET/SET
dc09: Date Modified STRING data type DATETIME FORM READ ONLY
dc0b: Parent Object UINT32 data type ANY 32BIT VALUE form READ ONLY
dc41: Persistant Unique Object Identifier UINT128 data type READ ONLY
dc44: Name STRING data type READ ONLY
dce0: Display Name STRING data type READ ONLY
dc4e: Date Added STRING data type DATETIME FORM READ ONLY
dc46: Artist STRING data type READ ONLY
dc9a: Album Name STRING data type READ ONLY
dc89: Duration UINT32 data type ANY 32BIT VALUE form READ ONLY
dc48: Description STRING data type READ ONLY
3801: JPEG
dc01: Storage ID UINT32 data type ANY 32BIT VALUE form READ ONLY
dc02: Object Format UINT16 data type ANY 16BIT VALUE form READ ONLY
dc03: Protection Status UINT16 data type ANY 16BIT VALUE form READ ONLY
dc04: Object Size UINT64 data type READ ONLY
dc07: Object File Name STRING data type GET/SET
dc09: Date Modified STRING data type DATETIME FORM READ ONLY
dc0b: Parent Object UINT32 data type ANY 32BIT VALUE form READ ONLY
dc41: Persistant Unique Object Identifier UINT128 data type READ ONLY
dc44: Name STRING data type READ ONLY
dce0: Display Name STRING data type READ ONLY
dc4e: Date Added STRING data type DATETIME FORM READ ONLY
dc48: Description STRING data type READ ONLY
3802: TIFF EP
dc01: Storage ID UINT32 data type ANY 32BIT VALUE form READ ONLY
dc02: Object Format UINT16 data type ANY 16BIT VALUE form READ ONLY
dc03: Protection Status UINT16 data type ANY 16BIT VALUE form READ ONLY
dc04: Object Size UINT64 data type READ ONLY
dc07: Object File Name STRING data type GET/SET
dc09: Date Modified STRING data type DATETIME FORM READ ONLY
dc0b: Parent Object UINT32 data type ANY 32BIT VALUE form READ ONLY
dc41: Persistant Unique Object Identifier UINT128 data type READ ONLY
dc44: Name STRING data type READ ONLY
dce0: Display Name STRING data type READ ONLY
dc4e: Date Added STRING data type DATETIME FORM READ ONLY
3804: BMP
dc01: Storage ID UINT32 data type ANY 32BIT VALUE form READ ONLY
dc02: Object Format UINT16 data type ANY 16BIT VALUE form READ ONLY
dc03: Protection Status UINT16 data type ANY 16BIT VALUE form READ ONLY
dc04: Object Size UINT64 data type READ ONLY
dc07: Object File Name STRING data type GET/SET
dc09: Date Modified STRING data type DATETIME FORM READ ONLY
dc0b: Parent Object UINT32 data type ANY 32BIT VALUE form READ ONLY
dc41: Persistant Unique Object Identifier UINT128 data type READ ONLY
dc44: Name STRING data type READ ONLY
dce0: Display Name STRING data type READ ONLY
dc4e: Date Added STRING data type DATETIME FORM READ ONLY
dc48: Description STRING data type READ ONLY
3807: GIF
dc01: Storage ID UINT32 data type ANY 32BIT VALUE form READ ONLY
dc02: Object Format UINT16 data type ANY 16BIT VALUE form READ ONLY
dc03: Protection Status UINT16 data type ANY 16BIT VALUE form READ ONLY
dc04: Object Size UINT64 data type READ ONLY
dc07: Object File Name STRING data type GET/SET
dc09: Date Modified STRING data type DATETIME FORM READ ONLY
dc0b: Parent Object UINT32 data type ANY 32BIT VALUE form READ ONLY
dc41: Persistant Unique Object Identifier UINT128 data type READ ONLY
dc44: Name STRING data type READ ONLY
dce0: Display Name STRING data type READ ONLY
dc4e: Date Added STRING data type DATETIME FORM READ ONLY
dc48: Description STRING data type READ ONLY
3808: JFIF
dc01: Storage ID UINT32 data type ANY 32BIT VALUE form READ ONLY
dc02: Object Format UINT16 data type ANY 16BIT VALUE form READ ONLY
dc03: Protection Status UINT16 data type ANY 16BIT VALUE form READ ONLY
dc04: Object Size UINT64 data type READ ONLY
dc07: Object File Name STRING data type GET/SET
dc09: Date Modified STRING data type DATETIME FORM READ ONLY
dc0b: Parent Object UINT32 data type ANY 32BIT VALUE form READ ONLY
dc41: Persistant Unique Object Identifier UINT128 data type READ ONLY
dc44: Name STRING data type READ ONLY
dce0: Display Name STRING data type READ ONLY
dc4e: Date Added STRING data type DATETIME FORM READ ONLY
380b: PNG
dc01: Storage ID UINT32 data type ANY 32BIT VALUE form READ ONLY
dc02: Object Format UINT16 data type ANY 16BIT VALUE form READ ONLY
dc03: Protection Status UINT16 data type ANY 16BIT VALUE form READ ONLY
dc04: Object Size UINT64 data type READ ONLY
dc07: Object File Name STRING data type GET/SET
dc09: Date Modified STRING data type DATETIME FORM READ ONLY
dc0b: Parent Object UINT32 data type ANY 32BIT VALUE form READ ONLY
dc41: Persistant Unique Object Identifier UINT128 data type READ ONLY
dc44: Name STRING data type READ ONLY
dce0: Display Name STRING data type READ ONLY
dc4e: Date Added STRING data type DATETIME FORM READ ONLY
dc48: Description STRING data type READ ONLY
380d: TIFF
dc01: Storage ID UINT32 data type ANY 32BIT VALUE form READ ONLY
dc02: Object Format UINT16 data type ANY 16BIT VALUE form READ ONLY
dc03: Protection Status UINT16 data type ANY 16BIT VALUE form READ ONLY
dc04: Object Size UINT64 data type READ ONLY
dc07: Object File Name STRING data type GET/SET
dc09: Date Modified STRING data type DATETIME FORM READ ONLY
dc0b: Parent Object UINT32 data type ANY 32BIT VALUE form READ ONLY
dc41: Persistant Unique Object Identifier UINT128 data type READ ONLY
dc44: Name STRING data type READ ONLY
dce0: Display Name STRING data type READ ONLY
dc4e: Date Added STRING data type DATETIME FORM READ ONLY
b901: WMA
dc01: Storage ID UINT32 data type ANY 32BIT VALUE form READ ONLY
dc02: Object Format UINT16 data type ANY 16BIT VALUE form READ ONLY
dc03: Protection Status UINT16 data type ANY 16BIT VALUE form READ ONLY
dc04: Object Size UINT64 data type READ ONLY
dc07: Object File Name STRING data type GET/SET
dc09: Date Modified STRING data type DATETIME FORM READ ONLY
dc0b: Parent Object UINT32 data type ANY 32BIT VALUE form READ ONLY
dc41: Persistant Unique Object Identifier UINT128 data type READ ONLY
dc44: Name STRING data type READ ONLY
dce0: Display Name STRING data type READ ONLY
dc4e: Date Added STRING data type DATETIME FORM READ ONLY
dc46: Artist STRING data type READ ONLY
dc9a: Album Name STRING data type READ ONLY
dc9b: Album Artist STRING data type READ ONLY
dc8b: Track UINT16 data type ANY 16BIT VALUE form READ ONLY
dc99: Original Release Date STRING data type DATETIME FORM READ ONLY
dc89: Duration UINT32 data type ANY 32BIT VALUE form READ ONLY
dc8c: Genre STRING data type READ ONLY
dc96: Composer STRING data type READ ONLY
de99: Audio WAVE Codec UINT32 data type ANY 32BIT VALUE form READ ONLY
de92: Bit Rate Type UINT16 data type enumeration: 1, 2, READ ONLY
de9a: Audio Bit Rate UINT32 data type range: MIN 1, MAX 1536000, STEP 1 READ ONLY
de94: Number Of Channels UINT16 data type enumeration: 1, 2, 3, 4, 5, 6, 7, 8, 9, READ ONLY
de93: Sample Rate UINT32 data type range: MIN 8000, MAX 48000, STEP 1 READ ONLY
b902: OGG
dc01: Storage ID UINT32 data type ANY 32BIT VALUE form READ ONLY
dc02: Object Format UINT16 data type ANY 16BIT VALUE form READ ONLY
dc03: Protection Status UINT16 data type ANY 16BIT VALUE form READ ONLY
dc04: Object Size UINT64 data type READ ONLY
dc07: Object File Name STRING data type GET/SET
dc09: Date Modified STRING data type DATETIME FORM READ ONLY
dc0b: Parent Object UINT32 data type ANY 32BIT VALUE form READ ONLY
dc41: Persistant Unique Object Identifier UINT128 data type READ ONLY
dc44: Name STRING data type READ ONLY
dce0: Display Name STRING data type READ ONLY
dc4e: Date Added STRING data type DATETIME FORM READ ONLY
dc46: Artist STRING data type READ ONLY
dc9a: Album Name STRING data type READ ONLY
dc9b: Album Artist STRING data type READ ONLY
dc8b: Track UINT16 data type ANY 16BIT VALUE form READ ONLY
dc99: Original Release Date STRING data type DATETIME FORM READ ONLY
dc89: Duration UINT32 data type ANY 32BIT VALUE form READ ONLY
dc8c: Genre STRING data type READ ONLY
dc96: Composer STRING data type READ ONLY
de99: Audio WAVE Codec UINT32 data type ANY 32BIT VALUE form READ ONLY
de92: Bit Rate Type UINT16 data type enumeration: 1, 2, READ ONLY
de9a: Audio Bit Rate UINT32 data type range: MIN 1, MAX 1536000, STEP 1 READ ONLY
de94: Number Of Channels UINT16 data type enumeration: 1, 2, 3, 4, 5, 6, 7, 8, 9, READ ONLY
de93: Sample Rate UINT32 data type range: MIN 8000, MAX 48000, STEP 1 READ ONLY
b903: AAC
dc01: Storage ID UINT32 data type ANY 32BIT VALUE form READ ONLY
dc02: Object Format UINT16 data type ANY 16BIT VALUE form READ ONLY
dc03: Protection Status UINT16 data type ANY 16BIT VALUE form READ ONLY
dc04: Object Size UINT64 data type READ ONLY
dc07: Object File Name STRING data type GET/SET
dc09: Date Modified STRING data type DATETIME FORM READ ONLY
dc0b: Parent Object UINT32 data type ANY 32BIT VALUE form READ ONLY
dc41: Persistant Unique Object Identifier UINT128 data type READ ONLY
dc44: Name STRING data type READ ONLY
dce0: Display Name STRING data type READ ONLY
dc4e: Date Added STRING data type DATETIME FORM READ ONLY
dc46: Artist STRING data type READ ONLY
dc9a: Album Name STRING data type READ ONLY
dc9b: Album Artist STRING data type READ ONLY
dc8b: Track UINT16 data type ANY 16BIT VALUE form READ ONLY
dc99: Original Release Date STRING data type DATETIME FORM READ ONLY
dc89: Duration UINT32 data type ANY 32BIT VALUE form READ ONLY
dc8c: Genre STRING data type READ ONLY
dc96: Composer STRING data type READ ONLY
de99: Audio WAVE Codec UINT32 data type ANY 32BIT VALUE form READ ONLY
de92: Bit Rate Type UINT16 data type enumeration: 1, 2, READ ONLY
de9a: Audio Bit Rate UINT32 data type range: MIN 1, MAX 1536000, STEP 1 READ ONLY
de94: Number Of Channels UINT16 data type enumeration: 1, 2, 3, 4, 5, 6, 7, 8, 9, READ ONLY
de93: Sample Rate UINT32 data type range: MIN 8000, MAX 48000, STEP 1 READ ONLY
b982: MP4
dc01: Storage ID UINT32 data type ANY 32BIT VALUE form READ ONLY
dc02: Object Format UINT16 data type ANY 16BIT VALUE form READ ONLY
dc03: Protection Status UINT16 data type ANY 16BIT VALUE form READ ONLY
dc04: Object Size UINT64 data type READ ONLY
dc07: Object File Name STRING data type GET/SET
dc09: Date Modified STRING data type DATETIME FORM READ ONLY
dc0b: Parent Object UINT32 data type ANY 32BIT VALUE form READ ONLY
dc41: Persistant Unique Object Identifier UINT128 data type READ ONLY
dc44: Name STRING data type READ ONLY
dce0: Display Name STRING data type READ ONLY
dc4e: Date Added STRING data type DATETIME FORM READ ONLY
b983: MP2
dc01: Storage ID UINT32 data type ANY 32BIT VALUE form READ ONLY
dc02: Object Format UINT16 data type ANY 16BIT VALUE form READ ONLY
dc03: Protection Status UINT16 data type ANY 16BIT VALUE form READ ONLY
dc04: Object Size UINT64 data type READ ONLY
dc07: Object File Name STRING data type GET/SET
dc09: Date Modified STRING data type DATETIME FORM READ ONLY
dc0b: Parent Object UINT32 data type ANY 32BIT VALUE form READ ONLY
dc41: Persistant Unique Object Identifier UINT128 data type READ ONLY
dc44: Name STRING data type READ ONLY
dce0: Display Name STRING data type READ ONLY
dc4e: Date Added STRING data type DATETIME FORM READ ONLY
b984: 3GP
dc01: Storage ID UINT32 data type ANY 32BIT VALUE form READ ONLY
dc02: Object Format UINT16 data type ANY 16BIT VALUE form READ ONLY
dc03: Protection Status UINT16 data type ANY 16BIT VALUE form READ ONLY
dc04: Object Size UINT64 data type READ ONLY
dc07: Object File Name STRING data type GET/SET
dc09: Date Modified STRING data type DATETIME FORM READ ONLY
dc0b: Parent Object UINT32 data type ANY 32BIT VALUE form READ ONLY
dc41: Persistant Unique Object Identifier UINT128 data type READ ONLY
dc44: Name STRING data type READ ONLY
dce0: Display Name STRING data type READ ONLY
dc4e: Date Added STRING data type DATETIME FORM READ ONLY
dc46: Artist STRING data type READ ONLY
dc9a: Album Name STRING data type READ ONLY
dc89: Duration UINT32 data type ANY 32BIT VALUE form READ ONLY
dc48: Description STRING data type READ ONLY
ba05: Abstract Audio Video Playlist
dc01: Storage ID UINT32 data type ANY 32BIT VALUE form READ ONLY
dc02: Object Format UINT16 data type ANY 16BIT VALUE form READ ONLY
dc03: Protection Status UINT16 data type ANY 16BIT VALUE form READ ONLY
dc04: Object Size UINT64 data type READ ONLY
dc07: Object File Name STRING data type GET/SET
dc09: Date Modified STRING data type DATETIME FORM READ ONLY
dc0b: Parent Object UINT32 data type ANY 32BIT VALUE form READ ONLY
dc41: Persistant Unique Object Identifier UINT128 data type READ ONLY
dc44: Name STRING data type READ ONLY
dce0: Display Name STRING data type READ ONLY
dc4e: Date Added STRING data type DATETIME FORM READ ONLY
ba10: WPL Playlist
dc01: Storage ID UINT32 data type ANY 32BIT VALUE form READ ONLY
dc02: Object Format UINT16 data type ANY 16BIT VALUE form READ ONLY
dc03: Protection Status UINT16 data type ANY 16BIT VALUE form READ ONLY
dc04: Object Size UINT64 data type READ ONLY
dc07: Object File Name STRING data type GET/SET
dc09: Date Modified STRING data type DATETIME FORM READ ONLY
dc0b: Parent Object UINT32 data type ANY 32BIT VALUE form READ ONLY
dc41: Persistant Unique Object Identifier UINT128 data type READ ONLY
dc44: Name STRING data type READ ONLY
dce0: Display Name STRING data type READ ONLY
dc4e: Date Added STRING data type DATETIME FORM READ ONLY
ba11: M3U Playlist
dc01: Storage ID UINT32 data type ANY 32BIT VALUE form READ ONLY
dc02: Object Format UINT16 data type ANY 16BIT VALUE form READ ONLY
dc03: Protection Status UINT16 data type ANY 16BIT VALUE form READ ONLY
dc04: Object Size UINT64 data type READ ONLY
dc07: Object File Name STRING data type GET/SET
dc09: Date Modified STRING data type DATETIME FORM READ ONLY
dc0b: Parent Object UINT32 data type ANY 32BIT VALUE form READ ONLY
dc41: Persistant Unique Object Identifier UINT128 data type READ ONLY
dc44: Name STRING data type READ ONLY
dce0: Display Name STRING data type READ ONLY
dc4e: Date Added STRING data type DATETIME FORM READ ONLY
ba14: PLS Playlist
dc01: Storage ID UINT32 data type ANY 32BIT VALUE form READ ONLY
dc02: Object Format UINT16 data type ANY 16BIT VALUE form READ ONLY
dc03: Protection Status UINT16 data type ANY 16BIT VALUE form READ ONLY
dc04: Object Size UINT64 data type READ ONLY
dc07: Object File Name STRING data type GET/SET
dc09: Date Modified STRING data type DATETIME FORM READ ONLY
dc0b: Parent Object UINT32 data type ANY 32BIT VALUE form READ ONLY
dc41: Persistant Unique Object Identifier UINT128 data type READ ONLY
dc44: Name STRING data type READ ONLY
dce0: Display Name STRING data type READ ONLY
dc4e: Date Added STRING data type DATETIME FORM READ ONLY
ba82: XMLDocument
dc01: Storage ID UINT32 data type ANY 32BIT VALUE form READ ONLY
dc02: Object Format UINT16 data type ANY 16BIT VALUE form READ ONLY
dc03: Protection Status UINT16 data type ANY 16BIT VALUE form READ ONLY
dc04: Object Size UINT64 data type READ ONLY
dc07: Object File Name STRING data type GET/SET
dc09: Date Modified STRING data type DATETIME FORM READ ONLY
dc0b: Parent Object UINT32 data type ANY 32BIT VALUE form READ ONLY
dc41: Persistant Unique Object Identifier UINT128 data type READ ONLY
dc44: Name STRING data type READ ONLY
dce0: Display Name STRING data type READ ONLY
dc4e: Date Added STRING data type DATETIME FORM READ ONLY
b906: FLAC
dc01: Storage ID UINT32 data type ANY 32BIT VALUE form READ ONLY
dc02: Object Format UINT16 data type ANY 16BIT VALUE form READ ONLY
dc03: Protection Status UINT16 data type ANY 16BIT VALUE form READ ONLY
dc04: Object Size UINT64 data type READ ONLY
dc07: Object File Name STRING data type GET/SET
dc09: Date Modified STRING data type DATETIME FORM READ ONLY
dc0b: Parent Object UINT32 data type ANY 32BIT VALUE form READ ONLY
dc41: Persistant Unique Object Identifier UINT128 data type READ ONLY
dc44: Name STRING data type READ ONLY
dce0: Display Name STRING data type READ ONLY
dc4e: Date Added STRING data type DATETIME FORM READ ONLY
Storage Devices:
StorageID: 0x00010001
StorageType: 0x0003 fixed RAM storage
FilesystemType: 0x0002 generic hierarchical
AccessCapability: 0x0000 read/write
MaxCapacity: 10362871808
FreeSpaceInBytes: 8785158144
FreeSpaceInObjects: 1073741824
StorageDescription: Pamięć telefonu
VolumeIdentifier: (null)
StorageID: 0x00020001
StorageType: 0x0004 removable RAM storage
FilesystemType: 0x0002 generic hierarchical
AccessCapability: 0x0000 read/write
MaxCapacity: 1968508928
FreeSpaceInBytes: 62480384
FreeSpaceInObjects: 1073741824
StorageDescription: Karta SD
VolumeIdentifier: (null)
Special directories:
Default music folder: 0xffffffff
Default playlist folder: 0xffffffff
Default picture folder: 0xffffffff
Default video folder: 0xffffffff
Default organizer folder: 0xffffffff
Default zencast folder: 0xffffffff
Default album folder: 0xffffffff
Default text folder: 0xffffffff
MTP-specific device properties:
Friendly name: Neffos C5
Synchronization partner: Neffos C5
Battery level 41 of 100 (40%)
libmtp supported (playable) filetypes:
Folder
Text file
HTML file
RIFF WAVE file
ISO MPEG-1 Audio Layer 3
MPEG video stream
JPEG file
BMP bitmap file
GIF bitmap file
JFIF file
Portable Network Graphics
TIFF bitmap file
Microsoft Windows Media Audio
Ogg container format
Advanced Audio Coding (AAC)/MPEG-2 Part 7/MPEG-4 Part 3
MPEG-4 Part 14 Container Format (Audio+Video Emphasis)
ISO MPEG-1 Audio Layer 2
Abstract Playlist file
XML file
Free Lossless Audio Codec (FLAC)
Powyżej został wykryty smartfon. Niemniej jednak, mamy tam informację, że libmtp
nie zna tego
urządzenia ( UNKNOWN
). Jeśli mamy podobny problem, to wypadałoby zgłosić numery urządzenia
(VID=2357 i PID=0314) do developerów. Te
powyższe zostały właśnie zgłoszone. W międzyczasie możemy napisać regułę dla UDEV'a wzorując się na
pliku /lib/udev/rules.d/69-libmtp.rules
. Pamiętajmy tylko, by nową regułę umieścić w pliku
/etc/udev/rules.d/69-libmtp.rules
. W przeciwnym razie, przy aktualizacji UDEV'a, zmiany w pliku
/lib/udev/rules.d/69-libmtp.rules
zostaną nadpisane. Poniżej reguła dla Neffos'a C5:
# TP-LINK NEFFOS C5
ATTR{idVendor}=="2357", ATTR{idProduct}=="0314", SYMLINK+="libmtp-%k", MODE="660", GROUP="audio", ENV{ID_MTP_DEVICE}="1", ENV{ID_MEDIA_PLAYER}="1"
Jako, że pakiet mtp-tools
zawiera całą masę poleceń mtp-*
, to można się trochę pogubić w
operowaniu na nich. Na szczęście nie musimy się nimi bawić, by wejść w interakcję z naszym
smartfonem.
Pakiety mtpfs oraz jmtpfs
Jeśli operowanie na tych wszystkich narzędziach zawartych w pakiecie mtp-tools
jest dla nas trochę
przytłaczające, to zawsze możemy skorzystać z automatu na bazie
FUSE. Mamy z grubsza dwa pakiety mtpfs
oraz jmtpfs
. Są
one w gruncie rzeczy podobne do siebie ale mtpfs
został osierocony na początku 2014 roku. Biorąc
pod uwagę, że ostatnia wersja mtpfs jest datowana na rok 2010,
to raczej nie ma sobie co tym pakietem głowy zawracać. Z kolei jeśli chodzi o jmtpfs
, to jest on
nieco nowszy ale i tak ostatni commit pojawił się trzy lata
temu. Grunt, że ciągle ktoś się tym projektem interesuje
oraz, że on działa. Dlatego też jeśli już chcemy instalować któryś z powyższych pakietów, to
zdecydujmy się na jmtpfs
.
Musimy jeszcze sobie nieco dostosować konfigurację FUSE w pliku /etc/fuse.conf
. Otwieramy go
zatem i dopisujemy poniższą linijkę, która zezwala użytkownikom innym niż root na korzystanie z
opcji allow_other
przy montowaniu zasobów:
user_allow_other
Montowanie zasobów smartfona
W przypadku, gdy mamy podpięty do komputera tylko jeden smartfon, to korzystanie z narzędzia
jmtpfs
znacznie się upraszcza. Nie musimy określać urządzenia za pomocą opcji -device
. Po
prostu wybrane zostanie pierwsze urządzenie na liście, którą z kolei możemy podejrzeć podając
parametr -l
. Poniżej jest lista urządzeń, które są w stanie komunikować się z moim systemem za
pomocą protokołu MTP:
$ jmtpfs -l
Device 0 (VID=2357 and PID=0314) is UNKNOWN in libmtp v1.1.12.
Available devices (busLocation, devNum, productId, vendorId, product, vendor):
2, 71, 0x0314, 0x2357, UNKNOWN, UNKNOWN
Jako, że mamy tylko jedno urządzenie, to możemy zamontować jego zasoby wpisując w terminalu to poniższe polecenie:
$ jmtpfs /home/morfik/Desktop/android
Device 0 (VID=2357 and PID=0314) is UNKNOWN in libmtp v1.1.12.
Android device detected, assigning default bug flags
W przypadku, gdy tych urządzeń byłoby więcej i chcielibyśmy skorzystać z drugiego z tych, które widnieją na liście, to powyższe polecenie przybierze poniższą formę:
$ jmtpfs -device=2,71 /home/morfik/Desktop/android/
W tej chwili powinniśmy uzyskać dostęp do systemu plików urządzenia, zarówno do karty SD jak i do pamięci telefonu:
$ mount
...
fusectl on /sys/fs/fuse/connections type fusectl (rw,relatime)
jmtpfs on /home/morfik/Desktop/android type fuse.jmtpfs (rw,nosuid,nodev,relatime,user_id=1000,group_id=1000)
Gdy skończymy zgrywać/wgrywać dane ze/na smartfona, system plików możemy odmontować w poniższy sposób:
$ fusermount -u /home/morfik/Desktop/android/
Przeglądanie zasobów za sprawą protokołu mtp://
Możemy również pominąć etap montowania systemu plików i zwyczajnie przeglądać zasoby bezpośrednio na
urządzeniu korzystając z adresu mtp://[USB:001,002]/
w menadżerze plików. Oczywiście menadżer
plików musi wspierać protokół MTP, inaczej nic z tego nie będzie. Numerki widoczne wyżej można
odczytać z wyjścia polecenia lsusb
lub też są one uwzględnione w informacji zwracanej przez
polecenie jmtpfs -l
:
$ jmtpfs -l
...
2, 71, 0x0314, 0x2357, UNKNOWN, UNKNOWN
W tym przypadku zostały zwrócone numerki 2
oraz 71
, zatem adres, który musimy wpisać w
menadżerze plików to mtp://[usb:002,071]/
. Niestety mój menadżer plików nie obsługuje tego typu
adresów. Można natomiast posłużyć się narzędziem gmtp:
I jeszcze info o urządzeniu zwracane przez gmtp
:
Problemy z przeglądaniem zasobów smartfona
Może się zdarzyć też tak, że zasoby smartfona zostaną podmontowane bez większego problemu ale, gdy tylko będziemy chcieli przejść do punktu montowania, to zostanie nam zwrócony taki oto błąd:
$ ls -al /home/morfik/Desktop/android/
ls: cannot access '/home/morfik/Desktop/android/': Input/output error
W niektórych smartfonach ekran musi być odblokowany. Dlatego też zanim podepniemy telefon do komputera, upewnijmy się, że blokada ekranu została dezaktywowana.