Triển khai SMS Notification trong Nagios sử dụng Gammu và USB 3G


1           Mục đích

Bài viết này đi vào nghiên cứu và áp dụng tính năng SMS Notification có trong Nagios sử dụng phần mềm Gammu và thiết bị USB 3G để nhanh chóng gửi thông tin, cảnh báo về trạng thái hoạt động của các host/service/network device đang chạy trong hệ thống.

2           Chuẩn bị và yêu cầu

  • Một Nagios monitoring server đang hoạt động, ở đây chạy trên CentOS 6.2
  • Một USB 3G, ở đây thử nghiệm với thiết bị D-Com của mạng Viettel.
  • Source package của Gammu, phần mềm giúp điều khiển các mobile phone, USB modem để thực hiện gửi và nhận SMS.
    • Các dependency mà Gammu bắt buộc phải có là: CMake, pkg-config
    • Các optional dependency giúp mở rộng tính năng cho Gammu là: Bluez-libs, libusb-1.0, libCURL, libiconv, Gettext, MySQL, PostgreSQL, unixODBC, libdbi, Python SQLite + libdbi-drivers + SQLite.
    • Ngoài ra, cần thêm các gói make, gcc để build và compile chương trình từ source.
    • Tải về source của các package cần thiết tại:

[1] Gammu
http://sourceforge.net/projects/gammu/files/gammu/1.32.0/gammu-1.32.0.tar.bz2
[2] Cmake
http://www.cmake.org/files/v2.8/cmake-2.8.8.tar.gz
[3] pkg-config
http://pkgconfig.freedesktop.org/releases/pkg-config-0.26.tar.gz
Hoặc cài đặt nhanh thông qua lệnh yum:

$ sudo yum install cmake pkgconfig

  • Có thể cần cài thêm gói usb_modeswitch  để chuyển từ chế độ storage sang modem nếu máy chủ CentOS chạy Nagios không nhận ra D-Com 3G như là một USB modem. Tải về source tại:

[1] http://www.draisberghof.de/usb_modeswitch/usb-modeswitch-data-20120531.tar.bz2
[2] http://www.draisberghof.de/usb_modeswitch/usb-modeswitch-1.2.3.tar.bz2

Và cài nhanh các dependency cần thiết bằng lệnh yum:

$ sudo yum install libusb-devel tcl

  • Cần tới quyền root trong quá trình cài đặt và cấu hình hệ thống.

3           Các bước thực hiện

3.1         Kết nối USB 3G tới máy Nagios

–          Kiểm tra xem CentOS đã nhận ra USB 3G là một GSM modem hay chưa:

$ dmesg | grep GSM

–          Nếu thấy output như sau thì đã ổn:

USB Serial support registered for GSM modem (1-port)
option 1-1:1.0: GSM modem (1-port) converter detected
usb 1-1: GSM modem (1-port) converter now attached to ttyUSB0
option 1-1:1.1: GSM modem (1-port) converter detected
usb 1-1: GSM modem (1-port) converter now attached to ttyUSB1
option 1-1:1.2: GSM modem (1-port) converter detected
usb 1-1: GSM modem (1-port) converter now attached to ttyUSB2
option 1-1:1.3: GSM modem (1-port) converter detected
usb 1-1: GSM modem (1-port) converter now attached to ttyUSB3
option: v0.7.2:USB Driver for GSM modems

(để ý là device file cho thiết bị là /dev/ttyUSB3)

–          Nếu output trống rỗng thì cần compile và install gói usb_modeswitch

3.2         Biên dịch và cài đặt Gammu

–          Giải nén source package của Gammu:

$ tar jxvf gammu-1.32.0.tar.bz2

–          Chuyển vào folder vừa được giải nén:

$ cd gammu-1.32.0

–          Chạy các lệnh sau để configure, compile và install Gammu:

$ ./configure
$ make
$sudo make install

–          Kiểm tra bằng lệnh:

$ gammu

–          Nếu nhận được thông báo lỗi liên quan tới library thì chạy 2 dòng lệnh sau:

$ ln -s /usr/local/lib/libGammu.so.7 /usr/lib/libGammu.so.7
$ ln -s /usr/local/lib/libgsmsd.so.7 /usr/lib/libgsmsd.so.7

3.3         Cấu hình Gammu để gửi SMS

–          Tạo config file cho Gammu:

# vi /etc/gammurc

–          Nội dung của file là:

