--- addons/chan_mobile.c.org 2012-05-28 17:22:06.000000000 +0000 +++ addons/chan_mobile.c 2012-06-06 16:45:30.270238143 +0000 @@ -4041,6 +4041,8 @@ static void *do_discovery(void *data) { + char addr[19] = {0}; + int port; struct adapter_pvt *adapter; struct mbl_pvt *pvt; @@ -4052,8 +4054,30 @@ AST_RWLIST_RDLOCK(&devices); AST_RWLIST_TRAVERSE(&devices, pvt, entry) { ast_mutex_lock(&pvt->lock); + port = pvt->rfcomm_port; + if (port == 0) { + ba2str(&pvt->addr, addr); + switch(pvt->type) { + case MBL_TYPE_PHONE: + port = sdp_search(addr, HANDSFREE_AGW_PROFILE_ID); + break; + case MBL_TYPE_HEADSET: + port = sdp_search(addr, HEADSET_PROFILE_ID); + break; + default: + ast_verb(3, "Bluetooth Device %s seems to be neither a headset nor a phone.\n", pvt->id); + break; + } + + if (port != 0) { + ast_verb(3, "Bluetooth Device %s uses port %d for communication.\n", pvt->id, port); + } + else { + ast_verb(3, "Bluetooth Device %s: port auto-detect failed.\n", pvt->id); + } + } if (!adapter->inuse && !pvt->connected && !strcmp(adapter->id, pvt->adapter->id)) { - if ((pvt->rfcomm_socket = rfcomm_connect(adapter->addr, pvt->addr, pvt->rfcomm_port)) > -1) { + if ((pvt->rfcomm_socket = rfcomm_connect(adapter->addr, pvt->addr, port)) > -1) { if (start_monitor(pvt)) { pvt->connected = 1; adapter->inuse = 1; @@ -4265,11 +4289,21 @@ } address = ast_variable_retrieve(cfg, cat, "address"); + if (ast_strlen_zero(address)) { + ast_log(LOG_ERROR, "Skipping device %s. Missing required address setting.\n", cat); + goto e_return; + } + port = ast_variable_retrieve(cfg, cat, "port"); + if (ast_strlen_zero(port)) { + ast_debug(1, "Port for device %s not specified, using run-time detection.\n", cat); + } +/* if (ast_strlen_zero(port) || ast_strlen_zero(address)) { ast_log(LOG_ERROR, "Skipping device %s. Missing required port or address setting.\n", cat); goto e_return; } +*/ /* create and initialize our pvt structure */ if (!(pvt = ast_calloc(1, sizeof(*pvt)))) { @@ -4291,7 +4325,12 @@ str2ba(address, &pvt->addr); pvt->timeout = -1; pvt->rfcomm_socket = -1; - pvt->rfcomm_port = atoi(port); + if (ast_strlen_zero(port)) { + pvt->rfcomm_port = 0; + } + else { + pvt->rfcomm_port = atoi(port); + } pvt->sco_socket = -1; pvt->monitor_thread = AST_PTHREADT_NULL; pvt->ring_sched_id = -1;