[基礎] Raspberry Pi 用 3G 網卡(3G USB dongle)上網

e1820_with_raspberry_pi_model_b_plus

本文章使用 Raspberry Pi Model B+,映像檔為 2014-12-24-wheezy-raspbian.img。使用的 3G 網卡為 Huawei E1820 3G 網卡。

現在的 3G/4G 網卡(或稱為 USB 數據機)大多同時有儲存設備和 USB 數據機的功能,其中儲存設備功能存放 MS Windows 的驅動程式,USB 數據機就是可撥號連線接取上網際網路。

如果是第一次將 3G 網卡插在安裝了 Windows 系統的電腦上,網卡將會以虛擬光碟機的模式掛載成儲存設備,並且自動安裝驅動程式。當完成安裝後就可用虛擬光碟機轉換工具(Virtual CD-ROM switching utility)或稱為模式轉換工具,正確轉換網卡為 USB 數據機。

如果要在 Raspberry Pi 上使用 3G/4G 網卡上網,要做的事就是安裝設定模式轉換工具與安裝設定撥號連線程式。步驟如下:
 
1. 確認硬體資訊。
當插上 E1820 時,可以看到系統可辨認成 HSPA modem。

pi@raspberrypi ~ $ lsusb
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp. 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. 
... skip ...
Bus 001 Device 008: ID 12d1:1446 Huawei Technologies Co., Ltd. E1552/E1800/E173 (HSPA modem)
... skip ...

dmesg 查看時,可看到系統將網卡的儲存功能辨認成 scsi 介面的 CD-ROM(sr0)。

pi@raspberrypi ~ $ dmesg
... skip ...
[    7.062455] usb 1-1.4: new high-speed USB device number 6 using dwc_otg
[    7.195063] usb 1-1.4: New USB device found, idVendor=12d1, idProduct=1446
[    7.219562] usb 1-1.4: New USB device strings: Mfr=3, Product=2, SerialNumber=0
[    7.242348] usb 1-1.4: Product: HUAWEI Mobile
[    7.251156] usb 1-1.4: Manufacturer: Huawei Technologies
[    7.282719] usb-storage 1-1.4:1.0: USB Mass Storage device detected
[    7.309727] scsi0 : usb-storage 1-1.4:1.0
[    7.323198] usb-storage 1-1.4:1.1: USB Mass Storage device detected
[    7.351048] scsi1 : usb-storage 1-1.4:1.1
[    8.322907] scsi 0:0:0:0: CD-ROM            HUAWEI   Mass Storage     2.31 PQ: 0 ANSI: 2
[    8.363958] scsi 1:0:0:0: Direct-Access     HUAWEI   TF CARD Storage       PQ: 0 ANSI: 2
[    8.417357] sd 1:0:0:0: [sda] Attached SCSI removable disk
[    8.583801] sr0: scsi-1 drive
[    8.591172] cdrom: Uniform CD-ROM driver Revision: 3.20
[    8.681129] sr 0:0:0:0: Attached scsi generic sg0 type 5
[    8.698176] sr 0:0:0:0: Attached scsi CD-ROM sr0

e1820_dmesg_before_mode_switch
如果我們將 sr0 掛載起來,就可清楚的看到裡面所存放的檔案是 Windows 驅動程式。

pi@raspberrypi ~ $ ls -al /dev/disk/by-id/
total 0
drwxr-xr-x 2 root root 140 Dec 24 12:31 .
drwxr-xr-x 6 root root 120 Jan  1  1970 ..
lrwxrwxrwx 1 root root  13 Jan  1  1970 memstick-SU16G_0x27885644 -> ../../mmcblk0
lrwxrwxrwx 1 root root  15 Dec 24 12:28 memstick-SU16G_0x27885644-part1 -> ../../mmcblk0p1
lrwxrwxrwx 1 root root  15 Dec 24 12:28 memstick-SU16G_0x27885644-part2 -> ../../mmcblk0p2
lrwxrwxrwx 1 root root   9 Dec 24 12:38 usb-HUAWEI_Mass_Storage-0:0 -> ../../sr0
lrwxrwxrwx 1 root root   9 Dec 24 12:31 usb-HUAWEI_TF_CARD_Storage-0:0 -> ../../sda
pi@raspberrypi ~ $ sudo mount /dev/sr0 /mnt
mount: block device /dev/sr0 is write-protected, mounting read-only
pi@raspberrypi ~ $ ls -al /mnt/
total 586
dr-xr-xr-x  1 root root   2048 Nov 27  2012 .
drwxr-xr-x 22 root root   4096 Dec 21 11:09 ..
-r-xr-xr-x  1 root root 148320 Mar 14  2011 AutoRun.exe
-r-xr-xr-x  1 root root     45 Oct  1  2008 AUTORUN.INF
dr-xr-xr-x  1 root root   2048 Nov 27  2012 Mobile Partner
-r-xr-xr-x  1 root root 439926 Nov 15  2009 Startup.ico
-r-xr-xr-x  1 root root   1742 Nov 23  2012 SysConfig.dat

e1820_mount_device

 
2. 安裝與設定模式轉換工具。
安裝 usb-modeswitch 會將有相依性的 usb-modeswitch-data 一併安裝起來。

pi@raspberrypi ~ $ sudo apt-get install -y usb-modeswitch

e1820_install_usb_modeswitch

我們可以比較模式轉換前後的分別,這可幫助我們確認是否有成功轉換 3G 網卡成 USB 數據機。檢查方式是執行 ls /dev/tty*,在模式還沒有轉換前,可以看到最後兩項是 /dev/ttyAMA0/dev/ttyprintk
e1820_ls_tty_before_mode_switch

安裝完成後就要進行模式的設定,usb-modeswitch 需要和 udev 搭配。

udev 包含 user space daemon(udevd)和工具程式 udevinfo(或 udevadm),並可以讓使用者自訂規則存放於 /etc/udev/rules.d/ 下。有關 udev 可以看 wiki 的介紹。

udev 是 Linux kernel 2.6 系列的設備管理器。它主要的功能是管理 /dev 目錄底下的設備節點。它同時也是用來接替 devfs 及 hotplug 的功能,這意味著它要在添加/刪除硬件時處理 /dev 目錄以及所有用戶空間的行為,包括加載 firmware 時。

實際上 usb-modeswitchudev 的運作順序如下:

* /lib/udev/rules.d/40-usb_modeswitch.rules:udev 的規則文件,如果設備被識別(包括 Vendor ID 和 Product ID)就會啟動 usb_modeswitch。
* /lib/udev/usb_modeswitch: 執行 usb_modeswitch_dispatcher 的 script。
* /usr/sbin/usb_modeswitch_dispatcher:usb_modeswitch 的 wrapper,用 tcl 寫的,會根據所選擇的設備與設定實際執行 /usr/sbin/usb_modeswitch。
* /etc/usb_modeswitch.conf:全域的設定檔案,也可用於單一的設備設定資訊。
* /etc/usb_modeswitch.d:該文件夾包含了各別設備的獨立設定資訊,各別裝置的設定檔案是用設備的 ID 來命名。
* /usr/sbin/usb_modeswitch:實際轉換裝置模式的二進位程式。

因此我們要新增網卡設備的規則到 /lib/udev/rules.d/40-usb_modeswitch.rules

pi@raspberrypi ~ $ sudo vi /lib/udev/rules.d/40-usb_modeswitch.rules

在檔案最後加上兩行。

# E1820
ATTRS{idVendor}=="12d1", ATTRS{idProduct}=="1446", RUN+="usb_modeswitch '%b/%k'"

e1820_udev_config

其中 idVendor="12d1" 和 idProduct="1446" 這些資訊是由 lsusb 得到的。
e1820_lsusb_before_mode_switch

接著再將網卡要轉換的資訊加到 /etc/usb_modeswitch.conf 下。

pi@raspberrypi ~ $ sudo vi /etc/usb_modeswitch.conf

在檔案最後加上幾行。

DefaultVendor=0x12d1
DefaultProduct=0x1446

TargetVendor=0x12d1
TargetProduct=0x14ac

MessageContent="5553424312345678000000000000061e000000000000000000000000000000"

