サーバー モードで動作し、リモート クライアントからの要求を受け取るように、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 AM com.pi4j.util.NativeLibraryLoader loadLibraryFromResource
警告: 一時ファイルは既に存在します [/tmp/libpi4j.so]; 今それを削除しようとしています。
で
わかった
AT+CREG=1
わかった
AT+CSTT="internet.ctimovil.com.ar","ctigprs","ctigprs999"
わかった
AT+CIICR
わかった
AT+CIPHEAD=1
わかった
AT+CIPSRIP=1
わかった
AT+CIPSHOWTP=1
わかった
AT + CIFSR
186.12.33.115
AT+CIP サーバー=1,1234
わかった
サーバーOK
リモート 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();
}
}
}
テキストを入力して Enter キーを押しますが、何も入力も出力もされません。
私が間違っていることに気づいたことはありますか?ヘルプが期待されます。
ガブリエル