使用 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
对文本部分进行了编码
我通过 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
对文本部分进行了编码