Python: Skapa bytes från int och float

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Python: Skapa bytes från int och float

Inlägg av Magnus_K »

Hej hej,

Försöker skicka lite data via TCP med hjälp av python-biblioteket "socket", men blir inte klok på hur datan ska se ut.
Egentligen förstår jag inte så mycket av python över huvud taget.

Både när jag testar att skicka en int eller en float så får jag felmeddelandet 'int'/'float' does not support the buffer interface. Sökning på det meddelandet ger ganska mycket träffar men jag förstår fortfarande inte riktigt vad jag ska göra.
Ska jag "packa" integern till bytes(?) och sedan skicka dessa bytes? Hur gör jag då om integern är flera bytes?
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43178
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Python: Skapa bytes från int och float

Inlägg av sodjan »

> ...men jag förstår fortfarande inte riktigt vad jag ska göra.

Du kan börja med att visa en kort "reproducer" som uppvisar problemet.
Det är enklare när man har något att titta på och att eventuellt testa. :-)
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Python: Skapa bytes från int och float

Inlägg av Magnus_K »

Har fortfarande inte lyckats klura ut hur man kopierar koden mellan min remote desktop och lokala datorn men har skrivit av den relevanta koden nedan.

Första testet går alltså ut på att skicka en etta till TCP-servern, 1 gång per sekund.
Jag får ut printen men sedan felmeddelandet enligt första inlägget (som hänvisar till sock.send()). Det är så jäkla retligt för jag finner massa information om det på nätet men får ändå inte ihop det.
Det verkar som att jag ska göra om integern till bytes och sedan "encode":a denna.

Kod: Markera allt

from time import sleep
import struct
import socket
import sys


def sendSample(sample):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_address = ('192.168.1.8', 5004)
    sock.connect(server_address)
    print("Connected with %s via %s" % server_address)
    sock.send(sample)
    sock.close()


while True:
    testsample = 1
    sendSample(testsample)
    sleep(1)
johano
Inlägg: 1943
Blev medlem: 22 januari 2008, 10:07:45
Ort: Stockholm

Re: Python: Skapa bytes från int och float

Inlägg av johano »

Om du vill skicka binära data så kolla in struct-modulen och funktionen pack()

Kod: Markera allt

import struct
i=1
bytes = struct.pack("I", i)
socket.send(bytes)
Annars hade jag nog gått på att skicka data i "strängformat", t.ex. JSON eller XML eller någon eget påhittat format, det är
så oändligt mycket lättare att felsöka med sniffers o.dyl. när data är i strängform...

/j
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: Python: Skapa bytes från int och float

Inlägg av lillahuset »

Hur är du uppkopplad mot din remote desktop och vad har du för OS i värddatorn?

Om du kör ssh och Linux på värden markerar du texten och kopierar med <shift><ctl>C och klistrar in med <shift><ctl>V.

Om du kör ett terminalfönster i windows med RPi-konsolen i har jag för mig att du kan välja text genom att högerklicka i terminalfönstret och även klistra in genom att högerklicka. Men jag är inte helt säker.
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Python: Skapa bytes från int och float

Inlägg av Magnus_K »

Tack johano!
Nu gav det inga felmeddelanden men programmet låser sig i sändningen efter 1-4 sändningar.
Misstänker det är för att jag inte sköter socket-hanteringen korrekt, eller något sånt. Lite knepigt att det sker med olika intervall dock :humm:
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Python: Skapa bytes från int och float

Inlägg av Magnus_K »

@lillahuset:
Värddatorn kör på W7 och uppkopplad mot RPi:n via TightVNC Viewer. Kom precis på att jag kan ju faktiskt öppna EF i RPi:ns browser och göra inlägget där :doh:
janno
Inlägg: 405
Blev medlem: 11 oktober 2009, 07:34:45
Ort: Västerås

Re: Python: Skapa bytes från int och float

Inlägg av janno »

