溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何使用AT命令操作SIM卡進(jìn)行短信發(fā)送

發(fā)布時間:2021-11-11 17:42:02 來源:億速云 閱讀:912 作者:柒染 欄目:互聯(lián)網(wǎng)科技

如何使用AT命令操作SIM卡進(jìn)行短信發(fā)送,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。

        最近投身于某電子公司的用電信息采集終端軟件重寫,主要負(fù)責(zé)終端與主臺的通訊功能編寫。本周用到了AT命令操作SIM卡進(jìn)行發(fā)送短信功能,在此做一個小小的總結(jié),希望對有類似需求的童鞋能有所幫助。

        注:由于有C語言源碼,再加上鄙人對硬件實在是知之甚少,所以很多操作步驟都是按照原有邏輯進(jìn)行重寫(尤其是短信模塊的初始化),若有錯誤,請各位酌情添加、刪除或修改。

1、 硬件的初始化

在現(xiàn)有代碼邏輯中按如下步驟進(jìn)行硬件初始化:打開串口→重啟SIM硬件模塊→發(fā)送AT命令檢查SIM卡運行狀態(tài)。

a)      打開串口

串口操作已經(jīng)有很成熟的代碼,這里就不贅述了。

b)      重啟SIM硬件模塊

使用的魔法數(shù)字定義:

static const unsigned char RESET_CTL = 0;

static const unsigned char POWER_CTL = 1;

static const unsigned char IGT_CTL = 2;

重啟步驟

硬件操作

turnOffModel()

int fd = open( "/dev/gprs_io", O_RDWR | O_NONBLOCK )

 

ioctl( fd, 0, POWER_CTL)

 

sleep(3)

 

::close(fd)

startModel()

int fd = open( "/dev/gprs_io", O_RDWR | O_NONBLOCK )

 

ioctl(fd, 0, IGT_CTL)

 

ioctl(fd, 1, POWER_CTL)

 

ioctl(fd, 1, RESET_CTL)

 

usleep(500000)

 

ioctl(fd, 0, RESET_CTL)

 

usleep(500000)

 

ioctl(fd, 1, RESET_CTL)

 

sleep(2)

 

ioctl(fd, 1, IGT_CTL)

 

sleep(3)

 

ioctl(fd, 0, IGT_CTL)

 

::close(fd)

 

sleep(5)

c)       發(fā)送AT命令檢查SIM卡運行狀態(tài)

操作步驟

發(fā)送的AT命令(C++轉(zhuǎn)意格式)

模塊正常時回復(fù)的結(jié)果

結(jié)果含義

檢測模塊是否正常

“AT\n”

AT

OK

OK表示模塊正常

ERROR表示模塊異常

查詢移動終端國際移動臺標(biāo)號

“AT+CIMI\n”

AT+CIMI

460000973136668

第二行數(shù)字為移動終端國際移動臺標(biāo)號。

此處用于系統(tǒng)進(jìn)行操作記錄,可忽略結(jié)果。

檢測SIM是否已注冊到網(wǎng)絡(luò)

“AT+CREG?\n”

AT+CREG?

+CREG: 0,2

 

OK

<0,2><0,5><1,2><1,5>均認(rèn)為結(jié)果正確。

+CREG: mode,state

mode:

0 : 禁止網(wǎng)絡(luò)注冊主動提供結(jié)果代碼(默認(rèn)設(shè)置)

1:允許網(wǎng)絡(luò)注冊主動提供結(jié)果代碼,格式:

state:

0:未注冊,并且模塊當(dāng)前不搜尋新的運營商

1:已注冊本地網(wǎng)絡(luò)

2:未注冊,終端正在搜尋基站

4:注冊被拒絕

5:已注冊,并且處于漫游狀態(tài)

查看信號值

“AT+CSQ\n”

AT+CSQ

+CSQ: 13,5

 

OK

第一個數(shù)字(即接收信號強(qiáng)度)大于6即認(rèn)為可用。

+CSQ:<RSSI>,<FER>

<RSSI>:

有效值0-31。值越大表明信號越好,16以下,呼叫有可能失敗。

模塊信號強(qiáng)度范圍在-75到-125DB,換算到有效值公式為

31×(125-|DB|)/50

<FER>:

信道誤幀率。

設(shè)置短信格式

“AT+CMGF=0\n”

AT+CMGF=0

OK

0:PDU模式。

1:文本模式。

2、 接收短信

操作步驟如下:

操作步驟

發(fā)送的AT命令(C++轉(zhuǎn)意格式)

模塊正常時回復(fù)的結(jié)果

結(jié)果含義

獲取短信數(shù)量

"AT+CPMS=\"SM\",\"SM\",\"SM\"\r"

+CPMS: 4,50,4,50,4,50

 

OK

此處取前兩位數(shù)字:

4表示當(dāng)前存儲的短信數(shù)量;

50表示SIM卡可存儲的短信總量。

獲取短信1信息

“AT+CMGR=1\r"

+CMGR: 1,,38

0891683108200845F7240D91683121436587F9

0000617072917253231

474747A0E4ACF416110BD3CA783C66F72D905

錯誤時會返回:

AT+CMGR=1

+CMS ERROR:<err>

刪除短信

“AT+CMGD=1\r”

OK

錯誤時返回

AT+CMGD=1

+CMGD ERROR:<err>

短信PDU碼流解析:

0891683108200845F7240D91683121436587F90000617072917253231474747A0E4ACF416110BD3CA783C66F72D905

08

