使用 java 发送 unicode 短信

Send unicode sms with java

我通过 GSM 设备发送短信,试试这个:

它可以发送普通短信,我尝试发送 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 + '2');

我配置有误吗?

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

结果我漏了AT+CSMP=1,167,0,8(, to more info, look https://www.smssolutions.net/tutorials/gsm/sendsmsat/)

以下是需要检查的原因 sending/receiving unicoded text

  • 确保以 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

  • sending/receivingunicode 文本
  • 使用字节消息方法代替文本消息

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

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

AT+CSCS="UCS2"

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

您可以参考blow utilty 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

我根据我的 repo 给你一个完整的例子:

//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());

请注意,在发送短信命令中 我使用 UTF_16 字符集 而非 UTF_8

对文本部分进行了编码