Python добавляет строку к bytearray и получает строку от bytearray - PullRequest
0 голосов
/ 07 февраля 2019

Я делаю IoT-устройство, которое рассчитывает давление, расход воды и получает координаты устройства.Я использую сокет Python.Мне нужно отправить их в веб-приложение.Тем не менее, я всегда получаю этот вывод:

Подключено: (ip_address, порт)

49 46

Этомой код для отправки в Интернет:

#!/usr/bin/env python3

import socket

HOST = 'my_ip'
PORT = myPort

#Temp storage
pressure = "1.6"
waterflow = "2.6"
latitude = "08.123"
longitude = "124.336"

my_bytes = bytearray()

my_bytes.extend(pressure.encode('latin-1'))
my_bytes.extend(waterflow.encode('latin-1'))
my_bytes.extend(latitude.encode('latin-1'))
my_bytes.extend(longitude.encode('latin-1'))

#Ready to pass data to web
information = [pressure, waterflow, latitude, longitude]

#Open Connection and Establish
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.connect((HOST, PORT))
    s.sendall(my_bytes)

и это код, который получает данные:

#!/usr/bin/env python3
import socket

host = 'myHost'
port = myport

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.bind((host, port))
    s.listen()
    conn, addr = s.accept()

    with conn:
            print('Connected by: ', addr)
            while True:
                data = conn.recv(1024)
                my_bytes = bytearray(data)
                print(my_bytes[0], my_bytes[1])
                break

Ожидаемый результат

1,62,6

1 Ответ

0 голосов
/ 07 февраля 2019

Я думаю, вы можете проверить модуль Python array для хранения эффективных массивов числовых значений.

Я переработал ваш код, чтобы использовать этот модуль вместо bytearray.Ваши переменные хранилища теперь являются плавающими (вместо строк) и передаются по сети как таковые.Использование чисел с плавающей запятой будет более эффективным с точки зрения памяти, чем строки для более высокой точности.

import socket
import array

HOST = 'localhost'
PORT = 55000

#Temp storage
pressure = 1.6
waterflow = 2.6
latitude = 8.123
longitude = 124.336

information = [pressure, waterflow, latitude, longitude]
my_bytes = array.array('f', information)  # 'f' = float

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.connect((HOST, PORT))
    s.sendall(my_bytes)

И получатель:

import socket
import array

host = 'localhost'
port = 55000

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.bind((host, port))
    s.listen()
    conn, addr = s.accept()

    with conn:
        print('Connected by: ', addr)
        data = conn.recv(1024)  # blocking
        my_bytes = array.array('f', data)
        information = my_bytes.tolist()
        print(information)

Я удалил петлю while в приемнике для целейэта демонстрация, поскольку conn.recv() является блокирующим вызовом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...