我有以下硬件:


3 x粒子光子。每个都充当HTTP服务器
1 x Raspberry Pi 3,它将充当HTTP客户端

在向任何一个光子请求HTTP GET之后,API返回:

{
  node: 1,
  uptime: 1234556,
  location: 'back',
  sensor: {
      Eu: {// Euler Angles from IMU
           h: 0, p: 0, r: 0
      },
      La: {// linear Acceleration values from IMU
           x: 0, y: 0, z: 0
      }
  }
}


我想创建一个轮询方案,其中Raspberry Pi客户端在3个服务器中的每一个上每0.1秒执行一次HTTP GET。

不知道是否有HTTP轮询之类的东西,以及是否应该使用像Twisted by Python这样的异步库。

我想对如何在多服务器-单客户端模型中获得一些建议将功能WRT HTTP?

参考文献

每个粒子光子都具有对HTTP GET请求的上述JSON响应。

Raspberry Pi将用作HTTP客户端,试图获取每个粒子光子的请求。


评论

树莓派不仅限于一次与一台远程服务器对话。如果您可以让一个客户端使用保持活动的TCP连接,则可以一次使用三个副本,或者使用程序的三个副本,三个线程,或者实际上在一个线程中小心地处理文件描述符(可能在一个线程中)大select()循环。

您可以从Pi使用浏览器。每个选项卡都是一个客户端,每个选项卡都可以访问不同的服务器。哪里出问题了?如果浏览器可以做到,您的代码也可以。很简单

可能最好在stackoverflow.com上询问编码问题,特别是因为这是一个纯HTTP问题且与设备无关

#1 楼

我为@Chris Stratton所指的保持活动的tcp连接找到了一个很好的基本解决方案:

import socket

# Set up a TCP/IP socket
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

# Connect as client to a selected server
# on a specified port
s.connect(("url_to_device_n",80))

# Protocol exchange - sends and receives
s.send("GET /answer_json HTTP/1.0\n\n")
while True:
    resp = s.recv(1024)
    if resp == "": break
    print resp, # here instead of print parse json

# Close the connection when completed
s.close()
print "\ndone"


您应该建立一个等待0.1s的永恒循环,然后建立一个永恒的循环这些连接和关闭之间的步骤,因此在启动时仅调用一次连接,仅在极端需要关闭所有内容时才关闭。

带螺纹的以前的作品:

import urllib2 
from multiprocessing.dummy import Pool as ThreadPool 
import socket
import time

def sendData( urlToDevice ):
   # Set up a TCP/IP socket
   s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
   s.connect(("url_to_device_n",80))
   while True:
      time.sleep(0.1)
      # Protocol exchange - sends and receives
      s.send("GET /answer_json HTTP/1.0\n\n")
      while True:
         resp = s.recv(1024)
         if resp == "": break
         print resp, # here instead of print parse json

    # Close the connection when completed
    s.close()
    print "\ndone"

#########################   
# This is main program: #
#########################

urls = [
      'url_to_device_1', 
      'url_to_device_2',
      'url_to_device_3',
      '..',
      'url_to_device_n',
      ]

# make the Pool of workers
pool = ThreadPool(n) 

# open the urls in their own threads
results = pool.map(sendData, urls)

# close the pool and wait for the work to finish 
pool.close() 
pool.join() 


来源:

http://www.wellho .net / resources / ex.php4?item = y303 / browser.py

https://stackoverflow.com/questions/2846653/how-to-use-threading-in-python

https://stackoverflow.com/questions/510348/how-can-i-make-a-time-delay-in-python

#2 楼

也许以下链接可以为您提供帮助:

基本客户端示例:
https://docs.python.org/2/library/asyncore.html#asyncore-example-basic-http- client

基本的回显服务器示例:
https://docs.python.org/2/library/asyncore.html#asyncore-example-basic-echo-server

还,您是否考虑过使用UDP协议?可能会更好...

据我所知,我建议HTTP / 1.0在其实现中不是强制性的,以保持连接畅通,这是HTTP / 1.1中定义的;无论如何,它取决于实现,它可以有也可以没有。


 import asyncore, socket

class HTTPClient(asyncore.dispatcher):

    def __init__(self, host, path):
        asyncore.dispatcher.__init__(self)
        self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
        self.connect( (host, 80) )
        self.buffer = 'GET %s HTTP/1.0\r\n\r\n' % path

    def handle_connect(self):
        pass

    def handle_close(self):
        self.close()

    def handle_read(self):
        print self.recv(8192)

    def writable(self):
        return (len(self.buffer) > 0)

    def handle_write(self):
        sent = self.send(self.buffer)
        self.buffer = self.buffer[sent:]


client = HTTPClient('www.python.org', '/')
asyncore.loop()
 



 import asyncore
import socket

class EchoHandler(asyncore.dispatcher_with_send):

    def handle_read(self):
        data = self.recv(8192)
        if data:
            self.send(data)

class EchoServer(asyncore.dispatcher):

    def __init__(self, host, port):
        asyncore.dispatcher.__init__(self)
        self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
        self.set_reuse_addr()
        self.bind((host, port))
        self.listen(5)

    def handle_accept(self):
        pair = self.accept()
        if pair is not None:
            sock, addr = pair
            print 'Incoming connection from %s' % repr(addr)
            handler = EchoHandler(sock)

server = EchoServer('localhost', 8080)
asyncore.loop()
 


评论


这对一切有什么帮助?您似乎提供了一个简单的例子来说明如何以困难的方式建立HTTP连接,但是在解决问题的实际问题上有什么用处-即,这如何帮助用户轮询多个设备?

–克里斯·斯特拉顿(Chris Stratton)
17年8月17日在21:33