#include #include #include #include #include #include #include #include int fd; void send_line(char* line) { write(fd, line, strlen(line)); write(fd, "\xd", 1); fprintf(stderr, "send_line:<%s>\n", line); } const char* get_line() { static char buf[1024]; char *bufit=buf; while (read(fd, bufit, 1)==1 && *bufit!='\xd') { if (*bufit=='\xa') bufit = buf; else bufit++; } *bufit = '\x0'; fprintf(stderr, "get_line:<%s>\n", buf); return buf; } int main(int argc, char *argv[]) { if (argc!=3) { fprintf(stderr, "argc!=3\n"); return 1; } fd = socket(PF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM); if (fd<0) { perror("socket error"); return 1; } struct sockaddr_rc addr; memset(&addr, 0, sizeof(addr)); addr.rc_family = AF_BLUETOOTH; str2ba(argv[1], &addr.rc_bdaddr); addr.rc_channel = 3; if (connect(fd, (struct sockaddr *)&addr, sizeof(addr)) < 0) { perror("connect error"); return 1; } send_line("AT+BRSF=22"); while (strncmp(get_line(),"OK",2)!=0); send_line("AT+CIND=?"); while (strncmp(get_line(),"OK",2)!=0); send_line("AT+CIND?"); while (strncmp(get_line(),"OK",2)!=0); send_line("AT+CMER=3,0,0,1"); while (strncmp(get_line(),"OK",2)!=0); char dialcmd[1024]; sprintf(dialcmd, "ATD%s;", argv[2]); send_line(dialcmd); while (strcmp(get_line(),"+CIEV: 10,3")!=0); fprintf(stderr, "alerting! connecting SCO\n"); int scofd = socket(PF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_SCO); if (scofd<0) { perror("scofd socket"); return 1; } struct sockaddr_sco scoaddr; memset(&scoaddr, 0, sizeof(scoaddr)); scoaddr.sco_family = AF_BLUETOOTH; str2ba(argv[1], &scoaddr.sco_bdaddr); if (connect(scofd, (struct sockaddr *)&scoaddr, sizeof(scoaddr))<0) { perror ("scofd connect"); return 1; } char scobuf[100][48]; int scoit=0; while (1) { while (read(scofd, scobuf[scoit], 48) == 48) { scoit = (scoit+1)%(sizeof(scobuf)/sizeof(scobuf[0])); write(scofd, scobuf[scoit], 48); } } return 0; }