Android 在覆盆子pi3上使用C(BlueZ)的蓝牙技术赢得';不要给安卓写信。读书很好

Android 在覆盆子pi3上使用C(BlueZ)的蓝牙技术赢得';不要给安卓写信。读书很好,android,c,bluetooth,bluez,raspberry-pi3,Android,C,Bluetooth,Bluez,Raspberry Pi3,我研究了一下,通过在这个网站上查找信息,我认为我已经找到了答案,但我仍然无法用C语言从pi发送到我的Android。我能够从Android fine接收信息。Android客户端软件似乎很好,因为我可以通过以下方式进行双向通信: “sdptool添加SP”然后是“sudo rfcomm watch hci0” 然后我使用/dev/rfcomm0设备使用了minicom-D 在执行此应用程序之前,我会运行“sdptool add SP”。在这之后,我可以连接我的Android。我没有得到任何错误。

我研究了一下,通过在这个网站上查找信息,我认为我已经找到了答案,但我仍然无法用C语言从pi发送到我的Android。我能够从Android fine接收信息。Android客户端软件似乎很好,因为我可以通过以下方式进行双向通信:

“sdptool添加SP”然后是“sudo rfcomm watch hci0”

然后我使用
/dev/rfcomm0
设备使用了
minicom-D

在执行此应用程序之前,我会运行“sdptool add SP”。在这之后,我可以连接我的Android。我没有得到任何错误。我的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;
}
#包括
#包括
#包括
#包括
#包括
int main(int argc,字符**argv)
{
结构sockaddr_rc loc_addr={0},rem_addr={0};
char buf[1024]={0};
int s,客户端,字节读取,状态;
socklen_t opt=sizeof(rem_addr);
状态=0;
//分配套接字
s=插座(AF_蓝牙、SOCK_流、BTPROTO_RFCOMM);
//将套接字绑定到第一个可用端口的端口1
//本地蓝牙适配器
loc_addr.rc_family=AF_蓝牙;
loc_addr.rc_bdaddr=*bdaddr_ANY;
loc_addr.rc_channel=(uint8_t)1;
绑定(结构sockaddr*)和loc_addr,大小(loc_addr));
//将套接字置于侦听模式
听(s,1);
printf(“进入侦听模式\n”);
//接受一个连接
client=accept(s,(struct sockaddr*)和rem_addr,&opt);
ba2str(和rem_addr.rc_bdaddr,buf);
fprintf(stderr,“已接受来自%s的连接”,buf);
//写一些字节
如果(状态==0)
状态=写入(客户端,“Hello World”,11);
如果(状态<0)printf(“某物已损坏”\n);
//从客户端读取数据
memset(buf,0,sizeof(buf));
bytes_read=read(客户机、buf、sizeof(buf));
如果(字节读取>0)
printf(“已接收\n[%s]\n”,buf);
//密切联系
关闭(客户);
关闭(s);;
返回0;
}

我已经为此工作了好几天了。我一问这个问题,就明白了。两件事:

  • 确保你的终端程序在吐出数据之前没有寻找/n/r,或者你应该确保你在测试中发送了a/n/r

  • “int status”保存上次写入命令发送的字符数。如果您尝试循环(虽然我的代码中没有显示,但我为测试做了),并且只在status==0时写入,那么它只会第一次发送。如果设置缓冲区限制,则可能无法达到该限制

  • 两者的结合让我看起来好像什么都没收到