Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!

Ogłoszenie

Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.

#1  2013-10-17 03:05:11

  morfik - Cenzor wirtualnego świata

morfik
Cenzor wirtualnego świata
Skąd: ze WSI
Zarejestrowany: 2011-09-15
Serwis

[SOLVED] Dziwne zachowanie bluetooth

Zainspirowany tym tematem -- http://forum.dug.net.pl/viewtopic.php?id=11179 --, postanowiłem coś sprawdzić u siebie. I się okazało, że mam jakieś cuda z tym bluetoothem :] Podpiąłem go zatem pod usb i włączyłem bluetooth w komórce po czym dałem:

Kod:

morfik:~$ ps -eo "pid user args" | grep -i blue
 5703 morfik   grep --color=auto -i blue
morfik:~$ hcitool scan
Scanning ...
    58:17:0C:11:46:0F    Morfik

morfik:~$ obexfs -b 58:17:0C:11:46:0F /home/morfik/bluetooth

morfik:~$ ls -al /home/morfik/bluetooth
total 5.0K
drwxr-xr-x  1 morfik morfik    0 Oct 17 01:59 ./
drwxr-xr-x 79 morfik morfik 4.0K Oct 17 01:43 ../
drwxr-xr-x  1 morfik morfik    0 Jan  1  1970 Karta pamięci/
drwxr-xr-x  1 morfik morfik    0 Jan  1  1970 Pamięć telefonu/

i mam:

Kod:

morfik:~$ ps -eo "pid user args" | grep -i blue
 5767 morfik   obexfs -b 58:17:0C:11:46:0F /home/morfik/bluetooth
 5796 morfik   grep --color=auto -i blue

Czyli wychodzi na to, że demon bluetooth nie jest odpalony ale urządzenia się widzą i mogę zgrywać i wgrywać dane przez /home/morfik/bluetooth. Ale jak chcę wysłać plik przez komórkę, to już wyrzuca błąd. xD

Patrzę w komórkę, nie ma sparowanych żadnych urządzeń. Próbuje wyszukać w komórce kompa, znajduje ale po próbie podłączenia, która trwa z jedną minutę wyrzuca komunikat, że nie można połączyć. Odpalam blueman-applet ale nie pojawia się ikonka na pasku, no bo demon bluetooth nie jest odpalony...

Po wydaniu:

Kod:

root:~# /etc/init.d/bluetooth restart
[ ok ] Stopping bluetooth: rfcomm /usr/sbin/bluetoothd.
[ ok ] Starting bluetooth: bluetoothd rfcomm.

root:~# ps -eo "pid user args" | grep -i blue
 6513 morfik   /usr/bin/python /usr/bin/blueman-applet
 6580 root     /usr/sbin/bluetoothd
 6694 root     grep --color=auto -i blue

Ikonka się pojawia, wchodzę w urządzenia ale tam też nie ma żadnych sparowanych urządzeń.

Sprawdziłem starą komórkę, która sobie od lat leży w szafie i tam ten numer nie przejdzie -- woła o pin. Ale odpalając jej  demona bluetooth + ustawiając pin, komórka dodaje komputer do listy, obex niby montuje system plików ale nic w nim nie ma:

Kod:

# /etc/init.d/bluetooth restart
[ ok ] Stopping bluetooth: rfcomm /usr/sbin/bluetoothd.
[ ok ] Starting bluetooth: bluetoothd rfcomm.

morfik:~$ bluetooth-agent 0000 &

# ps -eo "pid user args" | grep -i blue
 9073 root     /usr/sbin/bluetoothd
 9096 morfik   bluetooth-agent 0000
 9105 root     grep --color=auto -i blue

W przypadku ustawienia pinu na 0000 czy jakikolwiek inny, ta nowsza komórka dalej nie wyrzuca okienka, w którym można by go wprowadzić i dalej jest możliwa wymiana plików przez uprzednie zamontowanie systemu plików przez obex...

Czy ktoś mi jest w stanie wyjaśnić jak jakim cudem to działa? xD Te urządzenia nie powinny być pierw sparowane? W każdej graficznej nakładce chciało ode mnie kod zanim możliwa była interakcja miedzy urządzeniami, a tutaj na tej nowszej komórce pojawia się komunikat: TEST prosi o udostępnienie twoich elementów. Jak wyrażę zgodę, można przesyłać dane.