短信中心號碼(含類型碼)所占字節(jié)數(shù)

08表示之后8個字節(jié)(即16個十六進(jìn)制數(shù))為短信中心號碼(含類型碼)

91

短信中心號碼類型

91表示國際碼

A1表示國內(nèi)碼

68 31 08 20 08 45 F7

短信中心號碼

使用的是BCD編碼,該例中短信中心號碼為“8613800280547”。即所有字節(jié)高低位交換。F為填充碼。

24

基本參數(shù)(TP-MTI/MMS/RP)

含義未知

0D

發(fā)送方電話號碼長度(個數(shù),非字節(jié)數(shù),不含類型碼)

本例中為13個數(shù)字

91

發(fā)送方電話號碼類型

91表示國際碼

A1表示國內(nèi)碼

68 31 21 43 65 87 F9

發(fā)送方電話號碼

本例發(fā)送方電話號碼為“8613123456789”(請原諒我為了保護(hù)隱私,修改了這段碼流)

00

參數(shù)顯示SMSC以何種方式處理SM (比如FAX,、Voice等)

00表示是普通GSM類型,點到點方式

00

用戶數(shù)據(jù)(UD)編碼方案

00為7-bit編碼,08為UCS2編碼

61 70 72 91 72 53 23

BCD編碼,時間戳

本例為 16年7月27日19:27:35 +8時區(qū)

14

短信的實際長度。

本例為20個字節(jié)。

74 74 7A 0E 4A CF 41 61 10 BD 3C A7 83 C6 6F 72 D9 05

用戶數(shù)據(jù)”this is a test code.”的7-bit編碼。

用戶數(shù)據(jù)所占字節(jié)數(shù)因“編碼方案”不同而不同。

用戶數(shù)據(jù)的實際字節(jié)數(shù)(1個字節(jié)為2個16進(jìn)制數(shù))計算方式:

7-bit編碼: 短信實際長度*7/8,若有余數(shù)則加1.

UCS2編碼: 短信實際長度.

其他方式(不推薦,僅用于保證程序的健壯性):短信實際長度和”/r/n”之間的數(shù)據(jù)。

3、 發(fā)送短信

操作步驟如下;

操作步驟

發(fā)送的AT命令(C++轉(zhuǎn)意格式)

模塊正常時回復(fù)的結(jié)果

結(jié)果含義

發(fā)送短信

“AT+CMGS=33\r"

等待輸入短信PDU編碼

"0891683108100005F011000D91683121436587F90000AA

1474747A0E4ACF416110BD3CA783C66F72D905"+0xA1

OK

發(fā)送成功。

失敗返回:

+CMS ERROR: :<err>

0xa1為<Ctrl-Z>的符號碼,表示PDU碼流發(fā)送結(jié)束。


“AT+CMGS=33\r"中33表示發(fā)送的PDU編碼中除去短信中心號碼(”0891683108100005F0”)外的其他信息字節(jié)數(shù)(不含0xA1)。本例中為碼流” 11000D91683121436587F90000AA1474747A0E4ACF416110BD3CA783C66F72D905”的長度除以2.

短信PDU碼流解析:

0891683108100005F011000D91683121436587F90000AA1474747A0E4ACF416110BD3CA783C66F72D905

08

短信中心號碼(含類型碼)所占字節(jié)數(shù)

08表示之后8個字節(jié)(即16個十六進(jìn)制數(shù))為短信中心號碼(含類型碼)

91

短信中心號碼類型

91表示國際碼

A1表示國內(nèi)碼

68 31 08 10 00 05 F0

短信中心號碼

使用的是BCD編碼,該例中短信中心號碼為“8613800100500”。即所有字節(jié)高低位交換。F為填充碼。

11

pdu類型

11:160個英文字符/70個漢字以內(nèi)的短信,無短信報告

31:160個英文字符/70個漢字以內(nèi)的短信,有短信報告

51:長短信(多條合并),無短信報告

71:長短信(多條合并),有短信報告

00

消息基準(zhǔn)值(TP-MR)

 

0D

發(fā)送方電話號碼長度(個數(shù),非字節(jié)數(shù),不含類型碼)

本例中為13個數(shù)字

91

發(fā)送方電話號碼類型

91表示國際碼

A1表示國內(nèi)碼

68 31 21 43 65 87 F9

發(fā)送方電話號碼

本例發(fā)送方電話號碼為“8613123456789”(請原諒我為了保護(hù)隱私,修改了這段碼流)

00

參數(shù)顯示SMSC以何種方式處理SM (比如FAX,、Voice等)

00表示是普通GSM類型,點到點方式

00

用戶數(shù)據(jù)(UD)編碼方案

00為7-bit編碼,08為UCS2編碼

注;與短信實際長度、用戶數(shù)據(jù)要相對應(yīng),否則會返回531錯誤。

AA

短信有效期(TP-VP)

00 表示5分鐘

AA表示最長

其他未知

14

短信的實際長度。

20個字節(jié)。與編碼方案、用戶數(shù)據(jù)相對應(yīng)。

74 74 7A 0E 4A CF 41 61 10 BD 3C A7 83 C6 6F 72 D9 05

用戶數(shù)據(jù)”this is a test code.”的7-bit編碼。

用戶數(shù)據(jù)所占字節(jié)數(shù)因“編碼方案”不同而不同。

4、 關(guān)閉模塊

turnOffModel()、關(guān)閉串口。

看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注億速云行業(yè)資訊頻道,感謝您對億速云的支持。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

at
AI