int main() { int btsock; struct sockaddr_l2 addr; unsigned char *send_buf; unsigned char *recv_buf; socklen_t optlen; uint8_t id; int i; int lost; char * svr = "58:3F:54:7A:F8:5E"; char str[18]; /* Default options */ bacpy(&bdaddr, BDADDR_ANY); send_buf = malloc(L2CAP_CMD_HDR_SIZE + size); recv_buf = malloc(L2CAP_CMD_HDR_SIZE + size); if (!send_buf || !recv_buf) { perror("Can't allocate buffer"); exit(1); } /* Create socket */ btsock = socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_L2CAP); if (btsock < 0) { perror("Can't create socket"); return -1; } set_l2cap_mtu(btsock, 1000); /* Bind to local address */ memset(&addr, 0, sizeof(addr)); addr.l2_family = AF_BLUETOOTH; bacpy(&addr.l2_bdaddr, &bdaddr); if (bind(btsock, (struct sockaddr *) &addr, sizeof(addr)) < 0) { perror("Can't bind socket"); return -1; } /* Connect to remote device */ memset(&addr, 0, sizeof(addr)); addr.l2_family = AF_BLUETOOTH; str2ba(svr, &addr.l2_bdaddr); if (connect(btsock, (struct sockaddr *) &addr, sizeof(addr)) < 0) { perror("Can't connect"); return -1; }/* Get local address */ memset(&addr, 0, sizeof(addr)); optlen = sizeof(addr); if (getsockname(btsock, (struct sockaddr *) &addr, &optlen) < 0) { perror("Can't get local address"); return -1; } ba2str(&addr.l2_bdaddr, str); printf("Ping: %s from %s (data size %d) ...\n", svr, str, size); /* Initialize send buffer */ for (i = 0; i < size; i++) send_buf[L2CAP_CMD_HDR_SIZE + i] = (i % 40) + 'A'; id = ident; while (count == -1 || count-- > 0) { struct timeval tv_send, tv_recv, tv_diff; l2cap_cmd_hdr *send_cmd = (l2cap_cmd_hdr *) send_buf; l2cap_cmd_hdr *recv_cmd = (l2cap_cmd_hdr *) recv_buf; /* Build command header */ send_cmd->ident = id; send_cmd->len = htobs(size); if (reverse) send_cmd->code = L2CAP_ECHO_RSP; else send_cmd->code = L2CAP_ECHO_REQ; gettimeofday(&tv_send, NULL); /* Send Echo Command */ if (send(btsock, send_buf, L2CAP_CMD_HDR_SIZE + size, 0) <= 0) { perror("Send failed"); return -1; } /* Wait for Echo Response */ lost = 0; while (1) { struct pollfd pf[1]; int err; pf[0].fd = btsock; pf[0].events = POLLIN; if ((err = poll(pf, 1, timeout * 1000)) < 0) { perror("Poll failed"); return -1; } if (!err) { lost = 1; break; } if ((err = recv(btsock, recv_buf, L2CAP_CMD_HDR_SIZE + size, 0)) < 0) { perror("Recv failed"); return -1; } if (!err){ printf("Disconnected\n"); return -1; } recv_cmd->len = btohs(recv_cmd->len); /* Check for our id */ if (recv_cmd->ident != id) continue; /* Check type */ if (!reverse && recv_cmd->code == L2CAP_ECHO_RSP) break; if (recv_cmd->code == L2CAP_COMMAND_REJ) { printf("Peer doesn't support Echo packets\n"); return -1; } } sent_pkt++; if (!lost) { recv_pkt++; gettimeofday(&tv_recv, NULL); timersub(&tv_recv, &tv_send, &tv_diff); if (verify) { /* Check payload length */ if (recv_cmd->len != size) { fprintf(stderr, "Received %d bytes, expected %d\n", recv_cmd->len, size); return -1; } /* Check payload */ if (memcmp(&send_buf[L2CAP_CMD_HDR_SIZE], &recv_buf[L2CAP_CMD_HDR_SIZE], size)) { fprintf(stderr, "Response payload different.\n"); return -1; } } printf("%d bytes from %s id %d time %.2fms\n", recv_cmd->len, svr, id - ident, tv2fl(tv_diff)); if (delay) sleep(delay); } else { printf("no response from %s: id %d\n", svr, id - ident); } if (++id > 254) id = ident; } free(send_buf); free(recv_buf); return 0; }
//TODO: change to bluetooth address to specified int main(int argc, char **argv) { //程序员面试宝典 struct sockaddr_l2 local_addr, remote_addr; //hci_open_route char buf[60000] = {0}; int listensock, clientsock, err = 0, retval = 0; unsigned int optlen = sizeof(remote_addr); ssize_t count = 0; int i; listensock = socket(AF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_L2CAP); if (listensock < 0) return listensock; if (set_l2cap_mtu(listensock, 65000) != 0) { perror("set_l2cap_mtu"); goto failed; } //Bind to local adapter memset(&local_addr, 0, sizeof(local_addr)); local_addr.l2_family = AF_BLUETOOTH; local_addr.l2_bdaddr = *BDADDR_ANY; local_addr.l2_psm = htobs(0x1001); if (bind(listensock, (struct sockaddr *)&local_addr, sizeof(local_addr))) goto failed; if (listen(listensock, 1) < 0) goto failed; memset(&remote_addr, 0, sizeof(remote_addr)); for ( ; ; ) { clientsock = accept(listensock, (struct sockaddr *)&remote_addr, &optlen); if (clientsock < 0) { perror("accpet error"); //syslog(LOG_ERR, "ac") goto failed; } // if(set_flush_timeout(&remote_addr.l2_bdaddr, 10)) { // perror("set flush timeout"); // goto failed1; // } i = 0; ba2str(&remote_addr.l2_bdaddr, buf); fprintf(stderr, "accepted connection from %s\n", buf); do { count = recv(clientsock, buf, sizeof(buf), 0); if(count > 0) { printf("received [%d]:%d\n", count, i); } else if(count == 0){ printf("client disconnect\n"); } else { perror("recv error"); } //count = send(clientsock, "yes you are the best!", 20, 0); i++; } while (count > 0); failed1: close(clientsock); } //set MTU(maximum transfer unit)optlen //set no retranssimition: set auto flush number to a small value //set encry failed: err = errno; close(listensock); errno = err; return -1; }