Hallo liebe Leute ...
ich bin neu und unwissend am Pi ;-).
Ich bräuchte bitte eure Hilfe bei der Datenübertragung zu einer Webseite.
ich habe ein Programm was ohne weiteres funktioniert:
Code
#!/usr/bin/env python
# -*- coding: utf8 -*-
import socket #for sockets
import sys #for exit
try:
#create an AF_INET, STREAM socket (TCP)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
except socket.error, msg:
print 'Failed to create socket. Error code: ' + str(msg[0]) + ' , Error message : ' + msg[1]
sys.exit();
print 'Socket Created'
host = '192.168.33.172'
port = 80
try:
remote_ip = socket.gethostbyname( host )
except socket.gaierror:
#could not resolve
print 'Hostname could not be resolved. Exiting'
sys.exit()
print 'Ip address of ' + host + ' is ' + remote_ip
#Connect to remote server
s.connect((remote_ip , port))
print 'Socket Connected to ' + host + ' on ip ' + remote_ip
x = "32.234"
y = "nc."
z = "nc."
#Send some data to remote server
#message = "GET / HTTP/1.1\r\n\r\n"
message = "GET /insert2.php?x=" + x + "&y=" + y + "&z=" + z + \
" HTTP/1.1\r\nHost: " + host + "\r\n\r\n\r\n"
try :
#Set the whole string
s.sendall(message)
except socket.error:
#Send failed
print 'Send failed'
sys.exit()
print 'Message send successfully'
Alles anzeigen
nun habe ich ein weiteres Programm, welches mit die Daten von einem Sensor ausliest.
Wenn ich nun das Programm in dieses einbaue,
werden keine Daten an den Webserver geschickt.
hat einer eine Idee warum ?
Irgendwo ist da der Wurm drin und ich finde ihn nicht.
Python
#!/usr/bin/python
# -*- coding: utf8 -*-
import io # FileStreams benutzen
import fcntl # I2C Parameter benutzen
import time # benutzen fuer sleep delay und timestamps
import string # fuer String-parsing
import socket # fuer Internet Verbidungen
import math
import requests
import sys
x=y=z = 0
class AtlasI2C:
long_timeout = 1.5 # Timeout wird benoetigt um Querys zu lesen und zur Kalibrierung
short_timeout = .5 # Timeout fuer normale Commands
default_bus = 1 # der default bus fuer I2C
default_address = 102 # Basis-Addresse fuer den Sensor
current_addr = default_address
def __init__(self, address=default_address, bus=default_bus):
# 2 File-Streams oeffnen, eines fuer lesen und einen fuer schreiben
# Der genaue I2C-Chanal ist mir dem Bus ausgewaehlt
# Bei neueren RasPis (2 und 3) ist der Bus 1, bei aelteren 0
# wb und rb fuer lesen und schreiben
self.file_read = io.open("/dev/i2c-"+str(bus), "rb", buffering=0)
self.file_write = io.open("/dev/i2c-"+str(bus), "wb", buffering=0)
# I2C-Bus mit default-Adresse oder mit vom user gewaehlter Adresse iniziieren
self.set_i2c_address(address)
def set_i2c_address(self, addr):
# setzt die Adresse fuer die I2C-Komunikation zum Slave
# Die Befehle fuer die I2C dev benutzen die ioctl Funktionen, welche im:
# i2c-dev.h File von den i2c-tools sind
I2C_SLAVE = 0x703
fcntl.ioctl(self.file_read, I2C_SLAVE, addr)
fcntl.ioctl(self.file_write, I2C_SLAVE, addr)
self.current_addr = addr
def write(self, cmd):
# fuegt die null-Zeichen zum String hinzu und sendet diese ueber I2C
cmd += "\00"
self.file_write.write(cmd)
def read(self, num_of_bytes=31):
# liest definierte Zeichenanzahl vom I2C, danach das Ergebnis verarbeiten und anzeigen
res = self.file_read.read(num_of_bytes) # einlesen vom Board
response = filter(lambda x: x != '\x00', res) # die Nullen entfernen um das Ergebnis zu kuerzen
if ord(response[0]) == 1: # wenn die Antwort kein Error (Fehler) ist
# alle empfangenen MSB Bit umwandeln zu 0, ausser das Erste und Liste erstellen
char_list = map(lambda x: chr(ord(x) & ~0x80), list(response[1:]))
return " Aktuelle Temperatur: " + ''.join(char_list) # Char-Liste in String umwandeln und zurueckgeben
else:
return "Error " + str(ord(response[0]))
def query(self, string):
# ein Kommando zum Board schreiben, das Timeout abwarten, und den zurueckgegebenen Wert einlesen
self.write(string)
# Das Lese und Kalibrieren Kommando braucht ein laengeres timeout
if((string.upper().startswith("R")) or
(string.upper().startswith("CAL"))):
time.sleep(self.long_timeout)
elif string.upper().startswith("SLEEP"):
return "sleep mode"
else:
time.sleep(self.short_timeout)
return self.read()
def close(self):
self.file_read.close()
self.file_write.close()
def main():
device = AtlasI2C()
#print(">> Temperatur auslesen")
delaytime = AtlasI2C.long_timeout
# die Informationen vom ausgewaehlten Board einlesen
info = string.split(device.query("I"), ",")[1]
print(device.query("R"))
# Wert der Variable zuweisen, zum weiter verarbeiten
# =========== edit BkuP begin ===========================
# x = join(char_list)
x = (device.query("R"))
y = "nc."
z = "nc."
time.sleep = AtlasI2C.long_timeout
try:
#erzeuge AF_INET, STREAM socket (TCP)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
except socket.error, msg:
print 'Fehler bei Socket Erzeugung. Error code: ' + str(msg[0]) + ' , Error message : ' + msg[1]
sys.exit();
print 'Socket erzeugt'
# Ziel IP und Port angeben
host = '192.168.33.172'
port = 80
try:
remote_ip = socket.gethostbyname( host )
except socket.gaierror:
#Hostaufloeasung nicht moeglich
print 'Hostname konnte nicht aufgeloest werden, breche ab'
sys.exit()
print 'Ip Addresse von ' + host + ' ist ' + remote_ip
#verbinden zum Remote Server
s.connect((remote_ip , port))
print 'Socket verbunden zu ' + host + ' auf IP ' + remote_ip
message = "GET /insert2.php?x=" + x + "&y=" + y + "&z=" + z + \
" HTTP/1.1\r\nHost: " + host + "\r\n\r\n\r\n"
try :
#Daten uebertragen
s.sendall(message)
except socket.error:
#Senden fehlgeschlagen
print 'Senden fehlgeschlagen'
sys.exit()
print 'Daten erfolgreich uebertragen'
# =========== edit BkuP end ===========================
if __name__ == '__main__':
main()
Alles anzeigen
vom Bauchgefühl her hat es vielleicht etwas mit der def main() hier zu tun ???
herzlichen Dank schon einmal für die Hilfe und Anregungen
BkuP