我试图通过UDPSocket类将一些十六进制数据发送到服务器。
require 'socket'
socket = UDPSocket.new
socket.send('230055', 0, '192.168.1.205', 50000)
其中230055是我尝试发送的十六进制命令。这实际上有效,如果我采取十六进制,将其转换为ascii并发送它。是否可以只发送原始十六进制数据?
答案 0 :(得分:1)
如果我理解正确,你想在套接字中发送三个字节:0x23,0x00和0x55。这可以使用Array.pack
:
socket.send([0x23, 0x00, 0x55].pack('C*'), 0, '192.168.1.205', 50000)
这会将三个十六进制数转换为三个无符号字节,这就是'C *'格式字符串指定的内容,并通过套接字发送它们。如果您需要其他转换,请查看Array.pack
的文档。
答案 1 :(得分: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上找到。
我基本上将输入的值十六进制转换为值并发送。的工作原理。