天天看點

藍牙程式編譯

最近搞藍牙,自己找網上的例子嘗試編譯,中間遇到了一些坑,記錄一下:

<code>#include &lt;stdio.h&gt;</code>

<code>#include &lt;sys/types.h&gt;         </code>

<code>#include &lt;sys/socket.h&gt;</code>

<code>#include &lt;stdlib.h&gt;</code>

<code>#include &lt;poll.h&gt;</code>

<code>#include &lt;bluetooth/bluetooth.h&gt;</code>

<code>#include &lt;bluetooth/hci.h&gt;</code>

<code>#include &lt;bluetooth/hci_lib.h&gt;</code>

<code>#include &lt;bluetooth/l2cap.h&gt;</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 &lt; 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 &lt; 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(&amp;local_addr.l2_bdaddr, BDADDR_ANY);</code>

<code> </code><code>iRel = bind(sk, (</code><code>struct</code> <code>sockaddr *)&amp;local_addr, </code><code>sizeof</code><code>(</code><code>struct</code> <code>sockaddr));</code>

<code> </code><code>if</code><code>(iRel &lt; 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>(&amp;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, &amp;opts, &amp;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, &amp;opts, </code><code>sizeof</code><code>(opts)) &lt; 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>(&amp;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*)(&amp;remote_addr), &amp;len);</code>

<code>  </code><code>if</code><code>(nsk &lt; 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(&amp;(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(&amp;nth, NULL, Read_thread, &amp;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) &lt; 0)</code>

<code>   </code><code>perror</code><code>(</code><code>"\npoll():"</code><code>);</code>

<code>  </code><code>if</code><code>(fds[0].revents &amp; 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(&amp;exit_val);</code>

<code>   </code><code>break</code><code>;</code>

<code>  </code><code>if</code><code>(fds[0].revents &amp; 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 ,如需轉載請自行聯系原作者

繼續閱讀