<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="../assets/xml/rss.xsl" media="all"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Компы и автомобили (Posts about Bluetooth)</title><link>https://at-hacker.in/</link><description></description><atom:link href="https://at-hacker.in/categories/bluetooth.xml" rel="self" type="application/rss+xml"></atom:link><language>en</language><copyright>Contents © 2026 &lt;a href="mailto:"&gt;at-hacker&lt;/a&gt; </copyright><lastBuildDate>Sat, 16 May 2026 20:41:17 GMT</lastBuildDate><generator>Nikola (getnikola.com)</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><item><title>СМС-оповещения</title><link>https://at-hacker.in/posts/2012-04-13-1/</link><dc:creator>at-hacker</dc:creator><description>&lt;p&gt;У нас на фре трудится система мониторинга Zabbix. Обо всяких критических события, типа пропадания питания или неожиданной перезагрузки серверов хотелось бы, чтобы оповещения приходили на СМС заинтересованным лицам. Выкопал я у товарища старый бесхозный мобильник Motorola L6 и вознамерился его использовать. Чтобы не искать кабель, который, как водится, может ещё и не подойти, решил его сразу по bluetooth подключить. Долго курил мануалы, прописывал ключи и включал автоматический доступ на Мотороле с компа, чтобы она не запрашивала каждый раз подверждение. Вроде заработало. Написал скрипт для автоматического запуска rfcomm_sppd, которая создавала виртуальный COM-порт через bluetooth, через который, в свою очередь, комплект smstools отправлял сообщения.  &lt;/p&gt;
&lt;p&gt;Тока вот этот виртуальный COM-порт, через который работал rfcomm_sppd, постоянно отваливался. И каждый раз требовался танец с бубном, чтобы всё это опять заработало, причём каждый раз я не мог понять, почему такие же действия две минуты назад никакого эффекта не давали. Удалось выяснить, что выключение/включение голубого зуба на телефоне позволяло в течение пары минут запустить скрипт и тогда порт появлялся. Но сегодня не помогло даже это. Руками запускаю rfcomm_sppd с нужными ключами — порт есть. Делаю то же самое скриптом — connection refused. В конце концов меня это задрало.  &lt;/p&gt;
&lt;p&gt;Я с горя взял обычный провод USB-miniUSB, оставшийся от павшего смертью храбрых внешнего HDD, и подключил им телефон к серваку с FreeBSD. Оценил обстановку в логах. Обстановка гласила:  &lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;Apr 13 12:25:11 proxy root: Unknown USB device: vendor 0x22b8 product 0x4902 bus uhub2Apr 13 12:25:11 proxy kernel: ugen2.3: &amp;lt;Motorola Inc.&amp;gt; at usbus2Apr 13 12:32:57 proxy kernel: ugen2.3: &amp;lt;Motorola Inc.&amp;gt; at usbus2 (disconnected)Apr 13 12:33:05 proxy kernel: ugen2.3: &amp;lt;Motorola Inc.&amp;gt; at usbus2Apr 13 12:33:05 proxy root: Unknown USB device: vendor 0x22b8 product 0x4902 bus uhub2
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Попандос, думаю — ugen2.3. Это значит, что фря устройство видит, но как с ним работать — не знает, драйвера нет. Полазил по интернетам. Рекомендуют запускать модуль &lt;em&gt;ucom&lt;/em&gt;. Ок, пробуем:  &lt;/p&gt;
&lt;h2&gt;kldload ucom&lt;/h2&gt;
&lt;p&gt;kldload: can't load ucom: No such file or directory  &lt;/p&gt;
&lt;p&gt;Нету модуля, значит. Та же петрушка с рекомендованным модулем umodem. Лезем сначала в &lt;em&gt;/usr/src/sys/modules/usb/ucom&lt;/em&gt;, и делаем там  &lt;/p&gt;
&lt;h2&gt;make&lt;/h2&gt;
&lt;h2&gt;make install clean&lt;/h2&gt;
&lt;p&gt;Потом то же самое в каталоге /usr/src/sys/modules/usb/umodem  &lt;/p&gt;
&lt;p&gt;Потом грузим модули:  &lt;/p&gt;
&lt;h2&gt;kldload ucom&lt;/h2&gt;
&lt;h2&gt;kldload umodem&lt;/h2&gt;
&lt;p&gt;Перетыкаем кабель в телефоне, палим логи:  &lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="nx"&gt;Apr&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;46&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;38&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;proxy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;kernel&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ugen2&lt;/span&gt;&lt;span class="m m-Double"&gt;.2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Motorola&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Inc&lt;/span&gt;&lt;span class="p"&gt;.&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;at&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;usbus2Apr&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;46&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;38&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;proxy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;kernel&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;umodem0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Motorola&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Inc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Motorola&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Phone&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;L6&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;class&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;rev&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m m-Double"&gt;1.10&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="m m-Double"&gt;0.01&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;addr&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;on&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;usbus2Apr&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;46&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;38&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;proxy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;kernel&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;umodem0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;interface&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;has&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;CM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;over&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;has&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;no&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;breakApr&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;46&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;38&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;proxy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;kernel&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ugen2&lt;/span&gt;&lt;span class="m m-Double"&gt;.2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Motorola&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Inc&lt;/span&gt;&lt;span class="p"&gt;.&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;at&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;usbus2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;disconnected&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nx"&gt;Apr&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;46&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;38&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;proxy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;kernel&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;umodem0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;at&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;uhub2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;port&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;addr&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;disconnected&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nx"&gt;Apr&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;48&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;01&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;proxy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;kernel&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ugen2&lt;/span&gt;&lt;span class="m m-Double"&gt;.2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Motorola&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Inc&lt;/span&gt;&lt;span class="p"&gt;.&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;at&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;usbus2Apr&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;48&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;01&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;proxy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;kernel&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;umodem0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Motorola&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Communication&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Interface&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;on&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;usbus2Apr&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;48&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;01&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;proxy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;kernel&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;umodem0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;interface&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;has&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;CM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;over&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;has&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;no&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;break&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Ну круто, umodem нашёл телефон. В системе появился порт /dev/cuaU0 (не путать с COM1, который /dev/cuau0 — разница в регистре в имени). Это и есть искомый COM-порт для коммуникации с телефоном. Прописываем его в конфиге демона smsd из комплекта smstools, и получаем щастье! И никаких хитрых процедур и скриптов запуска по голубому зубу. Остаётся только прописать загрузку этих двух модулей в /boot/loader.conf, чтобы оно автоматом грузилось при старте системы.&lt;/p&gt;</description><category>Bluetooth</category><category>FreeBSD</category><category>Troubleshooting</category><category>Zabbix</category><guid>https://at-hacker.in/posts/2012-04-13-1/</guid><pubDate>Fri, 13 Apr 2012 09:12:00 GMT</pubDate></item><item><title>Сеть по bluetooth с помощью btpand</title><link>https://at-hacker.in/posts/2010-01-07-2/</link><dc:creator>at-hacker</dc:creator><description>&lt;p&gt;В упомянутом уже ThinkPad 600X сетки не было. Точнее, сетевая PCMCIA была, но товарищ не нашёл проводочек, который подключается одним концом к сетевухе, а другим — к коннектору RJ-45. Поскольку CDROM в ноуте старый и довольно глючный, пришлось что-то придумывать. Вариант был ровно один — поскольку USB-порт там один есть, остаётся только Bluetooth, ну, или всякие USB-сетевые, проводные или WiFi. Покупать для этого ноута USB-сетевую меня заломало — не такая уж важная птица, а адаптеров голобуго зуба у меня навалом.  &lt;/p&gt;
&lt;p&gt;Под фрёй 7.2 я настроил сетку с помощью LAN over PPP, настроил rfcomm_pppd и полетели. Запускалось оно несколько криво — из rc.local, и требовало ещё не менее трёхсекундной паузы для прописывания маршрутизации, но в общем, работало.  &lt;/p&gt;
&lt;p&gt;После перехода на 8-ую фрю начали наблюдаться проблемы — примерно через час прослушивания интернет-радио голубозубый линк отваливался, и не поднимался до тех пор, пока я не выдерну и не вставлю обратно bluetooth-адаптер на серверной стороне, с последующим перезапуском rfcomm_pppd с обоих сторон. Разбираться с этим бесполезно — никаких сообщений в логах нет, ничего не происходит, сервер по голубому зубу при обзоре устройств виден, и линк поднимается, но трафика по нему не идёт. Я такое уже видел, правда, с КПК, но побороть так и не смог. Решил перейти на btpand, раз уж он появился — это софтина, портированная во фрю из NetBSD (не прошло и 8 лет, как фря наконец-то начала вкуривать BT PAN, ггг).   &lt;/p&gt;
&lt;p&gt;Потестил btpand при ручном запуске. На сервере запускаем:  &lt;/p&gt;
&lt;h2&gt;ifconfig tap0 create&lt;/h2&gt;
&lt;h2&gt;btpand -d ubt0 -i tap0 -s NAP&lt;/h2&gt;
&lt;h2&gt;ifconfig tap0 192.168.2.1 netmask 255.255.255.0&lt;/h2&gt;
&lt;p&gt;На клиенте:  &lt;/p&gt;
&lt;h2&gt;ifconfig tap0 create&lt;/h2&gt;
&lt;h2&gt;btpand -d ubt0 -i tap0 -s NAP -a 00:18:e7:1a:24:9b&lt;/h2&gt;
&lt;h2&gt;ifconfig tap0 192.168.2.2 netmask 255.255.255.0&lt;/h2&gt;
&lt;p&gt;Ну, тут всё понятно — создаём интерфейс tap0, через который будет работать голубозубый линк, поднимаем сам линк, и затем конфигурируем интерфейсы — прописываем IP-адрес, на котором оно будет работать.  &lt;/p&gt;
&lt;p&gt;Проверяем наличие присутствия связи:  &lt;/p&gt;
&lt;p&gt;notebook# ping -c 4 192.168.2.1&lt;br&gt;
PING 192.168.2.1 (192.168.2.1): 56 data bytes&lt;br&gt;
64 bytes from 192.168.2.1: icmp_seq=0 ttl=64 time=22.778 ms&lt;br&gt;
64 bytes from 192.168.2.1: icmp_seq=1 ttl=64 time=18.257 ms&lt;br&gt;
64 bytes from 192.168.2.1: icmp_seq=2 ttl=64 time=39.277 ms&lt;br&gt;
64 bytes from 192.168.2.1: icmp_seq=3 ttl=64 time=18.313 ms  &lt;/p&gt;
&lt;p&gt;Типа, работает, что ли? Афигеть... :-)  &lt;/p&gt;
&lt;p&gt;Ну чо, подадим на ноут интернет теперь — пропишем nameserver на ноуте в /etc/resolv.conf, а серверный голубозубый IP-шник в качестве шлюза и перенастроим правила файрвола, чтобы он ноут пускал в интернет:  &lt;/p&gt;
&lt;h2&gt;route add default 192.168.2.1&lt;/h2&gt;
&lt;p&gt;Проверяем:  &lt;/p&gt;
&lt;p&gt;notebook# ping ya.ru&lt;br&gt;
PING ya.ru (77.88.21.8): 56 data bytes&lt;br&gt;
64 bytes from 77.88.21.8: icmp_seq=0 ttl=57 time=85.294 ms&lt;br&gt;
64 bytes from 77.88.21.8: icmp_seq=1 ttl=57 time=74.188 ms&lt;br&gt;
64 bytes from 77.88.21.8: icmp_seq=2 ttl=57 time=217.258 ms  &lt;/p&gt;
&lt;p&gt;Круто! Грузим KDE и пытаемся открыть &lt;a href="http://shoutcast.com"&gt;http://shoutcast.com&lt;/a&gt; Получаем облом. Сайт грузится, но не до конца, и запустить прослушивание чего-нибудь оттуда невозможно — даже плейлист не качается. Интуиция подсказывает, что раз что-то работает, а что-то нет при живом линке, то это проблемы с MTU. Начинаю гонять пинги разного размера, определяя, какой максимальный размер пинга пройдёт. Оказалось, что пинги размером 641 байт проходят, и больше — хрен. А MTU на интерфейсах tap0 выставился дефолтный в 1500. Мораль — надо копать. Накопал только &lt;a href="http://lists.freebsd.org/pipermail/freebsd-bluetooth/2009-May/001417.html"&gt;вот это&lt;/a&gt;. Симптомы там у товарища в точности как у меня — MTU в районе 600 байт, иначе хеликоптер нихт. Но потом он перезагрузил телефон, к которому подключал комп по BT, и чудесным образом всё заработало с правильным MTU 1500. Но у меня такая маза не прокатила — сразу после перезагрузки оно вроде заработал с MTU 1500, но через пару минут всё отвалилось, в том числе ssh. Так что на текущий момент MTU 640 является обязательным.  &lt;/p&gt;
&lt;p&gt;Ну, теперь надо как-то организовать, чтобы вся эта хрень запускалась при старте системы. Условия у меня довольно специфические — в сервере BT-адаптер торчит всегда, а в ноуте — практически всегда, потому что я его в качестве плейера радива из интернета использую. Значит, надо либо в rc.local вписывать, что проще, но криво, либо написать rc-скрипт. Поскольку лёгких путей мы не ищем, то я выбрал второй вариант.  &lt;/p&gt;
&lt;p&gt;Скрипт будет принимать такие параметры:  &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;btpand_enable&lt;/strong&gt; — разрешено или нет запускать btpand (по умолчанию NO);&lt;br&gt;
&lt;strong&gt;btpand_device&lt;/strong&gt; — девайс bluetooth, с которого работаем;&lt;br&gt;
&lt;strong&gt;btpand_interface — интерфейс, на котором работать (по умолчанию tap0);&lt;br&gt;
&lt;/strong&gt;btpand_service&lt;strong&gt;btpand_service&lt;/strong&gt; — сервис, который мы используем (GN, NAP, PANU, по умолчанию NAP);&lt;br&gt;
&lt;strong&gt;btpand_linkup&lt;/strong&gt; — скрипт, выполняемый при установлении соединения;&lt;br&gt;
&lt;strong&gt;btpand_linkdown&lt;/strong&gt; — скрипт, выполняемый при разрыве соединения;&lt;br&gt;
&lt;strong&gt;btpand_server&lt;/strong&gt; — MAC-адрес сервера, к которому будем подключаться, если работаем как клиент;&lt;br&gt;
&lt;strong&gt;btpand_iface_addr&lt;/strong&gt; — это параметр для конфигурирования интерфейса — прописывания IP-адреса и пр. Синтаксис такой же, как и у параметров rc.conf типа «ifconfig_rl0» — эта строка просто скармливается ifconfig'у.  &lt;/p&gt;
&lt;p&gt;Скрипты linkup/linkdown мне нужны, чтобы прописывать шлюз по умолчанию. В других задачах, возможно, потребуется ещё что-нибудь делать. Это необязательный параметр. Как, в общем, и многие другие. Обязательным будет являеться только btpand_enable и btpand_iface_addr для обоих компов, и btpand_server — только при запуске на клиенте. Остальное либо не обязательно, либо конфигурируется по умолчанию, как параметр btpand_interface.  &lt;/p&gt;
&lt;p&gt;Собственно, родился такой несложный скрипт:  &lt;/p&gt;
&lt;h2&gt;!/bin/sh&lt;/h2&gt;
&lt;h2&gt;PROVIDE: btpand&lt;/h2&gt;
&lt;h2&gt;REQUIRE: DAEMON sdpd&lt;/h2&gt;
&lt;h2&gt;BEFORE:  LOGIN&lt;/h2&gt;
&lt;h2&gt;KEYWORD: nojail&lt;/h2&gt;
&lt;p&gt;. /etc/rc.subr  &lt;/p&gt;
&lt;p&gt;name=«btpand»&lt;br&gt;
rcvar=&lt;code&gt;set_rcvar&lt;/code&gt;&lt;br&gt;
command=«/usr/sbin/btpand»  &lt;/p&gt;
&lt;p&gt;load_rc_config $name  &lt;/p&gt;
&lt;p&gt;eval «${rcvar}=\${${rcvar}:-'NO'}»  &lt;/p&gt;
&lt;p&gt;btpand_interface=${btpand_interface:-«tap0»}&lt;br&gt;
btpand_device=${btpand_device:-«ubt0hci»}&lt;br&gt;
btpand_service=${btpand_service:-«NAP»}&lt;br&gt;
btpand_server=${btpand_server:-«no»}&lt;br&gt;
btpand_iface_addr=${btpand_iface_addr:-«dhcp»}&lt;br&gt;
btpand_linkup=${btpand_linkup:-«no»}&lt;br&gt;
btpand_linkdown=${btpand_linkdown:-«no»}  &lt;/p&gt;
&lt;p&gt;start_cmd=«btpand_start»&lt;br&gt;
stop_precmd=«btpand_stopprecmd»&lt;br&gt;
stop_postcmd=«/sbin/ifconfig ${btpand_interface} destroy»  &lt;/p&gt;
&lt;p&gt;btpand_start()&lt;br&gt;
{&lt;br&gt;
  if [ ! -e /dev/${btpand_interface} ]&lt;br&gt;
    then /sbin/ifconfig ${btpand_interface} create&lt;br&gt;
  fi&lt;br&gt;
  /sbin/ifconfig ${btpand_interface} mtu 640&lt;br&gt;
  if [ «dhcp» = «${btpand_iface_addr}» ]&lt;br&gt;
    then /sbin/dhclient ${btpand_interface}&lt;br&gt;
    else /sbin/ifconfig ${btpand_interface} ${btpand_iface_addr}&lt;br&gt;
  fi&lt;br&gt;
  if [ «no» = «${btpand_server}» ]&lt;br&gt;
    then $command -d ${btpand_device} -s ${btpand_service} -i ${btpand_interface} &amp;gt; /dev/null 2&amp;gt;&amp;amp;1&lt;br&gt;
    else $command -d ${btpand_device} -s ${btpand_service} -i ${btpand_interface} \&lt;br&gt;
         -a ${btpand_server} &amp;gt; /dev/null 2&amp;gt;&amp;amp;1&lt;br&gt;
  fi&lt;br&gt;
  if [ ! «no» = «$btpand_linkup» ]&lt;br&gt;
    then sh ${btpand_linkup}&lt;br&gt;
  fi&lt;br&gt;
}  &lt;/p&gt;
&lt;p&gt;btpand_stopprecmd()&lt;br&gt;
{&lt;br&gt;
  if [ ! «no» = «$btpand_linkdown» ]&lt;br&gt;
    then sh ${btpand_linkdown}&lt;br&gt;
  fi&lt;br&gt;
}  &lt;/p&gt;
&lt;p&gt;run_rc_command «$1»&lt;/p&gt;
&lt;p&gt;Осталось это всё запустить. На сервере говорим:  &lt;/p&gt;
&lt;h2&gt;echo btpand_enable=«YES» &amp;gt;&amp;gt; /etc/rc.conf&lt;/h2&gt;
&lt;h2&gt;echo btpand_iface_addr=«192.168.2.1 netmask 255.255.255.0» &amp;gt;&amp;gt; /etc/rc.conf&lt;/h2&gt;
&lt;p&gt;На клиенте прописываем:  &lt;/p&gt;
&lt;h2&gt;echo btpand_enable=«YES» &amp;gt;&amp;gt; /etc/rc.conf&lt;/h2&gt;
&lt;h2&gt;echo btpand_iface_addr=«192.168.2.2 netmask 255.255.255.0» &amp;gt;&amp;gt; /etc/rc.conf&lt;/h2&gt;
&lt;h2&gt;echo btpand_server=«00:18:e7:1a:24:9b» &amp;gt;&amp;gt; /etc/rc.conf&lt;/h2&gt;
&lt;h2&gt;echo btpand_linkup=«/home/vasya/bt_linkup» &amp;gt;&amp;gt; /etc/rc.conf&lt;/h2&gt;
&lt;p&gt;И создаём файл /home/vasya/bt_linkup с таким содержанием:  &lt;/p&gt;
&lt;h2&gt;!/bin/sh&lt;/h2&gt;
&lt;p&gt;route add default 192.168.2.1  &lt;/p&gt;
&lt;p&gt;Перезапускаем сервер, перезапускаем ноут — судя по лампочкам на BT-адаптере, линк поднялся. Проверяем:  &lt;/p&gt;
&lt;p&gt;notebook# ping ya.ru&lt;br&gt;
PING ya.ru (77.88.21.8): 56 data bytes&lt;br&gt;
64 bytes from 77.88.21.8: icmp_seq=0 ttl=57 time=66.597 ms&lt;br&gt;
64 bytes from 77.88.21.8: icmp_seq=1 ttl=57 time=93.634 ms&lt;br&gt;
64 bytes from 77.88.21.8: icmp_seq=2 ttl=57 time=49.616 ms  &lt;/p&gt;
&lt;p&gt;Точно, поднялся. Ну, значит, топаем в KDE и запускаем чего-нибудь с Shoutcast'a бодрое на прослушивание! :-)  &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Область применения&lt;/strong&gt;  &lt;/p&gt;
&lt;p&gt;Вообще-то, это можно юзать не только для связи двух компов с фрёй между собой. BT-сервис «LAN over PPP» — довольно специфический, виндовые драйвера, которые я пробовал, его просто не видят, так что когда я захотел ноут с виндой, не имеющий WiFi адаптера, но имеющий BT, подключить в интернет через LAN over PPP, настроенный на серваке, то круто обломался.  &lt;/p&gt;
&lt;p&gt;Да и мобильные устройства далеко не все умеют LAN over PPP. Например, у меня был КПК HP hx2190 — он мог подключаться к такому сервису на сервере, и ходить через него в интернет и прослушивать музыку. А вот коммуникатор HTC Touch уже к серваку подключиться не мог — его BT-стек не поддерживает этот сервис. Touch, конечно, может работать по WiFi, который у меня всё равно в квартире есть, но WiFi гораздо более прожорлив в смысле батарейки, так что BT сильно предпочтительней, тем более что разницы в скорости между BT и WiFi линках на коммуникаторе практически незаметно.  &lt;/p&gt;
&lt;p&gt;К тому же, в коммуникаторе нет сервиса Dial-up internet, он интернет умеет раздавать только через PAN. При наличии btpand можно спокойно подключить 8-ую фрю к коммуникатору и заюзать интернет через EDGE.&lt;/p&gt;</description><category>Bluetooth</category><category>FreeBSD</category><category>Скрипты</category><guid>https://at-hacker.in/posts/2010-01-07-2/</guid><pubDate>Thu, 07 Jan 2010 02:30:00 GMT</pubDate></item></channel></rss>