我如何使用PIR传感器[WinError 10057]将信息从客户端发送到服务器端

问题描述 投票:1回答:1

我们是两名学生,正在从事一个学校项目。任务是将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调用在数据报套接字上发送时,未提供地址)

See image of the error

我们被困在此错误上,不知道如何解决。我们一直在搜索网络,但只找到2006年以来的主题,它们都没有任何帮助。还值得注意的是,我们已尝试禁用防火墙。我们也没有使用Python进行编码的经验。

python sockets server raspberry-pi windows-server-2019
1个回答
0
投票

可能是因为每次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")

这应该给您的套接字足够的时间来初始化,连接,发送和关闭。这样做的另一个好处是,在等待连接时不应阻塞循环,从而使程序运行更快。

© www.soinside.com 2019 - 2024. All rights reserved.