Websockets - 尝试将 Python 代码转换为节点

Posted

技术标签:

【中文标题】Websockets - 尝试将 Python 代码转换为节点【英文标题】:Websockets - trying to convert Phython Code to Node 【发布时间】:2019-07-17 23:26:41 【问题描述】:

我正在尝试复制此库 https://github.com/rnbguy/pysphere/blob/master/misphere.py 的功能,该库通过 websockets 连接到 Mi Sphere 360​​ 相机。

重要的代码在这里

ms_ip = '192.168.42.1'
ms_tcp_port = 7878
ms_uk_port = 8787
ms_fs_port = 50422

def init(self):
    self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    self.socket.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
    self.socket.connect((self.ms_ip, self.ms_tcp_port))
    self.socket_1 = socket.socket()
    self.recv_handle_live = True
    self.recv_thread = threading.Thread(target=self.recv_handler)
    self.recv_thread.daemon = True
    self.session = Session()
    self.session.conf = 
    self.session.locks = 
    self.last_send = 0

我正在尝试使用 Node 中的 ws 库来做到这一点

const ip = '192.168.42.1'
const port = '7878'
const url = `ws://$ip:$port`
const websocket = new WebSocket(url)

但是我没有连接到相机。 (通过Wifi连接,但websocket从不发送连接消息)

我想知道这是否与 Phython 代码中列出的协议有关。

我在 websocket 文档中看到您可以在连接中定义协议,但我找不到任何有关这些协议是什么以及如何添加它们的文档。

self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.socket.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)

有人知道我如何在 Node websocket 连接中添加这样的东西吗?

【问题讨论】:

【参考方案1】:

无法与普通 TCP 套接字服务器建立 webSocket 连接。

普通的 TCP 套接字与 webSocket 不同。您的 Python 代码似乎正在建立一个普通的 TCP 套接字连接。

您的 node.js 代码正在尝试建立 webSocket 连接。 webSocket 连接只能与使用 webSocket 协议(运行在普通 TCP 套接字之上)的 webSocket 服务器建立。

如果您的 Python 代码正常工作,那么您显然只需要建立一个普通的 TCP 套接字连接,您可以在 Net module 中查看如何操作。

有关普通 TCP 连接和 webSocket 连接之间差异的进一步说明,请参阅以下内容:

Computer refuses websocket connections

What's the difference between WebSocket and plain socket communication?

Is there a way to do a tcp connection to an IP with javascript?

Socket server not connect with JavaScript socket client

【讨论】:

【参考方案2】:

要连接到常规 TCP 套接字,请使用 net 包而不是 WebSocket。示例节点等效代码:

const net = require('net');
const port = 7878
const ip = "192.168.42.1"

const socket = net.createConnection(port, ip);

socket.on('connect', () => 
  console.log("socket connected");
);

【讨论】:

以上是关于Websockets - 尝试将 Python 代码转换为节点的主要内容,如果未能解决你的问题,请参考以下文章

通过 Websockets 在 Nodejs 和 Python 之间进行通信

python websockets,如何设置连接超时

如何确保消息使用 WebSockets 到达目的地?

python 将websockets与龙卷风结合起来,龙卷风用于控制

“在收到握手响应之前连接已关闭”尝试使用 websockets 将 Angular 与 Spring 连接时

Python - 单向 websocket