UDPSocket クラスを介してサーバーに 16 進数データを送信しようとしています。
require 'socket'
socket = UDPSocket.new
socket.send('230055', 0, '192.168.1.205', 50000)
230055 は、送信しようとしている 16 進コマンドです。これは、16進数を取得してASCIIに変換して送信すると、実際に機能します。生の16進データを送信することは可能ですか?
私の理解が正しければ、0x23、0x00、および 0x55 の 3 バイトをソケットに送信する必要があります。それは次を使用して行うことができますArray.pack
:
socket.send([0x23, 0x00, 0x55].pack('C*'), 0, '192.168.1.205', 50000)
これにより、3 つの 16 進数が 3 つの符号なしバイトに変換されます。これは、'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で入手できます。
私は基本的に入力値を16進数に変換して送信しました。動作します。