e1820_usb_modeswitch_config

DefaultVendor 和 DefaultProduct 也是剛剛 lsusb 的結果。但 TargetVendor 和 TargetProduct 就需要上網爬文,例如這裡有提供。

而將 EnableLogging=0 改為 EnableLogging=1 可在 /var/log 下查看 usb_modeswitch_** 的 log 方便除錯。

如果設定沒問題,重開機用 dmesg 就可以看到已經成功的將 USB 數據機(usb 1-1.4) 掛載到 ttyUSB0、ttyUSB1 和 ttyUSB2。

... skip ...
[    7.062368] usb 1-1.4: new high-speed USB device number 6 using dwc_otg
[    7.185037] usb 1-1.4: New USB device found, idVendor=12d1, idProduct=1446
[    7.208299] usb 1-1.4: New USB device strings: Mfr=3, Product=2, SerialNumber=0
[    7.230322] usb 1-1.4: Product: HUAWEI Mobile
[    7.250718] usb 1-1.4: Manufacturer: Huawei Technologies
[    7.273445] usb-storage 1-1.4:1.0: USB Mass Storage device detected
[    7.297764] scsi0 : usb-storage 1-1.4:1.0
[    7.313332] usb-storage 1-1.4:1.1: USB Mass Storage device detected
[    7.342617] scsi1 : usb-storage 1-1.4:1.1
[    8.315111] scsi 0:0:0:0: CD-ROM            HUAWEI   Mass Storage     2.31 PQ: 0 ANSI: 2
[    8.345229] scsi 1:0:0:0: Direct-Access     HUAWEI   TF CARD Storage       PQ: 0 ANSI: 2
[    8.373824] sd 1:0:0:0: [sda] Attached SCSI removable disk
[    9.630014] scsi 0:0:0:0: Attached scsi generic sg0 type 5
[    9.773321] sd 1:0:0:0: Attached scsi generic sg1 type 0
[    9.819475] sr0: scsi-1 drive
[    9.942382] cdrom: Uniform CD-ROM driver Revision: 3.20
[   10.122331] sr 0:0:0:0: Attached scsi CD-ROM sr0
[   11.142844] usb-storage 1-1.4:1.0: USB Mass Storage device detected
[   11.153861] usb 1-1.4: USB disconnect, device number 6
[   11.176368] scsi2 : usb-storage 1-1.4:1.0
[   11.208558] scsi 1:0:0:0: rejecting I/O to offline device
[   11.218302] scsi 1:0:0:0: killing request
[   15.762375] usb 1-1.4: new high-speed USB device number 7 using dwc_otg
[   15.885281] usb 1-1.4: New USB device found, idVendor=12d1, idProduct=14ac
[   15.906715] usb 1-1.4: New USB device strings: Mfr=4, Product=3, SerialNumber=0
[   15.929998] usb 1-1.4: Product: HUAWEI Mobile
[   15.959491] usb 1-1.4: Manufacturer: Huawei Technologies
[   15.999001] usb-storage 1-1.4:1.5: USB Mass Storage device detected
[   16.040642] scsi3 : usb-storage 1-1.4:1.5
[   16.057131] usb-storage 1-1.4:1.6: USB Mass Storage device detected
[   16.099706] scsi4 : usb-storage 1-1.4:1.6
[   16.366181] EXT4-fs (mmcblk0p2): re-mounted. Opts: (null)
[   16.445601] usbcore: registered new interface driver cdc_ether
[   16.491873] usbcore: registered new interface driver usbserial
[   16.586318] usbcore: registered new interface driver usbserial_generic
[   16.617253] usbcore: registered new interface driver cdc_wdm
[   16.679164] usbserial: USB Serial support registered for generic
[   16.721907] qmi_wwan 1-1.4:1.1: cdc-wdm0: USB WDM device
[   16.751517] qmi_wwan 1-1.4:1.1 wwan0: register 'qmi_wwan' at usb-bcm2708_usb-1.4, WWAN/QMI device, a6:37:fd:d4:42:14
[   16.800868] usbcore: registered new interface driver qmi_wwan
[   16.830143] usbcore: registered new interface driver option
[   16.866417] usbserial: USB Serial support registered for GSM modem (1-port)
[   16.953166] option 1-1.4:1.0: GSM modem (1-port) converter detected
[   17.008423] usb 1-1.4: GSM modem (1-port) converter now attached to ttyUSB0
[   17.054788] scsi 3:0:0:0: CD-ROM            HUAWEI   Mass Storage     2.31 PQ: 0 ANSI: 2
[   17.095286] sr0: scsi-1 drive
[   17.113002] sr 3:0:0:0: Attached scsi CD-ROM sr0
[   17.113502] sr 3:0:0:0: Attached scsi generic sg0 type 5
[   17.134929] option 1-1.4:1.3: GSM modem (1-port) converter detected
[   17.155709] scsi 4:0:0:0: Direct-Access     HUAWEI   TF CARD Storage       PQ: 0 ANSI: 2
[   17.193722] sd 4:0:0:0: [sda] Attached SCSI removable disk
[   17.204968] sd 4:0:0:0: Attached scsi generic sg1 type 0
[   17.326895] usb 1-1.4: GSM modem (1-port) converter now attached to ttyUSB1
[   17.473045] option 1-1.4:1.4: GSM modem (1-port) converter detected
[   17.612898] usb 1-1.4: GSM modem (1-port) converter now attached to ttyUSB2
... skip ...

