obex_push

Iniciado por anyjulio, 28 Noviembre 2006, 15:44 PM

0 Miembros y 1 Visitante están viendo este tema.

anyjulio

esto si funciona:
int main()
{
char comando[40];
char objeto[20]="archi.txt";
char MAC[20]= "00:E0:03:5A:CF:22";
int canal=9;
sprintf(comando,"obex_push %d %s %s ", canl,MAC,objeto);
system(comando);
return 0;
}
pero si ejecuto el ./bluezspammer -o archi.txt:Detectando dispositivo:
Celular Phone: 00:E0:03:5A:CF:22  Yulito
Fabricante: Nokia
Enviando Objeto...
Send and Receive files bluetooth OBEX PUSH channel 255
Sorry, unable to connect!

...no entiendo porq me pone como canal asociado el 255, cuando el sdptool me indica q el canal asociado al OBEX Object Push es el 9.
...nose, talvez esa sea la razon de q no permite enviar el archivo al fono ? porq si envio con  con el fragmento de codigo "main" arriba mencionado si funciona y el archivo es enviado al fono.
...Por favor alguien me podria ayudar? que puede estar mal.

Gracias, y Saludos desde ecuador

Gospel

BlueZSpammer utiliza la siguiente función distribuida bajo licencia GNU para obtener el canal correspondiente al perfil OBEX Object Push. Es posible que en tu dispositivo no lo detecte bien. Implementa tu mismo esta función en tu código a ver si funciona. Si es así, también debería funcionar BlueZSpammer.

//Funcion que obtiene el canal RFCOMM utilizado por el perfil OBEX Object Push en el dispositivo
int get_obex_channel(char *bt_address)
{

     bdaddr_t bdaddr;
     uint16_t class = 0x1105;
     sdp_list_t *attrid, *search, *seq, *next;
     uint32_t range = 0x0000ffff;
     char str[20];
     sdp_session_t *sess;
     uint32_t channel = -1;
     uuid_t   group;      /* Browse group */
     bdaddr_t interface;

     str2ba(bt_address, &bdaddr);
     sdp_uuid16_create(&group, class);
     
     bacpy(&interface, BDADDR_ANY);
     sess = sdp_connect(&interface, &bdaddr, SDP_RETRY_IF_BUSY);
     ba2str(&bdaddr, str);
     if (!sess) {
         return -1;
     }

     attrid = sdp_list_append(0, &range);
     search = sdp_list_append(0, &group);
     if (sdp_service_search_attr_req(sess, search, SDP_ATTR_REQ_RANGE, attrid, &seq)) {
         sdp_close(sess);
         return -1;
     }
     sdp_list_free(attrid, 0);
     sdp_list_free(search, 0);

     for (; seq; seq = next) {
         sdp_record_t *rec = (sdp_record_t *) seq->data;
         sdp_list_t *list = 0, *proto = 0;
         if (sdp_get_access_protos(rec, &proto) == 0) {
             sdp_list_t* ptr = proto;
             for(;ptr != NULL;ptr = ptr->next){
                 sdp_list_t *protDescSeq = (sdp_list_t *)ptr->data;
                 for(;protDescSeq != NULL;protDescSeq = protDescSeq->next){
                     channel = get_channel_from_service_desc(protDescSeq->data, NULL);
                     if(channel != -1) break;
                 }
             }
             sdp_list_free(proto, 0);
         }

         next = seq->next;
         free(seq);
         sdp_record_free(rec);
     }

     sdp_close(sess);
     return channel;
}


static int get_channel_from_service_desc(sdp_data_t *value, void *user)
{
    char str[MAX_LEN_PROTOCOL_UUID_STR];
    char UUID_str[MAX_LEN_UUID_STR];

    sdp_data_t *p = (sdp_data_t *)value, *s;
    int i = 0, proto = 0;
     
    for (; p; p = p->next, i++) {
        switch (p->dtd) {
        case SDP_UUID16:
        case SDP_UUID32:
        case SDP_UUID128:
            sdp_uuid2strn(&p->val.uuid, UUID_str, MAX_LEN_UUID_STR);
            sdp_proto_uuid2strn(&p->val.uuid, str, sizeof(str));
            proto = sdp_uuid_to_proto(&p->val.uuid);
            break;
        case SDP_UINT8:
            if (proto == RFCOMM_UUID){
                return p->val.uint8;
            }
            break;
        case SDP_UINT16:
        case SDP_SEQ16:
        case SDP_SEQ8:
        default:
            break;
        }
    }
    return -1;
}

anyjulio

