Handyzugriff mit AutoIt

  • Hallo Community,

    habe ein kleines Problem. Und zwar schaffe ich es nicht, auf mein Handy mit AutoIt zuzugreifen. Dies geht weder noch durch FileExists oder FileRead. Das Problem ist, dass mein Handy keinen Laufwerksbuchstaben hat.

    Hier ein kleines Bild (Handy unter "Arbeitsplatz")

    [Blockierte Grafik: http://image.burakkeskin.de/rechner/arbeitsplatz.png]

    "Mein" Script bisher:

    Spoiler anzeigen
    [autoit]

    HotKeySet("{ESC}", "_Exit")

    [/autoit] [autoit][/autoit] [autoit]

    Global $sDeviceProperty = "Name" ;Caption, Description, DeviceID, Name, PNPDeviceID
    Global $sUSBDevice = "Nokia 5800 XpressMusic USB Serial Port (COM3)" ;property value for Caption, Description, DeviceID, Name or PNPDeviceID

    [/autoit] [autoit][/autoit] [autoit]

    Global $fDeviceActive = _FindUSBDevice($sDeviceProperty) ;initialize variable with device state. global var prevents retriggering by other device insertion/removal
    ConsoleWrite($fDeviceActive & @LF)
    exit
    ;~ If $fDeviceActive = -1 Then ConsoleWrite("! Error finding device: " & @error & @LF)

    [/autoit] [autoit][/autoit] [autoit]

    ConsoleWrite("> Monitoring - Press ESC to Exit: " & @LF)

    [/autoit] [autoit][/autoit] [autoit]

    _Main()

    [/autoit] [autoit][/autoit] [autoit]

    Func _Main()
    Local Const $WM_DEVICE_CHANGE = 0x0219
    GUICreate("") ;dummy gui for receiving window messaging
    GUIRegisterMsg($WM_DEVICE_CHANGE, "_WM_DEVICE_CHANGE")
    While 1
    Sleep(1000)
    WEnd
    EndFunc ;==>_Main

    [/autoit] [autoit][/autoit] [autoit]

    Func _Exit()
    Exit
    EndFunc ;==>_Exit

    [/autoit] [autoit][/autoit] [autoit]

    Func _WM_DEVICE_CHANGE($hWnd, $Msg, $wParam, $lParam)
    #forceref $hWnd, $Msg, $wParam, $lParam
    Local Const $DBT_DEVNODES_CHANGED = 0x00000007
    If $wParam = $DBT_DEVNODES_CHANGED Then
    Switch _FindUSBDevice($sDeviceProperty)
    Case 1
    If Not $fDeviceActive Then ;check current state buffer to prevent events from other usb devices
    $fDeviceActive = True
    ConsoleWrite("+ Device Connected" & @LF)
    EndIf
    Case 0
    If $fDeviceActive Then ;check current state buffer to prevent events from other usb devices
    $fDeviceActive = False
    ConsoleWrite("! Device Disconnected" & @LF)
    EndIf
    Case -1
    ConsoleWrite("! WMI Error: " & @error & @LF)
    EndSwitch
    EndIf
    Return "GUI_RUNDEFMSG"
    EndFunc ;==>_WM_DEVICE_CHANGE

    [/autoit] [autoit][/autoit] [autoit]

    Func _FindUSBDevice($sProperty = "*", $strComputer = ".")
    Local $objWMIService = ObjGet("winmgmts:" & $strComputer & "rootcimv2")
    If @error Then Return SetError(1, 0, -1)
    Local $colDevices = $objWMIService.ExecQuery("Select Dependent From Win32_USBControllerDevice") ;Select Dependent instead of Select * - limit items in collection to speed up response slightly
    If Not IsObj($colDevices) Then Return SetError(2, 0, -1)
    Local $arrDeviceNames, $colUSBDevices
    For $objDevice In $colDevices
    $arrDeviceNames = StringSplit(StringReplace($objDevice.Dependent, Chr(34), ""), "=", 2)
    If @error Or UBound($arrDeviceNames) <> 2 Then Return SetError(3, 0, -1)
    $colUSBDevices = $objWMIService.ExecQuery("Select " & $sProperty & " From Win32_PnPEntity Where DeviceID = '" & $arrDeviceNames[1] & "'");Select $sProperty instead of Select * - limit items in collection to speed up response slightly
    If Not IsObj($colUSBDevices) Then Return SetError(4, 0, -1)
    For $objUSBDevice In $colUSBDevices
    ;ConsoleWrite("USB Description: " & Execute("$objUSBDevice." & $sProperty) & @LF)
    If (Execute("$objUSBDevice." & $sProperty) == $sUSBDevice) Then Return 1 ;device found
    If @error Then Return SetError(5, 0, -1)
    Next
    Next
    Return 0 ;device not found
    EndFunc ;==>_FindUSBDevice

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _Test($strComputer = ".")
    ;use to find your USB device WMI property name and value, then copy/paste value to $sUSBDevice and property name to $sDeviceProperty
    Local $objWMIService = ObjGet("winmgmts:" & $strComputer & "rootcimv2")
    Local $colDevices = $objWMIService.ExecQuery("Select Dependent From Win32_USBControllerDevice")
    Local $arrDeviceNames, $colUSBDevices, $Output

    [/autoit] [autoit][/autoit] [autoit]

    For $objDevice In $colDevices
    $arrDeviceNames = StringSplit(StringReplace($objDevice.Dependent, Chr(34), ""), "=", 2)
    $colUSBDevices = $objWMIService.ExecQuery("Select * From Win32_PnPEntity Where DeviceID = '" & $arrDeviceNames[1] & "'")

    [/autoit] [autoit][/autoit] [autoit]

    For $objItem In $colUSBDevices ;properties that usually return no value or are not needed are commented
    ;$Output &= "Availability: " & $objItem.Availability & @CRLF
    $Output &= "Caption: " & $objItem.Caption & @CRLF
    $Output &= "Description: " & $objItem.Description & @CRLF
    $Output &= "Name: " & $objItem.Name & @CRLF
    $Output &= "Manufacturer: " & $objItem.Manufacturer & @CRLF
    $Output &= "ClassGuid: " & $objItem.ClassGuid & @CRLF
    ;$Output &= "ConfigManagerErrorCode: " & $objItem.ConfigManagerErrorCode & @CRLF
    ;$Output &= "ConfigManagerUserConfig: " & $objItem.ConfigManagerUserConfig & @CRLF
    ;$Output &= "CreationClassName: " & $objItem.CreationClassName & @CRLF
    $Output &= "DeviceID: " & $objItem.DeviceID & @CRLF
    ;$Output &= "ErrorCleared: " & $objItem.ErrorCleared & @CRLF
    ;$Output &= "ErrorDescription: " & $objItem.ErrorDescription & @CRLF
    ;$Output &= "InstallDate: " & WMIDateStringToDate($objItem.InstallDate) & @CRLF
    ;$Output &= "LastErrorCode: " & $objItem.LastErrorCode & @CRLF
    $Output &= "PNPDeviceID: " & $objItem.PNPDeviceID & @CRLF
    $strPowerManagementCapabilities = $objItem.PowerManagementCapabilities(0)
    ;$Output &= "PowerManagementCapabilities: " & $strPowerManagementCapabilities & @CRLF
    ;$Output &= "PowerManagementSupported: " & $objItem.PowerManagementSupported & @CRLF
    $Output &= "Service: " & $objItem.Service & @CRLF
    $Output &= "Status: " & $objItem.Status & @CRLF
    ;$Output &= "StatusInfo: " & $objItem.StatusInfo & @CRLF
    ;$Output &= "SystemCreationClassName: " & $objItem.SystemCreationClassName & @CRLF
    ;$Output &= "SystemName: " & $objItem.SystemName & @CRLF
    ConsoleWrite("+ " & $Output & @LF) ;use to find your device name, then copy/paste to $sUSBDevice declaration
    $Output = ""
    Next
    Next
    EndFunc ;==>_Test

    [/autoit]


    Hier gibt es etwas, was ich dazu gefunden habe. So ganz verstanden habe ich das leider nicht (Einträge nicht bei mir vorhanden).

    http://www.autoitscript.com/forum/topic/14…cted/?p=1009217

  • Ich seh zwar in deinem Script beim überfliegen kein fileexists oder fileread, aber ich gehe mal davon aus du willst auf die Daten des Gerätes zugreifen. Dein Hauptproblem hierbei ist, dass das Geräte nicht als Wechseldatenträger/Speichermedium eingebunden wird, sondern als Medienwiedergabe Gerät. Somit ist ein direkter Dateizugriff auch nicht möglich. Entweder du stellst die Art der Verbindung auf dem Handy um oder du musst schaun wie man über den Treiber Zugang bekommt. Sehr wahrscheinlich existieren entsprechende Schnittstellen zur Kommunikation, andernfalls könnte Windows selbst auch keine Daten des Gerätes anzeigen / verändern. Einfacher ist es aber mit Sicherheit wenn das Handy sich gleich als Speichermedium anmeldet.


    Was dein Script angeht:
    So wie ich das überflogen habe soll das Script erstmal nur das Anschließen des Gerätes erkennen und dir Daten darüber liefern, was schonmal ein wichtiger Schritt wäre. Du hast leider nicht geschrieben ob das soweit funktioniert und was dir die ganzen Konsolenausgaben im Script liefern.

    Einmal editiert, zuletzt von misterspeed (31. Mai 2013 um 18:42)

  • Zitat

    Was dein Script angeht:
    So wie ich das überflogen habe soll das Script erstmal nur das Anschließen des Gerätes erkennen und dir Daten darüber liefern, was schonmal ein wichtiger Schritt wäre. Du hast leider nicht geschrieben ob das soweit funktioniert und was dir die ganzen Konsolenausgaben im Script liefern.

    Hallo misterspeed,
    das Script von meinem ersten Post hat nicht funktioniert. Hatte das auf autoitscript.com im Forum gefunden. Habe hier und da mal was verändert/hinzugefügt und jetzt klappt es. Ich kann erkennen, ob das Handy angeschlossen wurde bzw. getrennt wurde.

    Wie man genau JETZT abfragen kann, ob mein Handy angeschlossen ist, bleibt mir ein Rätsel.


    Nokia Suite Tool
    [autoit]

    Local $oWMISink, $sData

    [/autoit] [autoit][/autoit] [autoit]

    _MonitorUSBDevices($oWMISink)
    If @error Then Exit ConsoleWrite("! Error: " & @error & @LF)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    While 1
    Sleep(100)
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func SINK_OnObjectReady($objLatestEvent, $objAsyncContext)
    #forceref $objAsyncContext
    Switch $objLatestEvent.Path_.Class
    Case "__InstanceCreationEvent"
    If (Execute("$objLatestEvent.TargetInstance.PNPDeviceID") == "USB\VID_0421&PID_0154\xxxxxxxxxxxxxxx") Then
    If Not ProcessExists('NokiaSuite.exe') Then Run('C:\Program Files (x86)\Nokia\Nokia Suite\NokiaSuite.exe -tray')
    EndIf
    Case "__InstanceDeletionEvent"
    If (Execute("$objLatestEvent.TargetInstance.PNPDeviceID") == "USB\VID_0421&PID_0154\xxxxxxxxxxxxxxx") Then
    If ProcessExists('NokiaSuite.exe') Then ProcessClose('NokiaSuite.exe')
    EndIf
    EndSwitch
    EndFunc ;==>SINK_OnObjectReady

    [/autoit] [autoit][/autoit] [autoit]

    Func _MonitorUSBDevices(ByRef $oObj)
    $oObj = ObjCreate("WbemScripting.SWbemSink")
    If @error Or Not IsObj($oObj) Then Return SetError(1, 0, -1)
    ObjEvent($oObj, "SINK_")
    If @error Then Return SetError(2, 0, -1)
    Local $Obj_WMIService = ObjGet('winmgmts:\\localhost\root\cimv2')
    If @error Or Not IsObj($oObj) Then Return SetError(3, 0, -1)
    $Obj_WMIService.ExecNotificationQueryAsync($oWMISink, "SELECT TargetInstance FROM __InstanceOperationEvent WITHIN 1 WHERE TargetInstance ISA 'Win32_PnPEntity'")
    EndFunc ;==>_MonitorUSBDevices

    [/autoit] [autoit][/autoit] [autoit]

    Func _close()
    Exit
    EndFunc

    [/autoit]
  • Hi DeepRed92,
    wie es bei dir funktioniert, kann ich dir nicht sagen, aber ich kann dir beschreiben,
    welche Möglichkeiten ich habe(SE Xperia arc s, EB803):
    -WLAN am Handy und am Router einschalten..
    -Router auslesen, genaue Datei weiß ich jetz nicht^^
    -Anhand von MAC oder IP entscheiden, ob das Handy angeschlossen ist..
    Wenn es angeschlossen ist, könnte ich mit dem Windows-Explorer auf die Dateien zugreifen,
    aber ich erledige das mit MyPhoneExplorer ;)
    Da ich nur EIN Handy in meinem WLAN habe ist es relativ einfach, zu erkennen, ob es On-Line ist:
    Ping..
    Bei mehreren Geräten im WLAN wäre es nötig, die MAC-Adresse vom Handy zu wissen ;)
    denn dann könnteste mittels ARP nachsehen..
    'Einfacher' wäre es, wenn du feste IP-Adressen verwendest, aber weil es nicht unbedingt einfacher ist,
    steht es in Anführungszeichen xD
    HTH
    Gruß
    ytwinky

    (Ich) benutze stets die aktuelle (Beta) und SciTE..

  • Öhm es ging hier denke ich um direkten Anschluss via USB, nicht um Zugriff übers Netzwerk, was aber prinzipiell durchaus auch eine Lösung wäre. Das erfordert aber meiner Meinung nach, dass auf dem Handy eine SMB Freigabe existiert, oder eben vergleichbare Serverdienste laufen (z.B. FTP Server). Beides birgt aber Risiken, da dies prinzipiell auch Zugriffe ohne physikalische Verbindung erlaubt. Standardmässig dürfte sowas auf keinem Smartphone aktiviert sein, mein Nexus 4 ist jedenfalls weder per HTTP noch über den Explorer (SMB) erreichbar, könnte man wohl höchstens über entsprechende Apps nachrüsten. Obs solche Apps für Symbian gibt wäre die nächste Frage...

    2 Mal editiert, zuletzt von misterspeed (1. Juni 2013 um 14:49)