e1820_dmesg_after_mode_switch
 
ls /dev/tty* 也可看到最後長出了 /dev/ttyUSB0、/dev/ttyUSB1 和 /dev/ttyUSB2。

pi@raspberrypi ~ $ ls /dev/tty*

e1820_ls_tty_after_mode_switch

這時候我們用 lsusb 也可以發現讀到的硬體資訊改變了,包括 idProduct 和名稱都有變化。

pi@raspberrypi ~ $ lsusb
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp. 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. 
... skip ...
Bus 001 Device 007: ID 12d1:14ac Huawei Technologies Co., Ltd. 
... skip ...

e1820_lsusb_after_mode_switch

 
3. 安裝與設定撥號程式。
安裝撥號程式 wvdial 會一同安裝 ppp

pi@raspberrypi ~ $ sudo apt-get install -y wvdial

e1820_install_wvdial
 
再來設定 wvdial.conf

pi@raspberrypi ~ $ sudo vi /etc/wvdial.conf

加上一個撥號的 profile。

[Dialer E1820]
Phone = *99#
APN = internet
Username = username
Password = password
Init1 = ATZ
Init2 = ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0
Init3 = AT+CGDCONT=1, "IP","Internet"
Modem = /dev/ttyUSB0
Baud = 460800
Stupid Mode = 1

e1820_wvdial_config
其中
* [Dialer xxx]:profile 名稱,之後撥號就會以 xxx 為名,可設定多組 profile。
* Modem:wvdial 所用的數據機設備位置,預設為 /dev/modem。
* Baud:wvdial 和數據機所溝通的 baud rate。
* Stupid Mode:如果啟用 stupid mode,數據機在和終端伺服器(terminal server)溝通時將不會出現提示,並且當數據機連上後會立即啟動 pppd。

使用 wvdial 進行撥號連線,選擇 E1820 的 profile。

pi@raspberrypi ~ $ sudo wvdial E1820

在進行 pppd 連線過程中,會看到像是亂碼的符號,但如果連線成功會得到 IP 和 DNS 的位址。
e1820_wvdial
 
再用 ifconfig 查看網路介面資訊,可以發現多了一個 ppp0 的連線。
e1820_wvdial_ifconfig
 
開啟瀏覽器,確認可以連上網際網路。
browser_show_raspberry_pi_taiwan
 

常見問與答:

1. 如何測連線速度?
有關測網路的連線速度方法有很多,我們使用 speedtest-cli 這個用 python 寫的命令列測速套件,原始碼在 github。實際執行時,這個工具會連線到 speedtest.net 並測試上傳和下載的速度。

使用前需要先安裝相關的套件如下。

pi@raspberrypi ~ $ sudo apt-get install python-dev python-pip
pi@raspberrypi ~ $ sudo pip install speedtest-cli

