您好,登錄后才能下訂單哦!
如何使用AT命令操作SIM卡進行短信發送,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
最近投身于某電子公司的用電信息采集終端軟件重寫,主要負責終端與主臺的通訊功能編寫。本周用到了AT命令操作SIM卡進行發送短信功能,在此做一個小小的總結,希望對有類似需求的童鞋能有所幫助。
注:由于有C語言源碼,再加上鄙人對硬件實在是知之甚少,所以很多操作步驟都是按照原有邏輯進行重寫(尤其是短信模塊的初始化),若有錯誤,請各位酌情添加、刪除或修改。
1、 硬件的初始化
在現有代碼邏輯中按如下步驟進行硬件初始化:打開串口→重啟SIM硬件模塊→發送AT命令檢查SIM卡運行狀態。
a) 打開串口
串口操作已經有很成熟的代碼,這里就不贅述了。
b) 重啟SIM硬件模塊
使用的魔法數字定義:
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) 發送AT命令檢查SIM卡運行狀態
操作步驟 | 發送的AT命令(C++轉意格式) | 模塊正常時回復的結果 | 結果含義 |
檢測模塊是否正常 | “AT\n” | AT OK | OK表示模塊正常 ERROR表示模塊異常 |
查詢移動終端國際移動臺標號 | “AT+CIMI\n” | AT+CIMI 460000973136668 | 第二行數字為移動終端國際移動臺標號。 此處用于系統進行操作記錄,可忽略結果。 |
檢測SIM是否已注冊到網絡 | “AT+CREG?\n” | AT+CREG? +CREG: 0,2
OK | <0,2><0,5><1,2><1,5>均認為結果正確。 +CREG: mode,state mode: 0 : 禁止網絡注冊主動提供結果代碼(默認設置) 1:允許網絡注冊主動提供結果代碼,格式: state: 0:未注冊,并且模塊當前不搜尋新的運營商 1:已注冊本地網絡 2:未注冊,終端正在搜尋基站 4:注冊被拒絕 5:已注冊,并且處于漫游狀態 |
查看信號值 | “AT+CSQ\n” | AT+CSQ +CSQ: 13,5
OK | 第一個數字(即接收信號強度)大于6即認為可用。 +CSQ:<RSSI>,<FER> <RSSI>: 有效值0-31。值越大表明信號越好,16以下,呼叫有可能失敗。 模塊信號強度范圍在-75到-125DB,換算到有效值公式為 31×(125-|DB|)/50 <FER>: 信道誤幀率。 |
設置短信格式 | “AT+CMGF=0\n” | AT+CMGF=0 OK | 0:PDU模式。 1:文本模式。 |
2、 接收短信
操作步驟如下:
操作步驟 | 發送的AT命令(C++轉意格式) | 模塊正常時回復的結果 | 結果含義 |
獲取短信數量 | "AT+CPMS=\"SM\",\"SM\",\"SM\"\r" | +CPMS: 4,50,4,50,4,50
OK | 此處取前兩位數字: 4表示當前存儲的短信數量; 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 | 短信中心號碼(含類型碼)所占字節數 | 08表示之后8個字節(即16個十六進制數)為短信中心號碼(含類型碼) |
91 | 短信中心號碼類型 | 91表示國際碼 A1表示國內碼 |
68 31 08 20 08 45 F7 | 短信中心號碼 | 使用的是BCD編碼,該例中短信中心號碼為“8613800280547”。即所有字節高低位交換。F為填充碼。 |
24 | 基本參數(TP-MTI/MMS/RP) | 含義未知 |
0D | 發送方電話號碼長度(個數,非字節數,不含類型碼) | 本例中為13個數字 |
91 | 發送方電話號碼類型 | 91表示國際碼 A1表示國內碼 |
68 31 21 43 65 87 F9 | 發送方電話號碼 | 本例發送方電話號碼為“8613123456789”(請原諒我為了保護隱私,修改了這段碼流) |
00 | 參數顯示SMSC以何種方式處理SM (比如FAX,、Voice等) | 00表示是普通GSM類型,點到點方式 |
00 | 用戶數據(UD)編碼方案 | 00為7-bit編碼,08為UCS2編碼 |
61 70 72 91 72 53 23 | BCD編碼,時間戳 | 本例為 16年7月27日19:27:35 +8時區 |
14 | 短信的實際長度。 | 本例為20個字節。 |
74 74 7A 0E 4A CF 41 61 10 BD 3C A7 83 C6 6F 72 D9 05 | 用戶數據”this is a test code.”的7-bit編碼。 | 用戶數據所占字節數因“編碼方案”不同而不同。 |
用戶數據的實際字節數(1個字節為2個16進制數)計算方式:
7-bit編碼: 短信實際長度*7/8,若有余數則加1.
UCS2編碼: 短信實際長度.
其他方式(不推薦,僅用于保證程序的健壯性):短信實際長度和”/r/n”之間的數據。
3、 發送短信
操作步驟如下;
操作步驟 | 發送的AT命令(C++轉意格式) | 模塊正常時回復的結果 | 結果含義 |
發送短信 | “AT+CMGS=33\r" | > | 等待輸入短信PDU編碼 |
"0891683108100005F011000D91683121436587F90000AA 1474747A0E4ACF416110BD3CA783C66F72D905"+0xA1 | OK | 發送成功。 失敗返回: +CMS ERROR: :<err> 0xa1為<Ctrl-Z>的符號碼,表示PDU碼流發送結束。 |
“AT+CMGS=33\r"中33表示發送的PDU編碼中除去短信中心號碼(”0891683108100005F0”)外的其他信息字節數(不含0xA1)。本例中為碼流” 11000D91683121436587F90000AA1474747A0E4ACF416110BD3CA783C66F72D905”的長度除以2.
短信PDU碼流解析:
0891683108100005F011000D91683121436587F90000AA1474747A0E4ACF416110BD3CA783C66F72D905
08 | 短信中心號碼(含類型碼)所占字節數 | 08表示之后8個字節(即16個十六進制數)為短信中心號碼(含類型碼) |
91 | 短信中心號碼類型 | 91表示國際碼 A1表示國內碼 |
68 31 08 10 00 05 F0 | 短信中心號碼 | 使用的是BCD編碼,該例中短信中心號碼為“8613800100500”。即所有字節高低位交換。F為填充碼。 |
11 | pdu類型 | 11:160個英文字符/70個漢字以內的短信,無短信報告 31:160個英文字符/70個漢字以內的短信,有短信報告 51:長短信(多條合并),無短信報告 71:長短信(多條合并),有短信報告 |
00 | 消息基準值(TP-MR) |
|
0D | 發送方電話號碼長度(個數,非字節數,不含類型碼) | 本例中為13個數字 |
91 | 發送方電話號碼類型 | 91表示國際碼 A1表示國內碼 |
68 31 21 43 65 87 F9 | 發送方電話號碼 | 本例發送方電話號碼為“8613123456789”(請原諒我為了保護隱私,修改了這段碼流) |
00 | 參數顯示SMSC以何種方式處理SM (比如FAX,、Voice等) | 00表示是普通GSM類型,點到點方式 |
00 | 用戶數據(UD)編碼方案 | 00為7-bit編碼,08為UCS2編碼 注;與短信實際長度、用戶數據要相對應,否則會返回531錯誤。 |
AA | 短信有效期(TP-VP) | 00 表示5分鐘 AA表示最長 其他未知 |
14 | 短信的實際長度。 | 20個字節。與編碼方案、用戶數據相對應。 |
74 74 7A 0E 4A CF 41 61 10 BD 3C A7 83 C6 6F 72 D9 05 | 用戶數據”this is a test code.”的7-bit編碼。 | 用戶數據所占字節數因“編碼方案”不同而不同。 |
4、 關閉模塊
turnOffModel()、關閉串口。
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。