如何使用AT命令操作SIM卡進行短信發(fā)送,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。
創(chuàng)新互聯(lián)長期為近千家客戶提供的網(wǎng)站建設(shè)服務(wù),團隊從業(yè)經(jīng)驗10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為天寧企業(yè)提供專業(yè)的成都網(wǎng)站建設(shè)、成都網(wǎng)站制作,天寧網(wǎng)站改版等技術(shù)服務(wù)。擁有10多年豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。
最近投身于某電子公司的用電信息采集終端軟件重寫,主要負(fù)責(zé)終端與主臺的通訊功能編寫。本周用到了AT命令操作SIM卡進行發(fā)送短信功能,在此做一個小小的總結(jié),希望對有類似需求的童鞋能有所幫助。
注:由于有C語言源碼,再加上鄙人對硬件實在是知之甚少,所以很多操作步驟都是按照原有邏輯進行重寫(尤其是短信模塊的初始化),若有錯誤,請各位酌情添加、刪除或修改。
1、 硬件的初始化
在現(xià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)進行操作記錄,可忽略結(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ù)字(即接收信號強度)大于6即認(rèn)為可用。 +CSQ: 有效值0-31。值越大表明信號越好,16以下,呼叫有可能失敗。 模塊信號強度范圍在-75到-125DB,換算到有效值公式為 31×(125-|DB|)/50 信道誤幀率。 |
設(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: |
刪除短信 | “AT+CMGD=1\r” | OK | 錯誤時返回 AT+CMGD=1 +CMGD ERROR: |
短信PDU碼流解析:
0891683108200845F7240D91683121436587F90000617072917253231474747A0E4ACF416110BD3CA783C66F72D905
08 | 短信中心號碼(含類型碼)所占字節(jié)數(shù) | 08表示之后8個字節(jié)(即16個十六進制數(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”(請原諒我為了保護隱私,修改了這段碼流) |
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進制數(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: : 0xa1為 |
“AT+CMGS=33\r"中33表示發(fā)送的PDU編碼中除去短信中心號碼(”0891683108100005F0”)外的其他信息字節(jié)數(shù)(不含0xA1)。本例中為碼流” 11000D91683121436587F90000AA1474747A0E4ACF416110BD3CA783C66F72D905”的長度除以2.
短信PDU碼流解析:
0891683108100005F011000D91683121436587F90000AA1474747A0E4ACF416110BD3CA783C66F72D905
08 | 短信中心號碼(含類型碼)所占字節(jié)數(shù) | 08表示之后8個字節(jié)(即16個十六進制數(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”(請原諒我為了保護隱私,修改了這段碼流) |
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)知識有進一步的了解或閱讀更多相關(guān)文章,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對創(chuàng)新互聯(lián)的支持。