Magnus_K skrev:Har fortfarande inte lyckats klura ut hur man kopierar koden mellan min remote desktop och lokala datorn men har skrivit av den relevanta koden nedan.
Jag brukar använda WinSCP (https://winscp.net/eng/index.php) för att synca och/eller kopiera filer mellan pajen o PCn.
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Python: Skapa bytes från int och float

Inlägg av Magnus_K »

Ah, prefekt, tackar. Ska kika mer på lite senare.
Nu fastnar programmet i sendSample-funktionen. Ska se om jag kanske missat något vitalt.
Användarvisningsbild
tecno
Inlägg: 27039
Blev medlem: 6 september 2004, 17:34:45
Skype: tecnobs
Ort: Sparreholm, Södermanland N 59° 4.134', E 16° 49.743'
Kontakt:

Re: Python: Skapa bytes från int och float

Inlägg av tecno »

janno skrev:
Magnus_K skrev:Har fortfarande inte lyckats klura ut hur man kopierar koden mellan min remote desktop och lokala datorn men har skrivit av den relevanta koden nedan.
Jag brukar använda WinSCP]

Intressant, visste inte att WinSCP funkade i RPi.
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: Python: Skapa bytes från int och float

Inlägg av lillahuset »

Du kör WinSCP i din hjärndöda windowsburk och RPi pratar det standardiserade protokollet scp. Som vanligt alltså. :lol:
Användarvisningsbild
tecno
Inlägg: 27039
Blev medlem: 6 september 2004, 17:34:45
Skype: tecnobs
Ort: Sparreholm, Södermanland N 59° 4.134', E 16° 49.743'
Kontakt:

Re: Python: Skapa bytes från int och float

Inlägg av tecno »

Nu ska fabbo int va sån :wink:
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Python: Skapa bytes från int och float

Inlägg av Magnus_K »

Nej, det är något som "krashar" socketen, eller hur man nu bäst kan beskriva det.
När jag byter till en ny port så skickas meddelandet bara en gång och sen låser det sig under sock.connect().

Skulle någon ha ork och provköra det vore jag hemskt tacksam.
Kan också säga att jag har en netcat-server som sitter och lyssnar i andra ändan, om det spelar någon roll.

Nu är det saxat direkt ur mitt program:

Kod: Markera allt

from time import sleep
import os
import math
import struct
import socket
import sys

def sendSample(samp):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_address = ('192.168.1.8', 5003)
    sock.connect(server_address)
    print("Connected with: %s on %s" % server_address)
    bytes = struct.pack("f", samp)
    sock.send(bytes)
    sock.close()

while True:
    testsample = 1.5
    sendSample(testsample)
    sleep(1)
Användarvisningsbild
maDa
Inlägg: 4076
Blev medlem: 11 november 2005, 22:13:16
Ort: Malmö
Kontakt:

Re: Python: Skapa bytes från int och float

Inlägg av maDa »

Finns det en anledning att du gör en ny socket varje gång?

Detta rullar på för mig:

Kod: Markera allt

from time import sleep
import os
import math
import struct
import socket
import sys
 
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_address = ('192.168.3.20', 80)
sock.connect(server_address)
print("Connected with: %s on %s" % server_address)
 
while True:
    testsample = 1.5
    bytes = struct.pack("f", testsample)
    sock.send(bytes)
    print("sent sample %f" % testsample)
    sleep(1)

sock.close()
Men jag skulle nog rekommendera dig att använda något beprövat för detta. t.ex HTTP eller MQTT beroende på vad du tänkt skicka för data.
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Python: Skapa bytes från int och float

Inlägg av Magnus_K »

Det var "lösningen" maDa, klockrent.
Enda anledningen till varför jag skapade en ny socket för varje överföring var för att jag inte visste att man fick behålla den öppen, trodde den typ blockerar något i så fall.

I slutändan tänkte jag försöka få den här informationen till en app men måste först hitta en lämplig app och sedan klura ut vad för protokoll som används mest idag för liknande manövrar, sen göra om funktionen så programmet fräser ur sig sånt i stället.
Får dock hjärtsvikt bara av att tänka tanken...

Ska söka lite på vad vad HTTP och MQTT är. Tack för hjälpen och att du tog dig tid att testa :tumupp:
Skriv svar