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