2 Attachment(s)
Bluetooth в Asus WL-500gP и RT-N16/N66U
Данная тема является продолжением предыдущей Bluetooth в wl500gP от TIk
Завожу новую, чтобы не затерялся мануал алгоритма запуска и конфигурации BlueZ для раздачи интернета через bluetootn PAN с учётом нынешних реалий, c шифрованием, спариванием и одноразовым запросом PINa.
Для начала нужно ознакомиться с несколькими первыми постами предыдущей темы, без авторов которой не была бы возможна эта тема. Если при попытке повторить действия её автора вы столкнетесь с проблемами, то может вам поможет следующая информация:
Список самых распространённых ошибок при настройке BlueZ:
1. Для каждой прошивки нужны свои модули.
С времён первого поста предыдущей темы появилось множество новых прошивок, не от Олега. Наверное не все догадываются, что дополнительно к каждой прошивке отдельным архивом идут модули, которые подгружаются пользователем по необходимости.
Соответственно архивы с модулями, выложенные в теме вам скорее всего не подходят, или если они и загрузятся, то вы рискуете получить в будущем непонятные глюки.
Где берутся модуля? Там же, где и прошивки. Например, у меня сейчас стоит прошивка WL500gP-1.9.2.7-d-r1222 от энтузиастов, брал я её здесь http://code.google.com/p/wl500g/downloads/list, здесь выбираю search all downloads и нахожу свои modules-1.9.2.7-d-r1222.tgz (Additional kernel modules from 2010.02.21). Распаковываю архив и складываю оттуда в папку /opt/bluez/modules следующие файлы:
bluez.o
bnep.o
crc32.o
hci_usb.o
l2cap.o
rfcomm.o
sco.o
Если нужен исключительно только PAN, то sco.o (аудио через блютус) и rfcomm.o (СОМ порт через блютус) можно и не искать.
2. Загрузка модулей и запуск процессов BlueZ должны происходить в строгой очерёдности, один после другого.
Скрипт с правильной последовательностью загрузки уже находится в архиве snapshot.tar.gz и помещается он в /opt/etc/init.d/S40bluetooth.
В том же скрипте прописан запуск и остановка процессов, с установленными задержками. Дело в том, что некоторые процессы возвращают управление скрипту гораздо раньше, чем инициализируются сами, и возникает ситуация, когда следующий процесс инициализировался раньше предыдущего, не смог к нему обратиться и вывалился с ошибкой. Возможно именно для вашего устройства задержки надо будет увеличить, смотрите логи, реальная последовательность запуска процессов должна быть как в скрипте.
3. На данный момент текущие версии дистрибутивов для BlueZ частично нерабочие, отчасти через ошибки сборки, отчасти, возможно в связи с тем, что рассчитаны на самые последние прошивки.
Например с версиями библиотек bluez 3.36, которые предлагаются с репозитария, sdpd и другие процессы просто-напросто падают у меня и у многих других пользователей сразу после запуска. Благодаря пользователям из предыдущей ветки была найдена следующая рабочая комбинация библиотек:
dbus - 1.1.1-3
bluez-hcidump - 1.40-1
bluez-libs - 3.17-1
bluez-utils - 3.17-1
Если у вас уже стоят более новые, то вы можете установить старые с архива после удаления текущих и принудительной установки с файла, например ipkg -force-downgrade install bluez-utils_3.17-1_mipsel.ipk.
У этой рабочей комбинации библиотек есть свои проблемы - например, после ввода пинкода спаренные устройства не запоминаются, и их приходится спаривать и вводить PIN code каждый раз при подключении заново.
Для решения этой проблемы пришлось сделать сборную солянку с пакетов, которая будет выглядеть примерно так:
dbus - 1.1.1-3
bluez-hcidump - 1.40-1
bluez2-utils_2.25-6_mipsel + pand overwritten from bluez-utils_3.17-1_mipsel.ipk
bluez-libs_3.17-1
Чтобы не заморачиваться с комбинацией пакетов, уже готовый набор находится в файле shapshot.rar, а оригинальные дистрибутивы в distrib.rar.
4. Есть ещё одна мелкая деталь - во всех случаях рассматривался вариант подключения только одного устройства одновременно. На самом же деле к роутеру, даже с донглом версии 1.2 можно подключать сразу несколько устройств и они будут работать, нужно только несколько модифицировать скрипты, что частично сделано в архиве shapshot.rar.
Там по умолчанию можно подключать до двух устройств сразу, а вот при отключении одного из них сразу будут уничтожаться интерфейсы для обеих, меня это устраивало, у кого есть время и желание - дописать в скриптах распознавание какому устройству какой интерфейс принадлежит и какой из них нужно убивать - несложно.
Алгоритм установки "по быстрому": (Для прошивки rt-n здесь)
1. Закинуть на роутер пакеты из архива distrib.rar.
Установить методом ipkg -nodep -force-downgrade install следующие пакеты:
dbus - 1.1.1-3
bluez-hcidump - 1.40-1
bluez2-utils - 2.25-6
bluez-libs_3.17-1
2. Распаковать на роутере архив snapshot.tar.gz прямо в корень /. Файлы с архива должны перезаписать папки /opt/bin /opt/sbin /opt/var и так далее поверх уже установленных исполняемых файлов, библиотек и конфигурационных файлов.
3. Если у вас рутовый аккаунт не называется admin, переименуйте его в файлах конфигурации согласно первой темы.
Проверьте /opt/etc/init.d - для запуска и остановки всего BlueZ там используется только S40bluetooth, если у вас нет rc.unslung, то можете его добавить, переименовав из rc.unslung.default и сделав chmod +x rc.unslung, все остальные скрипты запуска от установленных ранее пакетов BlueZ в /opt/etc/init.d нужно удалить.
4. В папку /opt/bluez/modules положите модули от вашей прошивки, я специально их не добавлял
5. Усли у вас будет одновременно подключаться только одно устройство, закомментируйтее bnep1 в скриптах /opt/bluez/PAN_up.sh и PAN_down.sh - хватит и одного интерфейса.
6. Впишите PIN код, который будет запрашивать ваш роутер в /opt/etc/bluetooth/pin - этот код вы будете вводить на мобильном, когда будете инициировать подключение к роутеру. После спаривания, роутер записывает реквизиты вашего устройства в /opt/var/lib/bluetooth по одной папке с макадресом на одно устройство.
При попытке подключиться по блютусу к роутеру, он сначала заглянет в /opt/var/lib/bluetooth, если не найдёт там вашего устройства, тогда запросит пин и сверит с кодом отсюда /opt/etc/bluetooth/pin.
Впишите PIN код, который будет передавать ваш роутер при попытке подключиться к внешнему bluetooth устройству в /opt/etc/bluetooth/pin-helper - этот код вы будете вводить на мобильном, когда дадите команду роутеру самому подключаться к телефону.
7. Не спешите! Посмотрите как это работает:
http://i1.fastpic.ru/big/2011/0301/5...27ab177f57.jpg
Сначала пройдите каждый этап вручную запуская блоки из /opt/etc/init.d/S40bluetooth, вы будете активировать процессы слева->направо:
8. проверьте загрузку модулей:
Code:
insmod /opt/bluez/module/bluez.o
insmod /opt/bluez/module/l2cap.o
insmod /opt/bluez/module/crc32.o
insmod /opt/bluez/module/bnep.o
insmod /opt/bluez/module/rfcomm.o
insmod /opt/bluez/module/sco.o
insmod /opt/bluez/module/hci_usb.o
выполните lsmod - все должны быть загружены.
9. Запустите последовательно демон доступа к шине USB dbus-system, а потом демон доступа к шине устройств USB hcid. Посмотрите ps axuf и логи. Если вы изменили pin code, то вам нужно остановить все процессы bluez кроме dbus-system, и наново запустить всю цепочку, начиная с hcid.
10. Теперь вы можете набрать hciconfig -a и посмотреть параметры ваших USB донглов. Команда hciconfig hci0 reset перезапускает донгл с номером hci0 (у вас их может быть несколько, тогда нужно несколько модифицировать скрипт запуска и указать там нужный USB-BТ девайс) и обрывает все текущие сеансы связи, если они уже были установлены.
11. hciconfig hci0 up -запускаете первый донгл, смотрите логи.
Теперь вы должны находить ваш роутер с телефона с именем BlueZ.
12. Запускаете демон SDPd. Теперь с помощью sdptool можете прописать службы, которые по блютусу будет представлять ваш роутер, например:
sdptool add LAN - собственно услуга PAN
sdptool add --channel 2 SP - услуга rfcomm порта #2
Теперь при запросе списка служб с роутера, ваш телефон должен показать услуги PAN и последовательного порта.
13. Для обслуживания услуги PAN запускаете демон PANd c ключами из скрипта запуска и проверяете связь. Телефон и роутер должны спариться, после чего автоматически поднимется интерфейс bnep0 (проверяем с помощью ifconfig).
Ваш ssh сеанс на пару секунд подвиснет, потому что роутер будет перенастраивать свой бридж, подключая туда интерфейсы блютуза.
Мобильный телефон запросит у DHCP сервера вашего роутера настройки и получит доступ в сеть, согласно настроек DHCP.
Наберите pand -l увидите список соединений демона PAN.
Наберите hcitool con - увидите список всех соединений "по воздуху" с макадресом вашего телефона и режимом связи. Должны присутствовать слова AUTH ENCRYPT. Там же будут отображаться rfcomm, DUN и другие типы соединений. На основании этой информации в скрипте PAN_down.sh можно принимать решение, какой интерфейс убивать, при отсоединении одного из нескольких устройств по блютусу от роутера.
Наберите l2ping macaddr, где macaddr адрес вашего телефона.
После отключения соединения со стороны телефона или роутера, интерфейс bnep0 должен исчезнуть, а пакеты роутера опять на пару секунд перестанут ходить, пока он не вернёт свой бридж в предыдущее состояние. Состояние бриджа можно посмотреть командами brctl show && brctl showmacs br0.
После повторной попытки подключения, телефон должен сразу соединиться, без запроса пина. В случае проблем, проверяйте права на доступ в папку /opt/var/lib/bluetooth.
Для удаления пары с устройством, нужно определить удалить всю его папку с макадресом в /opt/var/lib/bluetooth.
P.S. Спасибо Liquidstorm за тестирование и исправление ошибок ;)
__________________________________________________ _____________
Литература идёт в следующим постом
Bluetooth kernel modules for rtn branch
Quote:
Originally Posted by
lly
Модули - это примерно 20% работы, их можем и мы собрать, не жалко. Только что вы будете делать со всеми остальными пакетами которые практически наверняка не подойдут от старой версии?
Сделал модули для тех, кто захочет продолжить работу. Пора допиливать userspace-часть. Можно попытаться заставить "взлететь" optware'овский bluez-3.36, но по хорошему надо пересобрать bluez-4.90. Есть заинтересованные?
Code:
$ tar -xvf ./bt-modules-1.9.2.7-rtn-r2719.tgz
$ insmod ./bluetooth/bluetooth.ko
$ insmod ./bluetooth/l2cap.ko
$ insmod ./bluetooth/sco.ko
$ insmod ./bluetooth/bnep/bnep.ko
$ insmod ./bluetooth/rfcomm/rfcomm.ko
$ insmod ./bluetooth/input-core.ko
$ insmod ./bluetooth/hid.ko
$ insmod ./bluetooth/hidp/hidp.ko
$ cat /tmp/syslog.log | grep "kernel: Bluetooth:"
Mar 2 23:41:39 kernel: Bluetooth: Core ver 2.11
Mar 2 23:41:39 kernel: Bluetooth: HCI device and connection manager initialized
Mar 2 23:41:39 kernel: Bluetooth: HCI socket layer initialized
Mar 2 23:41:57 kernel: Bluetooth: L2CAP ver 2.8
Mar 2 23:41:57 kernel: Bluetooth: L2CAP socket layer initialized
Mar 2 23:42:04 kernel: Bluetooth: SCO (Voice Link) ver 0.5
Mar 2 23:42:04 kernel: Bluetooth: SCO socket layer initialized
Mar 2 23:42:10 kernel: Bluetooth: BNEP (Ethernet Emulation) ver 1.2
Mar 2 23:42:21 kernel: Bluetooth: RFCOMM socket layer initialized
Mar 2 23:42:21 kernel: Bluetooth: RFCOMM ver 1.8
Mar 2 23:48:58 kernel: Bluetooth: HIDP (Human Interface Emulation) ver 1.2
Если при попытке загрузки модулей вы получаете сообщение
Code:
$ insmod ./bluetooth/bluetooth.ko
insmod: can't insert './bluetooth/bluetooth.ko': unknown symbol in module, or unknown parameter
$ cat /tmp/syslog.log | grep bluetooth
Mar 2 22:19:20 kernel: bluetooth: Unknown symbol malloc_sizes
тогда обновите прошивку на любую ревизию старше r2508. Дело в переходе со SLUB на SLAB в ревизиях r2507 - r2508.
Леонид, а по какой причине была в своё время отключена сборка модулей bluetooth в ветке 1.9.2.7-rtn? В ветке 1.9.2.7-d модули по сей день собираются.
Upd. Нашёл ответ. Просто эти модули ни кем не тестировались.