【发布时间】:2014-09-09 10:29:52
【问题描述】:
该程序包括我必须通过 Android 应用程序向 Wifi 接入点发送一个字节,然后这个字节由硬件设备解释。
我可以向客户端发送字节并且它正确接收字节(还有更多字节,不知道为什么,可能是因为协议)。硬件过滤协议字节并仅捕获正确的字节。
这就是我发送它的方式(之前用另一种方法创建的字节,但它是正确的):
public static void sendByte (Byte data) throws IOException {
DataOutputStream output;
Socket client;
client = new Socket("1.2.3.4", 2000);
output = new DataOutputStream(client.getOutputStream());
output.write(data);
output.close();
client.close();
Log.w("INFO","Data sended");
}
当我发送字节时,硬件部分改变了灯的颜色,并且成功发生了。
我也写了这 3 行:
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
直到这里没有问题。
然后我也想从那个硬件字节接收。想象一下有人改变了那盏灯的颜色,我想知道。于是我创建了一个接收方法:
public static String readByte() throws IOException{
InputStream input;
DataInputStream iData;
String data = null;
try {
byte[] bytes = {0, 0, 0, 0, 0, 0, 0, 0};
Socket server = new Socket(2000);
Socket client = server.accept();
input = client.getInputStream();
iData = new DataInputStream(input);
Scanner scanner = new Scanner(iData);
iData.skip(0);
iData.read(bytes, 0, 8);
data = bytesToHex(bytes); //A simple method that change bytes to hex, this method it's correct
Log.w("READ", "" + data);
input.close();
client.close();
server.close();
}catch(IOException e){
Log.w("EROR","No es pot conectar");
}
return data;
}
这里我创建了一个连接客户端获取数据的服务器(我不知道是否有必要创建一个服务器)。问题是我总是收到 7 个字节,而且它们总是相同的,我使用 skip(7) 跳过协议字节,但后来我不再收到字节了。
我知道硬件通过我连接的 wifi 发送字节,但我无法捕捉到它们。
_________TO SUM UP_________
我认为问题在于我无法捕获字节,因为硬件部分只是发送给我,而我的 Android 应用程序无法存储它。我想在硬件发送给我时读取字节,或者类似的东西。我到处搜索方法和对象属性,但找不到解决方案:(
感谢您的关注。 想知道 ServerSocket 是否是绝对必要的。
【问题讨论】:
-
您确定应该使用同一个 2000 端口进行双向通信吗?往返 wifi 接入点?
-
理想情况下,您的应用程序应该在某个端口上启动一个 ServerSocket。每当灯光颜色发生变化时,硬件应该联系您的 ServerSocket。但是,我认为您没有能力告诉 wifi 接入点将数据发送到某个服务器套接字。
-
想知道 ServerSocket 是否是绝对必要的。 你需要一个在 Android 设备中的 ServerSocket,如果它应该接受来自硬件的连接。你必须使用TCP吗?对我来说,这听起来像使用 UDP 更好......
-
您可以在同一连接上接收。但你必须坚持下去。这意味着您将不得不使用单独的线程来读取(在同一个 Socket 实例上)或使用 nio。
-
关键是,您无法知道硬件何时发送数据。所以你必须有一个线程(和一个 loop 在它里面)不断检查传入的数据。您可以跨线程共享同一个套接字实例以发送到硬件。
标签: java android client byte send