SMS通知の送信の実装

かなり大きなサーバー/スイッチ/モデム、およびオフィス内の他のアクティブな機器を考慮して、zabbix監視システムがインストールされ、長期間にわたって正常に使用されました。 Zabbixには、問題の通知を送信する素晴らしい機能があります。

これを行うために、電子メールオペレーターの電子メールからSMSへのゲートウェイを介してSMSメッセージを送信するスクリプトが作成されました.1日に1つのアドレスからのSMSメッセージの数の制限は、発信アドレスをローテーションすることによってバイパスされました約10〜15分遅れて到着しましたが、あまり快適ではありませんでした。

そのため、当社のGSMターミナルを介して通知を送信し、サプライヤの価格表を調べてみると、価格と特性に適したGSMモデムが見つからないことが決定されました。

そして、私は古いシーメンスCX65が家に横たわっていたことを思い出し、電話を接続してドックを喫煙してsmsメッセージを送信した後、私はあまり満足していない結論に至りました1はエラーを返します。

これらのデバイスでのメッセージの送信は、PDUモードでのみ可能です。スポーツへの関心と脳を伸ばすために、このシステムを実装することが決定されました。メッセージ形式をPDUに変換して電話で送信するスクリプトが作成されました。



メッセージングシステムのマニュアルは、次の場所にあります: dreamfabric.com/sms

結果のスクリプト自体:

 #!/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' pdu_data += '11' #SMS-SUBMIT pdu_data += '00' #TP-Message-Reference pdu_data += '0B' #Address-Length pdu_data += '91' #Address-Length '''Convert telephone number''' number += 'F' pdu_number = '' for i in range(0,len(number)): if i%2==0: continue pdu_number += number[i] + number[i-1] pdu_data += pdu_number pdu_data += '00' #TP-Protocol identifier pdu_data += '00' #TP-Data coding scheme pdu_data += 'AA' #TP-Validity-Period '''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[i][0:8-n] else: cp = str(pdu_text_bin[i+1][7-n:7] + pdu_text_bin[i])[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/ttyUSB0",argv[1],argv[2] + '\r\n' + argv[3]) return 0 if __name__ == '__main__': main(sys.argv)
      
      





私は正しいコードのふりをしていない、私は頻繁にPythonプログラミングをしていませんので、スクリプトの最適化を受け入れる準備ができています。



電話は、Prolific pl2303チップをベースにしたUSBシリアルアダプターであるデータケーブルを使用して接続されます。このチップはLinuxで安定して動作し、電話とコンピューターのバンドルの動作に関する苦情はありません。

スクリプトが正しく機能するためには、作業を開始する前に必要なcomポートパラメーターを設定する必要があります。

これを行うために、次の行が/etc/udev/rules.d/50-udev.rulesに追加されました。

KERNEL=="ttyUSB[0-9]", RUN+="/bin/stty -F /dev/%k speed 9600 -brkint -icrnl ixoff -imaxbel -opost -onlcr -isig -icanon -echo -echoe"





これで、ケーブルを接続するたびに、com-portのパラメーターが自動的に設定され、アプリケーションを手動で起動する必要がなくなりました。

さらに、zabbixでは、難しい設定ではなく、通知送信システムの準備が整っています。GSM端末の予算オプションは、email-to-smsサービスよりもはるかにうまく機能します。さらに、インターネットがドロップした後、チャネルがインターネットに落ちたという通知を送信できません。実装されました。



おそらく、この資料は誰かに役立つでしょう。古い携帯電話はおそらくすべての家に横たわっているので、8,000ルーブル以上のコストでgsmモデムを買いたくありません。



All Articles