[gammu]
port = /dev/ttyUSB3
connection = at19200

Ngoài ra, có thể sử dụng lệnh sau để cấu hình dễ dàng cấu hình các thông số trên:

$ gammu-config

–          Kiểm tra USB 3G được nhận dạng:

# gammu –identify

Device               : /dev/ttyUSB3
Manufacturer         : ZTE CORPORATION
Model                : unknown (MF190S)
Firmware             : BD_MF190SV1.0.0B01
IMEI                 : 864482000915806

Ngoài ra còn có 2 lệnh khác để theo dõi hoạt động của thiết bị là:

$ gammu –monitor
$ gammu –networkinfo

–          Nagios chạy với quyền của user nagios, vậy nên nếu muốn Nagios gửi thành công SMS, user nagios phải có quyền truy cập tới device file, config file và binary file của Gammu. Chạy các lệnh sau để gán các quyền thích hợp cho user nagios:

$ cp /etc/gammurc /home/nagios/.gammurc
$ sudo chown nagios.nagios /home/nagios/.gammurc
$ sudo chmod 4755 /usr/local/bin/gammu
$ sudo usermod -a -G dialout nagios
$ sudo usermod -a -G dialout apache

–          Chuyển qua user nagios và thử gửi một SMS mẫu:

$ su – nagios
$ echo “test SMS nagios” | gammu –sendsms TEXT +84932xxxxxx

If you want break, press Ctrl+C…
Sending SMS 1/1….waiting for network answer..OK, message reference=181

Nếu số điện thoại trong câu lệnh ở trên nhận được thông điệp “test SMS nagios” thì việc cấu hình để CentOS gửi SMS đã thành công.

3.4         Cấu hình Nagios để gửi notification qua SMS

–          Thêm 2 command mới sau vào config file /usr/local/nagios/etc/commands.cfg

# ‘notify-host-by-sms’ command definition

define command{

command_name    notify-host-by-sms

command_line    /usr/bin/printf “%b” “*** Nagios ***\n Notification Type: $NOTIFICATIONTYPE$\n Host: $HOSTNAME$\n State: $HOSTSTATE$\n Address: $HOSTADDRESS$\n Info: $HOSTOUTPUT$\n Date/Time: $LONGDATETIME$” | /usr/local/bin/gammu –sendsms TEXT $CONTACTPAGER$

}

# ‘notify-service-by-sms’ command definition

