давний скрытень, первый плакат. Спасибо за ваше время.
1. Обобщите проблему. Я работаю с Python 2 и Raspberry Pi 4, работающим под управлением Raspbian Buster. Пытаюсь ограничить скорость, с которой моя программа считывает данные датчиков с моего устройства Android, которое использует сокеты для отправки данных через UDP-соединение. IE: Я создал это как небольшое приложение для лазерной путевой проволоки, и для начала я хотел увеличивать счетчик счетчика каждый раз, когда значение датчика опускается ниже определенного числа, указывая на сработавший лазер. Однако данные считываются так быстро, что счет увеличивается много раз каждый раз, когда уровень датчика падает ниже. Как я могу читать данные UDP только каждые X секунд?
2. Опишите, что вы пробовали - я пробовал time.sleep (), но, судя по тому, что я прочитал, это функция блокировки, и после тестирования она действительно не позволяет моей программе обновлять данные датчика через UDP. сокет - я пробовал использовать потоки, но не могу понять, как передавать данные датчика из одного потока в другой. - Я исследовал join (), но техническая документация, с которой я столкнулся, была не очень удобна для новичков. - В некоторых публикациях здесь рекомендуется настроить интерфейс клиент / сервер, но я тоже не знаю, как это сделать.
3. При необходимости покажите код. Вот мой текущий прогресс для многопоточного решения. Я использую приложение android под названием SensorUDP, и при включенном датчике внешней освещенности и активированной функции отправки данных эта программа будет считывать данные UDP и печатать их. даже без данных UDP он все равно будет запускать поток подсчета.
import socket
from struct import *
import time
import threading
#We have 0-92 over a 1024 byte buffer representing distinct
#sensors being sent over UDP from my android smartphone
#this test program im only pulling byte 56 for Ambient Light sensing
#a laser shining into my phones sensor has 30,000-50,000 lums so anything
#less then that range must mean the laser was tripped
#UDP = SOCK_DGRAM, AF_INET = Internet
UDP_IP = "192.168.1.149" #my rpi4 address
print "Receiver IP: ", UDP_IP
UDP_PORT = 5000 #arbitrary for now but needs to match my androids broadcast
print "Port: ", UDP_PORT
sock = socket.socket(socket.AF_INET, # Internet
socket.SOCK_DGRAM) # UDP
sock.bind((UDP_IP, UDP_PORT)) #complete the binding
running = True
count = 0
laserOn = 1000 #using a low lums to test so I dont have to use laser every time
aLight = 0
result_available = threading.Event() #.set() this when the data is recieved
threadTimer = 5
def calcAmbLight():
# Continuously read from the UDP socket
while running:
data, addr = sock.recvfrom(1024) # buffer size is 1024 bytes
#the data from the app Im using to push the sensor data needs to
#be unpacked
aLight = "%.1f" %unpack_from ('!f', data, 56)
print ("Ambient Light = ", aLight)
def displayCount():
count = 0
while running:
time.sleep(1)
#how to pass aLight into this thread from the other thread?
if aLight < laserOn:
count = count + 1
print("Current aLight: ",aLight)
print("Current Count: ", count)
if __name__ == '__main__':
#create a basicthread to run calcAmbLight
calcAmb = threading.Thread(target= calcAmbLight)
calcAmb.start()
dispCount = threading.Thread(target = displayCount)
dispCount.start()