Bài 22: SMS gateway

SMS gateway cho phép máy tính có thể gởi/nhận tin nhắn SMS. Có thể dùng SMS gateway để xây dựng các dịch vụ Email to SMS, SMS to Email, trả lời tự động bằng SMS…

Có thể xây dựng RPI thành SMS gateway nhờ vào

  1. Google SMS (hợp tác với VinaPhone): Dùng cách này, chúng ta xây dựng hệ thống đơn thuần bằng phần mềm
  2. Gnokii hoặc Gammu: Các ứng dụng gởi/nhận/quản lý tin nhắn thông qua GSM modem (tận dụng điện thoại di động cũ, USB 3G…). Xem danh sách các thiết bị tương thích ở đây

Google SMS gateway

  • Chỉ có thể gởi SMS cho người dùng VinaPhone
  • Có định mức số SMS/ngày
  • Miễn phí gởi tin đi từ Google Voice
  • Tin đến 290đ/SMS
  • Hiện đang tạm dừng hoạt động nên chưa cần nói đến

usb_modeswitch

Khi cắm điện thoại di động, usb 3G … vào RPI, nếu thiết bị còn có chức năng lưu trữ thì sẽ được ưu tiên đùng như thiết bị lưu trữ, trong khi chúng ta cần sử dụng GSM modem. Một số thiết bị cho phép chọn lựa chức năng ngay khi cắm vào RPI. Tuy nhiên tốt nhất là nên cài đặt sao cho chức năng GSM modem là mặc định, phần mềm usb-modeswitch giúp làm việc này.

Thông thường chỉ cần cài đặt usb-modeswitch mà không cần can thiệp gì.

apt-get install usb-modeswitch

usb-modeswitch cần thiết khi cài đặt SMS gateway với Gnokii hay Gammu

Chú thích

Có trường hợp usb_modeswitch làm việc tốt khi cắm thiết bị vào RPI đang chạy, nhưng khi khởi động RPI với thiết bị cắm sẵn thì usb_modeswitch không chuyển thiết bị sang GSM mode được.

Cách khắc phục sau đây lấy Huawei E173 làm thí dụ

  • Chạy lệnh lsusb sau khi khởi động RPI đã cắm sẵn USB 3G để tìm Vendor IdProduct Id của thiết bị với vai trò thiết bị lưu trữ
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.
Bus 001 Device 004: ID 12d1:1446 Huawei Technologies Co., Ltd. E1552/E1800/E173 (HSPA modem)
  • Chạy lệnh lsusb sau khi rút và cắm lại USB 3G để tìm Product Id của GSM modem
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.
Bus 001 Device 005: ID 12d1:1436 Huawei Technologies Co., Ltd.

Chúng ta cần dùng usb_modeswitch để chuyển 12d1:1446 sang 12d1:1436. Việc này không đơn giản là chạy lệnh usb_modeswitch với các tham số -v -p -V -P

  • Trích file 12d1:1446 từ gói /usr/share/usb_modeswitch/configPack.tar.gz và đặt ở /etc/usb_modeswitch.d
  • Tạo file /etc/udev/rules.d/40-GSMswitch.rules có nội dung
#Huawei E173
ATTRS{idVendor}=="12d1", ATTRS{idProduct}=="1446", RUN+="usb_modeswitch '%b/%k'"
  • Khởi động lại RPI và dùng lệnh lsusb để kiểm tra

Thay vì gọi chay usb_modeswitch tự động qua file rules, có thể cho chạy thủ công qua dòng lệnh

usb_modeswitch -I -W -v 12d1 -p 1446 -c /etc/usb_modeswitch.d/12d1:1446

GNOKII SMS gateway

  • Trước tiên gắn GSM modem (điện thoại, USB 3G) vào RPI, kiểm tra xem hệ thống có nhận dạng được không bằng lệnh lsusb, nếu kết quả của lệnh tương tự như sau thì modem đã được nhận dạng
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 009: ID 0e8d:0003 MediaTek Inc. MT6227 phone
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp.
  • Tìm port được modem dùng qua lệnh dmesg|grep tty. Đôi khi modem không hoạt động vì không được cấp đủ điện từ cổng USB của RPI, khi đó phải cấp nguồn riêng cho modem.
[    0.000000] console [tty1] enabled
[    0.532849] dev:f1: ttyAMA0 at MMIO 0x20201000 (irq = 83, base_baud = 0) is a PL011 rev3
[    0.896190] console [ttyAMA0] enabled
[   99.059207] cdc_acm 1-1.2.4.2:1.1: ttyACM0: USB ACM device
[  241.614523] usb 1-1.2.4.2: GSM modem (1-port) converter now attached to ttyUSB0
  • Cài đặt minicom và gnokii
sudo apt-get install minicom gnokii
  • Cấu hình minicom và gnokii

1. Chạy lệnh minicom --setup, trình đơn cài đặt xuất hiện, chọn Serial port setup, gõ A để sửa Serial device thành ttyUSB0 (tìm thấy ở trên), Enter  rồi chọn Save setup as dfl, cuối cùng là chọn Exit từ trình đơn. Tại cửa sổ minicom, gõ lệnh AT, minicom sẽ đáp lại OK, gõ AT&F nếu lại nhận được OK thì modem đã hoạt động bình thường. Gõ Ctrl+ZX để đóng cửa sổ minicom.

2. Chạy lệnh mkdir ~/.config/gnokiicp /etc/xdg/gnokii/config ~/.config/gnokii/ để sao chép file cấu hình về thư mục home, sau đó mở file ~/.config/gnokii/config (nano ~/.config/gnokii/config) thay đổi giá trị portmodel thành port=ttyUSB0, model=AT. Chạy lệnh gnokii –identify nếu nhìn thấy số IMEI là đã cấu hình đúng.

  • Gởi TEXT SMS

echo "this is a test message" | gnokii --sendsms 090xxxxxx

GAMMU SMS gateway

  • Cài đặt gammu, gammu-smsd
apt-get install gammu python-gammu gammu-smsd

gammu, gammu-smsd (daemon) dùng để gởi/đọc SMS, python-gammu là thư viện python dùng để lập trình với gammu

Có hai cách để gởi/đọc SMS, dùng gammu hay dùng daemon gammu-smsd.
Hai ứng dụng này không thể đồng thời sử dụng, vì vậy dùng gammu-smsd để gởi/đọc SMS thì không dùng được các dòng lệnh gammu và ngược lại

  • Cấu hình gammu

gammu-config

1. Chạy lệnh gammu-detect để biết port của modem. Giả sử kết quả là device = /dev/ttyUSB2, khi đó port là ttyUSB2

hoặc chạy lệnh dmesg|grep tty, nếu có nhiều dòng GSM modem thì chọn port từ dòng cuối

[    0.896429] console [ttyAMA0] enabled
[ 1706.063987] usb 1-1.4: GSM modem (1-port) converter now attached to ttyUSB0
[ 1706.065936] usb 1-1.4: GSM modem (1-port) converter now attached to ttyUSB1
[ 1706.078706] usb 1-1.4: GSM modem (1-port) converter now attached to ttyUSB2

2. Chạy lệnh gammu-config để vào trình đơn cấu hình gammu

3. Từ trình đơn cấu hình, sửa lại Port là /dev/port_tìm_đượcModelAT, xong chọn Save. Để kiểm tra cấu hình, chạy lệnh gammu identify, nếu nhìn thấy số IMEI là đúng.

  • Cấu hình gammu-smsd

Soạn thảo /etc/gammu-smsdrc, đoạn [gammu] bao gồm PortConnection (Model) như cấu hình gammu

[gammu]
# Please configure this!
port = /dev/ttyUSB2
connection = at

Đoạn [smsd]  chỉ định cách ghi chép SMS/MMS đến

!!! Các dòng sau đây chỉ định gammu-smsd dùng file để ghi chép, sửa lại đường dẫn nếu cần

[smsd]
service = files
inboxpath = /var/spool/gammu/inbox/
outboxpath = /var/spool/gammu/outbox/
sentsmspath = /var/spool/gammu/sent/
errorsmspath = /var/spool/gammu/error/

!!! Nếu muốn dùng MySQL để ghi chép thì thay bằng

[smsd]
# service = MYSQL
# deprecated thay bằng 2 dòng sau
service = SQL
driver = native_mysql
database = smsd
user = smsd
password = mật_khẩu_của_user
pc = localhost

 

Đồng thời phải tạo CSDL smsd và import các bảng từ /usr/share/doc/gammu/examples/sql/mysql.sql.gz

– Chạy dòng lệnh

mysql -uroot -pYOUR_PASSWORD

– Tại dấu nhắc mysql> lần lượt nhập lệnh sau để tạo database và user smsd

CREATE DATABASE smsd;
CREATE USER smsd IDENTIFIED BY 'mật_khẩu_của_user';
GRANT SELECT, INSERT, UPDATE, DELETE ON smsd.* TO smsd@localhost;
quit;

– Chạy lệnh sau để import CSDL smsd

zcat /usr/share/doc/gammu/examples/sql/mysql.sql.gz|mysql -uroot -pYOUR_PASSWORD smsd
 

!!! Dùng service = NULL nếu không muốn lưu sms

Ngoài ra, có thể chỉ định đoạn mã xử lý tin đến qua sự kiện RunOnReceive (thí dụ ~/sms.sh). Lưu ý là gammu-smsd chờ đoạn mã này hoàn tất mới làm việc tiếp nên nếu đoạn mã cần thời gian xử lý lâu thì có thể tin đến sau bị bỏ lỡ.

RunOnReceive = sudo ~/sms.sh
  • Chạy gammu-smsd

Khi dùng daemon gammu-smsd, ứng dụng này phải được chạy thường trực.

Có thể cài đặt gọi chạy khi khởi động bằng

update-rc.d gammu-smsd defaults

hay chạy lệnh crontab -e và thêm vào dòng

@reboot gammu-smsd -d

hoặc gọi chạy mỗi khi cần dùng bằng lệnh

service gammu-smsd start
  • Nâng quyền user gammu bằng cách chạy lệnh sudo visudo và thêm vào cuối file
gammu ALL=(ALL) NOPASSWD: ALL

Khởi động lại RPI để các cài đặt có hiệu lực

  • Thí dụ sử dụng gammu và gammu-smsd

+++ Gởi TEXT SMS bằng gammu

gammu sendsms TEXT 090xxxxxx -text "this is a test message"

+++ Gởi TEXT SMS bằng gammu-smsd

gammu-smsd-inject TEXT 090xxxxxx -text "this is a test message"

Các dòng lệnh Bash đều có thể thay bằng Python. Thư viện python-gammu giúp lập trình gammu dễ dàng hơn

+++ Xử lý tin SMS đến

Nếu dùng gammu thì phải định kỳ quét tìm sms mới, nếu dùng gammu-smsd thì cài đặt RunOnReceive

Để cài đặt RunOnReceive có hiệu lực, daemon gammu-smsd phải được chạy trước, thí dụ cài đặt chạy mỗi khi khởi động

update-rc.d gammu-smsd defaults

sau đó mỗi khi có SMS mới thì tập lệnh Bash sms.sh được gọi chạy để xử lý tin nhắn.

Tập lệnh Bash sms.sh có thể viết lại bằng Python hay PHP (chạy theo dòng lệnh bằng php-cli)

+++ Hiện nội dung tin nhắn vừa nhận trong thư mục inbox

#!/bin/sh
INBOX=/path/to/smsd/inbox
PROGRAM=/bin/cat
for ID in "$@" ; do 
   $PROGRAM < $INBOX/$ID
done

+++ Hiện số điện thoại  người gởi và nội dung tin nhắn mới nhận từ bộ nhớ

#!/bin/sh
PROGRAM=/bin/echo
for i in `seq $SMS_MESSAGES` ; do
   eval "$PROGRAM \"\${SMS_${i}_NUMBER}\" \"\${SMS_${i}_TEXT}\""
done

+++ Hiện số điện thoại  người gởi, tiêu đề và nội dung tin nhắn MMS

#!/bin/sh
if [ $DECODED_PARTS -eq 0 ] ; then
    # No decoded parts, nothing to process
    exit
fi
if [ "$DECODED_1_MMS_ADDRESS" ] ; then
    echo "$DECODED_1_MMS_ADDRESS" "$DECODED_1_MMS_SENDER" "$DECODED_1_MMS_TITLE" >> /tmp/smsd-mms.log
fi
  • Các biến toàn cục dùng với gammu-smsd
SMS_MESSAGES: số tin vật lý nhận được
DECODED_PARTS: số phần tin được giải mã
SMS_n_CLASS: Class của tin
SMS_n_NUMBER: số điện thoại người gởi
SMS_n_TEXT: nội dung tin
DECODED_n_TEXT: giải mã tin nhắn dài
DECODED_n_MMS_SENDER: số điện thoại người gởi MMS
DECODED_n_MMS_TITLE: tiêu đề MMS
DECODED_n_MMS_ADDRESS: url của MMS
DECODED_n_MMS_SIZE: kích thước tin MMS
trong đó n là số thứ tự tin

 

KALKUN

Kalkun là một ứng dụng PHP + MySQL, quản lý tin nhắn dựa vào CSDL của gammu-smsd. Cần phải cài đặt CSDL cho gammu-smsd trước, sau đó mới có thể cài đặt Kalkun.

compose

Leave a Comment

Filed under Software

Leave a Reply