微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

用java发送unicode短信

如何解决用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,8https://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 举报,一经查实,本站将立刻删除。