Context: am doua microcomputere (raspberry și un upboard). Unul face ceva procesare și trebuie să ii trimită celuilalt informații (string, json, oricum). Le voi monta undeva unde nu am conexiune internet și sunt curios: pot trimite informații între dispozitive dacă le leg cu un cablu utp?
Am reușit cu doua raspberry conectate la rețeaua locală și python socket. Una ascultă, cealaltă trimite hostname-ului primei cutii. Dar nu pot să fac același lucru cu jucăriile în afara unei conexiuni de rețea.
import socket, sys
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = 'raspberry.local'
# port = int(sys.argv[1])
s.connect((host, 12345))
s.send('{"data":"here"}')
if s.recv(1024) == "ACK!":
# all good
pass
In principiu da. Iti trebuie un cablu crossover atunci cand legi doua calculatoare intre ele. Daca nu gasesti de cumparat, poti sa faci si singur oarecum, deoarece e doar o chestie de aranjare a celor 8 fire din cablul de ethernet non-fibra.
Ping&friends ar trebui sa mearga si interfetele sa apara ca “up”, eventual si cu luminitele aferente.
Atentie foarte mare cum lucrezi cu sockeţii. Nimeni si nimic nu garanteaza ca toate datele sosesc “dintr-o bucata”, chiar daca teoretic viteza de transmisia este extrem de mare. Din diverse motive, pachet-ul de date poate sosi pe bucăţi, chiar octet cu octet. Întotdeauna să pleci de la premiza asta. Sunt doua tipuri de rezolvari:
Inainte sa trimiti datele sa trimiti un header (sa zicem din 4 octeţi, little-endian) în care se specifică cantitatea de date pe care urmeaza s-o receptionezi. Astfel poti sa executi read() pana primesti tot.
Folosesti un terminator oarecare. Asta e buna pentru date de tip text, de exemplu executi read() pana dai de terminatorul zero (sau ce vrei tu si care nu e posibil sa apara si in datele utile).
Şi încă ceva, din diverse motive conexiunea se poate “agăţa” (aia TCP in special) şi trebuie sa-ţi laşi o portiţă de scăpare din situatia asta. Din acest motiv eu intotdeauna folosesc sockeţi non-blocanti si select() sau poll() sau epoll(). Atunci când conexiunea s-a agăţat in timp ce esti in bucla de read() select-ul (daca e setat corespunzator) pur si simplu va da timeout la citire si vei putea iesi din bucla si sa afisezi userului un mesaj de eroare in care explici ce s-a intamplat.