最近搞藍牙,自己找網上的例子嘗試編譯,中間遇到了一些坑,記錄一下:
<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 ,如需轉載請自行聯系原作者