蓝牙程序编译

最近搞蓝牙,自己找网上的例子尝试编译,中间遇到了一些坑,记录一下:

#include <stdio.h>
#include <sys/types.h>         
#include <sys/socket.h>
#include <stdlib.h>
#include <poll.h>

#include <bluetooth/bluetooth.h>
#include <bluetooth/hci.h>
#include <bluetooth/hci_lib.h>
#include <bluetooth/l2cap.h>

void * Read_thread(void* pSK);
int main(int argc, char** argv)
{
 int iRel = 0;
 int sk = 0;
 struct sockaddr_l2 local_addr;
 struct sockaddr_l2 remote_addr;
 int len;
 int nsk = 0;
 pthread_t nth = 0;
 struct l2cap_options opts;
 int optlen = 0;
 int slen = 0;
 char str[16] = {0};
 if(argc < 2)
 {
  printf("\nUsage:%s psm\n", argv[0]);
  exit(0);
 }
 
 // create l2cap socket
 sk = socket(PF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_L2CAP);  //发送数据,使用SOCK_SEQPACKET为好
 if(sk < 0)
 {
  perror("\nsocket():");
  exit(0);
 }

 //bind
 local_addr.l2_family = PF_BLUETOOTH;
 local_addr.l2_psm = htobs(atoi(argv[argc -1]));  //last psm
 bacpy(&local_addr.l2_bdaddr, BDADDR_ANY);
 iRel = bind(sk, (struct sockaddr *)&local_addr, sizeof(struct sockaddr));
 if(iRel < 0)
 {
  perror("\nbind()");
  exit(0);
 }

 //get opts
// in mtu 和 out mtu.每个包的最大值
 memset(&opts, 0, sizeof(opts));
 optlen = sizeof(opts);
 getsockopt(sk, SOL_L2CAP, L2CAP_OPTIONS, &opts, &optlen);
 printf("\nomtu:[%d]. imtu:[%d]. flush_to:[%d]. mode:[%d]\n", opts.omtu, opts.imtu, opts.flush_to, opts.mode);

 //set opts. default value
 opts.omtu = 0;
 opts.imtu = 672;
 if (setsockopt(sk, SOL_L2CAP, L2CAP_OPTIONS, &opts, sizeof(opts)) < 0)
 {
  perror("\nsetsockopt():");
  exit(0);
 }

 //listen
 iRel = listen(sk, 10);
 if(iRel < 0)
 {
  perror("\nlisten()");
  exit(0);
 }
 
 len = sizeof(struct sockaddr_l2);
 while(1)
 {
  memset(&remote_addr, 0, sizeof(struct sockaddr_l2));
  nsk = accept(sk, (struct sockaddr*)(&remote_addr), &len);
  if(nsk < 0)
  {
   perror("\naccept():");
   continue;
  }
  ba2str(&(remote_addr.l2_bdaddr), str);
  printf("\npeer bdaddr:[%s].\n", str);  //得到peer的信息
  iRel = pthread_create(&nth, NULL, Read_thread, &nsk);
  if(iRel != 0)
  {
   perror("pthread_create():");
   continue;
  }
  pthread_detach(nth);  // 分离之
  
 }
 
 return 0;
}

void * Read_thread(void* pSK)
{
 //struct pollfd fds[10];
 struct   pollfd   fds[100];
 char buf[1024] = {0};
 int iRel = 0;
 int exit_val = 0;
 
 //fds[0].fd = *(int*)pSK;
 //fds[0].events = POLLIN | POLLHUP;
 fds[0].fd   =   (int)(*(int*)pSK);
 fds[0].events   =   POLLIN   |   POLLHUP;
 
 while(1)
 {
  if(poll(fds, 1, -1) < 0)
  {
   perror("\npoll():");
  }
  if(fds[0].revents & POLLHUP)
  {
   //hang up
   printf("\n[%d] Hang up\n", *(int*)pSK);
   close(*(int*)pSK);
   pthread_exit(&exit_val);
   break;
  }
  if(fds[0].revents & POLLIN)
  {
   memset(buf, 0 , 1024);
   //read data
   iRel = recv(*(int*)pSK, buf, 572, 0);
   //printf("\nHandle[%d] Receive [%d] data:[%s]", *(int*)pSK, iRel, buf);
  }
  
 }
 return 0;
}

头文件:

#include <bluetooth/bluetooth.h>
#include <bluetooth/hci.h>
#include <bluetooth/hci_lib.h>
#include <bluetooth/l2cap.h>

需要从以下网址下载两个文件:

http://www.bluez.org/download/

其中,头文件在bluez-5.38.tar.xz文件中有。

链接需要库文件libbluetooth.so.2

这个文件就要通过bluez-libs-3.36.tar.gz编译生成,执行两条命令就可以生成:

./configure
make

将生成的库文件拷贝到/usr/lib目录下就可以了。

