当前位置: 首页 > news >正文

苏州企业网站建设公司价格h5网站设计

苏州企业网站建设公司价格,h5网站设计,东莞网站seo推广优化,网站上的flash怎么做的一、需求 在树莓派/香橙派上利用开发板自带的蓝牙作为一个蓝牙服务端#xff08;主机#xff09;#xff0c;允许外来设备#xff08;从机#xff09;通过蓝牙接入进行通信#xff0c;通信格式为透传方式#xff1b;采用的编程语言为Linux C 二、环境准备 bluez安装 …一、需求 在树莓派/香橙派上利用开发板自带的蓝牙作为一个蓝牙服务端主机允许外来设备从机通过蓝牙接入进行通信通信格式为透传方式采用的编程语言为Linux C 二、环境准备 bluez安装 linux C在终端中输入以下命令安装BlueZ库 sudo apt-get update sudo apt-get install bluez sudo apt-get install libbluetooth-dev修改配置文件 修改 /etc/systemd/system/dbus-org.bluez.service 在ExecStart /usr/lib/Bluetooth/bluetoothd 后面添加-C 紧接着添加一行ExecStartPost/usr/bin/sdptool add SP其中修改系统中蓝牙服务的启动选项-C的意思就是compat兼容性模式运行蓝牙服务sdptool add SP是为了开机自启动SPP服务默认是把这个服务放到channel 1的通道中这个通道类似于socket的端口号。 再reboot重启跟新配置 检查蓝牙设备是否加载成功 hciconfig检查蓝牙加载情况正常启动显示如下 rootorangepizero2:/home/orangepi# hciconfig hci0: Type: Primary Bus: UARTBD Address: 63:E8:09:BF:10:A5 ACL MTU: 1021:8 SCO MTU: 240:3UP RUNNINGRX bytes:744 acl:0 sco:0 events:51 errors:0TX bytes:5366 acl:0 sco:0 commands:51 errors:0蓝牙命令行操作非必须 如果想改变蓝牙的配置或查询状态等可以通过bluetoothctl的命令行进行操作具体可以参考这篇博文 https://blog.csdn.net/lxyoucan/article/details/124705648 三、服务端程序 代码思路 在主函数中创建一个用于广播信息的线程sendmsg_func广播时往在线的客户端发送相同消息 然后主函数处于监听状态等待外来蓝牙客户端的接入为每一个接入的客户端生成对应的recv_func线程同时允许最多20个蓝牙客户端接入其实蓝牙即使开了主从模式也接受不了这么多从机接入容易出现不稳定的情况所以这里设定20个客户端已经很大 其中客户端套接字数组c_fd[ClientMax]都会初始化为-1当客户端套接字被使用后离线程序会将该套接字的值重新置为-1表明该套接字未被占用后续接入的客户端可以使用该套接字 具体实现BluetoothServer2.c如下代码已经详细注释 #include stdio.h #include stdlib.h #include unistd.h #include sys/socket.h #include bluetooth/bluetooth.h #include bluetooth/rfcomm.h #include pthread.h#define ClientMax 20 #define BUFSIZE 512 int c_fd[ClientMax]; char recBuf[BUFSIZE] {0}; //用于记录接入的客户端的mac地址/******************* 用于广播信息到各个蓝牙的线程广播的消息这里通过终端直接输入 的形式实际应用时可自行修改为其他信息源 *******************/ void *sendmsg_func(void *p) {int j;printf(启动信息发送线程:\n);printf(直接在空白处输入即可\n);char sendBuf[BUFSIZE] {\0}; //用于存储要广播的消息while(1){memset(sendBuf,0,BUFSIZE);fgets(sendBuf,BUFSIZE,stdin); //用于用户输入要广播的消息//给所有在线的客户端发送信息for(j 0;c_fd[j] 0 j ClientMax;j){if (c_fd[j] -1){continue; //如果是已退出或未使用的客户端则不发送信息}else{if(write(c_fd[j],sendBuf,BUFSIZE) 0 ){perror(write);exit(-1);}}}} }/******************* 用于接收新接入的蓝牙客户端消息 *******************/void *recv_func(void *p) {int tmp_c_fd *((int *)p); //拿到接入的客户端的套接字char nameBuf[BUFSIZE] {0}; //存储接入的客户端的mac地址,用于区别不同客户端char readBuf[BUFSIZE] {0}; //用于存储接收到对应客户端的消息int n_read 0;//将全局变量recBuf接收到的mac地址copy到nameBuf中strcpy(nameBuf,recBuf); //这里其实最好要考虑线程并发对recBuf值的改变可以考虑使用互斥量等方法pthread_t tid;tid pthread_self();printf(启动线程tid:%lu,用于接收新蓝牙从机%s的信息\n ,tid,nameBuf);while(1){memset(readBuf,0,BUFSIZE);n_read read(tmp_c_fd,readBuf,sizeof(readBuf));if(n_read 0){//perror(read); //调试语句printf(%s中断或者下线了\n,nameBuf);tmp_c_fd -1; //如果对应的客户端退出则令对应的c_fd的值为-1表示掉线pthread_exit(NULL); //如果客户端掉线结束线程}else {printf(%s:#%s\n,nameBuf,readBuf); //将用户发送的信息打印在服务端若有数据库这里可以将聊天记录存在数据库}}}int main() {struct sockaddr_rc loc_addr { 0 }, rem_addr { 0 };int s,bytes_read,i,err,ret;pthread_t rec_tid[ClientMax] {0}; pthread_t send_tid; int opt sizeof(rem_addr);//让本机蓝牙处于可见状态ret system(hciconfig hci0 piscan);if(ret 0){perror(bluetooth discovering fail);}// allocate sockets socket(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM);// bind socket to port 1 of the first available// local bluetooth adapterloc_addr.rc_family AF_BLUETOOTH;loc_addr.rc_bdaddr *BDADDR_ANY; //相当于tcp的ip地址loc_addr.rc_channel (uint8_t) 1; //这里的通道就是SPP的通道相当于网络编程里的端口bind(s, (struct sockaddr *)loc_addr, sizeof(loc_addr));// put socket into listening modelisten(s, ClientMax);printf(bluetooth_server listen success\n);//初始化客户端套接字for(i 0;i ClientMax;i){c_fd[i] -1;}//创建线程用于广播消息err pthread_create(send_tid,NULL,sendmsg_func,NULL);if(err){fprintf(stderr,Create pthread fail:%s\n,strerror(err));exit(1);}//不断等待是否有新蓝牙接入while(1){i 0;//从数组中选取一个可用的客户端套接字值等于-1即为可用的套接字while(1){if((i ClientMax) (c_fd[i] ! -1)){i;}else if(i ClientMax){fprintf(stderr,client fd has more than 20\n);exit(-1);}else{break;}}//accept新的蓝牙接入c_fd[i] accept(s, (struct sockaddr *)rem_addr, opt);if (c_fd[i] 0){printf(client connected success\n);}else{printf(accept client fail\n);continue;}// ba2str把6字节的bdaddr_t结构//转为为形如XX:XX:XX:XX:XX:XX(XX标识48位蓝牙地址的16进制的一个字节)的字符串ba2str( rem_addr.rc_bdaddr, recBuf); fprintf(stdout, accepted connection from %s\n, recBuf);//为每个新的客户端创建自己的线程用于接收信息err pthread_create((rec_tidi),NULL,recv_func,(c_fdi));if (err){fprintf(stderr,Create pthread fail:%s\n,strerror(err));exit(1);} }// close connection//close(client);close(s);return 0; } 编译语句 将BluetoothServer2.c编译为可执行文件BluetoothServer2 gcc -o BluetoothServer2 BluetoothServer2.c -lbluetooth -lpthread执行结果 开启服务端后分别用两台手机的蓝牙接入服务端并向服务端发送消息然后服务端再广播消息到两台设备上 服务端结果 手机蓝牙1 手机蓝牙2 可以看到已经可以实现多客户端蓝牙通信 局限性 未考虑多并发的情况所以代码可以引入互斥量、条件变量等极致防止因为并发导致的数据不准确
http://www.hkea.cn/news/14443499/

