Krzychu.Net

PLD Linux + bluetooth + nokia + gprs

Poniższy opis powstał na bazie różnych HOWTO na temat bluetooth.

Sprzęt

Adapter USB Bluetooth Trust BT180, laptop ASUS A3FC-5056 z systemem
PLD Linux 2.0 (Ac) i kernelem 2.6.17 oraz telefon Nokia 6230i.

Soft

Dla adaptera bluetooth na USB wymagane są moduły do kernela:

 uhci_hcd
 hci_usb
 l2cap
 bnep
Bluetooth jest obsługiwany w Linuxie przez Bluez.
W systemie PLD Linux należy zainstalować następujące pakiety:

  bluez-hcidump-1.30-1
  bluez-utils-init-2.25-3
  bluez-utils-2.25-3
  bluez-hciemu-1.2-1
  bluez-qube-0.1-2
  bluez-libs-2.25-1
  bluez-pin-0.26-2
  ppp-2.4.2-7
oraz sprawdzić obecność urządzeń /dev/rfcomm*

  ls  -la  /dev/rfcomm*
  crw-rw-r--    1  root  ttyS  216,    0  2005-12-16  15:49  /dev/rfcomm0
  crw-rw-r--    1  root  ttyS  216,    1  2005-12-16  15:49  /dev/rfcomm1
  crw-rw-r--    1  root  ttyS  216,  10  2005-12-16  15:49  /dev/rfcomm10
  crw-rw-r--    1  root  ttyS  216,  11  2005-12-16  15:49  /dev/rfcomm11
  crw-rw-r--    1  root  ttyS  216,  12  2005-12-16  15:49  /dev/rfcomm12
  crw-rw-r--    1  root  ttyS  216,  13  2005-12-16  15:49  /dev/rfcomm13
  crw-rw-r--    1  root  ttyS  216,  14  2005-12-16  15:49  /dev/rfcomm14
  crw-rw-r--    1  root  ttyS  216,  15  2005-12-16  15:49  /dev/rfcomm15
  crw-rw-r--    1  root  ttyS  216,    2  2005-12-16  15:49  /dev/rfcomm2
  crw-rw-r--    1  root  ttyS  216,    3  2005-12-16  15:49  /dev/rfcomm3
  crw-rw-r--    1  root  ttyS  216,    4  2005-12-16  15:49  /dev/rfcomm4
  crw-rw-r--    1  root  ttyS  216,    5  2005-12-16  15:49  /dev/rfcomm5
  crw-rw-r--    1  root  ttyS  216,    6  2005-12-16  15:49  /dev/rfcomm6
  crw-rw-r--    1  root  ttyS  216,    7  2005-12-16  15:49  /dev/rfcomm7
  crw-rw-r--    1  root  ttyS  216,    8  2005-12-16  15:49  /dev/rfcomm8
  crw-rw-r--    1  root  ttyS  216,    9  2005-12-16  15:49  /dev/rfcomm9
a w przypadku ich braku wygenerować odpowiednie wpisy skryptem:

  #!/bin/sh 
  C=0;
  while [ $C -lt 16 ]; do
  if [ ! -c /dev/rfcomm$C ]; then
  mknod -m 666 /dev/rfcomm$C c 216 $C
  fi
  C=`expr $C + 1`
  done
Następnie dostosowujemy odpowiednio /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 auto;

	  # 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 /bin/bluepin;
          pin_helper /usr/local/bin/sendpin;

  }

  # Default settings for HCI devices
  device {
	  # Local device name
	  #   %d - device id
	  #   %h - host name
	  name "BlueZ (%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;
	  #
	  # lm accept,master;

	  # Default link policy
	  #   none    - no specific policy
	  #   rswitch - allow role switch
	  #   hold    - allow hold mode
	  #   sniff   - allow sniff mode
	  #   park    - allow park mode
	  #
	  #lp hold,sniff;
	  #
	  lp hold,sniff,park;

	  # Authentication and Encryption
	  auth enable;
	  #encrypt enable;
  }

W pliku wykonywalnym /usr/local/bin/sendpin umieszczamy PIN
którym autentykować się będą komputer oraz telefon, zawiera on:

  #!/bin/sh
  echo "PIN:123456"
Podłączamy adapter bluetooth do portu usb i startujemy obsługę bluetooth poleceniem

/etc/rc.d/init.d/bluetooth start

Sprawdzamy czy poprawnie wykryte zostało nasze urządzenie poleceniem

  hciconfig -a 
które powinno zwrócić informacje

  hci0:   Type: USB
          BD Address: 00:0B:0D:62:27:1A ACL MTU: 377:10 SCO MTU: 64:8
          UP RUNNING PSCAN ISCAN AUTH
          RX bytes:656 acl:0 sco:0 events:20 errors:0
          TX bytes:327 acl:0 sco:0 commands:20 errors:0
          Features: 0xff 0xfe 0x0d 0x38 0x08 0x08 0x00 0x00
          Packet type: DM1 DM3 DM5 DH1 DH3 DH5 HV1 HV2 HV3
          Link policy: RSWITCH HOLD SNIFF PARK
          Link mode: SLAVE ACCEPT
          Name: 'BlueZ (0)'
          Class: 0x3e0100
          Service Classes: Networking, Rendering, Capturing
          Device Class: Computer, Uncategorized
          HCI Ver: 1.2 (0x2) HCI Rev: 0x4 LMP Ver: 1.2 (0x2) LMP Subver: 0x309
          Manufacturer: Broadcom Corporation (15)