執行 speedtest-cli

pi@raspberrypi ~ $ speedtest-cli
Retrieving speedtest.net configuration...
Retrieving speedtest.net server list...
Testing from Chunghwa Telecom Co., Ltd. (223.136.198.66)...
Hosted by Taiwan Fixed Network (New Taipei) [7.30 km]: 91.097 ms
Testing download speed........................................
Download: 2.48 Mbits/s
Testing upload speed..................................................
Upload: 1.41 Mbits/s

speedtest-cli 會根據使用者所在的位置,連線到最近的伺服器做測速。我們可以加上 --list 列出在台灣的伺服器列表。

pi@raspberrypi ~ $ speedtest-cli --list | grep Taiwan
2133) Taiwan Fixed Network (Taipei, Taiwan) [0.47 km]
2327) Far Eastone Telecommunications Co., Ltd. (Taipei, Taiwan) [0.47 km]
5008) Asia Pacific Telecom (Taipei, Taiwan) [0.47 km]
5661) NCIC Telcom (Taipei, Taiwan) [0.47 km]
2188) TFN Media Co., Ltd. (Taipei, Taiwan) [0.47 km]
3967) Chief Telecom (Taipei, Taiwan) [0.47 km]
5056) Taipei Fiber (Taipei, Taiwan) [0.47 km]
5660) NCIC Telcom (New Taipei, Taiwan) [9.09 km]
4505) Chief Telecom (New Taipei, Taiwan) [9.09 km]
5219) Taiwan Fixed Network (New Taipei, Taiwan) [9.09 km]
5067) Far Eastone Telecommunications Co., Ltd. (New Taipei, Taiwan) [9.09 km]
3921) Taiwan Fixed Network (Taoyuan, Taiwan) [31.66 km]
2589) Far EasTone Telecommunications Co., Ltd (Taoyuan, Taiwan) [31.66 km]
... skip ...

我們也可以指定伺服器做測試。只要在 speedtest-cli 後面加上伺服器的編號例如 --server 2133 就可以了。但我們實際測試時是沒有加上這個選項,而讓它自己選擇最近的伺服器。

2. 有其他網卡的設定可參考嗎?
以下是我們測過的幾張網卡的設定檔。

Huawei E220/Huawei E230
修改 /lib/udev/rules.d/40-usb_modeswitch.rules

ATTRS{idVendor}=="12d1", ATTRS{idProduct}=="1003", RUN+="usb_modeswitch '%b/%k'"

修改 /etc/usb_modeswitch.conf

DefaultVendor=0x12d1
DefaultProduct=0x1003
TargetVendor=0x12d1
TargetProductList="1001,1003,1406,140c,14ac"
MessageContent="55534243123456780000000000000011060000000000000000000000000000"

使用 speedtest-cli 的參考結果。
E230_speedtest_cli
 

Huawei E372
修改 /lib/udev/rules.d/40-usb_modeswitch.rules

ATTRS{idVendor}=="12d1", ATTRS{idProduct}=="1505", RUN+="usb_modeswitch '%b/%k'"

修改 /etc/usb_modeswitch.conf

DefaultVendor=  0x12d1
DefaultProduct= 0x1505
TargetVendor=   0x12d1
TargetProduct=  0x140c
TargetProductList="1001,1406,140b,140c,1412,141b,1433,14ac,1506,150f"
MessageContent="5553424312345678000000000000061e000000000000000000000000000000"

使用 speedtest-cli 的參考結果。
E372_speedtest_cli
 

Huawei E398u-1
修改 /lib/udev/rules.d/40-usb_modeswitch.rules

ATTRS{idVendor}=="12d1", ATTRS{idProduct}=="1505", RUN+="usb_modeswitch '%b/%k'"

修改 /etc/usb_modeswitch.conf

DefaultVendor=0x12d1
DefaultProduct=0x1505
TargetVendor=0x12d1
TargetProduct=0x1506
MessageContent="5553424312345678000000000000061e000000000000000000000000000000"

使用 speedtest-cli 的參考結果。
E398_speedtest_cli
E372 和 E398 的 idProduct 相同,只是因為 Huawei 沒有給每一個裝置都使用唯一的 idProduct。
 

