【发布时间】:2012-03-01 12:02:06
【问题描述】:
我买了一个gps,我用短信和它自己的软件测试了这个来检索纬度/经度,它工作正常,看截图:
现在我确信与gprs->internet 的通信是有效的,所以我想创建自己的软件,它可以执行软件制造商不存在的许多其他功能。
在我的第一次反思中,我尝试在端口 7070 上使用套接字 tcp/ip (java) 监听 NMEA 消息,这是我的源代码:
import java.io.*;
import java.net.*;
public class Serveur {
static final int port = 7070;
public static void main(String[] args) throws Exception {
ServerSocket s = new ServerSocket(port);
System.out.println("waiting for connexion from GPS 7070");
Socket socClient = s.accept();
System.out.println("Connexion GPS ok");
BufferedReader in = new BufferedReader(
new InputStreamReader(socClient.getInputStream())
);
PrintWriter out = new PrintWriter(
new BufferedWriter(
new OutputStreamWriter(socClient.getOutputStream())),
true);
String str = in.readLine();
System.out.println("the GPS message is : " + str);
in.close();
out.close();
socClient.close();
}
}
我尝试通过本地网络上的 java 客户端发送消息,它可以工作..
但我不明白的问题是:当我收到来自 GPS 的消息时,我收到此错误:
waiting for connexion from GPS 7070
Connexion GPS ok
Exception in thread "main" java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(Unknown Source)
at java.net.SocketInputStream.read(Unknown Source)
at sun.nio.cs.StreamDecoder.readBytes(Unknown Source)
at sun.nio.cs.StreamDecoder.implRead(Unknown Source)
at sun.nio.cs.StreamDecoder.read(Unknown Source)
at java.io.InputStreamReader.read(Unknown Source)
at java.io.BufferedReader.fill(Unknown Source)
at java.io.BufferedReader.readLine(Unknown Source)
at java.io.BufferedReader.readLine(Unknown Source)
at serveur.Serveur.main(Serveur.java:27)
在 server.Serveur.main(Serveur.java:27)
错误来自line String str = in.readLine();
如果它的软件能够拦截消息 NMEA 为什么不是我的应用程序??
更新:
我嗅探了网络,结果如下:
[我的 GPS 使用的协议][4]
从 GPS 接收到的第一个数据包 (the hidden ip adress is my fixed public address ):
软件的第一个响应(1/2)(它是一条空消息):
来自软件(2/2):
来自 GPS:
从软:
来自 GPS(1/2)(它是一条空消息):
最后是来自 GPS(2/2) 的长/纬度/速度...:
正如我已经写过的,GPS 发送的信息是空的……所以这里是所有详细信息。
@Peter Lawrey:我尝试逐字节读取消息,但从 netbeans 收到错误消息,,,你能给我一段代码吗?谢谢 希望这对我有帮助。
【问题讨论】:
-
您确定 GPS 是 Socket 客户端吗?认为设备是服务器是有道理的。
-
我不确定,但通常这是一个套接字客户端...
-
你的设备和服务器在同一台机器上吗?
-
不,设备在车里,并且GPS通过GPRS网络发送的消息,通常有机会工作,因为您已经看到与GPS通信。 ..
-
然后尝试彼得的答案并直接使用
socClient.getInputStream(),而不是将其包装在 BufferedReader 中。通过调用InputStream.read()返回一个字节(在 int 的 LSB 中),您可以检查您是否正在接收数据或行终止符有问题。