一、英文短信 發:AT 收:OK 發:AT+CMGF=1 收:OK 發:AT+CMGS=13911139197 收:> 發:data→ //test 為發送內容,→為發送符(ctrl+z,十六進制0x1A) 收:+CMGS: 54 OK 二、中文PDU短信 本文以一個實例來解說AT指令發送PDU短信的全過程,假如我要發送下面的短信: 接收號碼:+8613902433649 短信內容:工作愉快! 短信中心號碼:+8613800100500 1、短信中心號碼處理:用字符串 addr 表示 a、將短信息中心號碼去掉+號,看看長度是否為偶數,如果不是,最后添加F 即 addr = "+8613800100500" => addr = "8613800100500F" b、將奇數位和偶數位交換。 => addr = "683108100005F0" c、將短信息中心號碼前面加上字符91,91是國際化的意思 => addr = "91683108100005F0" d、算出 addr 長度,結果除2,格式化成2位的16進制字符串,16 / 2 = 8 => "08" => addr = "0891683108100005F0" 2、手機號碼處理:用字符串 phone a、將手機號碼去掉+號,看看長度是否為偶數,如果不是,最后添加F 即 phone = "+8613902433649" => phone = "8613902433649F" b、將手機號碼奇數位和偶數位交換。 => phone = "683109423346F9" 3、短信息部分處理:用字符串 msg 表示 a、轉字符串轉換為Unicode代碼,例如“工作愉快!”的unicode代碼為 5DE54F5C61095FEBFF01,(轉換在linux里可用iconv函數實現。) b、將 msg 長度除2,保留兩位16進制數,即 5DE54F5C61095FEBFF01 = 20 / 2 => "0A",再加上 msg => msg = "0A5DE54F5C61095FEBFF01" 4、組合 a、手機號碼前加上字符串 11000D91(1100:固定,0D:手機號碼的長度,不算+號,十六進制表示,91:發送到手機為91,發送到小靈通為81) 即 phone = "11000D91" + phone => 11000D91683109423346F9 b、手機號碼后加上 000800 和剛才的短信息內容,000800也寫死就可以了 即 phone = phone + "000800" + msg 即 11000D91683109423346F9 + 000800 + 0A5DE54F5C61095FEBFF01 => phone = 11000D91683109423346F90008000A5DE54F5C61095FEBFF01 c、phone 長度除以2,格式化成2位的十進制數 即 11000D91683109423346F90008000A5DE54F5C61095FEBFF01 => 50位 / 2 => 25 5、所以要發送的內容為 發:AT 收:OK 發:AT+CMGF=0 收:OK 發:AT+CMGS=25 收:> 發:addr+phone→ //→為發送符(ctrl+z,十六進制0x1A) 收:+CMGS: 54 OK 6、如果返回不是ERROR,恭喜你,發送成功了 三、幾個要注意的問題 1、發送的指令用0x0D結尾,注意不是通常認為的0x0D,0x0A。 特別是在發送PDU短信的AT+CMGS=25命令時, 一定只能以0x0D結尾。 2、在發送短信內容時,以0x1A(代表ctrl+Z的虛擬鍵值)結尾。 3、用AT+CMEE=1命令,可以在短信貓返回ERROR時帶上原因,這樣方便調試。
轉於:https://blog.csdn.net/u013087068/article/details/45147019
https://blog.csdn.net/u012158332/article/details/74355742
https://blog.csdn.net/woshishui918/article/details/79051473