用java发送unicode短信



我通过GSM设备发送短信,试试这个:https://stackoverflow.com/a/31361225/6250402

它可以发送普通的短信,我尝试发送Unicode文本,但它自动转换为ASCII:VD¥n ba:#n D_a:?n: TBM01

Lib:

<dependency>
<groupId>com.neuronrobotics</groupId>
<artifactId>nrjavaserial</artifactId>
<version>5.1.1</version>
</dependency>

我的代码:

CommPortIdentifier portId = "I get CommPort match name";
SerialPort serialPort = portId.open("name", 2000);
serialPort.setSerialPortParams(115200, SerialPort.DATABITS_8, 
SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
this.outputStream = serialPort.getOutputStream();
// each command function
private void send(String cmd) throws IOException {
outputStream.write(cmd.getBytes(StandardCharsets.UTF_8)); //
outputStream.flush();
}
// this sends message method
send("AT+CMGS=" + '"' + phone + '"' + "rn");
send(message + '32');

我的配置错了吗?

任何通过GSM为java发送短信的代码都是一个很好的答案。

结果我缺少AT+CSMP=1,167,0,8(https://stackoverflow.com/a/15312611/6250402,要了解更多信息,请查看https://www.smssolutions.net/tutorials/gsm/sendsmsat/)

我有一个Java中GSM设备通信的示例项目,我在连接到SIMCom800L模块的树莓中运行。它使用jSerialComm进行串行通信,在完全没有配置的情况下工作得很好。请查看我的回购:https://github.com/pepevalbe/sms-gateway

要发送Unicode,您需要配置GSM设备字符集。使用以下命令检查可能的集合:

AT+CSCS=?
+CSCS: ("GSM","UCS2","IRA","HEX")

如果答案包含"0";HEX";或";UCS2";,Unicode似乎受到支持。我试过UCS2,效果很好。只需使用:AT+CSCS="UCS2"更改字符集这只会影响短信,而不会影响常规命令。

现在,您的设备将正确识别您从Java发送的unicode字符串。别忘了设置短信文本模式:AT+CMGF=1

我给你一个基于我的回购的完整例子:

//SIMCom serial port configuration: 115200 bps, 8 bit data, no parity, 1 bit stop, no data stream control
SerialPort serialPort = SerialPort.getCommPort("serial0");
serialPort.setComPortParameters(115200, 8, ONE_STOP_BIT, NO_PARITY);
serialPort.setFlowControl(FLOW_CONTROL_DISABLED);
serialPort.setComPortTimeouts(TIMEOUT_READ_BLOCKING, 3000, 0);
serialPort.openPort();
// Set sms text mode
String textModeCommand = "AT+CMGF=1r";
serialPort.writeBytes(textModeCommand.getBytes(StandardCharsets.UTF_8), textModeCommand.length());
// Set UCS2 charset
String characterSetCommand = "AT+CSCS="UCS2"r";
serialPort.writeBytes(characterSetCommand.getBytes(StandardCharsets.UTF_8), characterSetCommand.length());
// Send sms command
String sendTextCommand1 = "AT+CMGS="" + number + ""n";
String sendTextCommand2 = text + (char) 26 + "r";
serialPort.writeBytes(sendTextCommand1.getBytes(StandardCharsets.UTF_8), sendTextCommand1.length());
serialPort.writeBytes(sendTextCommand2.getBytes(StandardCharsets.UTF_16), sendTextCommand2.length());

请注意,在send sms命令中,我使用UTF_16字符集而不是UTF_8 对文本部分进行编码

要发送unicode文本,首先要将字符集选择为UTF-16(UCS2)

AT+CCSCS=";UCS2";

在设置AT+CCSCS=";UCS2";您发送的每个字符串参数都必须编码为UCS2格式,

您可以将漏洞提交给enCode到UCS2http://d-chips.blogspot.com/2012/06/coding-of-alpha-fields-in-sim-for-ucs2.html

以下是发送/接收unicoded文本时需要检查的原因

  • 请确保以UTF-8格式读取输入,并使用UTF-8编码创建InputstreamReader构造函数

InputStream InputStream=新的FileInputStream("data.txt");

InputStreamReader inputStreamReader =  new InputStreamReader(inputStream, Charset.forName("UTF-8"));

有关更多参考:https://docs.oracle.com/javase/tutorial/i18n/text/stream.html

  • 使用字节消息方法而不是文本消息发送/接收unicode文本

https://docs.oracle.com/javaee/7/api/javax/jms/BytesMessage.html

最新更新