Jeszcze zainstalowane pakiety:

Kod:

morfik:~$ dpkg -l | grep -i blue
ii  blueman                                                     1.23+update1-2                      i386         Graphical bluetooth manager
ii  bluez                                                       4.101-3                             i386         Bluetooth tools and daemons
ii  libbluetooth3:i386                                          4.101-3                             i386         Library to use the BlueZ Linux Bluetooth stack
ii  python-bluez                                                0.18-2                              i386         Python wrappers around BlueZ for rapid bluetooth development

Ostatnio edytowany przez morfik (2013-10-20 14:39:38)

Offline

 

#2  2013-10-17 14:41:19

  morfik - Cenzor wirtualnego świata

morfik
Cenzor wirtualnego świata
Skąd: ze WSI
Zarejestrowany: 2011-09-15
Serwis

Re: [SOLVED] Dziwne zachowanie bluetooth

Znalazłem trochę info o parowaniu urządzeń:

Entering a PIN is actually an outdated method of pairing, now called Legacy Pairing. Secure Simple Pairing Mode is available in Bluetooth v2.1 and later, which comprises most modern Bluetooth devices. SSPMode authentication is handled by the Bluetooth protocol stack and thus works without user interaction.[/quote]
Więcej można poczytać na http://en.wikipedia.org/wiki/Bluetooth#Pairing_mechanisms

Czyli w bluetooth 2.1+ user się już nie zajmuje tym ręcznym wpisywaniem pinów. Sprawdziłem i faktycznie sam adapter jak i nowa komórka mają wersje bluetooth 2.1, temu można przesyłać dane bez podawania pinu.

Ale nadal mnie zastanawia jak te urządzenia się komunikują skoro demon bluetooth jest nieodpalony. :] Włączyłem kompa z podłączonym adapterem, lampka nie miga. Wyciągnąłem i wsadziłem adapter, to samo. Dopiero jak odpaliłem demona przez

Kod:

root:~# /etc/init.d/bluetooth start
[ ok ] Starting bluetooth: bluetoothd rfcomm.

Lampka na adapterze zaczeła migać. Ale po zastopowaniu demona, dalej miga i mimo, że nie ma procesu bluetoothd, w dalszym ciągu można wymieniać dane. :] To bug czy tak powinno być? Jeśli odłączę ten adapter z migającą diodą przy położonym demonie bluetoothd i ponownie podłaczę adapter, lampka nie miga.

Znalazłem jeszcze info na temat zestawiania połączenia z urządzeniami bluetooth przy pomocy /dev/rfcomm0 . Poniżej instrukcja:

Kod:

root:~# /etc/init.d/bluetooth start
[ ok ] Starting bluetooth: bluetoothd rfcomm.
root:~# hcitool dev
Devices:
    hci0    00:15:83:4A:CD:C1
root:~# hciconfig 
hci0:    Type: BR/EDR  Bus: USB
    BD Address: 00:15:83:4A:CD:C1  ACL MTU: 310:10  SCO MTU: 64:8
    UP RUNNING PSCAN ISCAN 
    RX bytes:6667 acl:0 sco:0 events:70 errors:0
    TX bytes:923 acl:0 sco:0 commands:46 errors:0

root:~# hciconfig hci0 sspmode
hci0:    Type: BR/EDR  Bus: USB
BD Address: 00:15:83:4A:CD:C1  ACL MTU: 310:10  SCO MTU: 64:8
Simple Pairing mode: Enabled               # czyli SPP jest włączone 
root:~# hciconfig hci0 piscan
root:~# sdptool add SP
Serial Port service registered
root:~# hcitool scan
Scanning ...
    58:17:0C:11:46:0F    Morfik

Sprawdzamy czy urządzenie odpowiada na ping:

Kod:

root:~# l2ping 58:17:0C:11:46:0F
Ping: 58:17:0C:11:46:0F from 00:15:83:4A:CD:C1 (data size 44) ...
44 bytes from 58:17:0C:11:46:0F id 0 time 12.87ms
44 bytes from 58:17:0C:11:46:0F id 1 time 24.85ms
44 bytes from 58:17:0C:11:46:0F id 2 time 25.90ms
44 bytes from 58:17:0C:11:46:0F id 3 time 23.88ms
44 bytes from 58:17:0C:11:46:0F id 4 time 27.88ms
44 bytes from 58:17:0C:11:46:0F id 5 time 24.87ms
^C6 sent, 6 received, 0% loss

Teraz jeszcze trzeba uzupełnić plik rfcomm.conf  i podać w nim dane potrzebne do zestawienia połączenia:

Kod:

root:~# cat /etc/bluetooth/rfcomm.conf           
rfcomm0 {
    # Automatically bind the device at startup
    bind no;

    # Bluetooth address of the device
    device 58:17:0C:11:46:0F;

    # RFCOMM channel for the connection
    channel    10;

    # Description of the connection
    comment "Komcia Morfika";
}

root:~# rfcomm connect rfcomm0
Connected /dev/rfcomm0 to 58:17:0C:11:46:0F on channel 10
Press CTRL-C for hangup

Przy czym by uzyskać channel, trzeba przeskanować urządzenie bluetooth w celu znalezienia usług jakie to urządzenie posiada i zgodnie z tym co pisze tutaj: http://dug.net.pl/tekst/98/bluetooth_bez_gnome_i_kde/h/bluetooth , to by było:

Kod:

morfik:~$ sdptool browse 58:17:0C:11:46:0F
Browsing 58:17:0C:11:46:0F ...
Service Description: Sony Ericsson J10
Service RecHandle: 0x10000
Service Class ID List:
  "PnP Information" (0x1200)

Service Name: OBEX SyncML Client
Service RecHandle: 0x2008002
Service Class ID List:
  UUID 128: 00000002-0000-1000-8000-0002ee000002
Protocol Descriptor List:
  "L2CAP" (0x0100)
  "RFCOMM" (0x0003)
    Channel: 10
  "OBEX" (0x0008)

Service Name: Serial Port 1
Service RecHandle: 0x2008003
Service Class ID List:
  "Serial Port" (0x1101)
Protocol Descriptor List:
  "L2CAP" (0x0100)
  "RFCOMM" (0x0003)
    Channel: 2

Service Name: Dial-up Networking
Service RecHandle: 0x2008004
Service Class ID List:
  "Dialup Networking" (0x1103)
  "Generic Networking" (0x1201)
Protocol Descriptor List:
  "L2CAP" (0x0100)
  "RFCOMM" (0x0003)
    Channel: 1
Profile Descriptor List:
  "Dialup Networking" (0x1103)
    Version: 0x0100

Service Name: Music Streaming Service
Service Provider: Sony Ericsson
Service RecHandle: 0x8000001
Service Class ID List:
  "Audio Source" (0x110a)
Protocol Descriptor List:
  "L2CAP" (0x0100)
    PSM: 25
  "AVDTP" (0x0019)
    uint16: 0x100
Profile Descriptor List:
  "Advanced Audio" (0x110d)
    Version: 0x0100

Service Name: Remote Control Target Service
Service Provider: Sony Ericsson
Service RecHandle: 0x10000001
Service Class ID List:
  "AV Remote Target" (0x110c)
Protocol Descriptor List:
  "L2CAP" (0x0100)
    PSM: 23
  "AVCTP" (0x0017)
    uint16: 0x102
Profile Descriptor List:
  "AV Remote" (0x110e)
    Version: 0x0103

Service Name: Remote Control Service
Service Provider: Sony Ericsson
Service RecHandle: 0x10000002
Service Class ID List:
  "AV Remote" (0x110e)
Protocol Descriptor List:
  "L2CAP" (0x0100)
    PSM: 23
  "AVCTP" (0x0017)
    uint16: 0x102
Profile Descriptor List:
  "AV Remote" (0x110e)
    Version: 0x0103

Service Name: SEMC Watch Phone
Service RecHandle: 0x40000000
Service Class ID List:
  "" (0x8e771401)
Protocol Descriptor List:
  "L2CAP" (0x0100)
    PSM: 61681
  "RFCOMM" (0x0003)
    Channel: 2

Service Name: SEMC FRCP
Service RecHandle: 0x40000001
Service Class ID List:
  "" (0x8e771503)
Protocol Descriptor List:
  "L2CAP" (0x0100)
    PSM: 61691
Profile Descriptor List:
  "" (0x8e771501)
    Version: 0x0100

Service Name: PAN Network Access Point
Service Description: NAP provides access to internet for one connecting PANu
Service RecHandle: 0x1000003
Service Class ID List:
  "Network Access Point" (0x1116)
Protocol Descriptor List:
  "L2CAP" (0x0100)
    PSM: 15
  "BNEP" (0x000f)
    Version: 0x0100
    SEQ8: 0 6 dd
Language Base Attr List:
  code_ISO639: 0x656e
  encoding:    0x6a
  base_offset: 0x100
Profile Descriptor List:
  "Network Access Point" (0x1116)
    Version: 0x0100

Service Name: PAN user
Service Description: PANu can connect to a Network Access Point to gain access to internet
Service RecHandle: 0x1000004
Service Class ID List:
  "PAN User" (0x1115)
Protocol Descriptor List:
  "L2CAP" (0x0100)
    PSM: 15
  "BNEP" (0x000f)
    Version: 0x0100
    SEQ8: 0 6 dd
Language Base Attr List:
  code_ISO639: 0x656e
  encoding:    0x6a
  base_offset: 0x100
Profile Descriptor List:
  "PAN User" (0x1115)
    Version: 0x0100

Service Name: SEMC HLA
Service RecHandle: 0x40000002
Service Class ID List:
  "" (0x8e771301)
Protocol Descriptor List:
  "L2CAP" (0x0100)
    PSM: 61689
  "" (0x8e770300)
Profile Descriptor List:
  "" (0x8e771303)
    Version: 0x0100

Service Name: SEMC OBP
Service RecHandle: 0x40000003
Service Class ID List:
  "" (0x8e771602)
Protocol Descriptor List:
  "L2CAP" (0x0100)
    PSM: 61685
  "" (0x8e770300)
Profile Descriptor List:
  "" (0x8e771601)
    Version: 0x0100

Service Name: Hands-Free Gateway
Service RecHandle: 0x2008005
Service Class ID List:
  "Handsfree Audio Gateway" (0x111f)
  "Generic Audio" (0x1203)
Protocol Descriptor List:
  "L2CAP" (0x0100)
  "RFCOMM" (0x0003)
    Channel: 5
Profile Descriptor List:
  "Handsfree" (0x111e)
    Version: 0x0105

Service Name: Headset Gateway
Service RecHandle: 0x2008006
Service Class ID List:
  "Headset Audio Gateway" (0x1112)
  "Generic Audio" (0x1203)
Protocol Descriptor List:
  "L2CAP" (0x0100)
  "RFCOMM" (0x0003)
    Channel: 4
Profile Descriptor List:
  "Headset" (0x1108)
    Version: 0x0100

Service Name: OBEX Object Push
Service RecHandle: 0x2008007
Service Class ID List:
  "OBEX Object Push" (0x1105)
Protocol Descriptor List:
  "L2CAP" (0x0100)
  "RFCOMM" (0x0003)
    Channel: 6
  "OBEX" (0x0008)
Profile Descriptor List:
  "OBEX Object Push" (0x1105)
    Version: 0x0100

Service Name: OBEX File Transfer
Service RecHandle: 0x2008008
Service Class ID List:
  "OBEX File Transfer" (0x1106)
Protocol Descriptor List:
  "L2CAP" (0x0100)
  "RFCOMM" (0x0003)
    Channel: 7
  "OBEX" (0x0008)
Profile Descriptor List:
  "OBEX File Transfer" (0x1106)
    Version: 0x0100

Service Name: OBEX IrMC Sync Server
Service RecHandle: 0x2008009
Service Class ID List:
  "IrMC Sync" (0x1104)
Protocol Descriptor List:
  "L2CAP" (0x0100)
  "RFCOMM" (0x0003)
    Channel: 8
  "OBEX" (0x0008)
Profile Descriptor List:
  "IrMC Sync" (0x1104)
    Version: 0x0100

Service Name: Phonebook Access PSE
Service RecHandle: 0x200800a
Service Class ID List:
  "Phonebook Access - PSE" (0x112f)
