【问题标题】:Send unicode sms with java使用 java 发送 unicode 短信
【发布时间】:2021-02-02 09:27:56
【问题描述】:

我通过 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 发送 SMS 的代码都是一个很好的答案。

结果我错过了AT+CSMP=1,167,0,8https://stackoverflow.com/a/15312611/6250402,更多信息,请看https://www.smssolutions.net/tutorials/gsm/sendsmsat/

【问题讨论】:

  • 您是否尝试过 UCS-2(实际上是 UTF-16)?
  • 您的意思是encodeAsUcs2 代表phonemesage 或所有cmd
  • 据我所知,SMS 仅支持 GSM-7(8 位编码)和 UTF-16(16 位编码;以前是 UCS-2),而 UTF-8 是可变字符不能在那里使用的长度编码。我会先从消息正文开始,但我没有在那么低的级别使用 SMS,所以我只能猜测。
  • 嗯,我可能是错的,但整个cmd 可能应该被转换(我的意思是,否则混合编码有什么意义?)。

标签: java sms gsm


【解决方案1】:

我有一个 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());

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

【讨论】:

  • 致电AT+CSCS=?,我得到+CSCS: ("GSM","PCCP437","CUSTOM","HEX"),无法设置AT+CSCS="UCS2"
  • 然后选择 HEX。您需要将文本字符串编码为十六进制。看看这个:smssolutions.net/tutorials/gsm/sendsmsat
  • 我认为我的配置有误,我像您的示例一样发送了06450631062D06280627 &lt;CTRL-Z&gt;,但收到了ùEù1ù-ù(ù' 而不是مرحبا
  • 我错过了AT+CSMP=1,167,0,8 &lt;ENTER&gt;
【解决方案2】:

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

AT+CSCS="UCS2"

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

您可以将打击实用程序编码为 UCS2 http://d-chips.blogspot.com/2012/06/coding-of-alpha-fields-in-sim-for-ucs2.html

【讨论】:

    【解决方案3】:

    以下是在发送/接收 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-08
      相关资源
      最近更新 更多