开源改变世界

创意:遥控吊坠 #42

推推 grbl 3年前 (2023-02-02) 329次浏览

Warning: Undefined variable $output in /www/wwwroot/grbl.cc/wp-content/themes/Git-alpha/include/shortcode.php on line 321
关闭
dronecz 打开了这个问题 2016 年 6 月 15 日 · 23条评论
关闭

创意:遥控吊坠#42

dronecz 打开了这个问题 2016 年 6 月 15 日 · 23条评论

注释

创意:遥控吊坠 #42

你好@cheton

我有(也许)愚蠢的想法,但我想知道你的意见。

我想制作基于 Atmega 32u4 或 ESP8266 的远程吊坠,它可以用作 HID 设备。我想,如果这个设备通过 USB 连接将像任何其他键盘一样工作,但可以更改您的 cnc 服务器以侦听某些端口(如 8888)并且如果有一些数据,它将接受它作为键盘动作。此通信将通过 LAN/WIFI 进行。我不是程序员,但我想我可以和我的朋友一起制作一些 Arduino 草图来发送此类数据。

这对你来说可能吗?

谢谢你的回答。

创意:遥控吊坠 #42
合作者
奇顿 评论了 2016 年 6 月 16 日  

Web 界面通过 socket.io v1.x 客户端库与 cnc 服务器通信,我认为使用 Arduino 的 socket.io 库是可行的。GitHub 上有几个有用的资源:

最后一个链接包含一个演示如何在 Arduino 和 Node.js 服务器之间发送消息的示例。您还可以参考TinyWeb 示例来了解如何发送或接收与 cnc 服务器通信的消息。

然而,我手头没有 ESP8266,也从未编写过 Arduino 代码,如果我们能得到别人的帮助就太好了。

创意:遥控吊坠 #42 奇顿 添加了 问题 标签 2016 年 6 月 16 日
创意:遥控吊坠 #42
作者

你好@cheton

我正在查看它,但只是为了确保我想验证我是否理解它的编写,并且 CNC 服务器将监听端口 8000 上的所有通信,对吗?我找到了一些 Arduino + Node.js 的例子,我会做一些测试,但我想确保我使用正确的端口进行通信。

谢谢

创意:遥控吊坠 #42
合作者

cnc 服务器使用路径“ /socket.io/ ”在相同的 HTTP 服务器端口(例如 8080)下进行 Socket.IO 通信。期待看到你的作品!

创意:遥控吊坠 #42
作者

你好@cheton

我很高兴地报告向前迈出的一小步:
创意:遥控吊坠 #42

这只是简单的连接,但我希望这只是开始。

创意:遥控吊坠 #42
作者

你好@cheton

我可以以某种方式启动服务器以查看与客户端的完整通信吗?我现在使用 cnc -vv,但关于什么是 hapennig 的信息有限。

非常感谢您的回答。

创意:遥控吊坠 #42
合作者

cnc -vv是当前版本中的完整详细模式。我可以知道您想看到哪些信息(例如 Grbl 的完整回复)吗?

创意:遥控吊坠 #42
作者

如果我能看到服务器和客户端之间的整个通信,我只是在想。就像我在浏览器中点击 X 移动,在服务器端我会看到:

从 .. 在 IP 上连接…
收到 G91 X100 F500
已接受并已执行

我知道,我可能想要很多,但我只需要知道当我试图向它发送数据时接收到的服务器。到目前为止,我可以连接到服务器,但我正在学习应该向服务器发送什么。我查看了 tinyweb 示例,我有点知道我应该发送什么,但我需要知道什么可以通过,什么不能。

创意:遥控吊坠 #42
作者
无人机 评论了 2016 年 6 月 22 日  

我收回它.. :-p 我正在测试工作中的服务器,其中 a 与 GRBL 没有连接,当我现在在家里使用 GRBL 测试它时,我看到详细模式就像我在上一条消息中描述的那样。对不起我的愚蠢 ;-) :-p

创意:遥控吊坠 #42
合作者

稍后我将发布一个补丁版本 (v1.3.2),它可以输出所有 Grbl 响应以cnc -vvv用于调试目的。请注意,这将生成大量 Grbl 状态日志,不建议用于生产,但您可以通过管道grep -v过滤掉不必要的日志。

创意:遥控吊坠 #42
作者

你好@cheton

感谢补丁,我希望除了我之外还有其他人会使用它 ;-)。

我想问一下向服务器发送命令的正确语法是什么?

我发现,我需要发送client.send("write","",""); / client.send("command","","");,但我无法为该行的其余部分找到正确的语法。每次我向服务器发送内容时,都会收到此响应。
创意:遥控吊坠 #42

非常感谢您的耐心和帮助。

创意:遥控吊坠 #42
合作者
奇顿 评论了 2016 年 6 月 23 日  

我不确定您在 Arduino 上的客户端界面是否与 JavaScript 中的客户端库相同。您可以尝试以下命令:

从 Arduno 发送事件到 cnc 服务器:

// List ports
client.send('list');

// Open port
client.send('open', '/dev/cu.xxxxxxxx', 115200);

// Close port
client.send('close', '/dev/cu.xxxxxxxx');

// Write
client.send('write', '/dev/cu.xxxxxxxx', 'G0 X0 Y0 Z0\n'); // should contain a newline character
client.send('write', '/dev/cu.xxxxxxxx', '?'); // No newline for Grbl realtime commands

// Command
client.send('command', '/dev/cu.xxxxxxxx', 'feedhold');
client.send('command', '/dev/cu.xxxxxxxx', 'cyclestart');
client.send('command', '/dev/cu.xxxxxxxx', 'reset');

可用的侦听器事件:

serialport:list
serialport:open
serialport:close
serialport:error
serialport:read
serialport:write
grbl:status
grbl:parserstate
gcode:statuschange
创意:遥控吊坠 #42
贡献者
奥斯汀圣奥宾 评论了 2016 年 12 月 4 日  

@cheton你能为我指出正确的方向吗。
我正在尝试从 python 脚本向 grbl 发送串行命令。
我想通过 CNCjs 上的 socket.io 这样做。

我正在尝试让 PS3 控制器与 CNC 一起工作。
除了如何将点动命令从 python 脚本发送到 CNC 或 GRBL 之外,我几乎已经想通了所有事情。
Python 脚本在托管 CNC 的树莓派上本地运行。

目前尝试此操作没有成功,无法运行(不知道我在做什么)。
似乎使用 CNC 的网络套接字连接是最好的途径……

#client test
import socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('localhost', 8000))

client_socket.send("list")
client_socket.send("'open', '/dev/ttyUSB0', 115200")
client_socket.send("'close', '/dev/ttyUSB0'")

client_socket.send('write', '/dev/ttyUSB0', '$H\n')

我今天最接近。

import websocket
import thread
import time

def on_message(ws, message):
    print message

def on_error(ws, error):
    print error

def on_close(ws):
    print "### closed ###"

