簡體   English   中英

如何使用 PIR 傳感器將信息從客戶端發送到服務器端 [WinError 10057]

[英]How can I send information from client side to server side using PIR-sensor [WinError 10057]

我們是兩個學生,正在做一個學校項目。 任務是將 PIR 傳感器(運動傳感器)連接到樹莓派,每當傳感器檢測到運動時,它應該向運行 Windows Server 2019 的 AD/DNS 服務器上的文本文檔發送一個字符串。我們正在使用 Python 和我們用於客戶端的代碼(運行 PIR 傳感器的 Raspberry Pi)使用以下代碼:

import RPi.GPIO as GPIO
import time
import datetime
import socket

GPIO.setmode(GPIO.BCM)
pir = 24

GPIO.setup(pir, GPIO.IN)

print ("Sensor initializing...")
time.sleep(2)
print ("active")
print ("press ctrl+c to end program")

mouvement = "Motion detected at "


while True:
       if GPIO.input(pir) == True:
           now = datetime.datetime.now()
           fb = open("/home/pi/Projekt/pirsensor.txt", "a+")
           #print (mouvement)
           print(now.strftime("%Y-%m-%d %H:%M:%S "))
           fb.write(mouvement)
           fb.write(now.strftime("%Y-%m-%d %H:%M:%S "))
           fb.write("\n")
           fb.close()
           s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
           s.connect(('192.168.1.3', 5007))
           s.send(mouvement)
           s.send(now.strftime ("%Y-%m-%d %H: %M: %S "))
           s.send("\n")
           s.close()
    #time.sleep(2)
#time.sleep(0.1)         
GPIO.cleanup()
print (" program ended")

我們用於 Windows Server 2019 的代碼如下:

from socket import *
port = 5007
file = ''
class Server:
    gate = socket(AF_INET, SOCK_STREAM)   
    host = '192.168.1.3'
    def __init__(self, port):
        self.port = port
        self.gate.bind((self.host, self.port))  
        self.listen()

    def listen(self):
        self.gate.listen(10)
        while True:
            print("Lyssnar på anslutningar, via port: ", self.port)
            add = self.gate.accept()
            self.reciveFileName()
            self.reciveFile()


    def reciveFileName(self):
        while True:
            data = self.gate.recv(1024)
            self.file = data

    def reciveFile(self):
        createFile = open("new_"+self.file, "wb")
        while True:
            data = self.gate.recv(1024)
            createFile.write(data)
        createFile.close()
server= Server(port)
listen()

兩台設備都運行在同一個 LAN 網絡上,並且擁有靜態 IP 地址。 我們能夠相互 ping 並能夠將來自帶有 PIR 傳感器的 Raspberry pi 的信息發送到 Windows Server 2019 機器。 但是,我們有一個問題。 當我們在 Raspberry pi 上運行代碼並等待我們的服務器接收數據時,我們收到以下錯誤:

[WinError 10057] 不允許發送或接收數據的請求,因為套接字未連接並且(使用 sendto 調用在數據報套接字上發送時)未提供地址

查看錯誤圖片

我們被這個錯誤困住了,不知道如何解決它。 我們一直在網上搜索,但我們只找到了 2006 年的主題,沒有任何幫助。 還值得注意的是,我們已嘗試禁用防火牆。 我們也沒有用 Python 編碼的經驗。

這可能是因為每次while循環迭代時都會創建一個新的套接字。 最好在循環外聲明並連接您的套接字,並且只從循環內發送數據:

mouvement = "Motion detected at "

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('192.168.1.3', 5007))

while True:
       if GPIO.input(pir) == True:
           now = datetime.datetime.now()
           fb = open("/home/pi/Projekt/pirsensor.txt", "a+")
           #print (mouvement)
           print(now.strftime("%Y-%m-%d %H:%M:%S "))
           fb.write(mouvement)
           fb.write(now.strftime("%Y-%m-%d %H:%M:%S "))
           fb.write("\n")
           fb.close()
           s.send(mouvement)
           s.send(now.strftime ("%Y-%m-%d %H: %M: %S "))
           s.send("\n")
    #time.sleep(2)
#time.sleep(0.1)
s.close()
GPIO.cleanup()
print (" program ended")

這應該給您的套接字足夠的時間來初始化、連接、發送和關閉。 另一個好處是循環在等待連接時不應阻塞,從而使程序運行得更快。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM