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 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();
        }
    }
}

我输入文本并按回车键,但没有任何输入或输出。

你有没有发现我做错了什么?帮助很重要。

加布里埃尔

4

0 回答 0