[Python2.7 > Python3] migratie van Socket.senda(bytearray())

Pagina: 1
Acties:

Vraag


  • Dogooder
  • Registratie: April 2004
  • Laatst online: 14:23
Voor het uitlezen van mijn Zeversolar zonnepanelen inverter heb ik al jaren een Python2.7 script draaien. Nu heb ik door een ondoordachte update mij in een dependency puinhoop gebracht. Om dit op te lossen wilde ik mijn script omzetten van Python2.7 naar Python3.
Alleen loop ik tegen het volgende probleem aan:
In python2.7
Python:
1
2
3
4
5
6
7
def send(self):
     #calculate and append checksum
     tmp_request = bytearray()
     tmp_request = self._request + struct.pack("<H", crc16(bytes(self._request)))
     print("send")
     print(":".join("{:02x}".format(c) for c in tmp_request))
     self._socket.sendall(tmp_request)

Dit geeft het volgende en krijgt gewoon antwoord van de inverter.
code:
1
2
send
03:04:00:26:00:02:91:e2


Nu weet ik dat tussen Python2.7 en Python3 iets anders zit met bytearray(), in python2.7 was het onderwater een string, maar in Python3 een array met bytes.

Nu bijna hetzelfde in Python3, maar ik krijg geen enkel antwoord van de inverter. Het lijkt er op dat er dus iets anders over de lijn wordt gestuurd.
Python:
1
2
3
4
5
6
7
8
     #calculate and append checksum
     tmp_request = bytearray()
     #tmp_request = self._request + struct.pack("<H", crc16(bytes(self._request))) //crc16mod not available in Python3
     tmp_request = self._request + crc16(self._request) //crc16 returns struck.pack('H',crc) 
     print("send")
     print(":".join("{:02x}".format(c) for c in tmp_request))
     print(tmp_request)
     self._socket.sendall(bytes(tmp_request))  //unknown try to make bytes from bytearray()

Dit geeft het volgende en krijgt geen antwoord van de inverter. Maar de print lijkt hetzelfde.
code:
1
2
send
03:04:00:26:00:02:91:e2


Ik heb verschilldende pogingen gedaan, om het bijvoorbeeld naar string te converteren met .decode(), of bytes(data,'utf-8') maar eigen begrijp ik niet goed waarom het werkt in Python2.7 en niet in Python3.

Tot zo ver ik voorbeelden op internet vind over socket.sendall() wordt daar altijd al een string gebruikt als msg.
Wie kan mij weer een beetje op weg helpen?

Beste antwoord (via Dogooder op 25-09-2021 21:46)


  • Matis
  • Registratie: Januari 2007
  • Laatst online: 11-07 17:00

Matis

Rubber Rocket

In jouw geval zou ik beginnen met het installeren van een IDE, PyCharm Community is een Python IDE voor niet-commercieel gebruik.
Daarna kun je beginnen met debuggen.

Je kunt eventueel met verschillende virtual environments in Python experimenteren met meerdere Python versie.

Dan zie je hopelijk/mogelijk wat het verschil is tussen de Python 2.7 en Python 3.x (3.9 bij voorkeur) code en de waardes die de functies verwachten.

[ Voor 34% gewijzigd door Matis op 22-09-2021 11:53 ]

If money talks then I'm a mime
If time is money then I'm out of time

Alle reacties


Acties:
  • Beste antwoord
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 11-07 17:00

Matis

Rubber Rocket

In jouw geval zou ik beginnen met het installeren van een IDE, PyCharm Community is een Python IDE voor niet-commercieel gebruik.
Daarna kun je beginnen met debuggen.

Je kunt eventueel met verschillende virtual environments in Python experimenteren met meerdere Python versie.

Dan zie je hopelijk/mogelijk wat het verschil is tussen de Python 2.7 en Python 3.x (3.9 bij voorkeur) code en de waardes die de functies verwachten.

[ Voor 34% gewijzigd door Matis op 22-09-2021 11:53 ]

If money talks then I'm a mime
If time is money then I'm out of time


  • Ben(V)
  • Registratie: December 2013
  • Laatst online: 14:49
Je kunt six gebruiken voor de juiste conversie.
Zoiets werkt voor zowel python 2 als python 3:
import six
self._socket.sock.sendall(six.b(tmp_request))

[ Voor 19% gewijzigd door Ben(V) op 22-09-2021 14:21 ]

All truth passes through three stages: First it is ridiculed, second it is violently opposed and third it is accepted as being self-evident.


  • thlst
  • Registratie: Januari 2016
  • Niet online
Dogooder schreef op woensdag 22 september 2021 @ 10:39:
Dit geeft het volgende en krijgt geen antwoord van de inverter. Maar de print lijkt hetzelfde.
Het is handig om een hexdump te doen voor verschillen in bijv \r \n \0

Acties:
  • +2 Henk 'm!

  • Dogooder
  • Registratie: April 2004
  • Laatst online: 14:23
Als afsluiter:
Na gebruik van debuggers, virtual environments en het maken van een mock van de inverter, zodat ik ook kan testen terwijl de inverter uit staat, Er achter gekomen dat het eigenlijke probleem aan de ontvangende kant zat. Dat zat een beetje funky in elkaar, eigenlijk vraag ik mij af waarom het ooit gewerkt heeft. Maar goed, dat opgelost en nog 83 andere string to bytes/bytearray swaps en het lijkt weer te werken. Nu met python3.