注册 登录
编程论坛 VB6论坛

VB通过UDP发送16进制数据0x01

hongyb 发布于 2018-03-16 17:33, 4741 次点击
请教:

  现在要做个视易开关房及酒水接口的程序,按照接口协议的说明,通过UDP方式向酒水接口发送0x010x01的数据,

UDP 协议格式:

-----------------------------------------------------------------------------------------------------  ------------------------------------------
主消息号(4字节)    子消息号(4字节)   包厢IP(4字节)    预留(16字节)    正文长度(4字节)    正文内容(不超过4096-32字节)
-----------------------------------------------------------------------------------------------------  ------------------------------------------
                              
           包头部分(32字节固定长度)                                    正文部分

我调试这样发送:winsock.senddata "0x010x01000000000000000000000000192.168.1.2"

酒水接口接收的数据是这样的:[31303030][31303030]192.168.1.2

酒水接口接收正确的应该是:[0001][0001]192.168.1.2

请问我应该怎么发送0x01,0x01这个数据?



[此贴子已经被作者于2018-3-16 17:38编辑过]

10 回复
#2
wds12018-03-16 18:17
dim num1 as long
dim num2 as long
dim len1 as long
dim ip(3) as byte
dim text as string
dim data1
num1=1
num2=2
text="测试"
len1=lenb(text)
ip(0)=192:ip(1)=168:ip(2)=1:ip(3)=2
把num1转为4字节数据【假设为ip1】
把num2转为4字节数据【假设为ip2】
把len1转为4字节数据【假设为ip3】
把text转为len1长度的字节数据【假设为ip4】
redim data1(31) as byte
for i=0 to 3:data1(i)=ip1(i):next
for i=4 to 7:data1(i)=ip2(i):next'
for i=8 to 11:data1(i)=ip(i):next'
for i=28 to 31:data1(i)=ip(i):next'
for i=32 to 32+len1:data1(i)=ip4(i):next'
winsock.senddata data1




[此贴子已经被作者于2018-3-16 18:29编辑过]

#3
hongyb2018-03-16 18:51
先谢谢!!没看到转换0x010x01成二进制的地方?

[此贴子已经被作者于2018-3-16 18:58编辑过]

#4
风吹过b2018-03-16 23:43
0x01 这是C里的写法,vb 里是 &h01
这个值 定义一个 byte 的变量保存着就可以,以送时,发送这个变量

其实,你这个数据,应该定义一个结构体,对结构体进行操作
另外,有一个序列byte 的函数
还有一个统一发送数据的函数。
#5
hongyb2018-03-18 16:40
回复 4楼 风吹过b
大神:能否给个数据结构的例子,我发送到酒水接口试试?

现在我用字符发送过去,接口始终收到的是 ascii值,而不是正确的[0001][0001]192.168.1.2 这样的值
#6
wds12018-03-18 19:01
Private Type UID1
  No1 As Long
  No2 As Long
  Ip(0 To 3) As Byte
  Mem1(0 To 15) As Byte
  Len1 As Long
  Txt1 As String
End Type

Private Sub Form_Load()
  Dim A As UID1
  A.No1 = 1
  A.No2 = 1
  A.Ip(0) = 192:  A.Ip(1) = 168: A.Ip(2) = 1: A.Ip(3) = 2
  For i = 0 To 15: A.Mem1(i) = 0: Next i
  A.Txt1 = "test"
  A.Len1 = Len(A.Txt1)
 
  winsock.senddata A
End Sub

[此贴子已经被作者于2018-3-18 19:02编辑过]

#7
hongyb2018-03-19 11:33
回复 6楼 wds1
谢谢wds1,我理解了一点点的关于自定义数据类型 ,但编译时提示有错误:不支持的变体类型,
#8
wds12018-03-19 14:05
是这条语句报错 winsock.senddata a

正常long是4字节数据,uid1就应该可以。

你可以改为都是byte类型的
Private Type UID1
  No1(0 to 3) as byte
  No2(0 to 3) as byte
  Ip(0 To 3) As Byte
  Mem1(0 To 15) As Byte
  Len1(0 to 3) as byte
  Txt1(0 to 4) As byte[暂时定义发送4字节]
End Type

如果还不能通过,你可以手写一串byte值到一个数组,看winsock.senddata是否可以发送。




[此贴子已经被作者于2018-3-19 14:26编辑过]

#9
wds12018-03-19 15:05
我试了一下,winsock发送必须用字节数组或二进制流,下面是用数组发送数据,供参考
【改为一次发送数据】
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

Private Sub Command1_Click()
  Dim udhi(31) As Byte '定义头数组
  Dim txt() As Byte '定义正文数组
  Dim send_data
  '下面部分也可以定义结构体
  Dim No1 As Long
  Dim No2 As Long
  Dim ip As String
  Dim mem(0 To 15) As Byte
  Dim len1 As Long
  Dim Txt1 As String
 '赋值
  No1 = 1
  No2 = 1
  ip = "192.168.1.2"
  Txt1 = "测试"
  len1 = LenB(Txt1)
 '数据转为数组
  CopyMemory udhi(0), No1, 4
  CopyMemory udhi(4), No2, 4
 
  temp = Split(ip, ".")
  For i = 0 To 3
   udhi(8 + i) = Val(temp(i))
  Next
  CopyMemory udhi(28), len1, 4

  txt = StrConv(Txt1, vbFromUnicode)
 
  ReDim send_data(UBound(udhi) + UBound(txt) + 1)
 
  For i = 0 To 31: send_data(i) = udhi(i): Next
  For i = 0 To UBound(txt): send_data(32 + i) = txt(i): Next i
 
  Winsock.senddata send_data

End Sub



[此贴子已经被作者于2018-3-19 18:29编辑过]

#10
hongyb2018-03-19 17:40
回复 9楼 wds1
ip,应该和正文部份在一起的,udhi 和 txt 如何重新赋值到新的数组?请指教下,谢谢,谢谢
#11
hongyb2018-03-20 17:34
回复 9楼 wds1
谢谢版主:终于搞通了,十分感谢!

          Dim udhi(31) As Byte '定义头数组
          Dim txt() As Byte '定义正文数组
          Dim Send_data()  As Byte
         
          '下面部分也可以定义结构体
          Dim No1 As Long
          Dim No2 As Long
          Dim ip As String
           
          Dim len1 As Long
          Dim Txt1 As String
         '赋值
          No1 = 1
          No2 = 2

          Txt1 = "000000"
          len1 = LenB(Txt1)
         
          Txt2 = "192.168.1.2测试测试........."
         
         '数据转为数组
          CopyMemory udhi(0), No1, 4
          CopyMemory udhi(4), No2, 4
         

          CopyMemory udhi(31), len1, 4
        
          txt = StrConv(Txt2, vbFromUnicode)
         
          ReDim Send_data(UBound(udhi) + UBound(txt) + 1)
         
          For i = 0 To 31: Send_data(i) = udhi(i): Next
          For i = 0 To UBound(txt): Send_data(32 + i) = txt(i): Next i
         
          Winsock1.SendData Send_data
1