我正在做一个项目,我需要设置一个连接到 Raspberry PI 的 SIM900 模块以在服务器模式下工作并接收来自远程客户端的请求。就设置服务器和接收客户端连接而言,一切正常。这些已经建立,但没有数据通过。服务器无法接收数据,也无法将其发送给客户端。我在阿根廷,使用运营商 Claro 的 SIM 卡和提供公共 IP 的 APN。为了与 GPRS 模块通信,我使用 PI4J 和代码如下。
package pi4j;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import com.pi4j.io.serial.Serial;
import com.pi4j.io.serial.SerialDataEvent;
import com.pi4j.io.serial.SerialDataListener;
import com.pi4j.io.serial.SerialFactory;
public class SerialExample {
static String post;
static final Serial serial = SerialFactory.createInstance();
static List<InputHandler> handlers = new ArrayList<InputHandler>();
public static void main(String args[]) throws InterruptedException,
IOException {
serial.addListener(new SerialDataListener() {
String input = "";
public void dataReceived(final SerialDataEvent event) {
System.out.print(event.getData());
input += event.getData();
for (int i = 0; i < handlers.size(); i++) {
InputHandler handler = handlers.get(i);
synchronized (handler) {
String output = handler.handle(input);
if (!input.equals(output)) {
input = output;
handler.notify();
}
}
if (handler.pop) {
handlers.remove(handler);
i++;
}
}
}
});
serial.open(Serial.DEFAULT_COM_PORT, 115200);
new Thread() {
public void run() {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line = null;
try {
while((line = br.readLine()) != null) {
line = line.replace("ctrl+z", "" + (char) 0x1a);
if(line.endsWith("" + (char) 0x1a))
serial.write(line);
else
serial.writeln(line);
}
} catch (IllegalStateException | IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}.start();
sendCommandWaitOK("AT");
sendCommandWaitOK("AT+CREG=1");
sendCommandWaitOK("AT+CSTT=\"internet.ctimovil.com.ar\",\"ctigprs\",\"ctigprs999\"");
sendCommandWaitOK("AT+CIICR");
sendCommandWaitOK("AT+CIPHEAD=1");
sendCommandWaitOK("AT+CIPSRIP=1");
sendCommandWaitOK("AT+CIPSHOWTP=1");
sendCommandWaitResponse("AT+CIFSR", new InputHandler() {
public String handle(String input) {
if (input.indexOf("AT+CIFSR" + "\r\n") == -1)
return input;
String[] parts = input.split("\r\n");
mainLoop: for (String part : parts) {
String[] b = part.split("\\.");
if (b.length != 4)
continue;
for (String c : b)
try {
int d = Integer.parseInt(c);
if (d < 0 || d > 255)
continue;
} catch (NumberFormatException e) {
continue;
}
input = input.replace("AT+CIFSR" + "\r\n", "").replace(
"\r\n" + part + "\r\n", "");
pop = true;
break mainLoop;
}
return input;
}
});
sendCommandWaitEndsWith("AT+CIPSERVER=1,1234", true,
"\r\nOK\r\n\r\nSERVER OK\r\n");
}
private static void sendCommandWaitResponse(String command,
InputHandler handler) {
try {
synchronized (handler) {
handlers.add(handler);
if(command.endsWith("" + (char) 0x1a))
serial.write(command);
else
serial.writeln(command);
handler.wait();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
private static void sendCommandWaitOK(String command) {
sendCommandWaitEndsWith(command, true, "\r\nOK\r\n");
}
private static void sendCommandWaitEndsWith(final String command,
final boolean echo, final String expected) {
sendCommandWaitResponse(command, new InputHandler() {
public String handle(String input) {
if (echo && input.indexOf(command + "\r\n") == -1)
return input;
if (input.indexOf(expected) != -1) {
if (echo) {
input = input.replace(command + "\r\n", "");
}
input = input.replace(expected, "");
pop = true;
}
return input;
}
});
}
static abstract class InputHandler {
abstract String handle(String input);
boolean pop;
}
}
输出是这样的:
2014 年 8 月 2 日上午 1:51:22 com.pi4j.util.NativeLibraryLoader loadLibraryFromResource
警告:临时文件已经存在 [/tmp/libpi4j.so];现在试图删除它。
在
好的
AT+CREG=1
好的
AT+CSTT="internet.ctimovil.com.ar","ctigprs","ctigprs999"
好的
AT+CIICR
好的
AT+密码头=1
好的
AT+CIPSRIP=1
好的
AT+CIPSHOWTP=1
好的
AT+CIFSR
186.12.33.115
AT+CIPSERVER=1,1234
好的
服务器正常
远程IP:190.195.1.211
AT+CIPSEND
AT+CIPSEND
> 你好
你好
但随后什么也没有发生,它永远不会返回预期的“SEND OK”。在极少数情况下,客户端数据确实会通过,我可以看到它打印在控制台中,但我找不到重新创建这些条件的规则。
我尝试通过 Web 浏览器和小型 Java 控制台套接字客户端进行连接,结果始终相同。这是它的代码:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.Socket;
public class Pepin {
public static void main(String[] args) throws MalformedURLException, IOException {
final Socket s = new Socket("186.12.33.115", 1234);
new Thread() {
public void run() {
while(!s.isClosed())
try {
if(s.getInputStream().available() > 0)
System.out.print((char) s.getInputStream().read());
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
while(true) {
byte[] bytes = br.readLine().getBytes();
s.getOutputStream().write(bytes);
s.getOutputStream().flush();
}
}
}
我输入文本并按回车键,但没有任何输入或输出。
你有没有发现我做错了什么?帮助很重要。
加布里埃尔