File:  [NetBSD Developer Wiki] / wikisrc / guide / bluetooth.mdwn
Revision 1.3: download - view: text, annotated - select for diffs
Fri Jun 19 19:18:30 2015 UTC (5 years, 3 months ago) by plunky
Branches: MAIN
CVS tags: HEAD
replace direct links to manpages on netbsd.gw.com with templates

    1: **Contents**
    2: 
    3: [[!toc levels=3]]
    4: 
    5: # Bluetooth on NetBSD
    6: 
    7: ## Introduction
    8: 
    9: Bluetooth is a digital radio protocol used for short range and low power
   10: communications. NetBSD 4.0 introduced support for the Bluetooth protocol stack,
   11: and some integration of service profiles into the NetBSD device framework.
   12: 
   13: The lower layers of the Bluetooth protocol stack pertaining to actual radio
   14: links between devices are handled inside the Bluetooth Controller, which
   15: communicates with the Host computer using the *Host Controller Interface* (HCI)
   16: protocol which can be accessed via a raw packet BTPROTO\_HCI socket interface.
   17: 
   18: Most of the Bluetooth protocols or services layer atop the *Link Layer Control
   19: and Adaptation Protocol (L2CAP)*, which can be accessed via a BTPROTO\_L2CAP
   20: socket interface. This provides sequential packet connections to remote devices,
   21: with up to 64k channels. When an L2CAP channel is opened, the protocol or
   22: service that is required is identified by a *Protocol/Service Multiplexer (PSM)*
   23: value.
   24: 
   25: Service Discovery in the Bluetooth environment is provided for by the
   26: [[!template id=man name="sdp" section="3"]] library
   27: functions and the
   28: [[!template id=man name="sdpd" section="8"]] daemon,
   29: which keeps a database of locally registered services and makes the information
   30: available to remote devices performing queries. The
   31: [[!template id=man name="sdpquery" section="1"]]
   32: tool can be used to query local and remote service databases.
   33: 
   34: Security on Bluetooth links can be enabled by encryption and authentication
   35: options to
   36: [[!template id=man name="btconfig" section="8"]]
   37: which apply to all baseband links that a controller makes, or encryption and
   38: authentication can be enabled for individual RFCOMM and L2CAP links as required.
   39: When authentication is requested, a PIN is presented by each side (generally
   40: entered by the operator, some limited input devices have a fixed PIN). The
   41: controller uses this PIN to generate a Link Key and reports this to the Host
   42: which may be asked to produce it to authenticate subsequent connections. On
   43: NetBSD, the
   44: [[!template id=man name="bthcid" section="8"]]
   45: daemon is responsible for storing link keys and responding to Link Key Requests,
   46: and also provides an interface to allow unprivileged users to specify a PIN with
   47: a PIN client, such as
   48: [[!template id=man name="btpin" section="1"]].
   49: 
   50: ## Supported Hardware
   51: 
   52: Because Bluetooth controllers normally use the standard HCI protocol as
   53: specified in the *Bluetooth 2.0 Core* documentation to communicate with the
   54: host, the NetBSD Bluetooth stack is compatible with most controllers, only
   55: requiring an interface driver, with the following drivers available in NetBSD
   56: 5.0:
   57: 
   58:  * [[!template id=man name="bcsp" section="4"]]
   59:    provides a
   60:    [[!template id=man name="tty" section="4"]] line
   61:    discipline to send and receive BlueCore Serial Protocol packets over a serial
   62:    line as described in the *BlueCore Serial Protocol (BCSP)* specification.
   63:  * [[!template id=man name="bt3c" section="4"]]
   64:    provides an interface to the 3Com Bluetooth PC Card, model 3CRWB6096-A.
   65:  * [[!template id=man name="btbc" section="4"]]
   66:    provides support for the AnyCom BlueCard (LSE041, LSE039, LSE139) PCMCIA
   67:    devices.
   68:  * [[!template id=man name="btuart" section="4"]]
   69:    provides a
   70:    [[!template id=man name="tty" section="4"]] line
   71:    discipline to send and receive Bluetooth packets over a serial line as
   72:    described in the *Bluetooth Host Controller Interface [Transport Layer]
   73:    specification, Vol 4 part A*.
   74:  * [[!template id=man name="sbt" section="4"]]
   75:    provides support for Secure Digital IO Bluetooth adapters.
   76:  * [[!template id=man name="ubt" section="4"]]
   77:    interfaces to all USB Bluetooth controllers conforming to the *HCI USB
   78:    Transport Layer* specification.
   79: 
   80: If support for the NetBSD Bluetooth stack is enabled in the kernel,
   81: autoconfiguration messages will show up in the
   82: [[!template id=man name="dmesg" section="8"]]
   83: output, for example:
   84: 
   85:     bt3c0 at pcmcia0 function 0: <3COM, 3CRWB60-A, Bluetooth PC Card>
   86:     
   87:     ubt0 at uhub1 port 4 configuration 1 interface 0
   88:     ubt0: Cambridge Silicon Radio Bluetooth USB Adapter, rev 2.00/19.58, addr 4
   89:     
   90:     ubt1 at uhub1 port 2 configuration 1 interface 0
   91:     ubt1: Broadcom Belkin Bluetooth Device, rev 1.10/0.01, addr 5
   92: 
   93: When support is not already compiled in, it can be added to the kernel
   94: configuration file for any platform that supports USB and/or PCMCIA (see
   95: [[Kernel Tuning|guide/tuning]]), using the following declarations, as required:
   96: 
   97:     # Bluetooth Controller and Device support
   98:     
   99:     pseudo-device   bcsp                   # BlueCore Serial Protocol
  100:     pseudo-device   btuart                 # Bluetooth HCI UART
  101:     
  102:     # Bluetooth PCMCIA Controllers
  103:     bt3c* at pcmcia? function ?             # 3Com 3CRWB6096-A
  104:     btbc* at pcmcia? function ?             # AnyCom BlueCard LSE041/039/139
  105:     
  106:     # Bluetooth SDIO Controllers
  107:     sbt* at sdmmc?
  108:     
  109:     # Bluetooth USB Controllers
  110:     ubt* at uhub? port ?
  111:     
  112:     # Bluetooth Device Hub
  113:     bthub* at bcsp?
  114:     bthub* at bt3c?
  115:     bthub* at btbc?
  116:     bthub* at btuart?
  117:     bthub* at sbt?
  118:     bthub* at ubt?
  119:     
  120:     # Bluetooth HID support
  121:     bthidev* at bthub?
  122:     
  123:     # Bluetooth Mouse
  124:     btms* at bthidev? reportid ?
  125:     wsmouse* at btms? mux 0
  126:     
  127:     # Bluetooth Keyboard
  128:     btkbd* at bthidev? reportid ?
  129:     wskbd* at btkbd? console ? mux 1
  130:     
  131:     # Bluetooth Audio support
  132:     btsco* at bthub?
  133:         
  134: 
  135: Some older USB Bluetooth dongles based on the Broadcom BCM2033 chip require
  136: firmware to be loaded before they can function, and these devices will be
  137: attached to
  138: [[!template id=man name="ugen" section="4"]]. Use
  139: the `sysutils/bcmfw` package from the NetBSD Package Collection, to load
  140: firmware and enable these.
  141: 
  142: ## System Configuration
  143: 
  144: To fully enable Bluetooth services on NetBSD, the following line should be added
  145: to the `/etc/rc.conf` file.
  146: 
  147:     bluetooth=YES
  148: 
  149: and either reboot, or execute the following command:
  150: 
  151:     # /etc/rc.d/bluetooth start
  152: 
  153: *Note*: Configuration of Bluetooth controllers is done with the
  154: [[!template id=man name="btconfig" section="8"]]
  155: program, and the above argument enables only basic functionality, see the manual
  156: page for other useful options.
  157: 
  158: **Important**:
  159: [[!template id=man name="bthcid" section="8"]]
  160: *must* be running in order to make authenticated connections with remote
  161: devices, and authentication may be requested by either device.
  162: 
  163: ## Human Interface Devices
  164: 
  165: Support for *Human Interface Devices (HIDs)*, which operate using the USB HID
  166: protocol over a pair of L2CAP channels is provided by the
  167: [[!template id=man name="bthidev" section="4"]]
  168: driver. Currently, keyboards and mice are catered for, and attach to
  169: [[!template id=man name="wscons" section="4"]] as
  170: normal.
  171: 
  172: ### Mice
  173: 
  174: Bluetooth Mice can be attached to the system with the
  175: [[!template id=man name="btms" section="4"]] driver,
  176: using
  177: [[!template id=man name="btdevctl" section="8"]].
  178: 
  179: First, you must discover the BDADDR of the device. This may be printed on the
  180: box, but the easiest way is to place the device into discoverable mode and
  181: perform a device inquiry with the appropriate controller:
  182: 
  183:     # btconfig ubt0 inquiry
  184:     Device Discovery on ubt0 .... 1 response
  185:       1: bdaddr 00:14:51:c1:b9:2d (unknown)
  186:        : name "Mighty Mouse"
  187:        : class: [0x002580] Peripheral Mouse <Limited Discoverable>
  188:        : page scan rep mode 0x01
  189:        : page scan period mode 0x02
  190:        : page scan mode 0x00
  191:        : clock offset 6944
  192: 
  193: For ease of use, you may want to add the address to the `/etc/bluetooth/hosts`
  194: file, so that you can refer to the mouse by alias:
  195: 
  196:     # echo "00:14:51:c1:b9:2d mouse" >>/etc/bluetooth/hosts
  197: 
  198: Now, you can query the mouse, which will likely request authentication before it
  199: accepts connections. The fixed PIN should be listed in the documentation, though
  200: `0000` is often used. Set the PIN first using the
  201: [[!template id=man name="btpin" section="1"]]
  202: program:
  203: 
  204:     # btpin -d ubt0 -a mouse -p 0000
  205:     # btdevctl -d ubt0 -a mouse -s HID
  206:     local bdaddr: 00:08:1b:8d:ba:6d
  207:     remote bdaddr: 00:14:51:c1:b9:2d
  208:     link mode: auth
  209:     device type: bthidev
  210:     control psm: 0x0011
  211:     interrupt psm: 0x0013
  212:     Collection page=Generic_Desktop usage=Mouse
  213:       Input id=2 size=1 count=1 page=Button usage=Button_1 Variable, logical range 0..1
  214:       Input id=2 size=1 count=1 page=Button usage=Button_2 Variable, logical range 0..1
  215:       Input id=2 size=1 count=1 page=Button usage=Button_3 Variable, logical range 0..1
  216:       Input id=2 size=1 count=1 page=Button usage=Button_4 Variable, logical range 0..1
  217:       Input id=2 size=4 count=1 page=0x0000 usage=0x0000 Const Variable, logical range 0..1
  218:     Collection page=Generic_Desktop usage=Pointer
  219:       Input id=2 size=8 count=1 page=Generic_Desktop usage=X Variable Relative, logical range -127..127
  220:       Input id=2 size=8 count=1 page=Generic_Desktop usage=Y Variable Relative, logical range -127..127
  221:       Input id=2 size=8 count=1 page=Consumer usage=AC_Pan Variable Relative, logical range -127..127
  222:       Input id=2 size=8 count=1 page=Generic_Desktop usage=Wheel Variable Relative, logical range -127..127
  223:     End collection
  224:       Input id=2 size=8 count=1 page=0x00ff usage=0x00c0 Variable, logical range -127..127
  225:     Feature id=71 size=8 count=1 page=0x0006 usage=0x0020 Variable NoPref Volatile, logical range 0..100
  226:     End collection
  227: 
  228: This tells you that the mouse has responded to an SDP query, and the device
  229: capabilities are shown. Note that authentication is enabled by default for
  230: Bluetooth mice. You may now attach to the system:
  231: 
  232:     # btdevctl -d ubt0 -a mouse -s HID -A
  233: 
  234: which should generate some messages on the system console:
  235: 
  236:     bthidev0 at bthub0 remote-bdaddr 00:14:51:c1:b9:2d link-mode auth
  237:     btms0 at bthidev1 reportid 2: 4 buttons, W and Z dirs.
  238:     wsmouse1 at btms0 mux 0
  239:     bthidev1: reportid 71 not configured
  240:     bthidev1: connected
  241: 
  242: and the mouse should work.
  243: 
  244: The device capabilities are cached by
  245: [[!template id=man name="btdevctl" section="8"]],
  246: and to reattach the mouse at system startup, place an entry in
  247: `/etc/bluetooth/btdevctl.conf`. The
  248: [[!template id=man name="bthidev" section="4"]]
  249: driver will attempt to connect once, though mice will usually be sleeping and
  250: may require a tap on the shoulder to awaken, in which case they should initiate
  251: the connection to the host computer.
  252: 
  253: ### Keyboards
  254: 
  255: Bluetooth Keyboards can be attached to the system with the
  256: [[!template id=man name="btkbd" section="4"]]
  257: driver, using
  258: [[!template id=man name="btdevctl" section="8"]].
  259: 
  260: First, you must discover the BDADDR of the device. This may be printed on the
  261: box, but the easiest way is to place the device into discoverable mode and
  262: perform a device inquiry with the appropriate controller:
  263: 
  264:     # btconfig ubt0 inquiry
  265:     Device Discovery on ubt0 .... 1 response
  266:       1: bdaddr 00:0a:95:45:a4:a0 (unknown)
  267:        : name "Apple Wireless Keyboard"
  268:        : class: [0x002540] Peripheral Keyboard <Limited Discoverable>
  269:        : page scan rep mode 0x01
  270:        : page scan period mode 0x00
  271:        : page scan mode 0x00
  272:        : clock offset 18604
  273: 
  274: For ease of use, you may want to add the address to the `/etc/bluetooth/hosts`
  275: file, so that you can refer to the keyboard by alias:
  276: 
  277:     # echo "00:0a:95:45:a4:a0 keyboard" >>/etc/bluetooth/hosts
  278: 
  279: Now, you can query the keyboard, which will likely request authentication before
  280: it accepts connections. The PIN will need to be entered on the keyboard, and we
  281: can generate a random PIN, using the
  282: [[!template id=man name="btpin" section="1"]]
  283: program.
  284: 
  285:     # btpin -d ubt0 -a keyboard -r -l 8
  286:     PIN: 18799632
  287:     # btdevctl -d ubt0 -a keyboard -s HID
  288:     
  289:         < ENTER PIN ON BLUETOOTH KEYBOARD NOW >
  290:     
  291:     local bdaddr: 00:08:1b:8d:ba:6d
  292:     remote bdaddr: 00:0a:95:45:a4:a0
  293:     link mode: encrypt
  294:     device type: bthidev
  295:     control psm: 0x0011
  296:     interrupt psm: 0x0013
  297:     Collection page=Generic_Desktop usage=Keyboard
  298:       Input id=1 size=1 count=1 page=Keyboard usage=Keyboard_LeftControl Variable, logical range 0..1
  299:       Input id=1 size=1 count=1 page=Keyboard usage=Keyboard_LeftShift Variable, logical range 0..1
  300:       Input id=1 size=1 count=1 page=Keyboard usage=Keyboard_LeftAlt Variable, logical range 0..1
  301:       Input id=1 size=1 count=1 page=Keyboard usage=Keyboard_Left_GUI Variable, logical range 0..1
  302:       Input id=1 size=1 count=1 page=Keyboard usage=Keyboard_RightControl Variable, logical range 0..1
  303:       Input id=1 size=1 count=1 page=Keyboard usage=Keyboard_RightShift Variable, logical range 0..1
  304:       Input id=1 size=1 count=1 page=Keyboard usage=Keyboard_RightAlt Variable, logical range 0..1
  305:       Input id=1 size=1 count=1 page=Keyboard usage=Keyboard_Right_GUI Variable, logical range 0..1
  306:       Input id=1 size=8 count=1 page=0x0000 usage=0x0000 Const, logical range 0..1
  307:      Output id=1 size=1 count=1 page=LEDs usage=Num_Lock Variable, logical range 0..1
  308:      Output id=1 size=1 count=1 page=LEDs usage=Caps_Lock Variable, logical range 0..1
  309:      Output id=1 size=1 count=1 page=LEDs usage=Scroll_Lock Variable, logical range 0..1
  310:      Output id=1 size=1 count=1 page=LEDs usage=Compose Variable, logical range 0..1
  311:      Output id=1 size=1 count=1 page=LEDs usage=Kana Variable, logical range 0..1
  312:      Output id=1 size=3 count=1 page=0x0000 usage=0x0000 Const, logical range 0..1
  313:       Input id=1 size=8 count=6 page=Keyboard usage=No_Event, logical range 0..255
  314:       Input id=1 size=1 count=1 page=Consumer usage=Eject Variable Relative, logical range 0..1
  315:       Input id=1 size=1 count=1 page=Consumer usage=Mute Variable Relative, logical range 0..1
  316:       Input id=1 size=1 count=1 page=Consumer usage=Volume_Up Variable, logical range 0..1
  317:       Input id=1 size=1 count=1 page=Consumer usage=Volume_Down Variable, logical range 0..1
  318:       Input id=1 size=1 count=4 page=0x0000 usage=0x0000 Const, logical range 0..1
  319:     End collection
  320:           
  321: 
  322: This tells you that the keyboard has responded to an SDP query, and the device
  323: capabilities are shown. Note that encryption is enabled by default, since
  324: encrypted connection support is mandatory for Bluetooth keyboards. You may now
  325: attach to the system:
  326: 
  327:     # btdevctl -d ubt0 -a keyboard -s HID -A
  328: 
  329: which should generate some messages on the system console:
  330: 
  331:     bthidev1 at bthub0 remote-bdaddr 00:0a:95:45:a4:a0 link-mode encrypt
  332:     btkbd0 at bthidev0 reportid 1
  333:     wskbd1 at btkbd0 mux 1
  334:     wskbd1: connecting to wsdisplay0
  335:     bthidev1: connected
  336: 
  337: and the keyboard should work.
  338: 
  339: The device capabilities are cached by
  340: [[!template id=man name="btdevctl" section="8"]],
  341: and to reattach the keyboard at system startup, place an entry in
  342: `/etc/bluetooth/btdevctl.conf`. The
  343: [[!template id=man name="bthidev" section="4"]]
  344: driver will attempt to connect once when attached, but if the keyboard is not
  345: available at that time, you may find that pressing a key will cause it to wake
  346: up and initiate a connection to the last paired host.
  347: 
  348: ## Personal Area Networking
  349: 
  350: Personal Area Networking services over Bluetooth are provided by the
  351: [[!template id=man name="btpand" section="8"]]
  352: daemon which can assume all roles from the PAN profile and connects remote
  353: devices to the system through a
  354: [[!template id=man name="tap" section="4"]] virtual
  355: Ethernet interface.
  356: 
  357: ### Personal Area Networking User
  358: 
  359: The "Personal Area Networking User" role is the client that accesses Network
  360: services on another device. For instance, in order to connect to the Internet
  361: via a smart phone with the NAP profile, make sure that the phone is
  362: discoverable, then:
  363: 
  364:     # btconfig ubt0 inquiry
  365:     Device Discovery from device: ubt0 .... 1 response
  366:       1: bdaddr 00:17:83:30:bd:5e (unknown)
  367:        : name "HTC Touch"
  368:        : class: [0x5a020c] Smart Phone <Networking> <Capturing> <Object Transfer>
  369:         <Telephony>
  370:        : page scan rep mode 0x01
  371:        : clock offset 9769
  372:        : rssi -42
  373:     
  374:     # echo "00:17:83:30:bd:5e phone" >>/etc/bluetooth/hosts
  375: 
  376: You will see that the phone should have the `<Networking>` flag set in the Class
  377: of Device. Checking for the NAP service:
  378: 
  379:     # sdpquery -a phone search NAP
  380:     ServiceRecordHandle: 0x00010000
  381:     ServiceClassIDList:
  382:         Network Access Point
  383:     ProtocolDescriptorList:
  384:         L2CAP (PSM 0x000f)
  385:         BNEP (v1.0; IPv4, ARP, IPv6)
  386:     LanguageBaseAttributeIDList:
  387:         en.UTF-8 base 0x0100
  388:     BluetoothProfileDescriptorList:
  389:         Network Access Point, v1.0
  390:     ServiceName: "Network Access Point"
  391:     ServiceDescription: "Bluetooth NAP Service"
  392:     SecurityDescription: None
  393:     NetAccessType: 100Mb Ethernet
  394:     MaxNetAccessRate: 100000
  395: 
  396: reveals that the NAP service is available and that it provides IPv4, ARP and IPv6 protocols.
  397: 
  398: Most likely, the phone will request authentication before it allows connections
  399: to the NAP service, so before you make the first connection you may need to
  400: provide a PIN, which can be randomly generated. Then start
  401: [[!template id=man name="btpand" section="8"]]:
  402: 
  403:     # btpin -d ubt0 -a phone -r -l 6
  404:     PIN: 862048
  405:     # btpand -d ubt0 -a phone -s NAP
  406:     
  407:         < ENTER PIN ON PHONE NOW >
  408:     
  409:     Searching for NAP service at 00:17:83:30:bd:5e
  410:     Found PSM 15 for service NAP
  411:     Opening connection to service 0x1116 at 00:17:83:30:bd:5e
  412:     Using interface tap0 with addr 00:10:60:e1:50:3d
  413: 
  414: Finally, you will need to configure the
  415: [[!template id=man name="tap" section="4"]]
  416: interface, but the phone should have a DHCP server so
  417: [[!template id=man name="dhcpcd" section="8"]]
  418: will do that for you.
  419: 
  420:     # dhcpcd tap0
  421: 
  422: Now you can surf the World Wide Web, but watch your data usage unless you have a
  423: comprehensive data plan.
  424: 
  425: ## Serial Connections
  426: 
  427: Serial connections over Bluetooth are provided for by the RFCOMM protocol, which
  428: provides up to 30 channels multiplexed over a single L2CAP channel. This
  429: streamed data protocol can be accessed using the BTPROTO\_RFCOMM socket
  430: interface, or via the
  431: [[!template id=man name="rfcomm\_sppd" section="1"]]
  432: program.
  433: 
  434: For instance, you can make a serial connection to the *Dial Up Networking (DUN)*
  435: service of a mobile phone in order to connect to the Internet with PPP. First
  436: you should discover the BDADDR of the phone, and add this to your
  437: `/etc/bluetooth/hosts` for ease of use. Place the phone into Discoverable mode,
  438: and perform an inquiry from the appropriate controller:
  439: 
  440:     # btconfig ubt0 inquiry
  441:     Device Discovery from device: ubt0 ..... 1 response
  442:       1: bdaddr 00:16:bc:00:e8:48 (unknown)
  443:        : name "Nokia 6103"
  444:        : class: [0x520204] Cellular Phone <Networking> <Object Transfer> <Telephony>
  445:        : page scan rep mode 0x01
  446:        : page scan period mode 0x02
  447:        : page scan mode 0x00
  448:        : clock offset 30269
  449:     
  450:     # echo "00:16:bc:00:e8:48 phone" >>/etc/bluetooth/hosts
  451: 
  452: Now, you can query the phone to confirm that it supports the DUN profile:
  453: 
  454:     # sdpquery -d ubt0 -a phone search DUN
  455:     ServiceRecordHandle: 0x00010003
  456:     ServiceClassIDList:
  457:         Dialup Networking
  458:         Generic Networking
  459:     ProtocolDescriptorList:
  460:         L2CAP
  461:         RFCOMM (channel 1)
  462:     BrowseGroupList:
  463:         Public Browse Root
  464:     LanguageBaseAttributeIDList:
  465:         en.UTF-8 base 0x0100
  466:     BluetoothProfileDescriptorList:
  467:         Dialup Networking, v1.0
  468:     ServiceName: "Dial-up networking"
  469: 
  470: Most likely, the phone will request authentication before it allows connections
  471: to the DUN service, so before you make the first connection you may need to
  472: provide a PIN, which can be randomly generated. You can use `rfcomm_sppd` in
  473: stdio mode to check that the connection is working ok, press `^C` to
  474: disconnect and return to the shell, for example:
  475: 
  476:     # btpin -d ubt0 -a phone -r -l 6
  477:     PIN: 904046
  478:     # rfcomm_sppd -d ubt0 -a phone -s DUN
  479:     
  480:         < ENTER PIN ON PHONE NOW >
  481:     
  482:     rfcomm_sppd[24635]: Starting on stdio...
  483:     at
  484:     OK
  485:     ati
  486:     Nokia
  487:     
  488:     OK
  489:     ati3
  490:     Nokia 6103
  491:     
  492:     OK
  493:     at&v
  494:     ACTIVE PROFILE:
  495:     E1 Q0 V1 X5 &C1 &D2 &S0 &Y0
  496:     +CMEE=0 +CSTA=129 +CBST=0,0,1 +CRLP=61,61,48,6 +CR=0 +CRC=0 +CLIP=0,2
  497:     +CLIR=0,2 +CSNS=0 +CVHU=1 +DS=0,0,2048,32 +DR=0 +ILRR=0
  498:     +CHSN=0,0,0,0 +CHSR=0 +CPBS="SM"
  499:     S00:000 S01:000 S02:043 S03:013 S04:010 S05:008 S07:060 S08:002
  500:     S10:100 S12:050 S25:000
  501:     
  502:     OK
  503:     ^C
  504:     rfcomm_sppd[24635]: Completed on stdio
  505: 
  506: To have [[!template id=man name="pppd" section="8"]]
  507: connect to the DUN service of your phone automatically when making outbound
  508: connections, add the following line to the `/etc/ppp/options` file in place of
  509: the normal tty declaration:
  510: 
  511:     pty "rfcomm_sppd -d ubt0 -a phone -s DUN -m encrypt"
  512: 
  513: ## Audio
  514: 
  515: Isochronous (SCO) Audio connections may be created on a baseband radio link
  516: using either the BTPROTO\_SCO socket interface, or the
  517: [[!template id=man name="btsco" section="4"]] audio
  518: device driver. While the specification says that up to three such links can be
  519: made between devices, the current Bluetooth stack can only handle one with any
  520: dignity.
  521: 
  522: **Important**: When using SCO Audio with USB Bluetooth controllers, you will
  523: need to enable isochronous data, and calculate the MTU that the device will use,
  524: see [[!template id=man name="ubt" section="4"]] and
  525: [[!template id=man name="btconfig" section="8"]].
  526: 
  527: *Note*: SCO Audio does not work properly with the
  528: [[!template id=man name="bt3c" section="4"]] driver,
  529: use a USB controller for best results.
  530: 
  531: *Note*: SCO Audio will not work with
  532: [[!template id=man name="ehci" section="4"]] USB
  533: controllers, since support for Isochronous data over EHCI is missing in NetBSD.
  534: 
  535: ### SCO Audio Headsets
  536: 
  537: Audio connections to Bluetooth Headsets are possible using the
  538: [[!template id=man name="btsco" section="4"]] audio
  539: driver, and the
  540: [[!template id=man name="bthset" section="1"]]
  541: program. First, you need to discover the BDADDR of the headset, and will
  542: probably wish to make an alias in your `/etc/bluetooth/hosts` file for ease of
  543: use. Place the headset into discoverable mode and perform an inquiry with the
  544: appropriate controller:
  545: 
  546:     # btconfig ubt0 inquiry
  547:     Device Discovery from device: ubt0 ..... 1 response
  548:      1: bdaddr 00:07:a4:23:10:83 (unknown)
  549:       : name "JABRA 250"
  550:       : class: [0x200404] Wearable Headset <Audio>
  551:       : page scan rep mode 0x01
  552:       : page scan period mode 0x00
  553:       : page scan mode 0x00
  554:       : clock offset 147
  555:     
  556:     # echo "00:07:a4:23:10:83 headset" >>/etc/bluetooth/hosts
  557: 
  558: You will need to pair with the headset the first time you connect, the fixed PIN
  559: should be listed in the manual (often, `0000` is used).
  560: [[!template id=man name="btdevctl" section="8"]]
  561: will query the device and attach the
  562: [[!template id=man name="btsco" section="4"]] audio
  563: driver.
  564: 
  565:     # btpin -d ubt0 -a headset -p 0000
  566:     # btdevctl -d ubt0 -a headset -s HSET -A
  567:     local bdaddr: 00:08:1b:8d:ba:6d
  568:     remote bdaddr: 00:07:a4:23:10:83
  569:     link mode: none
  570:     device type: btsco
  571:     mode: connect
  572:     channel: 1
  573: 
  574: which should generate some messages on the system console:
  575: 
  576:     btsco0 at bthub0 remote-bdaddr 00:07:a4:23:10:83 channel 1
  577:     audio1 at btsco0: full duplex
  578: 
  579: In order to use the audio device, you will need to open a control connection
  580: with
  581: [[!template id=man name="bthset" section="1"]]
  582: which conveys volume information to the mixer device.
  583: 
  584:     # bthset -m /dev/mixer1 -v
  585:     Headset Info:
  586:             mixer: /dev/mixer1
  587:             laddr: 00:08:1b:8d:ba:6d
  588:             raddr: 00:07:a4:23:10:83
  589:             channel: 1
  590:             vgs.dev: 0, vgm.dev: 1
  591: 
  592: and you should now be able to transfer 8khz samples to and from `/dev/audio1`
  593: using any program that supports audio, such as
  594: [[!template id=man name="audioplay" section="1"]]
  595: or
  596: [[!template id=man name="audiorecord" section="1"]].
  597: Adjusting the mixer values should work when playing though you may find that
  598: when opening a connection, the headset will reset the volume to the last known
  599: settings.
  600: 
  601:     # audiorecord -d /dev/audio1 voice.au
  602:             < TALK NONSENSE NOW >
  603:     ^C
  604:     # audioplay -d /dev/audio voice.au
  605:             < THATS REALLY WHAT YOU SOUND LIKE >
  606:     # audioplay -d /dev/audio1 voice.au
  607:             < IN THE HEADSET >
  608: 
  609: The device capabilities are cached by
  610: [[!template id=man name="btdevctl" section="8"]],
  611: and to reattach the
  612: [[!template id=man name="btsco" section="4"]]
  613: driver at system startup, add an entry to `/etc/bluetooth/btdevctl.conf`.
  614: 
  615: ### SCO Audio Handsfree
  616: 
  617: Audio connections to Bluetooth mobile phones using the Handsfree profile are
  618: possible with the `comms/bthfp` program from the NetBSD Package Collection.
  619: 
  620: First, you need to discover the BDADDR of the phone, and will probably wish to
  621: make an alias in your `/etc/bluetooth/hosts` file for ease of use. Place the
  622: phone into discoverable mode and perform an inquiry with the appropriate
  623: controller:
  624: 
  625:     # btconfig ubt0 inquiry
  626:     Device Discovery from device: ubt0 ..... 1 response
  627:       1: bdaddr 00:16:bc:00:e8:48 (unknown)
  628:        : name "Nokia 6103"
  629:        : class: [0x520204] Cellular Phone <Networking;gt; <Object Transfer;gt; <Telephony;gt;
  630:        : page scan rep mode 0x01
  631:        : page scan period mode 0x02
  632:        : page scan mode 0x00
  633:        : clock offset 10131
  634:     
  635:     # echo "00:16:bc:00:e8:48 phone" >>/etc/bluetooth/hosts
  636: 
  637: Now, you should be able to query the phone to confirm that it supports the
  638: Handsfree profile:
  639: 
  640:     # sdpquery -d ubt0 -a phone search HF
  641:     ServiceRecordHandle: 0x00010006
  642:     ServiceClassIDList:
  643:         Handsfree Audio Gateway
  644:         Generic Audio
  645:     ProtocolDescriptorList:
  646:         L2CAP
  647:         RFCOMM (channel 13)
  648:     BrowseGroupList:
  649:         Public Browse Root
  650:     LanguageBaseAttributeIDList:
  651:         en.UTF-8 base 0x0100
  652:     BluetoothProfileDescriptorList:
  653:         Handsfree, v1.5
  654:     ServiceName: "Voice Gateway"
  655:     Network: Ability to reject a call
  656:     SupportedFeatures:
  657:         3 Way Calling
  658:         Echo Cancellation/Noise Reduction
  659:         Voice Recognition
  660:         In-band Ring Tone
  661: 
  662: and you will be able to use the bthfp program to access the Handsfree profile.
  663: The first time you connect, you may need to use a PIN to pair with the phone,
  664: which can be generated randomly by
  665: [[!template id=man name="btpin" section="1"]]:
  666: 
  667:     # btpin -d ubt0 -a phone -r -l 6
  668:     PIN: 349163
  669:     # bthfp -d ubt0 -a phone -v
  670:     
  671:           < ENTER PIN ON PHONE NOW >
  672:     Handsfree channel: 13
  673:     Press ? for commands
  674:     Connecting.. ok
  675:     < AT+BRSF=20
  676:     > +BRSF: 47
  677:     Features: [0x002f] <3 way calling> <EC/NR> <Voice Recognition> <In-band ringtone> <reject ability>
  678:     > OK
  679:     < AT+CIND=?
  680:     > +CIND: ("call",(0,1)),("service",(0,1)),("call_setup",(0-3)),("callsetup",(0-3))
  681:     > OK
  682:     < AT+CIND?
  683:     > +CIND: 0,1,0,0
  684:     > OK
  685:     < AT+CMER=3,0,0,1
  686:     > OK
  687:     < AT+CLIP=1
  688:     > OK
  689:     Service Level established
  690: 
  691: When the phone rings, just press `a` to answer, and audio should be routed
  692: through the `/dev/audio` device. Note that you will need a microphone connected
  693: in order to speak to the remote party.
  694: 
  695: ## Object Exchange
  696: 
  697: NetBSD does not currently have any native OBEX capability, see the
  698: `comms/obexapp` or `comms/obexftp` packages from the NetBSD Package Collection.
  699: 
  700: ## Troubleshooting
  701: 
  702: When nothing seems to be happening, it may be useful to try the hcidump program
  703: from the `sysutils/netbt-hcidump` package in the NetBSD Package Collection. This
  704: has the capability to dump packets entering and leaving Bluetooth controllers on
  705: NetBSD, which is greatly helpful in pinpointing problems.
  706: 

CVSweb for NetBSD wikisrc <wikimaster@NetBSD.org> software: FreeBSD-CVSweb