More actions
imported>Unknown No edit summary |
(Repair batch-0001 pages from live compare) |
||
| Line 27: | Line 27: | ||
int dev_id, sock, len, flags; | int dev_id, sock, len, flags; | ||
int i; | int i; | ||
char addr | char addr[19] = { 0 }; | ||
char name | char name[248] = { 0 }; | ||
dev_id = hci_get_route(NULL); | dev_id = hci_get_route(NULL); | ||
| Line 50: | Line 50: | ||
if (hci_read_remote_name(sock, &(ii+i)->bdaddr, sizeof(name), | if (hci_read_remote_name(sock, &(ii+i)->bdaddr, sizeof(name), | ||
name, 0) < 0) | name, 0) < 0) | ||
strcpy(name, " | strcpy(name, "[unknown]"); | ||
printf("%s %s\n", addr, name); | printf("%s %s\n", addr, name); | ||
} | } | ||
| Line 70: | Line 70: | ||
{ | { | ||
struct sockaddr_rc loc_addr = { 0 }, rem_addr = { 0 }; | struct sockaddr_rc loc_addr = { 0 }, rem_addr = { 0 }; | ||
char buf | char buf[1024] = { 0 }; | ||
int s, client, bytes_read; | int s, client, bytes_read; | ||
int opt = sizeof(rem_addr); | int opt = sizeof(rem_addr); | ||
| Line 97: | Line 97: | ||
bytes_read = read(client, buf, sizeof(buf)); | bytes_read = read(client, buf, sizeof(buf)); | ||
if( bytes_read > 0 ) { | if( bytes_read > 0 ) { | ||
printf("received | printf("received [%s]\n", buf); | ||
} | } | ||
| Line 117: | Line 117: | ||
struct sockaddr_rc addr = { 0 }; | struct sockaddr_rc addr = { 0 }; | ||
int s, status; | int s, status; | ||
char dest | char dest[18] = "01:23:45:67:89:AB"; | ||
// allocate a socket | // allocate a socket | ||
| Line 152: | Line 152: | ||
{ | { | ||
struct sockaddr_l2 loc_addr = { 0 }, rem_addr = { 0 }; | struct sockaddr_l2 loc_addr = { 0 }, rem_addr = { 0 }; | ||
char buf | char buf[1024] = { 0 }; | ||
int s, client, bytes_read; | int s, client, bytes_read; | ||
int opt = sizeof(rem_addr); | int opt = sizeof(rem_addr); | ||
| Line 181: | Line 181: | ||
bytes_read = read(client, buf, sizeof(buf)); | bytes_read = read(client, buf, sizeof(buf)); | ||
if( bytes_read > 0 ) { | if( bytes_read > 0 ) { | ||
printf("received | printf("received [%s]\n", buf); | ||
} | } | ||
| Line 201: | Line 201: | ||
int s, status; | int s, status; | ||
char *message = "hello!"; | char *message = "hello!"; | ||
char dest | char dest[18] = "01:23:45:67:89:AB"; | ||
if(argc < 2) | if(argc < 2) | ||
{ | { | ||
fprintf(stderr, "usage: %s <bt_addr>\n", argv | fprintf(stderr, "usage: %s <bt_addr>\n", argv[0]); | ||
exit(2); | exit(2); | ||
} | } | ||
strncpy(dest, argv | strncpy(dest, argv[1], 18); | ||
// allocate a socket | // allocate a socket | ||
Latest revision as of 23:56, 26 March 2026
What is BlueZ
The overall goal of this project is to make an implementation of the Bluetooth™ wireless standards specifications for Linux. The code is licensed under the GNU General Public License (GPL) and is now included in the Linux 2.4 and Linux 2.6 kernel series. from http://www.bluez.org/
BlueZ 설치 및 설정
http://www.bluez.org/download.html 에서 BlueZ 라이브러리를 받아서 컴파일해야함.
주의점) 커널 2.4의 경우 스택에 RFCOMM 관련 스택이 구현 안된 버전들이 존재하기 때문에 해당 사이트에서 버전에 맞는 패치를 한뒤 커널을 새로 올려야함.
Sample Code
주변 Bluetooth 노드 찾기
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <bluetooth/bluetooth.h>
#include <bluetooth/hci.h>
#include <bluetooth/hci_lib.h>
int main(int argc, char **argv)
{
inquiry_info *ii = NULL;
int max_rsp, num_rsp;
int dev_id, sock, len, flags;
int i;
char addr[19] = { 0 };
char name[248] = { 0 };
dev_id = hci_get_route(NULL);
sock = hci_open_dev( dev_id );
if (dev_id < 0 || sock < 0) {
perror("opening socket");
exit(1);
}
len = 8;
max_rsp = 255;
flags = IREQ_CACHE_FLUSH;
ii = (inquiry_info*)malloc(max_rsp * sizeof(inquiry_info));
num_rsp = hci_inquiry(dev_id, len, max_rsp, NULL, &ii, flags);
if( num_rsp < 0 ) perror("hci_inquiry");
for (i = 0; i < num_rsp; i++) {
ba2str(&(ii+i)->bdaddr, addr);
memset(name, 0, sizeof(name));
if (hci_read_remote_name(sock, &(ii+i)->bdaddr, sizeof(name),
name, 0) < 0)
strcpy(name, "[unknown]");
printf("%s %s\n", addr, name);
}
free( ii );
close( sock );
return 0;
}
RFCOMM Socket
rfcomm-server.c
#include <stdio.h>
#include <unistd.h>
#include <sys/socket.h>
#include <bluetooth/bluetooth.h>
#include <bluetooth/rfcomm.h>
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);
// 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) 1;
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;
}
rfcomm-client.c
#include <stdio.h>
#include <unistd.h>
#include <sys/socket.h>
#include <bluetooth/bluetooth.h>
#include <bluetooth/rfcomm.h>
int main(int argc, char **argv)
{
struct sockaddr_rc addr = { 0 };
int s, status;
char dest[18] = "01:23:45:67:89:AB";
// allocate a socket
s = socket(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM);
// set the connection parameters (who to connect to)
addr.rc_family = AF_BLUETOOTH;
addr.rc_channel = (uint8_t) 1;
str2ba( dest, &addr.rc_bdaddr );
// connect to server
status = connect(s, (struct sockaddr *)&addr, sizeof(addr));
// send a message
if( status == 0 ) {
status = write(s, "hello!", 6);
}
if( status < 0 ) perror("uh oh");
close(s);
return 0;
}
L2CAP Socket
l2cap-server.c
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <bluetooth/bluetooth.h>
#include <bluetooth/l2cap.h>
int main(int argc, char **argv)
{
struct sockaddr_l2 loc_addr = { 0 }, rem_addr = { 0 };
char buf[1024] = { 0 };
int s, client, bytes_read;
int opt = sizeof(rem_addr);
// allocate socket
s = socket(AF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_L2CAP);
// bind socket to port 0x1001 of the first available
// bluetooth adapter
loc_addr.l2_family = AF_BLUETOOTH;
loc_addr.l2_bdaddr = *BDADDR_ANY;
loc_addr.l2_psm = htobs(0x1001);
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.l2_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);
}
l2cap-client.c =
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <bluetooth/bluetooth.h>
#include <bluetooth/l2cap.h>
int main(int argc, char **argv)
{
struct sockaddr_l2 addr = { 0 };
int s, status;
char *message = "hello!";
char dest[18] = "01:23:45:67:89:AB";
if(argc < 2)
{
fprintf(stderr, "usage: %s <bt_addr>\n", argv[0]);
exit(2);
}
strncpy(dest, argv[1], 18);
// allocate a socket
s = socket(AF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_L2CAP);
// set the connection parameters (who to connect to)
addr.l2_family = AF_BLUETOOTH;
addr.l2_psm = htobs(0x1001);
str2ba( dest, &addr.l2_bdaddr );
// connect to server
status = connect(s, (struct sockaddr *)&addr, sizeof(addr));
// send a message
if( status == 0 ) {
status = write(s, "hello!", 6);
}
if( status < 0 ) perror("uh oh");
close(s);
}
참고사이트
http://people.csail.mit.edu/albert/bluez-intro/ http://www.holtmann.org/linux/kernel/ http://www.bluez.org/download.html http://tistory.izyou.net/entry/BlueZ-라이브러리를-이용한-리눅스-Bluetooth-프로그래밍