3. 這錯誤訊息是什麼意思?

--> WvDial: Internet dialer version 1.61
--> Initializing modem.
--> Sending: ATZ
ATZ
OK
--> Sending: ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0
ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0
OK
--> Sending: AT+CGDCONT=1, "IP","Internet"
AT+CGDCONT=1, "IP","Internet"
ERROR
--> Bad init string.
--> Initializing modem.
--> Sending: ATZ
ATZ
OK
--> Sending: ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0
ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0
OK
--> Sending: AT+CGDCONT=1, "IP","Internet"
AT+CGDCONT=1, "IP","Internet"
ERROR
--> Bad init string.
--> Initializing modem.
--> Sending: ATZ
ATZ
OK
--> Sending: ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0
ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0
OK
--> Sending: AT+CGDCONT=1, "IP","Internet"
AT+CGDCONT=1, "IP","Internet"
ERROR                                             
--> Bad init string.

會發生這樣錯誤訊息的可能性有很多種,比如說網卡和 /etc/usb_modeswitch.conf 不匹配,或是 wvdial.conf 連線設定有誤,有可能是 SIM 卡沒安裝或沒插好,也有可能是網卡壞掉,甚至有時候從 Model B 換到 Model B+ 就解決了。
 

4. 如果發現連線到一半容易斷線該怎麼辦?
這通常是供電不足造成的結果。如果使用好的電源還是會容易斷線的話,解決方法第一個可以先修改 /boot/config.txt 如下,讓 USB 的電流可以從 600mA 提升到 1200 mA。

max_usb_current=1

解決方法第二是接一個有獨立供電的 USB Hub,問題就會解決了。
 

參考資料:
* Huawei E220
* How to setup a USB 3G Modem on Raspberry PI using usb_modeswitch and wvdial
* Use 3g/UMTS USB Dongle for WAN connection
* USB_ModeSwitch – Handling Mode-Switching USB Devices on Linux
* usb_modeswitch_dispatcher
* usb_modeswitch(1) – Linux man page
* udev
* Device Reference
* Linux / Unix Command: wvdial.conf
* Huawei E372 mobile broadband
* TROUBLESHOOT HUAWEI E398 ON MANJARO LINUX
* How to check Internet Speed via Terminal?
* How to Test Internet Connection Speed using Speedtest-Cli on Ubuntu Server

8 thoughts on “[基礎] Raspberry Pi 用 3G 網卡(3G USB dongle)上網

  1. 您好:
    我參考網站設定E1820的網卡,可是每次走到 [再來設定 wvdial.conf ] 要加入profile都會不成功,不知道怎麼加入資料,如果切換到資料夾路徑->新增檔案的話都會遇到使用者權限錯誤的問題,請問可以幫忙我處理問題嗎? 讓我可以繼續使用E1820網卡,謝謝!

    • 您好

      這應該是權限問題,因為 wvdial.conf 的 owner 權限是 root,所以在編輯時要加上 sudo,例如:
      $ sudo nano /etc/wvdial.conf

      謝謝

  2. 你好,
    請教兩個問題:
    1.我使用huawei E398u-15設備的時候,按照上面的操作,Messagecontent應該怎麽查到?現在發現執行命令sudo usb_modeswitch -W -c /etc/usb_modeswitch.conf -I后可以轉換成功,但是配置后重新開機不能自動轉換,一定要執行命令行才能轉換。請問這個是什麽原因?
    2.使用wvdial撥號到時候,有時候可以撥號成功獲取到IP地址,但是大部分時候都失敗,大概30%幾率成功。請問這個可能是什麽原因?
    謝謝

    • E1820 的頻段規格如下:
      * 支援的網路與頻段:HSPA+/HSPA/UMTS 2100MHz GSM/GPRS/EDGE 850/900/1800/1900MHz

      台灣中華電信、遠傳、台灣大哥大都是使用 GSM 系統,頻率為 900/1800MHz,因此都可以使用該 3G 網卡。

Leave a Reply

Your email address will not be published. Required fields are marked *


8 − = six


*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>