sac*_*hin 6 c debian bluetooth
我正在尝试用 C 编写程序以通过蓝牙发送/接收数据。我参考了 Albert Huang 的一本书,其中有示例程序和很好的信息来源。链接:https : //people.csail.mit.edu/albert/bluez-intro/index.html (https://people.csail.mit.edu/albert/bluez-intro/x502.html)中的示例4.2显示了使用套接字编程的 RFCOMM 连接。还有没有办法使用设备的蓝牙名称而不是 BD 地址进行连接?在这里,我没有看到如何为通过蓝牙连接的通信设置 PIN 或身份验证。有没有办法实现它。由于没有身份验证过程,套接字连接是否足够安全?
我正在使用 debian 机器和 Bluez 包进行开发。我试图实现的拓扑是 - 1 个主服务器/服务器连接到 N(根据蓝牙协议规范最多 7 个)客户端,这些客户端可能是任何嵌入式简单芯片计算机,并且应该能够进行通信,直到连接被任何一个(源或客户)。
有没有人做过类似的事情或者可能是任何参考。
我发现关于 SO 的参考资料很少,但一切都指向我回到书中描述的相同内容。我找不到与我正在寻找的内容相似的内容。
任何帮助表示赞赏。
感谢您的时间和帮助。
首先,您必须搜索所有 BT 设备。
第二项检查是任何资助设备的名称是否与您的具体名称匹配。
如果 true 执行发送到服务器代码。
#include <stdio.h>
// POSIX sys lib: fork, pipe, I/O (read, write)
#include <unistd.h>
// superset of unistd, same
#include <stdlib.h>
//Bluetooth
#include <bluetooth/bluetooth.h>
#include <bluetooth/rfcomm.h>
#include <bluetooth/hci.h>
#include <bluetooth/hci_lib.h>
#include <bluetooth/sdp.h>
#include <bluetooth/sdp_lib.h>
#include <bluetooth/sco.h>
//socket
#include <sys/socket.h>
int main(int argc, char **argv)
{
int flag=0;
struct sockaddr_rc addrress = { 0 };
int s, status;
char dest[18]="";// = "B0:10:41:3F:6E:80";//My destination address Laptop
char namelaptop[20]="ss";
// allocate a socket
s = socket(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM);
///create a socket
// set the connection parameters (who to connect to)
addrress.rc_family = AF_BLUETOOTH;
addrress.rc_channel = (uint8_t) 1;//must use sdp to work in real devices
//may this channel not ready
printf("Search for BT Devices...\n");
///search
inquiry_info *ii = NULL;
int max_rsp, num_rsp;
int dev_id, sock, len, flags;
int i;
char addr[18] = { 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 = 2;
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]");
else{
printf("\nFind #%d\n",i);
printf("Addr:%s Name:%s\n", addr, name);
int a=strcmp(name, namelaptop);
//printf("compare:%d\n",a);
if (!a){ // if name mached
str2ba( addr, &addrress.rc_bdaddr );//copy dest-->addr.rc_bdaddr
flag =1;
}
}
}
/// End Search
///Connect and send
if (flag==0){
printf("Not find dest: %s\n",name);
exit(0);
}
// connect to server, throw socket s
status = connect(s, (struct sockaddr *)&addrress, sizeof(addrress));
//successful, connect() returns 0.
printf("connection status: %d\n\n",status);//0 show OK
// send a message to server
if( status == 0 ) {
status = write(s, "hello!", 6);
if (status == 6){
printf("Send data to server done\n");
}
}
else
if( status < 0 ){
perror("send message to server Failed\n");
}
printf("Closing socket\n");
///close the socket
close(s);
///End connect and send
free( ii );
close( sock );
return 0;
}
Run Code Online (Sandbox Code Playgroud)
只是只使用
rfcomm-server.c
Run Code Online (Sandbox Code Playgroud)
#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));
//get local address ?
//~ ba2str( &loc_addr.rc_bdaddr, buf );
//~ fprintf(stdout, "local %s\n", buf);
// 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;
}
Run Code Online (Sandbox Code Playgroud)
这两个代码对我有用。
rfcomm-client.c我在我的电脑和rfcomm-server.c笔记本电脑上运行。我的笔记本电脑 BT 名称是"ss"我硬编码的rfcomm-client.c
客户端发送一个 hello 消息,服务器如果收到则显示它。