Короче говоря, у меня есть сценарий PHP-CLI, который я написал для своего проекта, который мой веб-сервер. Сценарий аутентифицирует соединения и передает через локальный сокет ресурс сокета другому сценарию, который является «основным» сценарием. Я запускаю службы через systemd, все работает нормально, мое приложение Android может аутентифицировать и полностью использовать веб-сокет, мои программы C на Raspberry Pi Zero Wireless могут полностью получить доступ к веб-сокету, моя веб-страница PHP может аутентифицироваться и полностью получить доступ к серверу веб-сокета. /p>
Недавно я хотел попробовать, чтобы PICO Wireless выполняла часть того, что делает мой Pi Zero, просто управляя одной задачей, например, управлением освещением или сбором данных с датчиков, что он будет передаваться на мой веб-сокет таким же образом, как и текущая версия Pi Zero.
Я настроил свой PICO W для доступа к Wi-Fi, и это нормально, у меня статический IP-адрес. установил и могу пинговать его. Я клонировал «danni/uwebsockets», используя протокол.py, чтобы предоставить класс веб-сокетов, который, по-видимому, будет обрабатывать кадр и рукопожатие для этого клиента. Я использовал эту библиотеку из-за отсутствия информации о чем-либо еще, способном предоставить клиентский класс веб-сокета.
Код Micropython, который я собираюсь использовать, выполняет рукопожатие и будет получать сообщения в формате json с сервера после рукопожатие (у меня есть поле «mType»: «AUTH REQUEST», которое отправляется, чтобы указать, что клиент должен отправить AUTH. Когда я пытаюсь ответить своим сообщением «AUTH REPLY», сокет, похоже, не получает вся отправка как одна передача, что приводит к сбою распечатки и последующего json.decode, и мое сообщение не получено (хотя некоторые данные, похоже, были получены при приеме сокета на стороне сервера)
вот соответствующие части кода:
Это сокет_recv, который ожидает входящие данные после обновления сокета/рукопожатия:
Код: Выделить всё
$done = false;
$data = '';
$bytes = '';
$socketData = '';
while(!$done) {
socket_clear_error($newSocketArrayResource);
$bytes = socket_recv($newSocketArrayResource, $data, 1, MSG_DONTWAIT);
$lastError = socket_last_error($newSocketArrayResource);
if ($lastError != 11 && $lastError > 0) {
printf("lastError: %s\n",$lastError);
$done = true;
}else if ($bytes === false) {
printf("Socket: read finished\n");
$done = true;
}else if (intval($bytes) > 0) {
$socketData .= $data;
}else{
usleep(2000);
}
}
printf("socketData %s\n",strlen($socketData));
$socketMessage = $socketHandler->unseal($socketData);
printf("socketMessage %s %s\n",strlen($socketMessage),$socketMessage);
$messageObj = json_decode($socketMessage);
//printf("%s receive msg devID:%s mType:%s socketMessage: %s\n",$newSocketArrayResource, $messageObj->devID,$messageObj->mType,$socketMessage);
if(isset($messageObj->mType)&&$messageObj->mType=="AUTH"){
Это когда я использую ws.send(msg ) предварительно отформатированная строка JSON.
Код: Выделить всё
Jan 03 19:28:26 rc-think php[6611]: SOCKET Resource id #13 added to client socket array
Jan 03 19:28:26 rc-think php[6611]: h:GET /chatserver HTTP/1.1
Jan 03 19:28:26 rc-think php[6611]: Host: localhost:8090
Jan 03 19:28:26 rc-think php[6611]: User-Agent: PICO-W (MICROPYTHON)
Jan 03 19:28:26 rc-think php[6611]: Sec-WebSocket-Key: Wf5IqdigmE6WoltwZki6nA==
Jan 03 19:28:26 rc-think php[6611]: Sec-WebSocket-Version: 13
Jan 03 19:28:26 rc-think php[6611]: X-Forwarded-For: 192.168.0.99
Jan 03 19:28:26 rc-think php[6611]: X-Forwarded-Host: 192.168.0.22:8090
Jan 03 19:28:26 rc-think php[6611]: X-Forwarded-Server: 127.0.1.1
Jan 03 19:28:26 rc-think php[6611]: Upgrade: WebSocket
Jan 03 19:28:26 rc-think php[6611]: Connection: Upgrade
Jan 03 19:28:26 rc-think php[6611]: [1B blob data]
Jan 03 19:28:26 rc-think php[6611]: HANDSHAKE 127.0.0.1(proxy) for:192.168.0.99 cookie:unset sessid:unset secKey:Wf5IqdigmE6WoltwZki6nA==
Jan 03 19:28:26 rc-think php[6611]: Socket: read finished
Jan 03 19:28:26 rc-think php[6611]: socketData 2
Jan 03 19:28:26 rc-think php[6611]: socketMessage 0
Jan 03 19:28:26 rc-think php[6611]: Socket: read finished
Jan 03 19:28:26 rc-think php[6611]: socketData 93
Jan 03 19:28:26 rc-think php[6611]: [44B blob data]
Jan 03 19:28:26 rc-think php[6611]: [7B blob data]
Jan 03 19:28:26 rc-think php[6611]: [18B blob data]
Jan 03 19:28:26 rc-think php[6611]: [8B blob data]
Jan 03 19:28:26 rc-think php[6611]: [6B blob data]
Jan 03 19:28:26 rc-think php[6611]: [15B blob data]
Это когда я сбрасываю dict в строку с помощью json.dumps(data)
Код: Выделить всё
Jan 03 19:37:00 rc-think php[6752]: SOCKET Resource id #13 added to client socket array
Jan 03 19:37:00 rc-think php[6752]: h:GET /chatserver HTTP/1.1
Jan 03 19:37:00 rc-think php[6752]: Host: localhost:8090
Jan 03 19:37:00 rc-think php[6752]: User-Agent: PICO-W (MICROPYTHON)
Jan 03 19:37:00 rc-think php[6752]: Sec-WebSocket-Key: SeC2i7a8HqaXKFM6N0De5Q==
Jan 03 19:37:00 rc-think php[6752]: Sec-WebSocket-Version: 13
Jan 03 19:37:00 rc-think php[6752]: X-Forwarded-For: 192.168.0.99
Jan 03 19:37:00 rc-think php[6752]: X-Forwarded-Host: 192.168.0.22:8090
Jan 03 19:37:00 rc-think php[6752]: X-Forwarded-Server: 127.0.1.1
Jan 03 19:37:00 rc-think php[6752]: Upgrade: WebSocket
Jan 03 19:37:00 rc-think php[6752]: Connection: Upgrade
Jan 03 19:37:00 rc-think php[6752]: [1B blob data]
Jan 03 19:37:00 rc-think php[6752]: HANDSHAKE 127.0.0.1(proxy) for:192.168.0.99 cookie:unset sessid:unset secKey:SeC2i7a8HqaXKFM6N0De5Q==
Jan 03 19:37:00 rc-think php[6752]: Socket: read finished
Jan 03 19:37:00 rc-think php[6752]: socketData 2
Jan 03 19:37:00 rc-think php[6752]: socketMessage 0
Код: Выделить всё
Jan 03 19:31:03 rc-think php[6649]: SOCKET Resource id #14 added to client socket array
Jan 03 19:31:03 rc-think php[6649]: h:GET /chatserver HTTP/1.1
Jan 03 19:31:03 rc-think php[6649]: Host: localhost:8090
Jan 03 19:31:03 rc-think php[6649]: User-Agent: Mozilla/5.0 (MYCO; MYCO-CLIENT; en-US; rv:1.0.1a)
Jan 03 19:31:03 rc-think php[6649]: Cookie: MYCOUSERSESS=2d661e2db6904710ad924e9e745f8237
Jan 03 19:31:03 rc-think php[6649]: Sec-WebSocket-Key: Qg+crE7S7cu5XWK84PSRtw==
Jan 03 19:31:03 rc-think php[6649]: Sec-WebSocket-Version: 13
Jan 03 19:31:03 rc-think php[6649]: Sec-WebSocket-Extensions: permessage-deflate
Jan 03 19:31:03 rc-think php[6649]: Accept-Encoding: gzip
Jan 03 19:31:03 rc-think php[6649]: X-Forwarded-For: 192.168.0.192
Jan 03 19:31:03 rc-think php[6649]: X-Forwarded-Host: 192.168.0.22
Jan 03 19:31:03 rc-think php[6649]: X-Forwarded-Server: 127.0.1.1
Jan 03 19:31:03 rc-think php[6649]: Upgrade: WebSocket
Jan 03 19:31:03 rc-think php[6649]: Connection: Upgrade
Jan 03 19:31:03 rc-think php[6649]: [1B blob data]
Jan 03 19:31:03 rc-think php[6649]: HANDSHAKE 127.0.0.1(proxy) for:192.168.0.192 cookie:MYCOUSERSESS=2d661e2db6904710ad924e9e745f8237 sessid:2d661e2db6904710ad924e9e745f8237 secKey:Qg+crE7S7cu5XWK84PSRtw==
Jan 03 19:31:03 rc-think php[6649]: Socket: read finished
Jan 03 19:31:03 rc-think php[6649]: socketData 138
Jan 03 19:31:03 rc-think php[6649]: socketMessage 130 {"mType":"AUTH","uID":"552-5515366868-68","uDatID":"17c55cc6598bed92f79f2d0b70356f1b","sessID":"2d661e2db6904710ad924e9e745f8237"}
Jan 03 19:31:03 rc-think php[6649]: AUTH REQUEST USER Resource id #13 for 552-5515366868-68::17c55cc6598bed92f79f2d0b70356f1b::2d661e2db6904710ad924e9e745f8237
Jan 03 19:31:03 rc-think php[6649]: MYCO:AUTH:DB: connected...
Jan 03 19:31:03 rc-think php[6649]: MYCO:AUTH:U ADDING client ::13::1::17c55cc6598bed92f79f2d0b70356f1b::2d661e2db6904710ad924e9e745f8237
Jan 03 19:31:03 rc-think php[6649]: resource(13) of type (Socket)
Jan 03 19:31:03 rc-think php[6649]: MYCO:AUTH:U socket resource
Код: Выделить всё
"""
Websockets protocol
"""
#import logging
import ure as re
import ustruct as struct
import urandom as random
import usocket as socket
from ucollections import namedtuple
#LOGGER = logging.getLogger(__name__)
# Opcodes
OP_CONT = const(0x0)
OP_TEXT = const(0x1)
OP_BYTES = const(0x2)
OP_CLOSE = const(0x8)
OP_PING = const(0x9)
OP_PONG = const(0xa)
# Close codes
CLOSE_OK = const(1000)
CLOSE_GOING_AWAY = const(1001)
CLOSE_PROTOCOL_ERROR = const(1002)
CLOSE_DATA_NOT_SUPPORTED = const(1003)
CLOSE_BAD_DATA = const(1007)
CLOSE_POLICY_VIOLATION = const(1008)
CLOSE_TOO_BIG = const(1009)
CLOSE_MISSING_EXTN = const(1010)
CLOSE_BAD_CONDITION = const(1011)
URL_RE = re.compile(r'(wss|ws)://([A-Za-z0-9-\.]+)(?:\:([0-9]+))?(/.+)?')
URI = namedtuple('URI', ('protocol', 'hostname', 'port', 'path'))
class NoDataException(Exception):
pass
class ConnectionClosed(Exception):
pass
class Websocket:
"""
Basis of the Websocket protocol.
This can probably be replaced with the C-based websocket module, but
this one currently supports more options.
"""
is_client = True
def __init__(self, sock):
self.sock = sock
self.open = True
def __enter__(self):
return self
def __exit__(self, exc_type, exc, tb):
self.close()
def settimeout(self, timeout):
self.sock.settimeout(timeout)
def read_frame(self, max_size=None):
"""
Read a frame from the socket.
See https://tools.ietf.org/html/rfc6455#section-5.2 for the details.
"""
# Frame header
two_bytes = self.sock.read(2)
if not two_bytes:
raise NoDataException
byte1, byte2 = struct.unpack('!BB', two_bytes)
# Byte 1: FIN(1) _(1) _(1) _(1) OPCODE(4)
fin = bool(byte1 & 0x80)
opcode = byte1 & 0x0f
# Byte 2: MASK(1) LENGTH(7)
mask = bool(byte2 & (1
Подробнее здесь: [url]https://stackoverflow.com/questions/79328000/pico-w-micropython-websocket-client-cant-send-to-php-websocket-properly[/url]