define command{

command_name    notify-service-by-sms

command_line    /usr/bin/printf “%b” “*** Nagios ***\n Notification Type: $NOTIFICATIONTYPE$\n Service: $SERVICEDESC$\n Host: $HOSTALIAS$\n Address: $HOSTADDRESS$\n State: $SERVICESTATE$\n Date/Time: $LONGDATETIME$\n Additional Info: $SERVICEOUTPUT$” | /usr/local/bin/gammu –sendsms TEXT $CONTACTPAGER$

–          Thêm 1 contact mới sau vào config file /usr/local/nagios/etc/contacts.cfg

define contact{
contact_name                    admin
use                             generic-contact
alias                           Thang Man
service_notification_options    w,u,c,r
host_notification_options       d,u,r
service_notification_commands   notify-service-by-sms,notify-service-by-email
host_notification_commands      notify-host-by-sms,notify-host-by-email
email                           admin@gmail.com
pager                           +84983xxxxxx
}

Kiểm tra cấu hình và khởi động lại Nagios

$ sudo /usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg
$ sudo /etc/init.d/nagios restart
$ sudo /etc/init.d/nagios reload

Thử ngưng hoạt động một host/service/netwok device nào đó thì sau một khoảng thời gian quy định trước, Nagios sẽ kiểm tra trạng thái và gửi đi SMS thông báo tình trạng của chúng tới số điện thoại của người quản trị.

4           Hướng phát triển

  • Tìm hiểu cách cài đặt cho các loại USB 3G, mobile phone khác để linh động trong việc lựa chọn và thay thế thiết bị gửi SMS.
  • Cải tiến hệ thống monitor và alert dùng Nagios và Gammu để ngoài việc gửi notification thì hệ thống còn có thể nhận các xác nhận, chỉ lệnh từ điện thoại của người quản trị.

5           Tham khảo

[1] Nagios + SMS notifications with Gammu and Siemens MC35i
http://blog.wains.be/2010/01/05/nagios-sms-notifications-gammu-siemensmc35i/

[2] How To Send SMS With Gammu
http://en.doc.centreon.com/HowToSendSMSWithGammu

[3] Install and configure gammu in CentOS 6
http://irhamnurhalim.wordpress.com/2012/02/09/install-dan-configure-gammu-di-centos-6/

[4] Nagios 2-way alerting via SMS
http://matt.bottrell.com.au/archives/170-Nagios-2-way-alerting-via-SMS-Part-1.html

–manthang

7 comments

  1. Mình bị lỗi như bên dưới không biết bạn có bị ký tự $ trong alert không. VD: State: $

    ————————-
    Processed ‘SERVICEOUTPUT’, Clean Options: 3, Free: 1
    [1375820667.019791] [2048.0] [pid=22474] WARNING: An error occurred processing macro ‘SERVICEOUTPUT’!
    [1375820667.019800] [2048.2] [pid=22474] Non-macro. Running output (208): ‘/usr/bin/printf “%b” “*** Nagios ***\nNotification Type: PROBLEM\nService: $SERVICEDESC$\nHost: Wireless\nAddress: 192.168.1.2\nState: $SERVICESTATE$\nDate/Time: Wed Aug 7 03:24:27 ICT 2013\nAdditional Info: ‘
    [1375820667.019810] [2048.2] [pid=22474] Processing part: ‘” | /usr/local/bin/gammu –sendsms TEXT ‘
    —————————————————-

  2. cho em hỏi e make install usb_modeswitch-2.1.1 nó bị lổi này là gì vậy ạ

    sed ‘s_!/usr/bin/tclsh_!'”/usr/bin/tclsh”‘_’ usb_modeswitch_dispatcher
    cc -o usb_modeswitch usb_modeswitch.c -Wall `pkg-config –libs –cflags libusb-1.0`
    Package libusb-1.0 was not found in the pkg-config search path.
    Perhaps you should add the directory containing `libusb-1.0.pc’
    to the PKG_CONFIG_PATH environment variable
    No package ‘libusb-1.0’ found
    In file included from usb_modeswitch.c:59:
    usb_modeswitch.h:26:20: error: libusb.h: No such file or directory
    In file included from usb_modeswitch.c:59:
    usb_modeswitch.h:56: warning: ‘struct libusb_device_handle’ declared inside parameter list
    usb_modeswitch.h:56: warning: its scope is only this definition or declaration, which is probably not what you want
    usb_modeswitch.h:57: warning: ‘struct libusb_config_descriptor’ declared inside parameter list
    usb_modeswitch.c:65: warning: ‘struct libusb_device_handle’ declared inside parameter list
    usb_modeswitch.c: In function ‘usb_bulk_io’:
    usb_modeswitch.c:70: warning: implicit declaration of function ‘libusb_bulk_transfer’
    usb_modeswitch.c:75: error: ‘LIBUSB_ERROR_TIMEOUT’ undeclared (first use in this function)
    usb_modeswitch.c:75: error: (Each undeclared identifier is reported only once
    usb_modeswitch.c:75: error: for each function it appears in.)
    usb_modeswitch.c: At top level:
    usb_modeswitch.c:81: error: expected ‘)’ before ‘*’ token
    usb_modeswitch.c: In function ‘main’:
    usb_modeswitch.c:421: error: storage size of ‘descriptor’ isn’t known
    usb_modeswitch.c:491: warning: implicit declaration of function ‘libusb_init’
    usb_modeswitch.c:494: warning: implicit declaration of function ‘libusb_set_debug’
    usb_modeswitch.c:527: warning: implicit declaration of function ‘libusb_get_device_address’
    usb_modeswitch.c:528: warning: implicit declaration of function ‘libusb_get_bus_number’
    usb_modeswitch.c:531: warning: implicit declaration of function ‘libusb_open’
    usb_modeswitch.c:547: warning: passing argument 1 of ‘get_current_configuration’ from incompatible pointer type
    usb_modeswitch.h:56: note: expected ‘struct libusb_device_handle *’ but argument is of type ‘struct libusb_device_handle *’
    usb_modeswitch.c:553: warning: implicit declaration of function ‘libusb_get_device_descriptor’
    usb_modeswitch.c:555: warning: implicit declaration of function ‘libusb_get_config_descriptor’
    usb_modeswitch.c:557: error: dereferencing pointer to incomplete type
    usb_modeswitch.c:561: warning: passing argument 1 of ‘get_interface_class’ from incompatible pointer type
    usb_modeswitch.h:57: note: expected ‘struct libusb_config_descriptor *’ but argument is of type ‘struct libusb_config_descriptor *’
    usb_modeswitch.c:562: warning: implicit declaration of function ‘libusb_free_config_descriptor’
    usb_modeswitch.c:728: warning: passing argument 1 of ‘get_current_configuration’ from incompatible pointer type
    usb_modeswitch.h:56: note: expected ‘struct libusb_device_handle *’ but argument is of type ‘struct libusb_device_handle *’
    usb_modeswitch.c:746: warning: implicit declaration of function ‘libusb_close’
    usb_modeswitch.c:421: warning: unused variable ‘descriptor’
    usb_modeswitch.c: In function ‘deviceDescription’:
    usb_modeswitch.c:807: error: storage size of ‘descriptor’ isn’t known
    usb_modeswitch.c:815: warning: implicit declaration of function ‘libusb_get_string_descriptor_ascii’
    usb_modeswitch.c:807: warning: unused variable ‘descriptor’
    usb_modeswitch.c: In function ‘deviceInquire’:
    usb_modeswitch.c:867: warning: implicit declaration of function ‘libusb_claim_interface’
    usb_modeswitch.c:872: warning: implicit declaration of function ‘libusb_clear_halt’
    usb_modeswitch.c:874: warning: passing argument 1 of ‘usb_bulk_io’ from incompatible pointer type
    usb_modeswitch.c:64: note: expected ‘struct libusb_device_handle *’ but argument is of type ‘struct libusb_device_handle *’
    usb_modeswitch.c:880: warning: passing argument 1 of ‘usb_bulk_io’ from incompatible pointer type
    usb_modeswitch.c:64: note: expected ‘struct libusb_device_handle *’ but argument is of type ‘struct libusb_device_handle *’
    usb_modeswitch.c:886: warning: passing argument 1 of ‘usb_bulk_io’ from incompatible pointer type
    usb_modeswitch.c:64: note: expected ‘struct libusb_device_handle *’ but argument is of type ‘struct libusb_device_handle *’
    usb_modeswitch.c:907: warning: implicit declaration of function ‘libusb_release_interface’
    usb_modeswitch.c: In function ‘findMBIMConfig’:
    usb_modeswitch.c:920: warning: implicit declaration of function ‘libusb_get_device_list’
    usb_modeswitch.c:927: error: storage size of ‘descriptor’ isn’t known
    usb_modeswitch.c:952: error: dereferencing pointer to incomplete type
    usb_modeswitch.c:953: error: dereferencing pointer to incomplete type
    usb_modeswitch.c:954: error: dereferencing pointer to incomplete type
    usb_modeswitch.c:955: error: dereferencing pointer to incomplete type
    usb_modeswitch.c:927: warning: unused variable ‘descriptor’
    usb_modeswitch.c: In function ‘resetUSB’:
    usb_modeswitch.c:979: warning: implicit declaration of function ‘libusb_reset_device’
    usb_modeswitch.c: In function ‘switchConfiguration’:
    usb_modeswitch.c:1076: warning: implicit declaration of function ‘libusb_set_configuration’
    usb_modeswitch.c: In function ‘switchAltSetting’:
    usb_modeswitch.c:1094: warning: implicit declaration of function ‘libusb_set_interface_alt_setting’
    usb_modeswitch.c: In function ‘switchHuaweiMode’:
    usb_modeswitch.c:1108: warning: implicit declaration of function ‘libusb_control_transfer’
    usb_modeswitch.c:1108: error: ‘LIBUSB_REQUEST_TYPE_STANDARD’ undeclared (first use in this function)
    usb_modeswitch.c:1108: error: ‘LIBUSB_RECIPIENT_DEVICE’ undeclared (first use in this function)
    usb_modeswitch.c:1109: error: ‘LIBUSB_REQUEST_SET_FEATURE’ undeclared (first use in this function)
    usb_modeswitch.c: In function ‘switchSierraMode’:
    usb_modeswitch.c:1120: error: ‘LIBUSB_REQUEST_TYPE_VENDOR’ undeclared (first use in this function)
    usb_modeswitch.c:1121: error: ‘LIBUSB_ERROR_PIPE’ undeclared (first use in this function)
    usb_modeswitch.c: In function ‘switchKobilMode’:
    usb_modeswitch.c:1157: error: ‘LIBUSB_REQUEST_TYPE_VENDOR’ undeclared (first use in this function)
    usb_modeswitch.c:1157: error: ‘LIBUSB_RECIPIENT_DEVICE’ undeclared (first use in this function)
    usb_modeswitch.c:1157: error: ‘LIBUSB_ENDPOINT_IN’ undeclared (first use in this function)
    usb_modeswitch.c: In function ‘switchQuantaMode’:
    usb_modeswitch.c:1179: error: ‘LIBUSB_REQUEST_TYPE_VENDOR’ undeclared (first use in this function)
    usb_modeswitch.c:1179: error: ‘LIBUSB_RECIPIENT_DEVICE’ undeclared (first use in this function)
    usb_modeswitch.c:1179: error: ‘LIBUSB_ENDPOINT_IN’ undeclared (first use in this function)
    usb_modeswitch.c: In function ‘switchBlackberryMode’:
    usb_modeswitch.c:1191: error: ‘LIBUSB_REQUEST_TYPE_VENDOR’ undeclared (first use in this function)
    usb_modeswitch.c:1191: error: ‘LIBUSB_RECIPIENT_DEVICE’ undeclared (first use in this function)
    usb_modeswitch.c:1191: error: ‘LIBUSB_ENDPOINT_IN’ undeclared (first use in this function)
    usb_modeswitch.c: In function ‘switchPantechMode’:
    usb_modeswitch.c:1209: error: ‘LIBUSB_REQUEST_TYPE_VENDOR’ undeclared (first use in this function)
    usb_modeswitch.c:1209: error: ‘LIBUSB_RECIPIENT_DEVICE’ undeclared (first use in this function)
    usb_modeswitch.c: In function ‘switchActionMode’:
    usb_modeswitch.c:1234: error: ‘LIBUSB_REQUEST_TYPE_CLASS’ undeclared (first use in this function)
    usb_modeswitch.c:1234: error: ‘LIBUSB_RECIPIENT_INTERFACE’ undeclared (first use in this function)
    usb_modeswitch.c:1237: warning: implicit declaration of function ‘usb_interrupt_io’
    usb_modeswitch.c: In function ‘switchSequansMode’:
    usb_modeswitch.c:1285: error: ‘LIBUSB_REQUEST_TYPE_VENDOR’ undeclared (first use in this function)
    usb_modeswitch.c:1285: error: ‘LIBUSB_RECIPIENT_DEVICE’ undeclared (first use in this function)
    usb_modeswitch.c: In function ‘detachDriver’:
    usb_modeswitch.c:1416: warning: implicit declaration of function ‘libusb_kernel_driver_active’
    usb_modeswitch.c:1417: error: ‘LIBUSB_ERROR_NOT_SUPPORTED’ undeclared (first use in this function)
    usb_modeswitch.c:1430: warning: implicit declaration of function ‘libusb_detach_kernel_driver’
    usb_modeswitch.c: In function ‘sendMessage’:
    usb_modeswitch.c:1459: error: ‘LIBUSB_ERROR_NO_DEVICE’ undeclared (first use in this function)
    usb_modeswitch.c: In function ‘write_bulk’:
    usb_modeswitch.c:1585: warning: passing argument 1 of ‘usb_bulk_io’ from incompatible pointer type
    usb_modeswitch.c:64: note: expected ‘struct libusb_device_handle *’ but argument is of type ‘struct libusb_device_handle *’
    usb_modeswitch.c:1589: error: ‘LIBUSB_ERROR_NO_DEVICE’ undeclared (first use in this function)
    usb_modeswitch.c: In function ‘read_bulk’:
    usb_modeswitch.c:1599: warning: passing argument 1 of ‘usb_bulk_io’ from incompatible pointer type
    usb_modeswitch.c:64: note: expected ‘struct libusb_device_handle *’ but argument is of type ‘struct libusb_device_handle *’
    usb_modeswitch.c:1603: error: ‘LIBUSB_ERROR_NO_DEVICE’ undeclared (first use in this function)
    usb_modeswitch.c: In function ‘search_devices’:
    usb_modeswitch.c:1655: error: storage size of ‘descriptor’ isn’t known
    usb_modeswitch.c:1694: error: storage size of ‘descriptor’ isn’t known
    usb_modeswitch.c:1699: error: dereferencing pointer to incomplete type
    usb_modeswitch.c:1694: warning: unused variable ‘descriptor’
    usb_modeswitch.c:1731: warning: passing argument 1 of ‘get_current_configuration’ from incompatible pointer type
    usb_modeswitch.h:56: note: expected ‘struct libusb_device_handle *’ but argument is of type ‘struct libusb_device_handle *’
    usb_modeswitch.c:1655: warning: unused variable ‘descriptor’
    usb_modeswitch.c: In function ‘find_first_bulk_output_endpoint’:
    usb_modeswitch.c:1771: error: invalid use of undefined type ‘struct libusb_config_descriptor’
    usb_modeswitch.c:1771: error: dereferencing pointer to incomplete type
    usb_modeswitch.c:1774: error: dereferencing pointer to incomplete type
    usb_modeswitch.c:1775: error: dereferencing pointer to incomplete type
    usb_modeswitch.c:1776: error: dereferencing pointer to incomplete type
    usb_modeswitch.c:1776: error: ‘LIBUSB_ENDPOINT_ADDRESS_MASK’ undeclared (first use in this function)
    usb_modeswitch.c:1776: error: ‘LIBUSB_TRANSFER_TYPE_BULK’ undeclared (first use in this function)
    usb_modeswitch.c:1777: error: dereferencing pointer to incomplete type
    usb_modeswitch.c:1777: error: ‘LIBUSB_ENDPOINT_DIR_MASK’ undeclared (first use in this function)
    usb_modeswitch.c:1778: error: dereferencing pointer to incomplete type
    usb_modeswitch.c: In function ‘find_first_bulk_input_endpoint’:
    usb_modeswitch.c:1791: error: invalid use of undefined type ‘struct libusb_config_descriptor’
    usb_modeswitch.c:1791: error: dereferencing pointer to incomplete type
    usb_modeswitch.c:1793: error: dereferencing pointer to incomplete type
    usb_modeswitch.c:1794: error: dereferencing pointer to incomplete type
    usb_modeswitch.c:1795: error: dereferencing pointer to incomplete type
    usb_modeswitch.c:1795: error: ‘LIBUSB_ENDPOINT_ADDRESS_MASK’ undeclared (first use in this function)
    usb_modeswitch.c:1795: error: ‘LIBUSB_TRANSFER_TYPE_BULK’ undeclared (first use in this function)
    usb_modeswitch.c:1796: error: dereferencing pointer to incomplete type
    usb_modeswitch.c:1796: error: ‘LIBUSB_ENDPOINT_DIR_MASK’ undeclared (first use in this function)
    usb_modeswitch.c:1797: error: dereferencing pointer to incomplete type
    usb_modeswitch.c: At top level:
    usb_modeswitch.c:1804: error: conflicting types for ‘get_current_configuration’
    usb_modeswitch.h:56: note: previous declaration of ‘get_current_configuration’ was here
    usb_modeswitch.c: In function ‘get_current_configuration’:
    usb_modeswitch.c:1807: error: ‘LIBUSB_REQUEST_TYPE_STANDARD’ undeclared (first use in this function)
    usb_modeswitch.c:1807: error: ‘LIBUSB_RECIPIENT_DEVICE’ undeclared (first use in this function)
    usb_modeswitch.c:1807: error: ‘LIBUSB_REQUEST_GET_CONFIGURATION’ undeclared (first use in this function)
    usb_modeswitch.c: At top level:
    usb_modeswitch.c:1822: warning: ‘struct libusb_config_descriptor’ declared inside parameter list
    usb_modeswitch.c:1822: error: conflicting types for ‘get_interface_class’
    usb_modeswitch.h:57: note: previous declaration of ‘get_interface_class’ was here
    usb_modeswitch.c: In function ‘get_interface_class’:
    usb_modeswitch.c:1825: error: dereferencing pointer to incomplete type
    usb_modeswitch.c:1827: error: dereferencing pointer to incomplete type
    usb_modeswitch.c:1828: error: dereferencing pointer to incomplete type
    make: *** [usb_modeswitch] Error 1

  3. Bạn cho mình hỏi là khi cấu hình gửi SMS theo hướng dẫn ở trên
    Với 1 contact : gửi SMS okie
    Với nhiều contact tại một thời điểm thì check trong log nó báo lỗi như sau :
    wproc: stdout line 01: No response in specified timeout. Probably phone not connected

    Bạn có p/an hay cách giải quyết nào giúp mình với.
    Thanks !

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s