最近搞蓝牙,自己找网上的例子尝试编译,中间遇到了一些坑,记录一下:
<code>#include <stdio.h></code>
<code>#include <sys/types.h> </code>
<code>#include <sys/socket.h></code>
<code>#include <stdlib.h></code>
<code>#include <poll.h></code>
<code>#include <bluetooth/bluetooth.h></code>
<code>#include <bluetooth/hci.h></code>
<code>#include <bluetooth/hci_lib.h></code>
<code>#include <bluetooth/l2cap.h></code>
<code>void</code> <code>* Read_thread(</code><code>void</code><code>* pSK);</code>
<code>int</code> <code>main(</code><code>int</code> <code>argc, </code><code>char</code><code>** argv)</code>
<code>{</code>
<code> </code><code>int</code> <code>iRel = 0;</code>
<code> </code><code>int</code> <code>sk = 0;</code>
<code> </code><code>struct</code> <code>sockaddr_l2 local_addr;</code>
<code> </code><code>struct</code> <code>sockaddr_l2 remote_addr;</code>
<code> </code><code>int</code> <code>len;</code>
<code> </code><code>int</code> <code>nsk = 0;</code>
<code> </code><code>pthread_t nth = 0;</code>
<code> </code><code>struct</code> <code>l2cap_options opts;</code>
<code> </code><code>int</code> <code>optlen = 0;</code>
<code> </code><code>int</code> <code>slen = 0;</code>
<code> </code><code>char</code> <code>str[16] = {0};</code>
<code> </code><code>if</code><code>(argc < 2)</code>
<code> </code><code>{</code>
<code> </code><code>printf</code><code>(</code><code>"\nUsage:%s psm\n"</code><code>, argv[0]);</code>
<code> </code><code>exit</code><code>(0);</code>
<code> </code><code>}</code>
<code> </code>
<code> </code><code>// create l2cap socket</code>
<code> </code><code>sk = socket(PF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_L2CAP); </code><code>//发送数据,使用SOCK_SEQPACKET为好</code>
<code> </code><code>if</code><code>(sk < 0)</code>
<code> </code><code>perror</code><code>(</code><code>"\nsocket():"</code><code>);</code>
<code> </code><code>//bind</code>
<code> </code><code>local_addr.l2_family = PF_BLUETOOTH;</code>
<code> </code><code>local_addr.l2_psm = htobs(</code><code>atoi</code><code>(argv[argc -1])); </code><code>//last psm</code>
<code> </code><code>bacpy(&local_addr.l2_bdaddr, BDADDR_ANY);</code>
<code> </code><code>iRel = bind(sk, (</code><code>struct</code> <code>sockaddr *)&local_addr, </code><code>sizeof</code><code>(</code><code>struct</code> <code>sockaddr));</code>
<code> </code><code>if</code><code>(iRel < 0)</code>
<code> </code><code>perror</code><code>(</code><code>"\nbind()"</code><code>);</code>
<code> </code><code>//get opts</code>
<code>// in mtu 和 out mtu.每个包的最大值</code>
<code> </code><code>memset</code><code>(&opts, 0, </code><code>sizeof</code><code>(opts));</code>
<code> </code><code>optlen = </code><code>sizeof</code><code>(opts);</code>
<code> </code><code>getsockopt(sk, SOL_L2CAP, L2CAP_OPTIONS, &opts, &optlen);</code>
<code> </code><code>printf</code><code>(</code><code>"\nomtu:[%d]. imtu:[%d]. flush_to:[%d]. mode:[%d]\n"</code><code>, opts.omtu, opts.imtu, opts.flush_to, opts.mode);</code>
<code> </code><code>//set opts. default value</code>
<code> </code><code>opts.omtu = 0;</code>
<code> </code><code>opts.imtu = 672;</code>
<code> </code><code>if</code> <code>(setsockopt(sk, SOL_L2CAP, L2CAP_OPTIONS, &opts, </code><code>sizeof</code><code>(opts)) < 0)</code>
<code> </code><code>perror</code><code>(</code><code>"\nsetsockopt():"</code><code>);</code>
<code> </code><code>//listen</code>
<code> </code><code>iRel = listen(sk, 10);</code>
<code> </code><code>perror</code><code>(</code><code>"\nlisten()"</code><code>);</code>
<code> </code><code>len = </code><code>sizeof</code><code>(</code><code>struct</code> <code>sockaddr_l2);</code>
<code> </code><code>while</code><code>(1)</code>
<code> </code><code>memset</code><code>(&remote_addr, 0, </code><code>sizeof</code><code>(</code><code>struct</code> <code>sockaddr_l2));</code>
<code> </code><code>nsk = accept(sk, (</code><code>struct</code> <code>sockaddr*)(&remote_addr), &len);</code>
<code> </code><code>if</code><code>(nsk < 0)</code>
<code> </code><code>{</code>
<code> </code><code>perror</code><code>(</code><code>"\naccept():"</code><code>);</code>
<code> </code><code>continue</code><code>;</code>
<code> </code><code>}</code>
<code> </code><code>ba2str(&(remote_addr.l2_bdaddr), str);</code>
<code> </code><code>printf</code><code>(</code><code>"\npeer bdaddr:[%s].\n"</code><code>, str); </code><code>//得到peer的信息</code>
<code> </code><code>iRel = pthread_create(&nth, NULL, Read_thread, &nsk);</code>
<code> </code><code>if</code><code>(iRel != 0)</code>
<code> </code><code>perror</code><code>(</code><code>"pthread_create():"</code><code>);</code>
<code> </code><code>pthread_detach(nth); </code><code>// 分离之</code>
<code> </code>
<code> </code><code>return</code> <code>0;</code>
<code>}</code>
<code>void</code> <code>* Read_thread(</code><code>void</code><code>* pSK)</code>
<code> </code><code>//struct pollfd fds[10];</code>
<code> </code><code>struct</code> <code>pollfd fds[100];</code>
<code> </code><code>char</code> <code>buf[1024] = {0};</code>
<code> </code><code>int</code> <code>exit_val = 0;</code>
<code> </code><code>//fds[0].fd = *(int*)pSK;</code>
<code> </code><code>//fds[0].events = POLLIN | POLLHUP;</code>
<code> </code><code>fds[0].fd = (</code><code>int</code><code>)(*(</code><code>int</code><code>*)pSK);</code>
<code> </code><code>fds[0].events = POLLIN | POLLHUP;</code>
<code> </code><code>if</code><code>(poll(fds, 1, -1) < 0)</code>
<code> </code><code>perror</code><code>(</code><code>"\npoll():"</code><code>);</code>
<code> </code><code>if</code><code>(fds[0].revents & POLLHUP)</code>
<code> </code><code>//hang up</code>
<code> </code><code>printf</code><code>(</code><code>"\n[%d] Hang up\n"</code><code>, *(</code><code>int</code><code>*)pSK);</code>
<code> </code><code>close(*(</code><code>int</code><code>*)pSK);</code>
<code> </code><code>pthread_exit(&exit_val);</code>
<code> </code><code>break</code><code>;</code>
<code> </code><code>if</code><code>(fds[0].revents & POLLIN)</code>
<code> </code><code>memset</code><code>(buf, 0 , 1024);</code>
<code> </code><code>//read data</code>
<code> </code><code>iRel = recv(*(</code><code>int</code><code>*)pSK, buf, 572, 0);</code>
<code> </code><code>//printf("\nHandle[%d] Receive [%d] data:[%s]", *(int*)pSK, iRel, buf);</code>
头文件:
需要从以下网址下载两个文件:
<a href="http://www.bluez.org/download/" target="_blank">http://www.bluez.org/download/</a>
<a href="http://s4.51cto.com/wyfs02/M01/7E/86/wKiom1cDYCCQMGSDAACnUakPPUU328.png" target="_blank"></a>
其中,头文件在bluez-5.38.tar.xz文件中有。
链接需要库文件libbluetooth.so.2
这个文件就要通过bluez-libs-3.36.tar.gz编译生成,执行两条命令就可以生成:
<code>.</code><code>/configure</code>
<code>make</code>
将生成的库文件拷贝到/usr/lib目录下就可以了。
gcc编译的时候要加编译选项,这样才能编译成功:
<code>gcc server.c -o server -I bluez-5.38</code><code>/lib/</code> <code>-lbluetooth -lpthread</code>
<code></code>
本文转自fatshi51CTO博客,原文链接:http://blog.51cto.com/duallay/1760446 ,如需转载请自行联系原作者