Protocol Descriptor List:
  "L2CAP" (0x0100)
  "RFCOMM" (0x0003)
    Channel: 11
  "OBEX" (0x0008)
Profile Descriptor List:
  "Phonebook Access" (0x1130)
    Version: 0x0100

Z tym, że u mnie jest kilka pozycji od OBEX w Protocol Descriptor List . W każdym razie jak dałem 7 kanał od OBEX File Transfer to nie mogłem podmontować systemu plików fona przy pomocy obexa. Udało się to zrobić po zmianie kanału na 10, czyli OBEX SyncML Client.

Z tego co piszą, urządzenie /dev/rfcomm0 ma tylko zestawiać połączenie, choć w sumie zastanawiam się po co, przecie można było wymieniać dane montując system plików przy pomocy obexa i wszystko grało. Czy to jest tylko na wypadek gdyby domyślny kanał był nie taki jak trzeba i istniałaby potrzeba jego zmiany?

Czy istnieje możliwość wyłączenia bluetootha tak by lampka zgasła i to bez wyjmowania urządzenia z portu usb?

Offline

 

#3  2013-10-17 19:13:21

  morfik - Cenzor wirtualnego świata

morfik
Cenzor wirtualnego świata
Skąd: ze WSI
Zarejestrowany: 2011-09-15
Serwis

Re: [SOLVED] Dziwne zachowanie bluetooth

Ok już wiem jak parować te urządzenia tak by pojawiał się i kod i były dodawane na swoich listach zaufanych urządzeń.

Wszystko się rozchodzi o umiejętne operowanie narzędziami z bluez-* . I tak dla przykładu by sparować fona z kompem:

Kod:

morfik:~$ bluez-simple-agent hci0 58:17:0C:11:46:0F 
RequestConfirmation (/org/bluez/13370/hci0/dev_58_17_0C_11_46_0F, 163474)
Confirm passkey (yes/no): yes
Release
New device (/org/bluez/13370/hci0/dev_58_17_0C_11_46_0F)

Jak widać jest generowany kod: 163474 , potem pojawia się informacja na fonie z tym samym numerem. Po potwierdzeniu -- pierw na telefonie, potem na pc -- na liscie urządzeń w telefonie widnieje mój komp. Czyli wszystko przebiegło pomyślnie.

W przypadku ponownego parowania urządzeń, zostanie wyrzucony taki komunikat:

Kod:

morfik:~$ bluez-simple-agent hci0 58:17:0C:11:46:0F 
Creating device failed: org.bluez.Error.AlreadyExists: Already Exists

Jeśli uważamy, że ten powyższy błąd nie powinien się pojawić, trzeba ponownie sparzyć urządzenia:

Kod:

