簡體   English   中英

Raspberry Pi 4 python 代碼未從 php 運行

[英]Raspberry Pi 4 python code not run from php

我在 RaspberryPi 4 上有一個 python 代碼。如果我從終端運行它,它可以正常工作,但是如果我想從 php 代碼運行它,它就不起作用。 它有什么問題? 為什么在終端中正確運行,而不是從 php 運行? 謝謝。

python 代碼第 1 部分:

#!/usr/bin/python3

import os
import glob
import time
import board
import Adafruit_DHT
import urllib.request
from urllib.request import urlopen
from datetime import datetime
import socket
import re
import smtplib
from email.message import EmailMessage

#email
def email_alert(subject, body, to):
    msg = EmailMessage()
    msg.set_content(body)
    msg['subject'] = subject
    msg['to'] = to
    
    user = "xyz@gmail.com"
    msg['from'] = user
    password = "abcdef"
    
    server = smtplib.SMTP("smtp.gmail.com", 587)
    server.starttls()
    server.login(user, password)
    server.send_message(msg)
    
    server.quit()
    
    
# DECLARATIONS
now = datetime.now()                            # Get time right now
timestamp = now.strftime("%Y-%m-%d-%H:%M:%S")   # Format the timestamp
os.system('modprobe w1-gpio')                   # Adding 1-wire module to the kernel 
os.system('modprobe w1-therm')                  # Adding 1-wire therm module
base_dir = '/sys/bus/w1/devices/'               # Setting the base_dir
device_folder = glob.glob(base_dir + '28*')[0]  # Check if a Dallas DS18B20 is connected
device_file = device_folder + '/w1_slave'       # This file holds the temperature
#sensor_type = 11 #DHT sensor type 11/22
#sensor_pin = 7      #DHT sensor pin in GPIO
DHT_SENSOR = Adafruit_DHT.DHT11

DHT_PIN = 22    # = GPIO22; az alap a GPIO4

# Initial the dht device, with data pin connected to:
#dhtDevice = adafruit_dht.DHT11(board.D23)

python 代碼第 2 部分:

# Function to read raw temperature from the DS18b20
# It opens the device_file (/w1_slave), and reads the content, then close the file
def read_temp_raw():
    f = open(device_file, 'r')
    lines = f.readlines()
    f.close()
    return lines

# Function to read the temperature and format it to Celsius and Fahrenheit
def read_temp():
    lines = read_temp_raw()
    while lines[0].strip()[-3:] != 'YES':   
        time.sleep(0.2)
        lines = read_temp_raw()
    equal_pos = lines[1].find('t=')
    if equal_pos != -1:
        temp_string = lines[1][equal_pos+2:]
        temp_c = float(temp_string) / 1000.0
        global celsius
        celsius = temp_c
        temp_f = temp_c *9.0 / 5.0 + 32.0
        return temp_c, temp_f

# Function that reads the humidity and temperature from the DHT11
# It only saves and use the humidity
#humidity = 75
def read_humidity():
    global humidity
    #global temperature
    #humidity, temperature = Adafruit_DHT.read_retry(sensor_type, sensor_pin)
    humidity, temperature = Adafruit_DHT.read_retry(DHT_SENSOR, DHT_PIN)
    time.sleep(2)
    while True:
        if humidity is not None and temperature is not None:
            #print ('Data from sensor is OK. Humidity= {0:0.1f} %'.format(humidity))
            print("Temp={0:0.1f}*C  Humidity={1:0.1f}%".format(temperature, humidity))
            if humidity > 100:
                read_humidity()
            else:
                break
        else:
            print ('Error getting data from DHT.')

# Function to get the local hostname
# It is used for identify the "senor" in the mySQL database
def get_host_name():
    global local_hostname
    local_hostname = socket.gethostname()

# Function that get the external IP-adress
def get_external_ip_address():
    global external_ip
    url = "http://checkip.dyndns.org"           # This site return one line of text.
    my_request = urlopen(url).read()            # Read the URL
    res = re.findall(b'\d{1,3}', my_request)    # Search and findall integers in my_request
    my_ip_list = list(map(int, res))            # Clean up the list
    my_ip = str(my_ip_list)[1:-1]               # Remove the square brackets
    temp_ip = my_ip.replace(",", ".")           # Replace comma with periods
    external_ip = temp_ip.replace(" ", "")      # Replace <space> with none-space
    print ("External IP: " +external_ip)        # Print the External IP address as xxx.xxx.xxx.xxx

# Function that actualle sends data and adds it to the database
def send_data():
    print (timestamp)                           # For debug purpose
    print (celsius)                             # For debug purpose
    print (humidity)                            # For debug purpose
    print (local_hostname)                      # For debug purpose
    output = "http://example.com/rpi/add_temp.php?temp="+str(celsius) \
    +"&humi="+str(humidity)+"&time="+str(timestamp)+"&sensor="+str(local_hostname)+"&ip=" \
    +str(external_ip)                           # This is the string that is called by the urlopen
    print (output)                              # For debug purpose
    html = urlopen(output).read()               # Actually performing the call
    print (html)                                # For debug purpose

def main():
    read_temp()
    read_humidity()
    get_host_name()
    get_external_ip_address()
    send_data()
    #dhtDevice.exit()
    #GPIO.cleanup()
    email_alert("Hey", "Hello World", "xyz@gmail.com")
    #email_alert("Hey", "Hello World", "1234567891@vtext.com")
    
if __name__ == "__main__":
    main()

php 代碼:

<?php
// define the GPIO pins for the motor ouptput (Note: PiFace pins start at 200)


$output = shell_exec('/var/www/html/ds18b20_dht_mysql_v01.py 2>&1');
echo "<pre>$output</pre>";

?>

我得到的錯誤消息:

Traceback (most recent call last):
  File "/var/www/html/ds18b20_dht_mysql_v01.py", line 138, in 
    main()
  File "/var/www/html/ds18b20_dht_mysql_v01.py", line 128, in main
    read_humidity()
  File "/var/www/html/ds18b20_dht_mysql_v01.py", line 82, in read_humidity
    humidity, temperature = Adafruit_DHT.read_retry(DHT_SENSOR, DHT_PIN)
  File "/usr/local/lib/python3.7/dist-packages/Adafruit_DHT/common.py", line 94, in read_retry
    humidity, temperature = read(sensor, pin, platform)
  File "/usr/local/lib/python3.7/dist-packages/Adafruit_DHT/common.py", line 81, in read
    return platform.read(sensor, pin)
  File "/usr/local/lib/python3.7/dist-packages/Adafruit_DHT/Raspberry_Pi_2.py", line 34, in read
    raise RuntimeError('Error accessing GPIO.')
RuntimeError: Error accessing GPIO.

我可以看到問題出在 DHT11 溫度傳感器代碼上。 但我不明白為什么在終端上工作,為什么不在 php 上工作。

在您的方法中, read_humidity() 是對自身的調用。 是導致循環引用...

我嘗試直接從 Android 運行 this.py 文件。 但它不起作用。 .py 文件位置是 apache 服務器上的 /var/www/html/

                String command = "python3 http://192.168.1.49:8081/ds18b20_dht.py";
                try {
                    Process p = Runtime.getRuntime().exec(command);
                } catch (IOException e) {
                    e.printStackTrace();
                    Toast.makeText(getApplicationContext(), "Error", Toast.LENGTH_LONG).show();
                }

暫無
暫無

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

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