def on_open(ws):
    def run(*args):
        ws.send("
    ") ws.send("['open', '/dev/ttyUSB0', 115200]") ws.send('{"command","/dev/ttyUSB0","homing"}') time.sleep(5) ws.close() print "thread terminating..." thread.start_new_thread(run, ()) if __name__ == "__main__": websocket.enableTrace(True) ws = websocket.WebSocketApp("ws://xcarve:8000/socket.io/?token=eyJhbGciOiJIUzI1NiIs....................o", on_message = on_message, on_error = on_error, on_close = on_close) ws.on_open = on_open ws.run_forever()
    创意:遥控吊坠 #42
    合作者

    您必须导入 socketIO-client 而不是直接导入 websocket。明天我会看一看。

    创意:遥控吊坠 #42

    我也在尝试远程与 API 交互(虽然来自 C#)。

    代码是否需要 Socket.io 的任何特定功能,或者是否可以将其更改为仅使用标准 WebSocket?

    因为我无法为 C# 的 Socket.IO 找到好的库。

    不过,我可以找到很多用于 WebSocket 的库,而且现在大多数语言的标准库中都包含一个库,因此它可以更轻松地使用 API。

    创意:遥控吊坠 #42

    我有一个小时的 !fun 尝试让任何东西在 python、bash 和其他工具上与 socket.io 一起工作。
    我最终研究了使用 Node.js 来处理 HID 和游戏手柄,请参阅Idea: Remote Pendant (Playstation 3 Dualshock Controller / SIXAXIS Controller) #103

    创意:遥控吊坠 #42

    同样在这里,我尝试连接https://github.com/Quobject/SocketIoClientDotNet

    经过一些日志记录后,我发现了问题,需要某种授权标头。

    2016-12-04 23:55:43 275 [10] SocketIoClientDotNet-IO.cs:Socket#39 - ignoring socket cache for http://localhost:8000/socket.io&token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
    2016-12-04 23:55:43 281 [10] SocketIoClientDotNet-Manager.cs:Open#192 - readyState CLOSED
    2016-12-04 23:55:43 281 [10] SocketIoClientDotNet-Manager.cs:Open#192 - opening http://localhost:8000/socket.io&token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
    2016-12-04 23:55:43 299 [10] SocketIoClientDotNet-Manager.cs:Open#192 - connection attempt will timeout after 20000
    2016-12-04 23:55:45 760 [16] SocketIoClientDotNet-Manager.cs:Open#192 - readyState OPENING
    2016-12-04 23:55:45 761 [16] SocketIoClientDotNet-Manager.cs:Open#192 - opening http://localhost:8000/socket.io&token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
    2016-12-04 23:55:45 761 [16] SocketIoClientDotNet-Manager.cs:Open#192 - connection attempt will timeout after 20000
    2016-12-04 23:55:46 876 [18] SocketIoClientDotNet-Manager.cs:Open#192 - connect_error
    2016-12-04 23:55:46 889 [18] SocketIoClientDotNet-Manager.cs:Reconnect#440 - will wait 1000ms before reconnect attempt
    2016-12-04 23:55:47 903 [16] SocketIoClientDotNet-Manager.cs:Reconnect#464 - EasyTimer Reconnect start
    2016-12-04 23:55:47 903 [16] SocketIoClientDotNet-Manager.cs:Reconnect#464 - attempting reconnect
    2016-12-04 23:55:47 903 [16] SocketIoClientDotNet-Manager.cs:Open#192 - readyState CLOSED
    2016-12-04 23:55:47 903 [16] SocketIoClientDotNet-Manager.cs:Open#192 - opening http://localhost:8000/socket.io&token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
    2016-12-04 23:55:47 903 [16] SocketIoClientDotNet-Manager.cs:Open#192 - connection attempt will timeout after 20000
    2016-12-04 23:55:47 903 [16] SocketIoClientDotNet-Manager.cs:Reconnect#464 - EasyTimer Reconnect finish
    2016-12-04 23:55:47 905 [20] SocketIoClientDotNet-Manager.cs:OnOpen#263 - open
    2016-12-04 23:55:47 916 [20] SocketIoClientDotNet-Manager.cs:Packet#354 - writing packet Type:0 Id:-1 Nsp:/socket.io&token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 Data:{} Attachments:0
    2016-12-04 23:55:47 916 [20] SocketIoClientDotNet-Parser.cs:Encode#54 - encoding packet Type:0 Id:-1 Nsp:/socket.io&token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 Data:{} Attachments:0
    2016-12-04 23:55:47 917 [20] SocketIoClientDotNet-Parser.cs:EncodeAsString#103 - encoded Type:0 Id:-1 Nsp:/socket.io&token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 Data:{} Attachments:0 as 0/socket.io&token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9,{}
    2016-12-04 23:55:47 927 [20] SocketIoClientDotNet-Manager.cs:Reconnect#440 - reconnect success
    2016-12-04 23:55:47 932 [20] SocketIoClientDotNet-Parser.cs:decodeString#271 - decoded 4{"message":"No Authorization header was found","code":"credentials_required","type":"UnauthorizedError"} as Type:4 Id:-1 Nsp:/ Data:{"message":"No Authorization header was found","code":"credentials_required","type":"UnauthorizedError"} Attachments:0
    2016-12-04 23:55:47 933 [20] SocketIoClientDotNet-Parser.cs:decodeString#271 - decoded 4/socket.io&token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9,"Invalid namespace" as Type:4 Id:-1 Nsp:/socket.io&token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 Data:"Invalid namespace" Attachments:0
    
    创意:遥控吊坠 #42
    合作者

    你好@tritao,

    您是否在 Windows 上使用预构建的可执行文件(即 Electron 应用程序)运行 cnc?如果是,端口将是 1024 以上的随机端口号,而不是 8000。

    创意:遥控吊坠 #42

    我从 Git 编译它并用NODE_ENV=development bin/cnc -vv -p 8000.

    在上面的跟踪中,令牌不正确,但即使在修复之后我似乎也无法通过授权检查。我一直在检查socketio-jwt来源以检查任何线索,但到目前为止没有运气。

    是否有可能将通信通道切换到直接 WebSockets 以简化与非 JS 环境的通信?

    创意:遥控吊坠 #42
    合作者
    奇顿 评论了 2016 年 12 月 6 日  

    可以参考JavaScript客户端示例代码:
    https ://github.com/cheton/cnc/blob/master/examples/tinyweb/controller.js

    授权令牌存储在 localStorage 中,这演示了如何检索存储在本地存储中的令牌。“错误”事件表示令牌不再有效,因此它将用户重定向到登录页面。用户成功通过身份验证后,您可以再次从 localStorage 检索令牌。

    var root = window;
    var token = '';
    
    // Retrieve session token
    try {
        var cnc = JSON.parse(localStorage.getItem('cnc') || {});
        cnc.state = cnc.state || {};
        cnc.state.session = cnc.state.session || {};
        token = cnc.state.session.token || '';
    } catch (err) {
        // Ignore error
    }
    
    var socket = root.io.connect('', {
        query: 'token=' + token
    });
    
    socket.on('connect', function() {
        // Add your code here
    });
    
    // Redirect user to the Sign In page
    socket.on('error', function() {
        socket.destroy();
        window.location = '/';
    });
    创意:遥控吊坠 #42
    合作者

    你好@tritao,

    socketio-jwt仅在服务器端是必需的,您不需要将其包含在客户端实现中。

    创意:遥控吊坠 #42

    如果连接到 socket.io 时出现问题,请查看#103
    我让 Node.js 客户端正常工作。

    创意:遥控吊坠 #42
    合作者

    关闭这个问题。您可以开始使用cncjs-pendant-ps3来学习如何创建吊坠控制器。