przypisanie znaków string do zmiennych

0

Witam potrzebuje przypisać do dwóch zmiennych dwie cyfry ze string dostaje b'222' wypisuje mi normalnie x i y ale gdy chce to gdzieś wstawić np do timesleep(y) .
to dostaje następujący błąd

TypeError: unsupported types for __lt__: 'int', 'str'

A to co zrobiłem

data = sock.recv(1024)
  while data:
    num=data
    num=int(num)
    num=str(num)
    x=num[0]
    y=num[1:3]
    print(x)
    print(y)

jeżeli używam tej formy :

while data:
    num=data
    num=int(num)
`` 
wszystko działa tylko mam jedną zmienną a potrzebuje dwóch
0

Wyślij '2 22', nie '222' i dalej:

data = sock.recv(1024)
while data:
  x, y = [int(n) for n in data.decode('ascii').split(' ')]

W micropythonie granica między bytes a str (tzn. bytes obsługuje kilka metod, których normalny python nie obsługuje*) jest troszkę rozmyta i nie zawsze trzeba używać decode, ale lepiej dmuchać na zimne.

* https://docs.micropython.org/en/latest/genrst/index.html

0

No niestety

IndentationError: unindent doesn't match any outer indent level
0

Zrobiłem Coś takiego lecz bez wiekszego efektu
screenshot-20200105154511.png

0

Nie wiem jak to poprawić już jest invalid syntax
screenshot-20200105160344.png

0

Błędów sie pozbyłem lecz nic nie dekoduje
screenshot-20200105170100.png

0

tutaj jest cały kod

import pycom
import time
import machine
import pycom
import socket
from pysense import Pysense
from SI7006A20 import SI7006A20
from MPL3115A2 import MPL3115A2,PRESSURE


#tempValue = 1024
host = '192.168.0.104'
port = 80

tcp_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM , socket.IPPROTO_TCP)
tcp_sock.bind(('0.0.0.0', 80))
tcp_sock.listen(5)

while True:
  sock, addr = tcp_sock.accept()
  print('incoming connection from {}'.format(addr))

  data = sock.recv(1024)
       while data:
        x, y = [int(n)]
for n in data.decode('ascii').split(' '):
        print(x)
        print(y)
for i in range(0,1):
        time.sleep(1)
        py = Pysense()
        si = SI7006A20(py)
        mpp = MPL3115A2(py,mode=PRESSURE)
        pressurevalue = mpp.pressure()
        humidityValue = si.humidity()
        contentStr ='{"DeviceName" : "fipyesp32" , "Humidity" : "%.2f" ,  "Pressure" : "%.2f"}'%(humidityValue,pressurevalue)
        postStr = 'POST /radofipy/InsertfipyIOTjsonRESTData2.php HTTP/1.1\r\n'
        hostStr = 'Host:%s:%s\r\n'%(str(host),str(port))
        contentTypeStr = 'Content-Type:application/json\r\n'
        contentLengthStr = 'Content-Length:%s\r\n\r\n'%str(len(contentStr))
        payload= postStr + hostStr+ contentTypeStr + contentLengthStr + contentStr
        print(payload)

        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM,socket.IPPROTO_TCP )
        s.connect((host,port))
        s.send(payload.encode())
        svrResponse = s.recv(4096)
        print(svrResponse)
        s.close ()
        time.sleep(60)
        sock.close()
        break
1
while True:
  sock, addr = tcp_sock.accept()
  print('incoming connection from {}'.format(addr))

  data = sock.recv(1024)

  # Musisz się koniecznie zdecydować ile wynosi twoje bazowe wcięcie
  # ja tutaj wcinam po 2 spacje.

  while data:
    x, y = [int(n)]

# To ci się już nie ma prawa wykonać, bo powyżej masz nieskończoną pętlę
for n in data.decode('ascii').split(' '):
        print(x)

Czyli ostatecznie:

while True:
  sock, addr = tcp_sock.accept()
  print('incoming connection from {}'.format(addr))

  data = sock.recv(1024)

  # Musisz się koniecznie zdecydować ile wynosi twoje bazowe wcięcie
  # ja tutaj wcinam po 2 spacje.

  # czyli jak masz zagnieżdżone pętle, to muszą być względem siebie wcięte o 2

  # while True:
  #   while True:
  #     while True:
  #       pass

  while data:
    # Tu poczyniamy niebezpieczne założenie, że dane zawsze
    # będą mieć taki sam format, czyli string z dwiema liczbami
    # jak wyślesz coś innego, to ci wywali wyjątek, no ale to już
    # rozwiążesz sam
    x, y = [int(n) for n in data.decode('ascii').split(' ')]
    print(x, y)

    for i in range(0,1):
      ...
      sock.close()
      break
0

teraz mam problem z php ponieważ wypisuje mi error że za dużo parametrów czyli 4 a robie to tak

<?php
echo"<span style=\"font-size: 20px;\"> Pomiar jest wykonywany proszę chwilę zaczekać </span>";

$host = "192.168.0.106";
$port = 80;
$output = $_POST['ile'];
$out =$_POST['jak'];
$socket1 = socket_create(AF_INET, SOCK_STREAM,0) or die("Could not create socket\n");

socket_connect ($socket1 , $host,$port ) ;

socket_write($socket1, $output,$out, strlen ( $output)) or die("Could not write output\n");

socket_close($socket1) ;
header('Refresh: 10; URL=http://localhost/radofipy/get.php'); 
?>
``
i taki błąd : Warning: socket_write() expects at most 3 parameters, 4 given
0

No to cyk do dokumentacji:

 socket_write ( resource $socket , string $buffer [, int $length = 0 ] ) : int

Ty próbujesz wysłać w środku dwa stringi. Musisz je połączyć w jeden.

0

Coś takiego stworzyłem
screenshot-20200106130944.png

0
  1. Co oznacza string($output)?
  2. Nawiasy kwadratowe w dokumentacji wskazują na to, że dany parametr jest opcjonalny - jeśli jednak chcesz go wykorzystać, nie musisz już tych nawiasów tam wrzucać (czyli powinieneś mieć socket_write($socket1, $output, $cokolwiekMaByćTymParametrem, 4);.
  3. Co oznacza :string or die()?
0

Nie no, kompletnie nie zrozumiałeś tego, co napisałem. Nie napisałem ci, żebyś kopiował sygnaturę z dokumentacji, tylko żebyś zauważył, że funkcja, którą wywołujesz nie oczekuje od ciebie dwóch stringów

socket_write($socket1,
  $output,$out, // <- tutaj, próbujesz przekazać dwa stringi, co nie zgadza się z sygnaturą funkcji
strlen ( $output)) or die("Could not write output\n");

tylko jednego stringa, który musisz utworzyć z tych twoich dwóch przez ich połączenie ze sobą.

1 użytkowników online, w tym zalogowanych: 0, gości: 1