2

サーバー モードで動作し、リモート クライアントからの要求を受け取るように、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 キーを押しますが、何も入力も出力もされません。

私が間違っていることに気づいたことはありますか?ヘルプが期待されます。

ガブリエル

4

0 に答える 0