OkHttp 发送的 Http 请求未在 micropython 服务器上收到
Http request send by OkHttp not received on micropython server
我目前正在尝试编写一个 android 应用程序来设置和控制运行 micropython 的 ESP8266。
在 micropython 服务器上,我像这样初始化一个 websocket:
def __init__(self, task_manager, setup_mode):
address = socket.getaddrinfo('0.0.0.0', 80)[0][-1]
self._socket = socket.socket()
self._socket.bind(address)
self._socket.listen(1)
self._socket.setblocking(False)
self._socket.settimeout(5)
self._task_manager = task_manager
self._setup_mode = setup_mode
print('New Socket is listening on: ', address)
然后像这样简单地监听传入的连接,然后对传入的消息做出反应。此外,该列表是循环的,以允许微控制器逻辑每 5 秒更新一次。
client, address = self._socket.accept()
print("New request from:", address)
当我从我的 PC 使用 python 发送测试请求时,一切正常。例如,一个简单的请求将是这样的:
data = json.dumps({'load': {'type': "is_lighthub", 'data': {}}})
response = requests.post(ip, json=data)
但是,当我尝试使用来自 android 应用程序的 OkHttp 发出相同的 post 请求时,ESP 上没有传入连接。
这是 android java 代码:
private void addIfLighthub(final InetAddress address) {
try {
RequestBody body = RequestBody.create(JSON, "{\"load\": {\"type\": \"is_lighthub_server\", \"data\": {}}");
Request request = new Request.Builder()
.url("http://" + address.getHostAddress())
.post(body)
.build();
try (Response response = client.newCall(request).execute()) {
final JSONObject myResponse = new JSONObject(response.body().string());
if((boolean)myResponse.get("is_lighthub")) {
onlineDeviceList.add(address);
}
} catch (IOException e) {
System.out.println(e.getMessage());
}
} catch (JSONException jsonException) {
System.out.println(jsonException.getMessage());
}
}
然而,奇怪的是,如果示例代码提供了我的路由器地址,它确实会收到路由器默认 html 站点 ...
那么,我是不是漏掉了什么?我对网络相当陌生,但是来自 phone 的简单 post 请求应该与来自 python 示例代码的请求相同,对吧?
还是我的 java 函数有错误?
提前谢谢大家的帮助!
如果我自己修好了!
错误是 python 测试客户端将 json 分开发送,而 okhttp 客户端将两者合并发送。
这使得服务器在等待第二条消息时超时...
我目前正在尝试编写一个 android 应用程序来设置和控制运行 micropython 的 ESP8266。
在 micropython 服务器上,我像这样初始化一个 websocket:
def __init__(self, task_manager, setup_mode):
address = socket.getaddrinfo('0.0.0.0', 80)[0][-1]
self._socket = socket.socket()
self._socket.bind(address)
self._socket.listen(1)
self._socket.setblocking(False)
self._socket.settimeout(5)
self._task_manager = task_manager
self._setup_mode = setup_mode
print('New Socket is listening on: ', address)
然后像这样简单地监听传入的连接,然后对传入的消息做出反应。此外,该列表是循环的,以允许微控制器逻辑每 5 秒更新一次。
client, address = self._socket.accept()
print("New request from:", address)
当我从我的 PC 使用 python 发送测试请求时,一切正常。例如,一个简单的请求将是这样的:
data = json.dumps({'load': {'type': "is_lighthub", 'data': {}}})
response = requests.post(ip, json=data)
但是,当我尝试使用来自 android 应用程序的 OkHttp 发出相同的 post 请求时,ESP 上没有传入连接。
这是 android java 代码:
private void addIfLighthub(final InetAddress address) {
try {
RequestBody body = RequestBody.create(JSON, "{\"load\": {\"type\": \"is_lighthub_server\", \"data\": {}}");
Request request = new Request.Builder()
.url("http://" + address.getHostAddress())
.post(body)
.build();
try (Response response = client.newCall(request).execute()) {
final JSONObject myResponse = new JSONObject(response.body().string());
if((boolean)myResponse.get("is_lighthub")) {
onlineDeviceList.add(address);
}
} catch (IOException e) {
System.out.println(e.getMessage());
}
} catch (JSONException jsonException) {
System.out.println(jsonException.getMessage());
}
}
然而,奇怪的是,如果示例代码提供了我的路由器地址,它确实会收到路由器默认 html 站点 ...
那么,我是不是漏掉了什么?我对网络相当陌生,但是来自 phone 的简单 post 请求应该与来自 python 示例代码的请求相同,对吧?
还是我的 java 函数有错误?
提前谢谢大家的帮助!
如果我自己修好了! 错误是 python 测试客户端将 json 分开发送,而 okhttp 客户端将两者合并发送。 这使得服务器在等待第二条消息时超时...