gcc编译的时候要加编译选项,这样才能编译成功:

gcc server.c -o server -I bluez-5.38/lib/ -lbluetooth -lpthread
时间: 2024-11-05 12:21:35

蓝牙程序编译的相关文章

C程序编译过程浅析【转】

转自:http://blog.csdn.net/koudaidai/article/details/8092647 前几天看了<程序员的自我修养——链接.装载与库>中的第二章“编译和链接”,主要根据其中的内容简单总结一下C程序编译的过程吧. 我现在一般都是用gcc,所以自然以GCC编译hellworld为例,简单总结如下. hello.c源代码如下: ?[Copy to clipboard] C 1 2 3 4 5 6 [c] view plaincopy <span style=&qu

程序编译运行和exe运行之文件位置的区别

如图: 文件输入输出 1.程序编译运行 输入文件和输出文件与.c同位置 2.exe运行 输入文件和输出文件与.exe同位置

C语言程序编译过程

最近在编译DM8168的ARM端程序时经常出现未定义.重定义等报错,由于源码文件多,包含关系比较多,所以自己添加时容易乱.深深的体会到,好的代码风格是如此重要,之前也在看代码重构,以后应该更加注意代码的质量.经思考总结规律如下: 1.公用的数据结构等写为一个头文件,其他源文件包含此头文件.同时为了让不同源文件里的函数都可以使用,公用的函数可以放在此头文件中声明. 2.其他源文件里声明的变量,如果想在另一个文件里用,需要extern声明,这样可以避免各种全局变量的交互混杂. 理解的比较浅,希望高人

.NET概念:.NET程序编译和运行

.NET概念:.NET程序编译和运行 分类: c#程序设计 2012-02-29 15:46 3001人阅读 评论(2) 收藏 举报 .net编译器语言microsoftassemblyvb.net 程序的编译和运行,总得来说大体是:首先写好的程序是源代码,然后编译器编译为本地机器语言,最后在本地操作系统运行. 下图为传统代码编译运行过程: .NET的编译和运行过程与之类似,首先编写好的源代码,然后编译为微软中间语言代码,运行的时候即时编译为本地机器语言,同时.NET代码运行时有一个CLR环境来

CUDA程序编译过程中产生警告的解决方法

有时候经常使用别人用Tabhost+其它的实现demo.单纯利用Tabhost该如何使用呢? 下面看例子: public class MainActivity extends TabActivity { public TabHost tabHost; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 获取对象 tabHost = getTabH

c++ --程序编译

程序编译 程序的编译流程大体可分为编辑.预处理.编译和链接4个步骤. 1. 编辑 编辑程序:将源文件输入计算机进行修改和保存的过程就称为“编辑”. 2. 预处理 预处理器是在真正的编译开始之前由编译器调用的独立程序.预处理器可以删除注释.包含文件以及执行宏替代. 预处理器在编译器之前根据指令更改程序文本.编译器看到的是预处理器修改过的代码文本. "#include "."#define "等都属于编译预处理.预处理行尾不加分号.原则上预处理行可以写在程序的任意位置,

C/C++程序编译运行过程分析(转载)

为了减轻使用机器语言编程的痛苦,人们进行了一种有益的改进:用一些简洁的英文字母.符号串来替代一个特定的指令的二进制串,比如,用“A D D”代表加法,“M O V”代表数据传递等等,这样一来,人们很容易读懂并理解程序在干什么,纠错及维护都变得方便了,这种程序设计语言就称为汇编语言,即第二代计算机语言.然而计算机是不认识这些符号的,这就需要一个专门的程序,专门负责将这些符号翻译成二进制数的机器语言,这种翻译程序被称为汇编程序.因为汇编指令和机器语言之间有着一一对应的关系,这可比英译汉或汉译英简单多

C程序编译执行过程

C程序编译执行过程 认识C编译执行过程,是C学习的开端. 简单说C语言从编码编译到执行要经历一下过程: C源代码 编译---->形成目标代码,目标代码是在目标机器上运行的代码. 连接---->将目标代码与C函数库相连接,并将源程序所用的库代码与目标代码合并,并形成最终可执行的二进制机器代码(程序). 执行----->在特定的机器环境下运行C程序. 如果用一个图 来表示: 以上过程仅仅是个大概,详细的过程相当复杂,下面这篇文章写得很详细,从中受益很多: 原文来自:http://www.vc

转载:ios程序编译链接参数 all_load 的 ld duplicate symbol _main 的 bug及修复

转载自:http://www.cnblogs.com/dabaopku/archive/2012/12/12/2813940.html ios程序编译链接参数 all_load 的 ld duplicate symbol _main 的 bug及修复 问题 -all_load 是在Objective-C 编译时常用到的一个参数,比如这篇文章所介绍的,生成静态库的一些问题-all_load.但是我们在加入这个参数后,有时会出现"ld: duplicate symbol _main"的错误