相关文章:

  • 建立平台网站需要花多少钱男女做羞羞的事视频网站
  • 手机app网站开发二手书网站建设的目的
  • 亚运村网站建设美食美客网站建设
  • 手机网站html模板下载精品网站建
  • wordpress做图片站的可能性用focusky做h5微网站
  • 计算机毕设代做网站动漫网站开发研究内容
  • 做网站怎么样才能排在首页建设银行平潭招聘网站
  • 网站建设需要啥武进网站建设多少钱
  • seo网站优化插件tag改为静态wordpress
  • 网站热力图工具奇搜建设辽沈阳网站
  • 微网站建设是什么安阳论坛最新消息
  • 兼职开发网站开发企业制作网站
  • 简单的明星个人网站建设论文网站是如何做的好
  • 怎么把别人网站模板下载出来展会宣传推广计划
  • 公司网站主页怎么做电力公司建设安全文化
  • 网站建设费用会计分录嘉瑞建设有限公司网站
  • 深圳手机建站模板网站色调选择
  • 网站建设公司江苏做设计一般用什么素材网站
  • 建设企业网站小微如何找到能够建设网站的人
  • asp手机网站开发教程商务网站建设内容
  • 创建一个网站流程网站技术支持 新锐网络
  • 长春网站制作培训做企业网站用什么
  • 天津建设银行招聘网站学校网站建设制度
  • 手机网站建设的图片北京做网站公司有哪些
  • 网站制作设计方案百度推广渠道
  • 中国移动官方网站官网后盾网原创实战网站建设教程1-15
  • 昆明网站建设公司猫咪科技南京自助建站模板
  • 设计网站推荐外网做太空泥的几分钟网站
  • 做网站必须先买域名吗网页代理网站
  • 俄语网站推广如何使用网站模板