⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 network-bluetooth.html

📁 这是很好的学习嵌入式LINUX的文章
💻 HTML
📖 第 1 页 / 共 2 页
字号:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta name="generator" content="HTML Tidy, see www.w3.org" /><title>蓝牙</title><meta name="GENERATOR" content="Modular DocBook HTML Stylesheet Version 1.7" /><link rel="HOME" title="FreeBSD 使用手册" href="index.html" /><link rel="UP" title="高级网络" href="advanced-networking.html" /><link rel="PREVIOUS" title="无线网络" href="network-wireless.html" /><link rel="NEXT" title="桥接" href="network-bridging.html" /><link rel="STYLESHEET" type="text/css" href="docbook.css" /><meta http-equiv="Content-Type" content="text/html; charset=GB2312" /></head><body class="SECT1" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#840084"alink="#0000FF"><div class="NAVHEADER"><table summary="Header navigation table" width="100%" border="0" cellpadding="0"cellspacing="0"><tr><th colspan="3" align="center">FreeBSD 使用手册</th></tr><tr><td width="10%" align="left" valign="bottom"><a href="network-wireless.html"accesskey="P">后退</a></td><td width="80%" align="center" valign="bottom">章 24. 高级网络</td><td width="10%" align="right" valign="bottom"><a href="network-bridging.html"accesskey="N">前进</a></td></tr></table><hr align="LEFT" width="100%" /></div><div class="SECT1"><h1 class="SECT1"><a id="NETWORK-BLUETOOTH" name="NETWORK-BLUETOOTH">24.4. 蓝牙</a></h1><i class="AUTHORGROUP"><span class="CONTRIB">作者:</span> Pav Lucistnik.</i> <iclass="AUTHORGROUP"><span class="CONTRIB">中文翻译:</span> 张 雪平 和 袁 苏义.</i> <div class="SECT2"><h2 class="SECT2"><a id="AEN35977" name="AEN35977">24.4.1. 简介</a></h2><p>Bluetooth(蓝牙)是一项无线技术,用于建立带宽为2.4GHZ,波长为10米的私有网络。网络一般是由便携式设备,比加手机(cellularphone),掌上电脑(handhelds)和膝上电脑(laptops))以ad-hoc形式组成。不象其它流行的无线技术——Wi-Fi,Bluetooth提供了更高级的服务层面,像类FTP的文件服务、文件推送(filepushing)、语音传送、串行线模拟等等。</p><p>在FreeBSD里,蓝牙栈(Bluetooth stack)通过使用Netgraph框架(请看<spanclass="CITEREFENTRY"><span class="REFENTRYTITLE">netgraph</span>(4)</span>)来的实现。大量的"Bluetooth USB dongle"由<span class="CITEREFENTRY"><spanclass="REFENTRYTITLE">ng_ubt</span>(4)</span>驱动程序支持。 基于BroadcomBCM2033芯片组的Bluetooth设备可以通过<span class="CITEREFENTRY"><spanclass="REFENTRYTITLE">ubtbcmfw</span>(4)</span>和<span class="CITEREFENTRY"><spanclass="REFENTRYTITLE">ng_ubt</span>(4)</span>驱动程序支持。 3Com Bluetooth PC 卡3CRWB60-A 由 <span class="CITEREFENTRY"><spanclass="REFENTRYTITLE">ng_bt3c</span>(4)</span> 驱动程序支持。 基于Serial 和 UART的蓝牙设备由<span class="CITEREFENTRY"><spanclass="REFENTRYTITLE">sio</span>(4)</span>,<span class="CITEREFENTRY"><spanclass="REFENTRYTITLE">ng_h4</span>(4)</span>和<span class="CITEREFENTRY"><spanclass="REFENTRYTITLE">hcseriald</span>(8)</span>。 本节介绍USB Bluetooth dongle的使用。在FreeBSD 5.0及更新的系统里,都可以支持Bluetooth。</p></div><div class="SECT2"><h2 class="SECT2"><a id="AEN36005" name="AEN36005">24.4.2. 插入设备</a></h2><p>默认的Bluetooth设备驱动程序已存在于内核模块里。接入设备前,你需要将驱动程序加载入内核:</p><pre class="SCREEN"><samp class="PROMPT">#</samp> <kbd class="USERINPUT">kldload ng_ubt</kbd></pre><p>如果系统启动时Bluetooth设备已经存在于系统里,那么从<ttclass="FILENAME">/boot/loader.conf</tt>里加载这个模块:</p><pre class="PROGRAMLISTING">ng_ubt_load="YES"</pre><p>插入USB dongle。 控制台(console)(或syslog中)会出现类似如下的信息:</p><pre class="SCREEN">ubt0: vendor 0x0a12 product 0x0001, rev 1.10/5.25, addr 2 ubt0: Interface 0 endpoints: interrupt=0x81, bulk-in=0x82, bulk-out=0x2 ubt0: Interface 1 (alt.config 5) endpoints: isoc-in=0x83, isoc-out=0x3, wMaxPacketSize=49, nframes=6, buffer size=294</pre><p>复制<ttclass="FILENAME">/usr/share/examples/netgraph/bluetooth/rc.bluetooth</tt>到一个合适的地方,如<tt class="FILENAME">/etc/rc.bluetooth</tt>。 这个脚本用于启动和停止Bluetoothstack(蓝牙栈)。 最好在拔出设备前停止stack(stack),当然也不是非做不可。启动stack(栈)时,会得到如下的输出:</p><pre class="SCREEN"><samp class="PROMPT">#</samp> <kbdclass="USERINPUT">/etc/rc.bluetooth start ubt0</kbd> BD_ADDR: 00:02:72:00:d4:1a Features: 0xff 0xff 0xf 00 00 00 00 00 &lt;3-Slot&#62; &lt;5-Slot&#62; &lt;Encryption&#62; &lt;Slot offset&#62; &lt;Timing accuracy&#62; &lt;Switch&#62; &lt;Hold mode&#62; &lt;Sniff mode&#62; &lt;Park mode&#62; &lt;RSSI&#62; &lt;Channel quality&#62; &lt;SCO link&#62; &lt;HV2 packets&#62; &lt;HV3 packets&#62; &lt;u-law log&#62; &lt;A-law log&#62; &lt;CVSD&#62; &lt;Paging scheme&#62; &lt;Power control&#62; &lt;Transparent SCO data&#62; Max. ACL packet size: 192 bytes Number of ACL packets: 8 Max. SCO packet size: 64 bytes Number of SCO packets: 8</pre></div><div class="SECT2"><h2 class="SECT2"><a id="AEN36024" name="AEN36024">24.4.3. 主控制器接口(HCI)</a></h2><p>主控制器接口(HCI)提供了通向基带控制器和连接管理器的命令接口及访问硬件状态字和控制寄存器的通道。这个接口提供了访问蓝牙基带(Bluetooth baseband)功能的统一方式。主机上的HCI层与蓝牙硬件上的HCI固件交换数据和命令。主控制器的传输层(如物理总线)驱动程序提供两个HCI层交换信息的能力。</p><p>为每个蓝牙(Bluetooth)设备创建一个<span class="emphasis"><iclass="EMPHASIS">hci</i></span>类型的Netgraph结点。 HCI结点一般连接蓝牙设备的驱动结点(下行流)和L2CAP结点(上行流)。所有的HCI操作必须在HCI结点上进行而不是设备驱动结点。 HCI结点的默认名是``devicehci''。更多细节请参考<span class="CITEREFENTRY"><spanclass="REFENTRYTITLE">ng_hci</span>(4)</span>的联机手册。</p><p>最常见的任务是发现在RF proximity中的蓝牙(Bluetooth)设备。 这个就叫做<spanclass="emphasis"><i class="EMPHASIS">质询(inquiry)</i></span>。质询及HCI相关的操作可以由<span class="CITEREFENTRY"><spanclass="REFENTRYTITLE">hccontrol</span>(8)</span>工具来完成。以下的例子展示如何找出范围内的蓝牙设备。 在几秒钟内你应该得到一张设备列表。注意远程主机只有被置于<span class="emphasis"><iclass="EMPHASIS">discoverable(可发现)</i></span>模式才能答应质询。</p><pre class="SCREEN"><samp class="PROMPT">%</samp> <kbd class="USERINPUT">hccontrol -n ubt0hci inquiry</kbd>Inquiry result, num_responses=1Inquiry result #0       BD_ADDR: 00:80:37:29:19:a4       Page Scan Rep. Mode: 0x1       Page Scan Period Mode: 00       Page Scan Mode: 00       Class: 52:02:04       Clock offset: 0x78efInquiry complete. Status: No error [00]</pre><p><var class="LITERAL">BD_ADDR</var> 是蓝牙设备的特定地址,类似于网卡的MAC地址。需要用此地址与某个设备进一步地通信。 可以为BD_ADDR分配由人可读的名字(human readablename)。 文件<tt class="FILENAME">/etc/bluetooth/hosts</tt>包含已知蓝牙主机的信息。下面的例子展示如何获得分配给远程设备的可读名。</p><pre class="SCREEN"><samp class="PROMPT">%</samp> <kbdclass="USERINPUT">hccontrol -n ubt0hci remote_name_request 00:80:37:29:19:a4</kbd>BD_ADDR: 00:80:37:29:19:a4Name: Pav's T39</pre><p>如果在远程蓝牙上运行质询,你会发现你的计算机是``your.host.name (ubt0)''。分配给本地设备的名字可随时改变。</p><p>蓝牙系统提供点对点连接(只有两个蓝牙设备参与)和点对多点连接。在点对多点连接中,连接由多个蓝牙设备共享。以下的例子展示如何取得本地设备的活动基带(baseband)连接列表。</p><pre class="SCREEN"><samp class="PROMPT">%</samp> <kbdclass="USERINPUT">hccontrol -n ubt0hci read_connection_list</kbd>Remote BD_ADDR    Handle Type Mode Role Encrypt Pending Queue State00:80:37:29:19:a4     41  ACL    0 MAST    NONE       0     0 OPEN</pre><p><span class="emphasis"><i class="EMPHASIS">connection handle(连接柄)</i></span>在需要终止基带连接时有用。 注意:一般不需要手动完成。栈(stack)会自动终止不活动的基带连接。</p><pre class="SCREEN"><samp class="PROMPT">#</samp> <kbdclass="USERINPUT">hccontrol -n ubt0hci disconnect 41</kbd>Connection handle: 41Reason: Connection terminated by local host [0x16]</pre><p>参考<tt class="COMMAND">hccontrol help</tt> 获取完整的HCI命令列表。大部分HCI命令不需要超级用户权限。</p></div><div class="SECT2"><h2 class="SECT2"><a id="AEN36063" name="AEN36063">24.4.4.逻辑连接控制和适配协议(L2CAP)</a></h2><p>逻辑连接控制和适配协议(L2CAP)为上层协议提供面向连接和无连接的数据服务,并提供多协议功能和分割重组操作。L2CAP充许上层协议和应用软件传输和接收最大长度为64K的L2CAP数据包。</p><p>L2CAP 基于 <span class="emphasis"><i class="EMPHASIS">通道(channel)</i></span>的概念。通道(Channel)是位于基带(baseband)连接之上的逻辑连接。每个通道以多对一的方式绑定一个单一协议(single protocol)。多个通道可以绑定同一个协议,但一个通道不可以绑定多个协议。每个在通道里接收到的L2CAP数据包被传到相应的上层协议。 多个通道可共享同一个基带连接。</p><p>为每个蓝牙(Bluetooth)设备创建一个<span class="emphasis"><iclass="EMPHASIS">l2cap</i></span>类型的Netgraph结点。 L2CAP结点一般连接HCI结点(下行流)和蓝牙设备的驱动结点(上行流)。L2CAP结点的默认名是``devicel2cap''。 更多细节请参考<span class="CITEREFENTRY"><spanclass="REFENTRYTITLE">ng_l2cap</span>(4)</span>的联机手册。</p><p>一个有用的命令是<span class="CITEREFENTRY"><spanclass="REFENTRYTITLE">l2ping</span>(8)</span>,它可以用来 ping 其它设备。一些蓝牙实现可能不会返回所有发送给它们的数据,所以下例中的 <var class="LITERAL">0bytes</var> 是正常的。</p><pre class="SCREEN"><samp class="PROMPT">#</samp> <kbd class="USERINPUT">l2ping -a 00:80:37:29:19:a4</kbd>0 bytes from 0:80:37:29:19:a4 seq_no=0 time=48.633 ms result=00 bytes from 0:80:37:29:19:a4 seq_no=1 time=37.551 ms result=00 bytes from 0:80:37:29:19:a4 seq_no=2 time=28.324 ms result=00 bytes from 0:80:37:29:19:a4 seq_no=3 time=46.150 ms result=0</pre><p><span class="CITEREFENTRY"><spanclass="REFENTRYTITLE">l2control</span>(8)</span>工具用于在L2CAP上进行多种操作。以下这个例子展示如何取得本地设备的逻辑连接(通道)和基带连接的列表:</p><pre class="SCREEN"><samp class="PROMPT">%</samp> <kbdclass="USERINPUT">l2control -a 00:02:72:00:d4:1a read_channel_list</kbd>L2CAP channels:Remote BD_ADDR     SCID/ DCID   PSM  IMTU/ OMTU State00:07:e0:00:0b:ca    66/   64     3   132/  672 OPEN<samp class="PROMPT">%</samp> <kbdclass="USERINPUT">l2control -a 00:02:72:00:d4:1a read_connection_list</kbd>L2CAP connections:Remote BD_ADDR    Handle Flags Pending State00:07:e0:00:0b:ca     41 O           0 OPEN</pre><p>另一个诊断工具是<span class="CITEREFENTRY"><spanclass="REFENTRYTITLE">btsockstat</span>(1)</span>。 它完成与<spanclass="CITEREFENTRY"><spanclass="REFENTRYTITLE">netstat</span>(1)</span>类似的操作,只是用了蓝牙网络相关的数据结构。以下这个例子显示与<span class="CITEREFENTRY"><spanclass="REFENTRYTITLE">l2control</span>(8)</span>相同的逻辑连接。</p><pre class="SCREEN"><samp class="PROMPT">%</samp> <kbd class="USERINPUT">btsockstat</kbd>Active L2CAP socketsPCB      Recv-Q Send-Q Local address/PSM       Foreign address   CID   Statec2afe900      0      0 00:02:72:00:d4:1a/3     00:07:e0:00:0b:ca 66    OPENActive RFCOMM sessionsL2PCB    PCB      Flag MTU   Out-Q DLCs Statec2afe900 c2b53380 1    127   0     Yes  OPENActive RFCOMM socketsPCB      Recv-Q Send-Q Local address     Foreign address   Chan DLCI Statec2e8bc80      0    250 00:02:72:00:d4:1a 00:07:e0:00:0b:ca 3    6    OPEN</pre></div><div class="SECT2"><h2 class="SECT2"><a id="AEN36106" name="AEN36106">24.4.5. RFCOMM 协议</a></h2><p>RFCOMM 协议提供基于L2CAP协议的串行端口模拟。 该协议基于ETSI TS 07.10标准。RFCOMM是一个简单的传输协议,附加了摸拟9针RS-232(EIATIA-232-E)串行端口的定义。 RFCOMM协议最多支持60个并发连接 (RFCOMM通道) 。</p><p>为了实现RFCOMM,运行于不同设备上的应用程序建立起一条关于它们之间通信段的通信路径。RFCOMM实际上适用于使用串行端口的应用软件。通信段是一个设备到另一个设备的蓝牙连接(直接连接)。</p><p>RFCOMM关心的只是直接连接设备之间的连接,或在网络里一个设备与modem之间的连接。 RFCOMM能支持其它的配置,比如在一端通过蓝牙无线技术通讯而在另一端使用有线接口。</p><p>在FreeBSD,RFCOMM 协议在蓝牙套接字层(Bluetooth sockets layer)实现。</p></div><div class="SECT2"><h2 class="SECT2"><a id="AEN36114" name="AEN36114">24.4.6. 设备的结对(Pairing ofDevices)</a></h2><p>默认情况下,蓝牙通信是不需要验证的,任何设备可与其它任何设备对话。一个蓝牙设备(比如手机)可以选择通过验证以提供某种特殊服务(比如拨号服务)。蓝牙验证一般使用<span class="emphasis"><i class="EMPHASIS">PIN码(PIN codes)</i></span>。一个PIN码是最长为16个字符的ASCII字符串。 用户需要在两个设备中输入相同的PIN码。用户输入了PIN 码后,两个设备会生成一个<span class="emphasis"><iclass="EMPHASIS">连接密匙(link key)</i></span>。 接着连接密钥可以存储在设备或存储器中。连接时两个设备会使用先前生成的连接密钥。 以上介绍的过程被称为<span class="emphasis"><iclass="EMPHASIS">结对(pairing)</i></span>。注意如果任何一方丢失了连接密钥,必须重新进行结对。</p><p>守护进程<span class="CITEREFENTRY"><spanclass="REFENTRYTITLE">hcsecd</span>(8)</span>负责处理所有蓝牙验证请求。默认的配置文件是<tt class="FILENAME">/etc/bluetooth/hcsecd.conf</tt>。下面的例子显示一个手机的PIN码被预设为``1234'':</p><pre class="PROGRAMLISTING">device {        bdaddr  00:80:37:29:19:a4;        name    "Pav's T39";        key     nokey;        pin     "1234";

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -