📄 bt_ser.cpp
字号:
#include"BT_ser.h"#include <stdlib.h>#include <unistd.h>#include <sys/socket.h>#include <bluetooth/bluetooth.h>#include <bluetooth/hci.h>#include <bluetooth/hci_lib.h>#include <bluetooth/rfcomm.h>#include<stdio.h>int sock;int client;bool bt_on;bool bt_stop=false;BT_ser * pbt;void * bt_receiver(void * data){ BT_ser * bt = (BT_ser *)data; int cmd; while(!bt_stop) { if(bt_on == false) { printf("bt not still on \n"); return NULL; } read(client,&cmd,sizeof(int)); bt->emit_sig(cmd); } close(client); close(sock); bt_stop = false; printf("bt disconnected \n"); pbt->start_bt_server(); pbt->wait_connection(); return NULL;}void pack(int *cmd){ *cmd |= ui; *cmd |= TO(PDA_CMD);}void BT_ser::switcher(int cmd){ int cmd_t;// if (cmd==-1024)// {// bt_stop=true;// return;// } switch(cmd & 0xff) { case start_bt_ser: start_bt_server(); wait_connection(); cmd_t = bt_ser_started; pack(&cmd_t); emit sig_cmd(cmd_t); break; case stop_bt_ser: case bt_disconnect: stop_connection(); cmd_t = bt_ser_stopped; cmd_t |=ui; cmd_t |= TO(KER_CMD); pack(&cmd_t); emit sig_cmd(cmd_t); break; default: printf("error bt ser wrong cmd \n"); break; }}void BT_ser::write_BT(int cmd){ int status; status = write(client,&cmd,sizeof(int)); if(status<0)printf("error send order \n");}void BT_ser::emit_sig(int cmd){ emit sig_cmd(cmd);}void BT_ser::start_BT_reader(){ pthread_create(&th_bt_reader,NULL,bt_receiver,(void *)this);}void BT_ser::stop_connection(){ bt_stop=true;}void BT_ser::init(){ pbt = this; bt_on = false; start_bt_server(); wait_connection();// start_BT_reader();}void BT_ser::start_bt_server(){ int dev_id, socker; dev_id = hci_get_route( NULL );//把参数NULL传给hci_get_route可以获得第一个有效的蓝牙适配器识别号。 socker = hci_open_dev( dev_id );// hci_open_dev函数可以打开特定资源号的一个套接口, //确切的说hci_open_dev打开的套接字建立了一条和本地蓝牙适配器控制器的连接� //而不是和远端蓝牙设备的连接。使用这个套接口发送命令到蓝牙控制器可以实现底层的蓝牙操作 printf("Creating socket...\n"); sock=socket(PF_BLUETOOTH,SOCK_STREAM,BTPROTO_RFCOMM);//创建套接字 if(sock<0) { perror("create socket error"); exit(1); } else { printf("create socket success!\n"); }}void * wait_connect(void * data);pthread_t th_waiter;void BT_ser::wait_connection(){ pthread_create(&th_waiter,NULL,wait_connect,NULL);}void * wait_connect(void * data){ printf("waiting ... \n"); char buf[50]; struct sockaddr_rc loc_addr={0},rem_addr={0}; int opt=sizeof(rem_addr); int result; loc_addr.rc_family=AF_BLUETOOTH; loc_addr.rc_bdaddr=*BDADDR_ANY; loc_addr.rc_channel=(uint8_t)1; printf("Binding socket...\n"); result=bind(sock,(struct sockaddr *)&loc_addr,sizeof(loc_addr));//绑定,与创建的套接字进行连接 if(result<0) { printf("bind socket error:"); } else { printf("bind socket success!\n"); } printf("Listen..."); result=listen(sock,1);//监听,看有没有从客户端发来的请求 if(result<0) { printf("error:%d\n",result); printf("listen error:"); } else { printf("requested!\n"); } printf("Accepting...\n");//若有,则接受请求 client=accept(sock,(struct sockaddr *)&rem_addr,(socklen_t *)&opt); if(client<0) { printf("accept error"); } else { bt_on = true; int cmd; pack(&cmd); cmd |= bt_connected; pbt->emit_sig(cmd); printf("accept OK!\n"); } ba2str(&rem_addr.rc_bdaddr,buf);//把6字节的bdaddr_t结构转化成标识48位蓝牙地址的16进制的一个字节)的字符串 fprintf(stderr,"accepted connection from %s \n",buf); pbt->start_BT_reader();}BT_ser::BT_ser(){ bt_on = false;}BT_ser::~BT_ser(){}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -