소스는 공개된 것들이지만 서리님께서 정리해둔 거 퍼 왔습니다.
삭제 요청하시면 지워드려야 합니다.
이 소스 사용전 필수사항 : # apt-get install libbluetooth-dev
[출처] 블루투스 프로그래밍 - 라즈베리파이에서|작성자 서리
1. scan -- C,python
hcitool scan
또는
sdptool browse
과 같은 기능이다.
- C
#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; }
pi@raspberrypi ~/src/cc $ gcc simplescan.c -o simplescan -lbluetooth
pi@raspberrypi ~/src/cc $ ./simplescan
00:12:02:03:01:07 H-C-2010-06-01
13:FA:5D:C9:12:4C FEE
- Python :
pi@raspberrypi ~/src/python/net $ cat discovery.py
from bluetooth import *
print "performing inquiry..."
nearby_devices = discover_devices(lookup_names = True)
print "found %d devices" % len(nearby_devices)
for addr,name in nearby_devices:
print "%20s - %s" % (name,addr)
pi@raspberrypi ~/src/python/net $ python discovery.py
performing inquiry...
found 2 devices
FEE - 13:FA:5D:C9:12:4C
H-C-2010-06-01 - 00:12:02:03:01:07
-- C
typedef struct { uint8_t b[6]; } __attribute__((packed)) bdaddr_t;
typedef struct { bdaddr_t bdaddr; uint8_t pscan_rep_mode; uint8_t pscan_period_mode; uint8_t pscan_mode; uint8_t dev_class[3]; uint16_t clock_offset; } __attribute__ ((packed)) inquiry_info;
이런거만 있으면 되나부네~
주소를 문자열로 바꾸고 ,. 변환하는거도 있어야겟고...
2. rfcomm-sever / rfcomm-client
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; socklen_t 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-server-sdp.py import bluetooth server_sock=bluetooth.BluetoothSocket( bluetooth.RFCOMM ) port = bluetooth.get_available_port( bluetooth.RFCOMM ) server_sock.bind(("",port)) server_sock.listen(1) print "listening on port %d" % port uuid = "1e0ca4ea-299d-4335-93eb-27fcfe7fa848" bluetooth.advertise_service( server_sock, "FooBar Service", uuid ) client_sock,address = server_sock.accept() print "Accepted connection from ",address data = client_sock.recv(1024) print "received [%s]" % data client_sock.close() server_sock.close()
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; }
rfcomm-client-sdp.py
import sys
import bluetooth
uuid = "1e0ca4ea-299d-4335-93eb-27fcfe7fa848"
service_matches = bluetooth.find_service( uuid = uuid )
if len(service_matches) == 0:
print "couldn't find the FooBar service"
sys.exit(0)
first_match = service_matches[0]
port = first_match["port"]
name = first_match["name"]
host = first_match["host"]
print "connecting to \"%s\" on %s" % (name, host)
sock=bluetooth.BluetoothSocket( bluetooth.RFCOMM )
sock.connect((host, port))
sock.send("hello!!")
sock.close()
struct sockaddr_rc { sa_family_t rc_family; bdaddr_t rc_bdaddr; uint8_t rc_channel; };
-- Dynamically assigned port number
int dynamic_bind_rc(int sock, struct sockaddr_rc *sockaddr, uint8_t *port) { int err; for( *port = 1; *port <= 31; *port++ ) { sockaddr->rc_channel = *port; err = bind(sock, (struct sockaddr *)sockaddr, sizeof(sockaddr)); if( ! err || errno == EINVAL ) break; } if( port == 31 ) { err = -1; errno = EINVAL; } return err; }
3. l2cap-server / l2cap-client
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; socklen_t 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); }
struct sockaddr_l2 { sa_family_t l2_family; unsigned short l2_psm; bdaddr_t l2_bdaddr; };
MTU( Maximun Transmission Unit )struct l2cap_options { uint16_t omtu; uint16_t imtu; uint16_t flush_to; uint8_t mode; }; int set_l2cap_mtu( int sock, uint16_t mtu ) { struct l2cap_options opts; int optlen = sizeof(opts), err; err = getsockopt( s, SOL_L2CAP, L2CAP_OPTIONS, &opts, &optlen ); if( ! err ) { opts.omtu = opts.imtu = mtu; err = setsockopt( s, SOL_L2CAP, L2CAP_OPTIONS, &opts, optlen ); } return err; };
[출처] 블루투스 프로그래밍 - 라즈베리파이에서|작성자 서리
'실전 임베디드' 카테고리의 다른 글
| raspberry pi keyboard layout 실전 임베디드 2016. 2. 5. 14:52 (0) | 2019.09.22 |
|---|---|
| raspberry pi wifi가 자꾸 잠을 자요... 실전 임베디드 2016. 1. 29. 20 (0) | 2019.09.22 |
| raspberry pi serial 실전 임베디드 2016. 1. 29. 19:47 (0) | 2019.09.22 |
| Raspberry pi RTL wifi 실전 임베디드 2016. 1. 27. 23:06 (0) | 2019.09.22 |
| raspberry pi vsftpd 실전 임베디드 2016. 1. 27. 22:55 (0) | 2019.09.22 |