2013-06-30 44 views
2

我想通过UDPSocket类发送一些十六进制数据到服务器。如何通过ruby UDPSocket类发送原始十六进制数据?

require 'socket' 
socket = UDPSocket.new 
socket.send('230055', 0, '192.168.1.205', 50000) 

其中230055是我试图发送的十六进制命令。这实际上工作,如果我把十六进制,将其转换为ascii并发送。是否有可能发送原始十六进制数据?

回答

1

如果我正确理解你,你想发送三个字节:0x23,0x00和0x55到套接字中。可以使用Array.pack来完成:

socket.send([0x23, 0x00, 0x55].pack('C*'), 0, '192.168.1.205', 50000) 

这将三张十六进制数转换成三个无符号字节,这是什么“C *”格式的字符串指定,并通过插座给他们。如果您需要其他转换,请查看Array.pack的文档。

0

我不喜欢的东西如下:

#!/usr/bin/ruby 
require 'socket' 
require 'parseconfig' 
wifi_bridge_ip = '192.168.1.205' 
wifi_bridge_port = 50000 

#define lamp states 
lamp_on = "\x22\x00\x55" 
lamp_off = "\x21\x00\x55" 

case ARGV[0] 
when "on" 
    socket = UDPSocket.new 
    socket.send(lamp_on, 0, wifi_bridge_ip, wifi_bridge_port) 

when "off" 
    socket = UDPSocket.new 
    socket.send(lamp_off, 0, wifi_bridge_ip, wifi_bridge_port) 

.....

when "color" 
    #set color argument to be an integer 
    passed_color = ARGV[1].to_i 
    #puts "passed_color is #{passed_color}" 

    #convert that to a hex value 
    colorcode = passed_color.to_s(16) 
    #puts "hex color code is #{colorcode}" 

    #send the value being sure to encode the color code into hex 
    set_color = "\x20#{colorcode.hex.chr}\x55" 
    socket = UDPSocket.new 
    socket.send(set_color, 0, wifi_bridge_ip, wifi_bridge_port) 

的完整代码可在github

我基本上转换值输入值十六进制并发送。作品。

相关问题