|
Несмотря на значительный прогресс в поддержке различного железа, достигнутый операционной системой Юбунту, некоторые шероховатости по-прежнему имеют место быть. В частности, я столкнулся с ними при подключении приемника GPS по bluetooth.
Несмотря на значительное количесто имеющихся в интернете рекомендаций, ни одна из них не подошла мне в чистом виде, пришлось маневрировать и комбинировать. Итак, что я делал:
1. Почти в чистом виде передрал советы по модификации конфигурациооных сервисов блутуса (взято отсюда: http://aspire1.ru/forum/31-4945-1):
По умолчанию служба serial в bluetooth не работает при старте системы. исправим это:
Code
sudo gedit /etc/bluetooth/serial.service
Заменяем содержимое на следующее:
[Bluetooth Service] Identifier=serial Name=Serial service Description=Bluetooth Serial Port service Autostart=true
Отредактируем файл hcid.conf :
Code
sudo gedit /etc/bluetooth/hcid.conf
Заменяем содержимое файла на следующее:
# # HCI daemon configuration file. #
# HCId options options { # Automatically initialize new devices autoinit yes;
# Security Manager mode # none - Security manager disabled # auto - Use local PIN for incoming connections # user - Always ask user for a PIN # security user;
# Pairing mode # none - Pairing disabled # multi - Allow pairing with already paired devices # once - Pair once and deny successive attempts pairing multi;
# PIN helper #pin_helper /usr/bin/bluepin;
# D-Bus PIN helper #dbus_pin_helper;
# Default PIN code for incoming connections passkey "1234"; }
# Default settings for HCI devices device { # Local device name # %d - device id # %h - host name name "%h-%d";
# Local device class class 0x3e0100;
# Default packet type #pkt_type DH1,DM1,HV1;
# Inquiry and Page scan iscan enable; pscan enable;
# Default link mode # none - no specific policy # accept - always accept incoming connections # master - become master on incoming connections, # deny role switch on outgoing connections lm accept;
# Default link policy # none - no specific policy # rswitch - allow role switch # hold - allow hold mode # sniff - allow sniff mode # park - allow park mode lp rswitch,hold,sniff,park;
# Authentication and Encryption (Security Mode 3) #auth enable; #encrypt enable; }
2. Далее определяем МАС адрес GPS устройства:
> hcitool scan
Scanning ... 00:0B:0D:6F:F9:C5 SJA GPS
3. Далее, с помощью команды spdtool определяем канал:
> sdptool browse 00:0B:0D:6F:F9:C5
Browsing 00:0B:0D:6F:F9:C5 ... Service Name: SPP slave Service Description: Bluetooth SPP V1.01 Service RecHandle: 0x10000 Service Class ID List: "Serial Port" (0x1101) Protocol Descriptor List: "L2CAP" (0x0100) "RFCOMM" (0x0003) Channel: 1 Language Base Attr List: code_ISO639: 0x656e encoding: 0x6a base_offset: 0x100
Приведенный выше листинг показывает как это должно работать (показывает канал 1), однако, у меня ничего не получилось, листинг моего устройста был попросту пуст. Поэтому мне пришлось методом научного тыка решить что у меня канал тоже 1-й. Время показало, что это был удачный выбор.
4. Создаем виртуальный последовательный порт, с помощью которого устройство gps, используюя его МАС-адрес и канал, связывается с device rfcomm0:
> rfcomm bind /dev/rfcomm0 00:0B:0D:6F:F9:C5 1
Проверяем, как это работает:
> cat /dev/rfcomm0
Если все ОК, то на консоль начнется вывод данных в стандарте NMEA.
5. (взято отсюда: http://aspire1.ru/forum/31-4945-1):
В линуксе в качестве связующего звена между железом и софтом используется демон gpsd, который берет на себя всю ответственность за получение координат и другого рода информации от ГПС устройств. Это сильно упрощает написание программ, потому как в этом случае программистам не надо забоититься о поддержке разного рода протоколов от ГПС устройств. Нужно только соединиться с gpsd сервисом и получить от негу необходимую информацию.
Чтобы запустить gpsd нам потребуется название утройства и стартуем gpsd дополнительные параметры. Например я чаще всего запускаю его с параметрами
Code
sudo gpsd -N -D 3 -b /dev/rfcomm0
где,
* опция “-N” не позволяет отпустить консоль после запуска * опция “-D 3″ повышает уровень выводимой на консоль информации * опция “-b” переводит gpsd в режим Read-Only (ничего не посылать в порт). Используется с некоторыми глупыми GPS (у меня похоже такой) которым сносит крышу от того что им что то пишут в порт. * /dev/rfcomm0 — системное устройство отвечающее за связь с bluetooth приемником (на его месте может быть /dec/ttyUSB0 для USB или любое другое)
Gpsd сервис теперь запущен (отсутствие сообщений об ошибке в выводе команды) и надо проверить что сигнал идет. В пакете gpsd-clients идет утилита xgps для отображения информации получаемой от gpsd демона.
Утилита наглядно показывает доступные в зоне видимости спутники, координаты, высоту, некоторую дополнительную информацию — что означает что ГПС модуль и gpsd демон работают нормально.
В итоге мы получаем последовательность для запуска:
Code
sudo rfcomm bind rfcomm0 sudo rfcomm release 0 sudo rfcomm connect 0 - вот эти тири команды у меня не работали, пришлось последние две просто не использовать, а первую заменить на полноформатную rfcomm bind /dev/rfcomm0 00:0B:0D:6F:F9:C5 1 sudo killall gpsd sudo gpsd -N -D 3 -b /dev/rfcomm0 sudo xgps
Софта под линукс конечно очень мало. Более-менее приемлимый: TangoGPS. Работает он только на указание места на карте(карты подгружаются в кэш(лучше дома с широким каналом)) и запись маршрута.
|