本文并不是完整的从头到尾介绍怎么用java通过短信modem发送短信,只是侧重讲解决短信modem中文发送短信的问题。
首先,由于短信modem型号的不同,你所采用的AT命令的格式以及解决中文短信乱码的方案也不同。
1.Anydata 即西门子的短信modem
//AT+CMGF=1命令将设置短信格式设置为text tmp = "AT+CMGF=1\r\n"; //writeContent方法就是将命令或内容通过串口写入短信modem的方法 if (writeContent(tmp, rt) != 1) { return -1; } // “AT+CMGS=msgid,number,callback-number,option,data” //Msgid是用户指定的消息代号 //Number是短消息的目的地号码 //Callback-number是用户填写的回叫号码 //Option: 这个参数是几个选项的组合 //bit 0-1:coding //0: ascii,原文; //1: ascii, HEX格式化 //3: Unicode, HEX格式化; //2: OCTET,HEX格式化 tmp = "AT+CMGS=2,"+mobile+",,3,"+stringToUnicode(message)+"\r\n"; if (writeContent(tmp, rt) == 1) { return 0; }
中文肯定是先用转换成unicode码字符串才能发送,不然会是乱码
/* * 将字符串转化为unicode码字符串 */ public String stringToUnicode(String s) { String str = ""; for (int i = 0; i < s.length(); i++) { int ch = (int) s.charAt(i); if (ch > 255) str += Integer.toHexString(ch) ; else str +="00" + Integer.toHexString(ch); } return str; }
2.wavecom 短信modem
//AT+CMGF=1同样是将短信模式设置为text模式 tmp = "AT+CMGF=1\r\n"; if (writeContent(tmp, rt) != 1) { return -1; } //Command syntax: AT+CMGS=[, ] [, ] [, ] [, ] //[, ] [ ] tmp = "AT+CMGS=\"" +mobile+"\","+message.getBytes("UNICODE").length+"\r"; //这是先写命令的前半部分 writeContent(tmp, rt); //这是写后半部分,也就是写短信内容 if(writeCNContent(message,rt,(char)-1)==1){ return 0; };
/** *写中文短信内容 **/ public int writeCNContent(String content, Rxtx rt, char last) { try { //将短信内容转码成unicode的byte数组 byte[] b = content.getBytes("UNICODE"); char[] carr = new char[170]; rt.writeData(b, 0, b.length); Thread.sleep(500); //b2是ctrl+z命令的byte数组形式 byte[] b2 = new byte[] { 0x00, 0x1a }; rt.writeData(b2, 0, b2.length); int ret = rt.read(carr, 170, 2000); if (ret == 0) { debug.error(" command read failed"); rt.closeConnection(); return 0; } //解析从短信modem返回回来的结果信息 String t = parseByte(carr); if ((!(t.indexOf("OK") > -1)) && (!(t.indexOf(">") > -1))) { } } catch (Exception ce) { ce.printStackTrace(); return 0; } return 1; }