金笛后花園

金笛工業(yè)手機官方博客

金笛只為您,一切全為您

mac電腦短信貓使用AT指令發(fā)短信

作者:Felix

? ? ? ? 短信貓,是一種用來收發(fā)短信的設(shè)備,他和我們用的手機一樣,需要手機SIM卡的支持,在需要收發(fā)短信的時候,在短信貓里面插入一張我們平時用的手機卡,插上電源,通過(USB或者串口、網(wǎng)口)數(shù)據(jù)線和電腦相連可以實現(xiàn)短信收發(fā)的功能。因為工作中開發(fā)的項目需要提供給公安部門用,必須部署在內(nèi)網(wǎng)環(huán)境,某種功能需要發(fā)短信,然后想到了短信貓。

如何使用親測有效!

硬件調(diào)試真的很難搞,網(wǎng)上的教程千奇百怪,很多很久遠了,不少坑。這里整理了我實現(xiàn)了的。

這里使用的是wavecom的短信貓,電腦上安裝usb轉(zhuǎn)串口驅(qū)動,然后連接短信貓。

mac系統(tǒng)在終端執(zhí)行l(wèi)s /dev/cu.* 看到有/dev/cu.usbserial,說明已經(jīng)成功連接上了,windows下直接看usb下com口。(連接的時候千萬不要直接拔掉,不然電腦會自動重啟

短信貓主要通過AT指令發(fā)送短信,Text模式和PDU模式。使用Text模式收發(fā)短信代碼簡單,很容易實現(xiàn),最大缺點不支持中文短信。PDU模式不僅能發(fā)送中文短信,也能發(fā)送英文短信。PDU收發(fā)短信有三種編碼可用:7-bit、8-bit和UCS2編碼。7-bit編碼用于發(fā)送普通的ASCII字符,即英文短信,最多可發(fā)送160字符。8- bit編碼通常用于發(fā)送數(shù)據(jù)消息。UCS2編碼用于發(fā)送Unicode字符,可發(fā)送中文字符,最多發(fā)送70字符,缺點是比較復(fù)雜。

 

使用串口調(diào)試工具可以簡單地測試一下,例子如下:

1.Text模式(向號碼為15050850677的手機發(fā)送“TEST”):

1
2
3
4
5
?AT????????????????????????//發(fā)送AT?返回OK?連接成功
?OK
?AT+CMGF=1?????????????????//設(shè)置為Text模式
?AT+CMGS="15050850677"?????//發(fā)送指令,雙引號內(nèi)改為對用手機號碼
?>?TEST(+^z,十六進制的1A)????//返回字符串中有OK?發(fā)送成功?>號為設(shè)備返回字符

 

2.PDU模式(向號碼為15050850677的手機發(fā)送“你好”):

1
2
3
4
5
?AT????????????????????????//發(fā)送AT?返回OK?連接成功
?OK
?AT+CMGF=0?????????????????//設(shè)置為PDU模式
?AT+CMGS=19????????????????//發(fā)送指令,更改為對應(yīng)PDU編碼的長度計算方法在后面
?>?0011000D91685150800576F70008C4044F60597D(+^z,十六進制的1A)???//返回字符串中有OK?發(fā)送成功

 

? ? ? ? 這里著重介紹下PDU的發(fā)送方式,一般的PDU編碼由A B C D E F G H I J K L M十三項組成。
1
2
3
4
5
6
7
8
9
10
11
12
13
A:短信息中心地址長度,2位十六進制數(shù)(1字節(jié))。
B:短信息中心號碼類型,2位十六進制數(shù)。
C:短信息中心號碼,B+C的長度將由A中的數(shù)據(jù)決定。
D:文件頭字節(jié),2位十六進制數(shù)。?
E:信息類型,2位十六進制數(shù)。
F:被叫號碼長度,2位十六進制數(shù)。
G:被叫號碼類型,2位十六進制數(shù),取值同B。
H:被叫號碼,長度由F中的數(shù)據(jù)決定。
I:協(xié)議標(biāo)識,2位十六進制數(shù)。
J:數(shù)據(jù)編碼方案,2位十六進制數(shù)。
K:信息有效期,2位十六進制數(shù)。
L:用戶數(shù)據(jù)長度,2位十六進制數(shù)。
M:用戶數(shù)據(jù),其長度由L中的數(shù)據(jù)決定。J中設(shè)定采用UCS2編碼,這里是中英文的Unicode字符。

? ? ?用一個例子說明整個過程~
? ? ? ? 短信中心:+8613800100500(可以查詢各個SIM卡得短信中心,填寫錯誤是發(fā)送不出去的)
收信號碼:+8613401041516
短信內(nèi)容:我愛聽評書

? ? ?第一步——格式化短信中心號碼
? ? ?1 – 要去掉“+”號,然后看看長度要是奇數(shù)的話就在末尾追加一個“F”。

+8613800200500 >>>> 8613800100500F
? ? ?2 – 將奇數(shù)位和偶數(shù)位交換位置。
? ? ? ? ? 8613800100500F >>>> 683108100005F0
? ? ?3 – 在前面加上“91”,是國際化的意思。
683108100005F0 >>>> 91683108100005F0
? ? ?4 – 最后算一算它有多長了,把長度除于2,再把結(jié)果轉(zhuǎn)換為2位的16進制數(shù),加在最前面。
? ? ? ? ? 91683108100005F0長16 16/2=8 8的16進制“08” 一定要注意是2位
91683108100005F0 >>>> 0891683108100005F0
短信中心號碼就處理完了,下幾一步有類似的算法。

? ? ?第二步——格式化收信號碼
? ? ?1 – 要去掉“+”號,然后看看長度要是奇數(shù)的話就在末尾追加一個“F”。

+8613401041516 >>>> 8613401041516F
? ? ?2 – 將奇數(shù)位和偶數(shù)位交換位置。
? ? ? ? ? ?8613401041516F >>>> 683104011415F6

? ? ?第三步——格式化發(fā)送內(nèi)容
? ? ?1 – 把字符串轉(zhuǎn)換為Unicode格式。(轉(zhuǎn)換函數(shù)我寫過了,直接拿去用好了)
我愛聽評書 >>>> 62117231542C8BC44E66
? ? ?2 – 把串Unicode碼的長度除于2,再把結(jié)果轉(zhuǎn)換為2位的16進制數(shù),加在最前面。
62117231542C8BC44E66長20 20/2=10 10的16進制“0A”
62117231542C8BC44E66 >>>> 0A62117231542C8BC44E66

? ? ?先看看我們都準(zhǔn)備什么了,再繼續(xù)~
格式化后的短信中心:0891683108100005F0
格式化后的收信號碼:683104011415F6
格式化后的發(fā)送內(nèi)容:0A62117231542C8BC44E66

? ? ?第四步——組合處理
? ? ?1 – 算一下收信號碼的長度,不包括“+”號。這個收信號碼指的是+8613401041516,而不是683104011415F6。
? ? ? ? ? +8613401041516 >>>> 8613401041516 長度為“OD”(2位16進制數(shù)表示)
? ? ?2 – 在長度前后分別加“1100”。
? ? ? ? ? OD >>>> 1100OD
? ? ?3 – 如果收信號碼是手機的話就在后面追加“91”,如果是小靈通的話就要追加“81”。
+8613401041516是手機號碼所以加“91”
? ? ? ? ? 11000D >>>> 11000D91
? ? ?4 – 11000D91 + 格式化后的收信號碼 + “000800” + 格式化后的發(fā)送內(nèi)容
11000D91 >>>> 11000D91683104011415F60008000A62117231542C8BC44E66
? ? ?5 – 計算上面那一大字符串的長度除于2,10進制表示。
? ? ? ? ? 11000D91683104011415F6008000A62117231542C8BC44E66長50 50/2=25

? ? ?嗯,咱再看看手里都有啥了~
格式化后的短信中心:0891683108100005F0
實際的發(fā)送內(nèi)容:11000D91683104011415F60008000A62117231542C8BC44E66
發(fā)送內(nèi)容的長度:25
都準(zhǔn)備好了我們可以發(fā)短信啦
? ? ?最后一步——通過AT命令發(fā)送PDU短信
AT+CMGF=0 <Enter> (告訴它你要發(fā)的是PDU類的短信)
OK (這是它返回的它說:“我已經(jīng)準(zhǔn)備好了”)
AT+CMGS=25 <Enter> (告訴它你要發(fā)的實際長度)
>0891683108100005F011000D91683104011415F60008000A62117231542C8BC44E66 <Ctrl+Z> (看到它返回“>” 在后面輸入格式化的短信中心+實際的發(fā)送內(nèi)容最后按Ctrl+Z發(fā)送)
如果最后返回不是“ERROR”,那就是發(fā)送成功咯~!

? ? ??簡化:

現(xiàn)在的SIM卡貌似內(nèi)置了缺省短信中心號碼,經(jīng)過試驗,在上述第四步的第五點算出發(fā)送內(nèi)容和長度后,在開頭加上’00′意為取sim內(nèi)置短信中心也可以發(fā)送成功。也就是說實際發(fā)送內(nèi)容為0011000D91683104011415F60008000A62117231542C8BC44E66,長度計算不變,還是25。

python操作串口可以使用pyserial庫,附上簡略代碼:

 

1
2
3
4
5
6
7
8
9
10
import?serial
???????
sa?=?serial.Serial(port="/dev/cu.usbserial",?baudrate=9600,?timeout=3)
sa.write("ATZ\r")
sa.write("AT+CMGF=1\r")
sa.write("AT+CMGS="18888888888\r")
sa.write("helloworld")
sa.write(chr(26))
print?sa.readlines()
sa.close()

原創(chuàng)文章如轉(zhuǎn)載,請注明出處

?

2018/07/10 0 / /
標(biāo)簽:  暫無標(biāo)簽

4 + 4 =

回到頂部
滦南县| 拉孜县| 屏南县| 平远县| 临沭县| 深水埗区| 建水县| 黄陵县| 金坛市| 苍溪县| 休宁县| 文成县| 南靖县| 丹阳市| 德惠市| 清徐县| 苗栗县| 德昌县| 廉江市| 睢宁县| 阿瓦提县| 旬邑县| 剑阁县| 柳林县| 龙州县| 红桥区| 卫辉市| 陕西省| 焦作市| 康马县| 藁城市| 呼和浩特市| 巴南区| 沧州市| 胶南市| 成都市| 南雄市| 四川省| 应城市| 胶南市| 东丰县|