如何解决用java发送unicode短信
我通过 GSM 设备发送短信,试试这个:https://stackoverflow.com/a/31361225/6250402
它可以发送普通短信,我尝试发送 Unicode 文本,但它会自动转换为 ASCII:VD¥n ba:#n D_a:?n: TBM01
库:
<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 + '"' + "\r\n");
send(message + '\032');
我的配置有误吗?
任何通过 GSM for java 发送短信的代码都是一个很好的答案。
结果我错过了AT+CSMP=1,167,8
(https://stackoverflow.com/a/15312611/6250402,要了解更多信息,请看https://www.smssolutions.net/tutorials/gsm/sendsmsat/)
解决方法
要发送 unicode 文本,首先要选择的字符集为 UTF-16 (UCS2)
AT+CSCS="UCS2"
设置 AT+CSCS="UCS2" 后,您发送的每个字符串参数都必须编码为 UCS2 格式,
你可以参考blow utilty to enCode to UCS2 http://d-chips.blogspot.com/2012/06/coding-of-alpha-fields-in-sim-for-ucs2.html
,我有一个用 Java 编写的 GSM 设备通信示例项目,我在连接到 SIMCom800L 模块的覆盆子中运行该项目。它使用 jSerialComm 进行串行通信,无需任何配置即可正常工作。请查看我的存储库:https://github.com/pepevalbe/sms-gateway
要发送 Unicode,您需要配置您的 GSM 设备字符集。使用此命令检查可能的设置:
AT+CSCS=?
+CSCS: ("GSM","UCS2","IRA","HEX")
如果答案包含“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=1\r";
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-8 格式读取输入,使用 UTF-8 编码创建 InputstreamReader 构造函数
InputStream inputStream = new FileInputStream("data.txt");
InputStreamReader inputStreamReader = new InputStreamReader(inputStream,Charset.forName("UTF-8"));
更多参考:https://docs.oracle.com/javase/tutorial/i18n/text/stream.html
- 使用 bytemessage 方法而不是文本消息来发送/接收 unicode 文本
https://docs.oracle.com/javaee/7/api/javax/jms/BytesMessage.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。