morfik:~$ bluez-simple-agent hci0 58:17:0C:11:46:0F repair
RequestConfirmation (/org/bluez/13370/hci0/dev_58_17_0C_11_46_0F, 833296)
Confirm passkey (yes/no): yes
Release
New device (/org/bluez/13370/hci0/dev_58_17_0C_11_46_0F

W przypadku gdy się wybierze "no" , urządzenie zostanie usunięte z listy.

Można też dodawać urządzenia do zaufanych. I tak np. by sprawdzić czy dane urządzenie jest zaufane:

Kod:

morfik:~$ bluez-test-device trusted 58:17:0C:11:46:0F
0

0 oznacza, że nie jest, 1 oznacza, że jest. By uczynić to urządzenie zaufanym:

Kod:

morfik:~$ bluez-test-device trusted 58:17:0C:11:46:0F yes
morfik:~$ bluez-test-device trusted 58:17:0C:11:46:0F
1

I to generalnie jest wszystko jeśli chodzi o parzenie urządzeń. Raz zrobione i nie ma potrzeby ponownie tym sobie głowy zawracać.

Czyli pozostaje tylko jedno pytanie już. Czemu ten bluetooth po położeniu demona dalej działa i czy idzie go jakoś wyłączyć? xD

EDIT:

Właśnie sprawdziłem ten sposób ze starą komórką:

Kod:

morfik:~$ bluez-simple-agent hci0 00:18:C5:1F:02:CD
RequestPinCode (/org/bluez/13370/hci0/dev_00_18_C5_1F_02_CD)
Enter PIN Code: 7865
Release
New device (/org/bluez/13370/hci0/dev_00_18_C5_1F_02_CD)

Różnica polega na tym, że trzeba było ręcznie podać pin. W każdym razie po sparowaniu puściłem obexa:

Kod:

morfik:~$ obexfs -b 00:18:C5:1F:02:CD /home/morfik/bluetooth
morfik:~$ ls -al /home/morfik/bluetooth
total 8.0K
drwxr-xr-x  1 morfik morfik    0 Oct 17 20:28 ./
drwxr-xr-x 79 morfik morfik 4.0K Oct 17 16:47 ../
drwxr-xr-x  1 morfik morfik    0 Jan  1  1970 Dźwięki/
drwxr-xr-x  1 morfik morfik    0 Jan  1  1970 Grafiki/
drwxr-xr-x  1 morfik morfik    0 Jan  1  1970 Media Player Sync files/
drwxr-xr-x  1 morfik morfik    0 Jan  1  1970 Nagrania/
drwxr-xr-x  1 morfik morfik    0 Jan  1  1970 Odebr. pliki/
drwxr-xr-x  1 morfik morfik    0 Jan  1  1970 Pliki wideo/
drwxr-xr-x  1 morfik morfik    0 Jan  1  1970 Tematy/
drwxr-xr-x  1 morfik morfik    0 Jan  1  1970 Zdjęcia/

Przetestowałem zapis i odczyt, wszystko działa jak należy. Pierwszy raz udało mi się doprowadzić te komórkę do stanu używalności. xD

EDIT2:

Udało mi się też w końcu wyłączyć adapter bez wyciągania i ponownego podpinania do portu. Więcej info tutaj: http://forum.dug.net.pl/viewtopic.php?pid=243327#p243327

Ostatnio edytowany przez morfik (2013-10-20 14:39:00)

Offline

 

Stopka forum

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson
To nie jest tylko forum, to nasza mała ojczyzna ;-)

[ Generated in 0.011 seconds, 11 queries executed ]

Informacje debugowania

Time (s) Query
0.00012 SET CHARSET latin2
0.00006 SET NAMES latin2
0.00111 SELECT u.*, g.*, o.logged FROM punbb_users AS u INNER JOIN punbb_groups AS g ON u.group_id=g.g_id LEFT JOIN punbb_online AS o ON o.ident='3.145.44.22' WHERE u.id=1
0.00090 REPLACE INTO punbb_online (user_id, ident, logged) VALUES(1, '3.145.44.22', 1732387752)
0.00060 SELECT * FROM punbb_online WHERE logged<1732387452
0.00092 SELECT topic_id FROM punbb_posts WHERE id=243111
0.00155 SELECT id FROM punbb_posts WHERE topic_id=24412 ORDER BY posted
0.00087 SELECT t.subject, t.closed, t.num_replies, t.sticky, f.id AS forum_id, f.forum_name, f.moderators, fp.post_replies, 0 FROM punbb_topics AS t INNER JOIN punbb_forums AS f ON f.id=t.forum_id LEFT JOIN punbb_forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id=3) WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.id=24412 AND t.moved_to IS NULL
0.00007 SELECT search_for, replace_with FROM punbb_censoring
0.00160 SELECT u.email, u.title, u.url, u.location, u.use_avatar, u.signature, u.email_setting, u.num_posts, u.registered, u.admin_note, p.id, p.poster AS username, p.poster_id, p.poster_ip, p.poster_email, p.message, p.hide_smilies, p.posted, p.edited, p.edited_by, g.g_id, g.g_user_title, o.user_id AS is_online FROM punbb_posts AS p INNER JOIN punbb_users AS u ON u.id=p.poster_id INNER JOIN punbb_groups AS g ON g.g_id=u.group_id LEFT JOIN punbb_online AS o ON (o.user_id=u.id AND o.user_id!=1 AND o.idle=0) WHERE p.topic_id=24412 ORDER BY p.id LIMIT 0,25
0.00102 UPDATE punbb_topics SET num_views=num_views+1 WHERE id=24412
Total query time: 0.00882 s