(Bluetooth) Регистрация записи SDP на локальном сервере в C на Linux - PullRequest
0 голосов
/ 11 января 2020

Я работаю с приложением, использующим Bluetooth, и хочу зарегистрировать новую запись на локальном SDP-сервере, используя C. Я использую библиотеку BlueZ, но у меня возникает ошибка при попытке зарегистрировать мой сервис.

Код выглядит следующим образом:

sdp_session_t *register_service()
{
    uint32_t service_uuid_int[] = { 0, 0, 0, 0xABCD };
    uint8_t rfcomm_channel = 11;
    bdaddr_t interface;
    const char *service_name = "BlueFind";
    const char *service_dsc = "Service to locate";
    const char *service_prov = "BlueFind Inc.";

    uuid_t root_uuid, l2cap_uuid, rfcomm_uuid, svc_uuid;
    sdp_list_t *l2cap_list = 0, 
               *rfcomm_list = 0,
               *root_list = 0,
               *proto_list = 0, 
               *access_proto_list = 0;
    sdp_data_t *channel = 0;

    bacpy(&interface, BDADDR_ANY);

    sdp_record_t *record = sdp_record_alloc();

    // set the general service ID
    sdp_uuid128_create( &svc_uuid, &service_uuid_int );
    sdp_set_service_id( record, svc_uuid );

    // make the service record publicly browsable
    sdp_uuid16_create(&root_uuid, PUBLIC_BROWSE_GROUP);
    root_list = sdp_list_append(0, &root_uuid);
    sdp_set_browse_groups( record, root_list );


    // set l2cap information
    sdp_uuid16_create(&l2cap_uuid, L2CAP_UUID);
    l2cap_list = sdp_list_append( 0, &l2cap_uuid );
    proto_list = sdp_list_append( 0, l2cap_list );


    // set rfcomm information
    sdp_uuid16_create(&rfcomm_uuid, RFCOMM_UUID);
    channel = sdp_data_alloc(SDP_UINT8, &rfcomm_channel);
    rfcomm_list = sdp_list_append( 0, &rfcomm_uuid );
    sdp_list_append( rfcomm_list, channel );
    sdp_list_append( proto_list, rfcomm_list );


    // attach protocol information to service record
    access_proto_list = sdp_list_append( 0, proto_list );
    sdp_set_access_protos( record, access_proto_list );


    // set the name, provider, and description
    sdp_set_info_attr(record, service_name, service_prov, service_dsc);
    sdp_session_t *session = 0;

    // connect to the local SDP server, register the service record, and 
    // disconnect
    session = sdp_connect( BDADDR_ANY, BDADDR_LOCAL, SDP_RETRY_IF_BUSY );


    sdp_device_record_register(session, &interface, &record, SDP_RECORD_PERSIST);


    // cleanup
    sdp_data_free( channel );
    sdp_list_free( l2cap_list, 0 );
    sdp_list_free( rfcomm_list, 0 );
    sdp_list_free( root_list, 0 );
    sdp_list_free( access_proto_list, 0 );

    return session;
}

Это очень похоже на реализацию sdptool из инструментов BlueZ. Я сузил свою проблему до черты:

sdp_device_record_register(session, &interface, &record, SDP_RECORD_PERSIST);

, но я не знаю, как это преодолеть. Существуют ли другие функции, которые я могу использовать для регистрации службы? Или я неправильно использую функцию?

Я запускаю этот проект на Raspberry Pi, используя Jess ie, но я также получаю это на своей Ubuntu VM, работающей 18.04.3 LTS.

...