Tạo dịch vụ bỏ phiếu HTTP GET trên Máy khách Raspberry Pi


8

Tôi có phần cứng sau:

  1. 3 x Hạt photon . Mỗi máy chủ phục vụ như một Máy chủ HTTP

  2. 1 x Raspberry Pi 3 sẽ phục vụ như một Máy khách HTTP

Khi yêu cầu HTTP GET cho bất kỳ Photon nào, API sẽ trả về:

{
  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
      }
  }
}

Tôi muốn tạo sơ đồ Bỏ phiếu trong đó máy khách Raspberry Pi thực hiện HTTP GET mỗi 0,1 giây trên mỗi 3 Máy chủ.

Tôi không chắc liệu có thứ gì đó giống như HTTP Polling hay không và liệu các Thư viện không đồng bộ như Twisted by Python có nên được sử dụng hay không.

Tôi muốn nhận được một số lời khuyên về cách một Máy chủ Nhiều Máy chủ - Mô hình Máy khách Đơn lẻ sẽ hoạt động như thế nào với HTTP?

Tài liệu tham khảo

Mỗi Hạt Photon có phản hồi JSON được đề cập ở trên đối với Yêu cầu HTTP GET.

Raspberry Pi sẽ phục vụ như một Máy khách HTTP, cố gắng nhận các yêu cầu từ mỗi Photon hạt. hình ảnh thành phần với Pi và ba photon và hướng của các cuộc gọi nghỉ


3
Raspberry pi không giới hạn nói chuyện với một máy chủ từ xa tại một thời điểm. Nếu bạn có thể làm cho một máy khách hoạt động với kết nối TCP được giữ nguyên, có lẽ bạn có thể xử lý ba cái cùng một lúc, bằng cách sử dụng ba bản sao của chương trình, ba luồng hoặc thực sự tung hứng các bộ mô tả tệp trong một luồng, có thể trong một luồng vòng lặp select () lớn.
Chris Stratton

1
Bạn có thể sử dụng trình duyệt từ Pi. Mỗi tab là một máy khách, mỗi tab có thể truy cập một máy chủ khác nhau. Vấn đề ở đâu? Nếu trình duyệt có thể làm điều đó, thì mã của bạn cũng vậy. Thật đơn giản
Mawg nói rằng phục hồi Monica

1
Các câu hỏi về mã hóa có thể được hỏi tốt hơn tại stackoverflow.com Đặc biệt vì đây là một câu hỏi HTTP hoàn toàn độc lập với thiết bị
Mawg nói rằng phục hồi Monica

Câu trả lời:


6

Tôi đã tìm thấy một giải pháp cơ bản tốt cho những gì @Chris Stratton đề cập đến một kết nối tcp được giữ nguyên:

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"

Bạn nên tạo một vòng lặp vĩnh cửu chờ 0,1 giây và sau đó thực hiện một trong các bước này giữa kết nối và đóng để kết nối chỉ được gọi một lần khi bắt đầu và chỉ đóng khi cực kỳ cần tắt mọi thứ.

Với chủ đề, một khi các công trình trước:

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() 

Nguồn:

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

/programming/2846653/how-to-use-threading-in-python

/programming/510348/how-can-i-make-a-time-delay-in-python


3

Có lẽ các liên kết sau có thể giúp bạn:

Ví dụ về ứng dụng khách cơ bản: https://docs.python.org/2/l Library / asyncore.html # asyncore- example-basic-http-client

Ví dụ về máy chủ tiếng vang cơ bản: https://docs.python.org/2/l Library / asyncore.html # asyncore-example-basic -echo-server

Ngoài ra, bạn đã nghĩ về việc sử dụng giao thức UDP? nó có thể tốt hơn ...

Và tôi sẽ tư vấn về HTTP / 1.0, theo như tôi biết, không bắt buộc trong quá trình triển khai, để giữ cho các kết nối tồn tại, được xác định trong HTTP / 1.1; dù sao nó phụ thuộc vào việc thực hiện, nó có thể có hoặc không thể.


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()

1
Làm thế nào điều này giúp mọi thứ? Bạn dường như đang cung cấp một ví dụ tầm thường về việc tạo kết nối HTTP một cách khó khăn, nhưng điều đó mang lại điều gì trong việc giải quyết vấn đề thực tế của câu hỏi - tức là, điều này giúp người dùng thăm dò nhiều thiết bị như thế nào?
Chris Stratton
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.