我进行了研究,并通过在此站点上查找信息,认为我已经弄明白了,但我仍然无法从 pi 发送到我的 C Android 中。我可以从 Android 中正常接收。 Android 客户端软件似乎没问题,因为我可以使用以下方式进行双向通信:
'sdptool add SP' 然后'sudo rfcomm watch hci0'
然后我使用 minicom -D
使用 /dev/rfcomm0
设备。
在执行此应用程序之前,我确实运行了“sdptool add SP”。之后我就可以连接我的安卓了。我没有收到任何错误。我的 Android 屏幕上什么也看不到。
我错过了什么?我认为一旦打开套接字并且连接成功,我就可以从中读取和写入。
这是我在 pi 上的代码:
#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, status;
socklen_t opt = sizeof(rem_addr);
status = 0;
// 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);
printf("Put into listening mode\n");
// 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);
//write some bytes
if (status == 0)
status = write(client,"Hello World",11);
if (status < 0) printf("Something is broken\n");
// read data from the client
memset(buf, 0, sizeof(buf));
bytes_read = read(client, buf, sizeof(buf));
if( bytes_read > 0 )
printf("received\n [%s]\n", buf);
// close connection
close(client);
close(s);
return 0;
}
最佳答案
我已经为此工作了好几天。我一问这个问题,我就明白了。两件事:
确保您的终端程序在吐出数据之前没有查找/n/r,或者您应该确保在测试时发送/n/r!
'int status' 保存从最后一个写命令发送的字符数。如果你尝试循环(我做了测试,虽然没有在我的代码中显示)并且只写 while status==0,它只会发送第一次。如果您设置缓冲区限制,则可能无法达到。
两者的结合让我看起来好像什么都没收到。
关于android - 在 Raspberry pi3 上使用 C (BlueZ) 的蓝牙不会写入 Android。读书没问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39049912/