如何通过Python请求/ URL模块将JSON消息从同一路由器/ LAN上的Pizero W发送到Pi Django服务器?

我有一个连接到同一家庭无线网络的Raspberry Pi 3+和Raspberry PizeroW。

Pi 3+正在托管Django服务器,而Pi 3+的IP地址在本地网络192.384.5.767上是静态的。

Pizero W在192.384.5.343的家庭网络上具有一个静态IP地址。

当我从Pizero W ping Pi 3+服务器时,我看到它已经启动:

pi@PIZEROW:~$ ping 192.384.5.767
64 bytes from 192.384.5.767: icmp_seq=1 ttl=64 time=10.5 ms
64 bytes from 192.384.5.767: icmp_seq=2 ttl=64 time=30.0 ms
64 bytes from 192.384.5.767: icmp_seq=3 ttl=64 time=32.1 ms

此外,当我访问平板电脑上Django服务器托管的网站时,没有任何问题。

但是,我需要在Pizero W和Django服务器之间进行双向通信,因此想测试从Pizero W向Pi 3+服务器发送超简单JSON消息并从其收到的服务器接收确认消息。除了接收消息,丢弃消息并发送确认消息已收到以外,我不需要服务器对消息做任何事情。

我尝试使用以下方法从Pizero W进行此操作:

pi@PIZEROW:~$ python3
>>> import requests
>>> import JSON
>>> url = "http://192.384.5.767:8000"
>>> data = {'msg':'test'}
>>> r = requests.post(url,data)

并收到以下错误:

Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/urllib3/connection.py",line 159,in _new_conn
    (self._dns_host,self.port),self.timeout,**extra_kw)
  File "/usr/lib/python3/dist-packages/urllib3/util/connection.py",line 80,in create_connection
    raise err
  File "/usr/lib/python3/dist-packages/urllib3/util/connection.py",line 70,in create_connection
    sock.connect(sa)
ConnectionRefusedError: [Errno 111] Connection refused

During handling of the above exception,another exception occurred:

Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py",line 600,in urlopen
    chunked=chunked)
  File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py",line 354,in _make_request
    conn.request(method,url,**httplib_request_kw)
  File "/usr/lib/python3.7/http/client.py",line 1229,in request
    self._send_request(method,body,headers,encode_chunked)
  File "/usr/lib/python3.7/http/client.py",line 1275,in _send_request
    self.endheaders(body,encode_chunked=encode_chunked)
  File "/usr/lib/python3.7/http/client.py",line 1224,in endheaders
    self._send_output(message_body,line 1016,in _send_output
    self.send(msg)
  File "/usr/lib/python3.7/http/client.py",line 956,in send
    self.connect()
  File "/usr/lib/python3/dist-packages/urllib3/connection.py",line 181,in connect
    conn = self._new_conn()
  File "/usr/lib/python3/dist-packages/urllib3/connection.py",line 168,in _new_conn
    self,"Failed to establish a new connection: %s" % e)
urllib3.exceptions.NewConnectionError: <urllib3.connection.HTTPConnection object at 0xb5a2b610>: Failed to establish a new connection: [Errno 111] Connection refused

During handling of the above exception,another exception occurred:

Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/requests/adapters.py",line 449,in send
    timeout=timeout
  File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py",line 638,in urlopen
    _stacktrace=sys.exc_info()[2])
  File "/usr/lib/python3/dist-packages/urllib3/util/retry.py",line 398,in increment
    raise MaxRetryError(_pool,error or ResponseError(cause))
urllib3.exceptions.MaxRetryError: HTTPConnectionPool(host='192.384.5.767',port=8000): Max retries exceeded with url: / (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0xb5a2b610>: Failed to establish a new connection: [Errno 111] Connection refused'))

During handling of the above exception,another exception occurred:

Traceback (most recent call last):
  File "<stdin>",line 1,in <module>
  File "/usr/lib/python3/dist-packages/requests/api.py",line 116,in post
    return request('post',data=data,json=json,**kwargs)
  File "/usr/lib/python3/dist-packages/requests/api.py",line 60,in request
    return session.request(method=method,url=url,**kwargs)
  File "/usr/lib/python3/dist-packages/requests/sessions.py",line 533,in request
    resp = self.send(prep,**send_kwargs)
  File "/usr/lib/python3/dist-packages/requests/sessions.py",line 646,in send
    r = adapter.send(request,**kwargs)
  File "/usr/lib/python3/dist-packages/requests/adapters.py",line 516,in send
    raise ConnectionError(e,request=request)
requests.exceptions.ConnectionError: HTTPConnectionPool(host='192.384.5.767',port=8000): Max retries exceeded with url: / (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0xb5a2b610>: Failed to establish a new connection: [Errno 111] Connection refused'))

不能完全确定发生了什么,但是尽管我的平板电脑已经启动并运行了Django服务器,并且ping成功了,但看来我仍然从Pizero发送和接收消息。

任何帮助/建议将不胜感激!谢谢!

qq1151873004 回答:如何通过Python请求/ URL模块将JSON消息从同一路由器/ LAN上的Pizero W发送到Pi Django服务器?

这可能是三件事之一:

(1)您的django服务器未绑定到IP地址或0.0.0.0。通常,runserver命令在127.0.0.1或本地主机上启动django侦听。要使其绑定到正确的IP地址/端口,请使用

python manage.py 192.384.5.767:8000

在生产环境中,django应用程序通常与gunicorn或uwsgi一起使用并在端口80上侦听。如果您与gunicorn / uwsgi一起运行,请更新适当的配置设置。

(2)pi上的防火墙阻止了访问。根据操作系统的不同,您可能需要允许远程访问tcp端口80。根据Linux的版本,您可能还必须为apparmor和/或selinux添加规则。例如:

iptables -A INPUT -p tcp --port 80 -j ACCEPT

(3)最后,使用请求的调用略微关闭。应该是

requests.post(url,json=data)
本文链接:https://www.f2er.com/3169982.html

大家都在问