#python #android #bluetooth #python-asyncio #pyserial
Вопрос:
В настоящее время я работаю с подключением Bluetooth к raspberry pi4 и использую свое устройство Android. У меня есть две функции, одна из которых является основной, а другая-асинхронная функция, известная как receive с двумя аргументами reader и writer. Эта асинхронная функция подключается к устройству Bluetooth, такому как мой телефон Android, где я могу получать и отправлять сообщения на свой raspberry pi 4. Ниже я показал свой код для моей асинхронной функции и моей основной функции.
async def receive(reader, writer):
global led_on
global TamperEvents
global Threshold
minnum = str(5000)
byte_val_min = minnum.encode()
maxnum = str(10000)
byte_val_max = maxnum.encode()
try:
while True:
writer.write(b"Commands for Bluetooth Connectivityn")
writer.write(b"1. led onn")
writer.write(b"2. led offn")
writer.write(b"3. clearn")
writer.write(b"4. readn")
writer.write(b"5. threshn" )
data = await reader.readuntil(b'n')
status = data.strip().decode()
if (status == "led on"):
writer.write(b'LED is now enabledn')
led_on = 1
elif (status == "led off"):
writer.write(b'LED is now disabledn')
led_on = 0
elif (status == "clear"):
writer.write(b'Tamper event count has been clearedn')
TamperEvents = 0
elif (status == "thresh"):
value = ""
writer.write(b"Set a new Threshold : ")
adxlthresh = await reader.readuntil(b'n')
print(adxlthresh)
val = int.from_bytes(adxlthresh, "little")
print(val)
if adxlthresh <= byte_val_min:
Threshold = 5000
elif adxlthresh >= byte_val_max:
Threshold = 10000
else:
Threshold = 10000
writer.write(b'ADXL threshold has been set to: %d' % Threshold)
elif (status == "read"):
writer.write(b"Intrusion Count = %dn" % TamperEvents)
writer.write(b"Threshold Setting = %dn" % Threshold)
writer.write(b"LED enable = %dn" % led_on)
else:
writer.write("unknown command receivedn" )
except KeyboardInterrupt:
sys.exit(0)
async def main(port, baudrate):
global led_on
global halleffect
global TamperEvents
#Settling values for the HallSensor
calibrateHallSensor()
#Settling values for the LIS3DH
calibrate_Axes()
reader, writer = await serial_asyncio.open_serial_connection(url=port, baudrate=baudrate)
receiver = receive(reader, writer)
await asyncio.wait(([receiver]))
while True:
#continuous update on the write and read byte data for x,y,z, ADC raw readings
adc_Raw_Data()
#Coninuous update on the write and read byte data for hallsensor readings
hallSensor()
#Calculate how far the real-time reading is from the calibration point.
x = abs(xAccl - xcal)
y = abs(yAccl - ycal)
z = abs(zAccl - zcal)
#If any axis exceeds the threshold trigger alert
if (x > Threshold or y > Threshold or z > Threshold):
if (senseTilt()==0):
TamperEvents =1
print("Motion Trigger: x=%d, y=%d, z=%d" % (x,y,z))
if (led_on):
blinkLED(.2)
calibrate_Axes()
#If hall sensor value exceeds the threshold trigger alert
halleffect = abs(PinA1 - calhall)
if ((halleffect > Upper_Hall_Threshold) or (halleffect < Lower_Hall_Threshold)):
tamperCountHallSensor(TamperEvents)
#wait 10ms between each sampling of the LIS3DH
time.sleep(.01)
if __name__ == '__main__':
port = sys.argv[1]
baudrate = sys.argv[2]
loop = asyncio.get_event_loop()
loop.run_until_complete(main(port, baudrate))
loop.close()
Проблема, с которой я сталкиваюсь с моим кодом, связана с функцией подключения Bluetooth receive. Где один раз эта функция вызывается в моей основной функции и используется строка await asyncio.wait([приемник]). Больше ничего не работает, в этот момент он застревает, и я хочу иметь возможность запускать эту программу, когда одновременно работают и подключение по Bluetooth, и моя основная функция. Таким образом, пользователь может в любое время ввести любое сообщение с устройства Bluetooth, а также увидеть другие результаты. Есть ли другой способ использовать эту строку, чтобы пользователь мог вводить данные в любое время?