마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

블루투스 통신(리눅스 서버 ↔ 안드로이드 클라이언트)이 잘 안되요..

0 추천

안녕하세요.

블루투스 통신을 필요로 하는 프로그램을 짜기 위해, 간단한 블루투스 테스트 프로그램을 작성했습니다.

필요로 하는 시스템이, 서버(블루투스 MASTER)는 리눅스 보드에서 동작하고 클라이언트(블루투스 SLAVE)는 안드로이드 스마트폰이나 태블릿에서 동작하는 것입니다.

안드로이드↔안드로이드 통신, 리눅스↔리눅스 통신은 잘 되는 것을 확인했는데요,

이상하게 리눅스↔안드로이드 통신이 안됩니다.

(디바이스 검색, 페어링까지는 잘되는데, 소켓 연결은 실패합니다.)

 

아무리 구글링을 해보아도, 리눅스끼리 or 안드로이드끼리 통신하는 예제만 나오네요.. ㅠ

혹시 리눅스와 안드로이드 간에 블루투스 통신을 해보신 적이 있으신 분이 계시다면,

문제가 될만한 요소 같은 것이 있는지, 조언해주시면 정말정말 감사하겠습니다 !

 

안드로이드 클라이언트 소스 (앞부분 생략)

UUID uuid = UUID.fromString("00001101-0000-1000-8000-0015831212E7");
mSocket = device.createInsecureRfcommSocketToServiceRecord(uuid);
// mSocket = device.createRfcommSocketToServiceRecord(uuid);
....
mSocket.connect(); // 실패
 
 
 
리눅스 서버 소스
(리눅스 커널 버전은 2.6.21, BlueZ 라이브러리는 bluez-2.25 버전 사용하였으며, 보드에 블루투스 동글을 연결했습니다.)
 
#include <bluetooth/bluetooth.h>
#include <bluetooth/sdp.h>
#include <bluetooth/sdp_lib.h>

#include <stdio.h>
#include <unistd.h>
#include <sys/socket.h>
#include <bluetooth/bluetooth.h>
#include <bluetooth/rfcomm.h>


sdp_session_t *register_service()
{
	uint32_t service_uuid_int[] = { 0x00001101, 0x00001000, 0x80000015, 0x831212E7 };
	uint8_t rfcomm_channel = 11;
	const char *service_name = "K_Service_Name";
	const char *service_dsc = "K_Service_Dsc";
	const char *service_prov = "K_Service_Prov";

	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, *psm = 0;

	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);

	int err = 0;
	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 );
	err = sdp_record_register(session, record, 0);

	// 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;
}


int main(int argc, char **argv)
{
	struct sockaddr_rc loc_addr = { 0 }, rem_addr = { 0 };
	char buf[1024] = { 0 };
	int s, client, bytes_read;
	int opt = sizeof(rem_addr);

	sdp_session_t *session = register_service();

	// allocate socket
	s = socket(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM);

	// bind socket to port 1 of the first available 
	// local bluetooth adapter
	loc_addr.rc_family = AF_BLUETOOTH;
	loc_addr.rc_bdaddr = *BDADDR_ANY;
	loc_addr.rc_channel = (uint8_t) 11;
	bind(s, (struct sockaddr *)&loc_addr, sizeof(loc_addr));

	// put socket into listening mode
	listen(s, 1);

	// accept one connection
	client = accept(s, (struct sockaddr *)&rem_addr, &opt);

	ba2str( &rem_addr.rc_bdaddr, buf );
	fprintf(stderr, "accepted connection from %s\n", buf);
	memset(buf, 0, sizeof(buf));

	// read data from the client
	bytes_read = read(client, buf, sizeof(buf));
	if( bytes_read > 0 ) {
		printf("received [%s]\n", buf);
	}

	// close connection
	close(client);
	close(s);
	return 0;
}

 

 

Code_K (120 포인트) 님이 2013년 7월 17일 질문
Code_K님이 2013년 7월 18일 reopened

답변 달기

· 글에 소스 코드 보기 좋게 넣는 법
· 질문에 대해 추가적인 질문이나 의견이 있으면 답변이 아니라 댓글로 달아주시기 바랍니다.
표시할 이름 (옵션):
개인정보: 당신의 이메일은 이 알림을 보내는데만 사용됩니다.
스팸 차단 검사:
스팸 검사를 다시 받지 않으려면 로그인하거나 혹은 가입 하세요.
...