Jeśli nie pojawi się status podobny o powyższego można spróbować sekwencji:


  hciconfig hci0 down
  hciconfig hci0 up
  hciconfig -a
Brak informacji o urządzeniu oznacza iż nie działa ono prawidłowo.

Łączenie urządzeń

Wydajemy polecenie aby komputer wyszukał urządzenia bluetooth dostępne w jego pobliżu.
Należy pamiętać aby uaktywnić bluetooth w telefonie. Następnie wykonać polecenie

  hcitool scan

Powinno ono zwrócić informację:

  Scanning ...
          00:15:DE:8F:DF:AA       Nokia 6230i

Sprawdzamy połączenie w warstwie drugiej parując przy okazji telefon z komputerem przy użyciu PINu z pliku /usr/local/bin/sendpin

  l2ping 00:15:DE:8F:DF:AA
Powinniśmy dostać w odpowiedzi

  Ping: 00:15:DE:8F:DF:AA from 00:0B:0D:62:27:1A (data size 44) ...
  0 bytes from 00:15:DE:8F:DF:AA id 0 time 75.72ms
  0 bytes from 00:15:DE:8F:DF:AA id 1 time 7.78ms
  0 bytes from 00:15:DE:8F:DF:AA id 2 time 8.73ms
Nastepnie sprawdzamy obecność usługi Dialup na naszym telefonie

  sdptool browse
Powinniśmy dostać odpowiedz podobną do fragmentu poniżej:


  Inquiring ...

  Browsing 00:15:DE:8F:DF:AA ...
  Service Name: Dial-up networking
  Service RecHandle: 0x10000
  Service Class ID List:
    "Dialup Networking" (0x1103)
    "Generic Networking" (0x1201)
  Protocol Descriptor List:
    "L2CAP" (0x0100)
    "RFCOMM" (0x0003)
      Channel: 1
  Language Base Attr List:
    code_ISO639: 0x656e
    encoding:    0x6a
    base_offset: 0x100
  Profile Descriptor List:
    "Dialup Networking" (0x1103)
      Version: 0x0100
Sprawdzamy na jakim kanale pracuje usługa Dialup (w tym przypadku kanał 1) a następnie wykonujemy.

    rfcomm bind 0 00:15:DE:8F:DF:AA 1
pierwsza cyfra to numer urządzenia rfcomm, druga to adres bluetooth telefonu the bluetooth a trzecia to numer kanału Dialup. Ta komenda łączy urządzenie /dev/rfcomm0 z telefonem.

Połączenie przez GPRS

Na tym etapie można już użyć pppd aby połączyć się z internetem.

Dla połączeń ppp przez GPRS niezbędne jest załadowanie odpowiednich modułów i opcji do obsługi połączeń ppp.
W pliku /etc/modprobe.conf dodajemy:


  alias /dev/ppp          ppp_generic
  alias char-major-108    ppp_generic
  alias tty-ldisc-3       ppp_async  
  alias tty-ldisc-14      ppp_synctty
  alias ppp-compress-21   bsd_comp   
  alias ppp-compress-24   ppp_deflate
  alias ppp-compress-26   ppp_deflate
  options ppp_async flag_time=0
Aby wywołać połączenie ppp wpisujemy

pppd /dev/rfcomm0 noauth nocrtscts noipdefault novj novjccomp defaultroute 
connect 'chat -v -f /etc/ppp/nokia' &
gdzie dla połączenia GPRS plik /etc/ppp/nokiazawiera

  "" "ath"
  OK "atdt*99#"
  CONNECT

Automatyzacja

Poniżej przykład skryptu automatycznie łączącego się z internetem przez bluetooth i GPRS.


  #!/bin/sh
  ifdown eth0
  killall -9 pppd
  echo Podłącz urządzenie bluetooth i naciśnij enter 
    read
    /etc/rc.d/init.d/bluetooth restart
    sleep 1
    hciconfig hci0 down
    sleep 1
    hciconfig hci0 up
    sleep 1
    hciconfig -a
    echo Jeśli urządzenie aktywne naciśnij enter, jeśli nie spróbuj ponownie 
używając ctrl-c echo Sprawdzam ping w warstwie drugiej l2ping -c 3 00:15:DE:8F:DF:AA rfcomm release 0 2> /dev/null rfcomm bind 0 00:15:DE:8F:DF:AA 1 pppd /dev/rfcomm0 noauth nocrtscts noipdefault novj novjccomp defaultroute
connect 'chat -v -f /etc/ppp/nokia' & echo Połączenie bluetooth powinno być aktywne za chwilę, aby zakończyć
wpisz killall -9 pppd oraz ifup eth0

Koniec.