Utilizando las funciones de busqueda del canal Obex funciona a la perfeccion con mi código q es para 1 solo dispositivo, pero si utilizo el código de Bluezspammer me sigue dando el mismo problema: si lo pongo en modo demo (-d) scanea y presenta todos los dispositivos, el problema es cuando trata de enviar archivos:

./bluezspammer -f -o archi.txt
en este caso solo scanea los dispositivos q tengo q son 2 y termina la ejecución sin error. Aunq no envia los archivos.

./bluezspammer -o archi.txt
en este caso presenta el error q menciono en el primer post, me arroja un canal 255 y unable to connect.

La verdad no se q puede ser le he dado vueltas y vueltas. De cualquier forma mil gracias, me a servido de much ayuda tu sugerencia. Y ya postearé alguna novedad con mi dilema.

LLegue a pensar q el problema podia ser el usb bluetooth del pc q es un ISSC USB Bluetooth Generico q incluso arroja como direccion MAC = 11:11:11:11:11, la verdad compre est porq en ecuador no hay a la venta ninguno de los q se listan en la pagina de HOLTMAN (dispositivos soportados linux), y la verdad todo me estaba funcionando bien con est dispositivo, hasta q me tope con Bluezpammer. Y no lo he podido hacer funcionar.

Mil gracias por leerme, Saludos.

Gospel

No tiene ningún sentido!! No puede ser que esa función te resuelva bien el canal del Perfil Obex Object Push y BlueZSpammer intente enviar al 255.

Puedes trastear con el código de BlueZSpammer que para eso se publica. Prueba a mostrar el canal que resuelve tras la llamada a la función get_obex_channel() imprimiendo con printf. Si sale 255 no tiene ningún sentido...

Si bluezspammer te funciona bien en modo demo, entonces el módulo USB es reconocido correctamente.

anyjulio

Si comento la funcion encuentradispositivos() la otra funcion enviaarchivo() trabaja bien, pero si descomento la 1era de ellas, ni siquiera manda el archivo y sale "unable to connect", si son funciones q no tienen nada q ver la una con la otra porq se interfieren? no le encuentro sentido alguno. Hasta eh llegado a probar disparates como esto para comprobar q el inquiry  no me deja trabajar en el mismo proceso para enviar archivos con obex_push, porq? no lo se. pero hay una interferencia entre los 2 y no se de q tipo.

int main()
{
  //encuentradispositivo();
  enviaarchivo();
}

void encuentradispositivos()
{
  inquiry_info *ii=NULL;
  .
  .
  ii=(inquiry_info*)malloc(max_rsp*sixe(..));
  for(i=0;i<num_rsp;i++)
  .
  .
  free(ii);
  close(socket);
}

void enviaarchivo()
{
char comando[40];
char objeto[20]="archi.txt";
char MAC[20]= "00:E0:03:5A:CF:22";
int canal=9;
sprintf(comando,"obex_push %d %s %s ", canl,MAC,objeto);
system(comando);
}



Gracias por la sugerencia de inprimir el valor del canal, y si lo imprime pero siempre es -1 cuando utilizo el codigo de bluezspammer por ello es q aparece el canal 255 en la llamada al  obex_push.

Mil gracias por cualquier sugerencia.

anyjulio

Saludos Gospel,
Por favor me podrias ayudar, mencionandome el modelo del modulo bluetooth q utilizaste. Te lo pregunto porq quiero comprarme uno q ya haya sido probado con el fedora core 5, q es el SO q yo manejo. Se q hay un listado en las paginas de HOLMANT, pero la verdad por tratarse de un tema de tesis q intento desarrollar, deseo adquirir algo probado. Intentare comprarlo por internet, ya q en mi pais (Ecuador), no hay a la venta estos productos.
Te agradezco much por tu comprension, y tu ayuda.
Julio.

caballeroat

  Hola Julio y Gospel.... he estado trabajando en un proyecto de mi escuela con bluetooth y me encontre con exactamente tu problema Julio.... lo resolviste???  me podrias echar la mano.... les mando saludos coordiales desde mexico... :)

caballeroat

hola he estado probando el bluespammer dias anteriores y tenia el mismo problema... cuando llegaba a la sentencia system(comando_obex) me salia que no se podia conectar al dispositivo..... y moviendole mil cosas al codigo encontre que es cuestion de tiempo el bluetooth como que necesita un segundo antes de ejecutar esa sentencia....
le inserte al codigo: sleep(1) antes del envio y funciona correctamente.... le quito el tiempo de espera y me sale que no se puede conectar......

pruebalo y me dices si es correcto,....

SAludos!