⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bt_ser.cpp

📁 嵌入式LINUX的智能家居系统源码
💻 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 + -