sudo gedit /home/shift/SendSMSTest.py
#!/usr/bin/python
import os
import sys
import time
def dectobin(i):
b = ''
while i > 0:
j = i & 1
b = str(j) + b
i >>= 1
return b
def SendSMS(dev,number,text):
pdu_data = '00' #SMSC
pdu_data += '01' #PDU header
pdu_data += '00' #TP-Message-Reference
pdu_data += '0a' #Address-Length. Число символов в номере(hex)
pdu_data += '81' #Type-of-Address. Номер в национальном формате
'''Convert telephone number'''
number += 'F'
pdu_number = ''
for i in range(0,len(number)):
if i%2==0:
continue
pdu_number += number + number[i-1]
pdu_data += pdu_number
pdu_data += '00' #TP-PID
pdu_data += '00' #TP-DCS
'''Convert text to binary format'''
pdu_text_bin = []
for i in text:
dec_s=ord(i)
if dec_s == 95:
dec_s = 17
if dec_s == 94:
dec_s = 1
if dec_s == 64:
dec_s = 0
if dec_s == 36:
dec_s = 2
if dec_s == 123:
dec_s = 40
if dec_s == 125:
dec_s = 41
if dec_s == 124:
dec_s = 64
if dec_s == 126:
dec_s = 61
if dec_s == 92:
dec_s = 47
if dec_s == 91:
dec_s = 60
if dec_s == 93:
dec_s = 62
bin = dectobin(dec_s)
le = len(bin)
while le<7:
bin='0'+bin
le = len(bin)
pdu_text_bin.append(bin)
'''Encode binary to PDU format'''
pdu_text_bin_cp = []
n=0
for i in range(0,len(text)):
if (i>0) & ((i+1)%8==0):
continue
n+=1
if n==8:
n=1
if i==len(text)-1:
cp = pdu_text_bin[0:8-n]
else:
cp = str(pdu_text_bin[i+1][7-n:7] + pdu_text_bin)[0:8]
pdu_text_bin_cp.append(cp)
'''Convert PDU to hex'''
pdu_text=''
for i in pdu_text_bin_cp:
hexi = str(hex(int(i,2)))[2:4].upper()
if len(hexi) == 1:
hexi = '0' + str(hexi)
pdu_text += hexi
'''Calculate text length'''
len_hex = hex(len(text))[2:4].upper()
if len(len_hex) == 1:
len_hex = '0' + str(len_hex)
'''Calculate PDU length'''
pdu_data+=len_hex+pdu_text
pdu_len = str(len(pdu_data)/2-1)
if True:
fd = os.open(dev, os.O_RDWR)
()os.write(fd, "AT+CMGF=0 \015")
time.sleep(1)
os.write(fd, "AT+CMGS=" + pdu_len + "\015")
time.sleep(1)
os.write(fd, pdu_data + "\032")
os.close(fd)
def main(argv):
SendSMS("/dev/ttyACM1",argv[1],argv[2]) #Порт модема может быть другим. В моем случае это ttyACM1.
return 0
if __name__ == '__main__': main(sys.argv)
_____________________________________________________________________
Делает файл SendSMSText.py доступным для исполнения всем пользователям:
chmod +x /home/shift/SendSMSTest.py
_____________________________________________________________________
запуск скрипта в терминале:
./SendSMSTest.py номер_телефона "текст_сообщения"
примечание:
текст нужно вводить только латинскими символами; если в тексте есть пробел, то текст смс нужно вписать в ковычки. выглядит это так: "text sms"
немного пояснения по скрипту:
первая часть PDU-формата состоит из 00 01 00 0а 81.
00 - номер смс-центра берем из памяти сим-карты; 0а - количество символов в номере получателя(dec=10, переводим в hex=0a); 81-национальный формат номера(международный 91).
как работает скрипт:
пусть номер получателя будет в национальном формате и состоит из 10-ти цифр: 0666947621, отправляемое сообщение "1".
тогда в порт модема(/dev/ttyACM1) скрипт посылает следующие команды:
AT+CMGF=0<Enter>
AT+CMGS=13<Enter>
> 0001000A81606649671200000131<Ctrl+Z>
honeybeer - спасибо за пояснение.