python呼叫AT指令操作簡訊貓

2021-07-25 00:19:55 字數 1515 閱讀 9464

簡訊貓是一種可以通過串列埠通訊來操作傳送簡訊的裝置, 在python中, 要想通過com通訊, 需要使用serial包。

通過使用serial向簡訊貓傳送at指令的方式來操作簡訊貓,網上有不少python來操作簡訊貓的例子,能找到的主要有兩種**:

1, 使用控制項傳送簡訊, **一般看起來是這樣的

#! /usr/bin/env python

#coding=gbk

import sys

import win32com.client

ocxname='shouyan_smsgate61.smsgate'

axocx=win32com.client.dispatch(ocxname)

axocx.commport=8#設定com埠號

axocx.smsservice='+8613800100500'#設定簡訊服務號碼

axocx.settings='9600,n,8,1'#設定com埠速度

axocx.sn='loyin'

c=axocx.connect(1)#連線簡訊貓或手機

print '連線情況',axocx.link()

axocx.sendsms('python確實是很好的','15101021000',0)#傳送簡訊

這裡使用了win32com來呼叫控制項,直接看這段**基本上一點用沒有, 因為這個控制項不知道從哪弄

2. 第二種是使用at指令pdu模式傳送, 過程比較複雜, 需要經過多次編碼

首先是傳送簡訊的手機號和接受的手機號, 前面加86, 最後一位補乙個f, 然後奇偶位互換,隨後在兩個號碼之間增加一些固定的間隔符,最後加上要傳送的資訊和結束標誌,這些拼成乙個字串, 然後使用at+cmgs傳送,試了很多次都不成功,網上的**多半不靠譜啊。

其實用text模式傳送過程很簡單, 互動環境下幾行**搞定:

>>>import serial

>>>ser = serial.serial(port='com1', baudrate=9600)

>>>ser.write("at+cmgf=1\r")

>>>ser.write("at+cmgs=18600000000\r")

>>>ser.write("1234" + "\x1a")

注:這裡是傳送驗證碼,所以選擇文字傳送,但是如果需要傳送中文還是需要pdu模式, 那麼用pdu怎麼傳送呢,首先要生成乙個手機號+簡訊的字串

1, 手機號 加86, 尾部加f, 然後奇偶換位   dis_phone

2,簡訊 轉unicode 字元, 長度 /2 ->msg, msg_len (最後一步字串中的msg_len需要轉為16進製制字串)

3,傳送at+cmgf=0 , 切換到pdu模式

4,傳送at+cmgs=15+  len

5,生成msg字串資訊並傳送    '0011000d91000801\x1a'.format(phone=dis_phone, msg_len=msg_len, msg=msg)

長呼叫與短呼叫 呼叫門

cs裡的是乙個段選擇子 1 拆分段選擇子,查gdt表 2 該段描述符為系統描述符,s位為0,type為1100,是乙個門描述符 dpl必須為3,不然該描述符的許可權檢查過不去 3 該描述符的16到31位為另外乙個段描述符的選擇子 決定是否提權 另外乙個段描述符 必須是 段 dpl決定是否提權 長呼叫...

python實用操作指令

os.path.splitext 分隔路徑中的檔案資訊以及字尾名 os.path.split 分離路徑資訊和檔名資訊 os.path.dirname用於分割路徑中 之前的資料夾目錄 os.path.basename 只保留檔名稱,除去之前的路徑資訊 os.path.abspath 獲取檔案的絕對路徑...

python的短邏輯

python中的與 and 和或 or 都是短路的與或,短路指的是當通過第乙個值能判斷出結果時,就不再去檢視第二個值了。python支援布林型別的資料,布林型別只有true和false兩種值,但是布林型別有以下幾種運算 與 and 運算 對於與運算,由於要求兩個都為true結果才為true,所以如果...