Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Conexión USB con celular! (https://www.clubdelphi.com/foros/showthread.php?t=80060)

escafandra 06-09-2012 20:53:01

Cita:

Empezado por kurono (Mensaje 442121)
amigos les cuento que tuve un resultado positivo en la prueba que hise con la pequena modificacion que nos mensiono el amigo escafandra \\.\PhysicalDriveX

Añadir que es muy importante localizar correctamente el número de unidad, puesto que todas las unidades físicas se llaman igual (HD y USB) cambiando sólo su número. Para este fín se debe usar la API DeviceIoControl con IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS. Tenéis un ejemplo en delphi en la función GetPhysicalDrive escrita por seoane o en GetPhysicalNumOfDrive escrita por mi mismo. Ambas tienen la misma funcionalidad y es devolver el número de disco físico conociendo una letra de unidad lógica.

Cita:

Empezado por kurono (Mensaje 442121)
creo que una ves conectado el dipositivo las demas funciones de la libreria USB no deberian dar problemas

El problema va a estar en lo que se escriba y donde...

Cita:

Empezado por ecfisa (Mensaje 442129)
Luego haré algunas pruebas, pero como pensaba del mismo modo que escafandra, nada que implique escritura hasta que no sepa bién lo que estoy haciendo. No está entre mis planes hacer detonar el celular :D.

Muy sensato...:D

Se debe tener en cuenta que el S.O. del teléfono puede poner sus "peros" al acceso por el puerto USB y, por supuesto, al acceder como \\.\PhysicalDriveX accedemos a la "unidad de almacenamiento masivo"... En este sentido quisiera añadir que los dispositivos android se comunican con el PC a través de un driver por socket y el programa puente es el conocido adb.exe.



Saludos.

kurono 07-09-2012 05:16:19

amigo escafandra entonces acediendo como \\.\PhysicalDriveX estariamos conectandonos a la memoria interna del dipositivo , en el caso de un celular sacando las sd si tiene y usando el codigo \\.\PhysicalDriveX me imagino que acederia a la Rom del celular que creo que es la idea principal de nustro amigo Alan_B el cual quiere flashear un celular con delphi

si es asi entonces con la libreria usb creo que se puede escribir en la rom del celular en este caso hay que tomar en cuenta lo que has dicho ante de saber que lo que se quiere escribir y donde o me equivoco

Alan_B 07-09-2012 05:20:30

Bueno gente les comento que aun sigo sin resultados positivos (USB - Celular), utilizando \\.\PhysicalDriveX funciona perfectamente, sera que el error esta en que no tipeamos bien el identificador del celular??? Yo probe ya con varios entre ellos "Id. de Hardware", "GUID", etc... Todos sumandolos de esta forma "USB#VID_0C44&PID_0020#{4d36e96d-e325-11ce-bfc1-08002be10318}"... Donde Id. de hardware: VID_0C44&PID_0020, GUID: {4d36e96d-e325-11ce-bfc1-08002be10318} y bueno concatenados con #, como lo vi en el ejemplo del creador del unit!!!

Alan_B 08-09-2012 05:03:14

Aun sin respuesta positiva del celular, no puedo creer que sea tan dificil esto jaja, alguien logro conectar con un celular??? kurono, pegaste en la tecla, la idea es hacer una aplicacion capaz de lograr conexion con un celular y cargarle su firmware (flashear)!

Si alguien logro encontrar algun dato que aporte bienvenido sea, GRACIAS a TODOS!!!

kurono 09-09-2012 04:04:36

amigo Alan_B para que no pierda las esperanzas te cuento que una ves flashe un celular sony erizon en el cual el programa estaba hecho en delphi pero lamentablemente el autor del programa no ofrecia el codigo fuente esto te lo digo en delphi se puede hacer solo hay que saber como

escafandra 10-09-2012 15:06:21

Mira a ver si esto te sirve de ayuda:

Código Delphi [-]
function GetDeviceName: String;
var
 hKey: Windows.HKEY;
 Device: ShortString;
 Key: String;
 Count, Len: Cardinal;
begin
 Result:= '';
 RegOpenKey(HKEY_LOCAL_MACHINE, 'SYSTEM\CurrentControlSet\Services\WpdUsb\Enum', hKey);
 RegQueryValueEx(hKey, 'Count', nil, nil, @Count, @Len);
 if Count = 1 then
 begin
   Len:= sizeof(Device);
   RegQueryValueEx(hKey, '0',  nil, nil, @Device[1], @Len);
   Device[0]:= CHAR(Len-1);
   Device:= Copy(Device, Pos('Vid', Device), Pos('Pid_', Device)+7 - Pos('Vid', Device)+1);
   RegCloseKey(hKey);
   Key:= 'SYSTEM\CurrentControlSet\Enum\USB\' + Device;
   RegOpenKey(HKEY_LOCAL_MACHINE, PCHAR(Key), hKey);
   RegEnumKey(hKey, 0, @Device[1], SizeOf(Device) - 1);
   Device[0]:= CHAR(lstrlen(@Device));
   RegCloseKey(hKey);
   RegOpenKey(HKEY_LOCAL_MACHINE, PCHAR(Key + '\' + Device), hKey);
   RegQueryValueEx(hKey, 'Service', nil, nil, @Device[1], @Len);
   RegCloseKey(hKey);
   Device[0]:= CHAR(Len-1);
   RegOpenKey(HKEY_LOCAL_MACHINE, PCHAR('SYSTEM\CurrentControlSet\Services\' + Device), hKey);
   RegCloseKey(hKey);
   Key:= 'SYSTEM\CurrentControlSet\Services\' + Device + '\Enum';
   RegOpenKey(HKEY_LOCAL_MACHINE, PCHAR(Key), hKey);
   RegQueryValueEx(hKey, 'Count', nil, nil, @Count, @Len);
   if Count = 1 then
   begin
     Len:= sizeof(Device);
     RegQueryValueEx(hKey, '0',  nil, nil, @Device[1], @Len);
     Device[0]:= CHAR(Len-1);   // Ahora tenemos el device y el serial
   end;
   RegCloseKey(hKey);
   Key:= 'SYSTEM\CurrentControlSet\Enum\USB\' + Copy(Device, 5, Length(Device)-4) + '\Device Parameters';
   RegOpenKey(HKEY_LOCAL_MACHINE, PCHAR(Key), hKey);
   Len:= sizeof(Device);
   RegQueryValueEx(hKey, 'SymbolicName', nil, nil, @Device[1], @Len);
   RegCloseKey(hKey);
   Device[0]:= CHAR(Len);
   Result:= Device;
   Result[2]:= '\';
   Result[3]:= '.';
 end
 else
   RegCloseKey(hKey);
end;

Su Uso:
Código Delphi [-]
hFile:= CreateFile(PCHAR(GetDeviceName),
                     GENERIC_READ or GENERIC_WRITE,
                     FILE_SHARE_READ or FILE_SHARE_WRITE,
                     nil, 
                     OPEN_EXISTING,
                     FILE_FLAG_WRITE_THROUGH or FILE_FLAG_NO_BUFFERING, 
                     0);


Saludos.

escafandra 11-09-2012 01:38:28

Aclaraciones sobre mi mensaje anterior:

1- El código que he escrito para explorar el registro en busca del nombre de dispositivo está basado en un análisis del registro de tres PCs con Windows XP y un Teléfono Samsung Galaxy SII conectado al puerto USB.

2- Sólo funciona con un dispositivo conectado.

3- Devuelve un Nombre de dispositivo que se puede abrir con la API CreateFile.

4- No he escrito nada en mi teléfono.

5- Ignoro si el sistema es válido para otro dispositivo telefónico.



Saludos.

roman 11-09-2012 01:40:40

Cita:

Empezado por escafandra (Mensaje 442718)
4- No he escrito nada en mi teléfono.

Je, je. Punto importante :)

// Saludos

bubulino 07-02-2013 02:14:12

amigos alguien logro alguna conexion con el codigo hecho por Ooxtocco,yo tbm tengo el mismo problema no logro conectar me tira el mismo error de Alan :(

pacocable 19-04-2013 20:11:35

creo que es cuestion de drivers
 
los moviles necesitan sus drivers y si se puede conectar

pacocable 24-04-2013 20:52:59

Se conectan casi siempre por puerto com virtual
 
segun he mirado los moviles al menos nokia se conecta por un com virtual que se crea al conectarlo con sus drivers.asi lo he conectado yo:
procedure TForm1.Button5Click(Sender: TObject);
begin
IF Marcar('COM2',edit3.Text) then
begin
showmessage('llamando');
end
else
begin
showmessage('no llama');
end;
end;

function Marcar(Puerto: String; Telefono: String): Boolean;
var
hPort: THandle;
DCB: TDCB;
Comando: String;
Escritos: Cardinal;
begin
Result:= FALSE;
Puerto:= Uppercase(Puerto);
// Cambiar esto si es necesario un puerto diferente
if (Puerto<>'COM1') and (Puerto<>'COM2') then
begin
showmessage('puerto no valido comprobar panel de control');
exit;
end;

hPort:= CreateFile(PChar('\\.\'+Puerto), GENERIC_READ or GENERIC_WRITE,0, nil,
OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
if hPort<>INVALID_HANDLE_VALUE then
begin
DCB.DCBlength:= sizeof(DCB);
if GetCommState(hPort,DCB) then
begin
// Cambiar esto para una configuracion del puerto diferente
with DCB do
begin
BaudRate := CBR_9600;
ByteSize := 8;
Parity := NOPARITY;
StopBits := ONESTOPBIT;
Flags := $01;
end;
if SetCommState(hPort, DCB) then
begin
PurgeComm(hPort, PURGE_TXABORT or PURGE_RXABORT or PURGE_TXCLEAR or
PURGE_RXCLEAR);
Comando:= 'ATD'+Telefono+#13;
Result := WriteFile(hPort, PChar(Comando)^, Length(Comando), Escritos, nil);

end;
end;
CloseHandle(hPort);
end
else
begin
showmessage('no conetado');
end;
end;
en text3 va el numero de telefono amarcar lo que si me faltan son mas comandos at

Casimiro Notevi 24-04-2013 23:06:10

Recuerda poner los tags al código fuente, ejemplo:



Gracias :)

pacocable 26-04-2013 19:10:26

mil perdones
 
lo siento no me di cuenta


La franja horaria es GMT +2. Ahora son las 19:58:48.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi