搜索
aardio官方社区 门户 查看主题

使用socket发送数据问题请教

发布者: xiaojinhe2 | 发布时间: 2016-9-21 16:23| 查看数: 1423| 评论数: 6|帖子模式

在aardio中socket如何发送16进制的字节码到服务端,我使用string.hex(msg)编码后发送过去服务器没反应,服务器报文格式如上图,请问该如何发送16进制字节数据过去。


报文格式如下:
-------------------------------------------------------------------------------------------------------------------------------------------------------------------
0xFF           0x01      0x15        0xXX   0xXX  0xXX  0xXX        0xXX   0xXX   0xXX  0xXX         0xXX              0xXX             0xXX        0xAA
-------------------------------------------------------------------------------------------------------------------------------------------------------------------
帧头           帧标示         帧长        城市代码(4字节)                       中继器ID(4字节)                        检测器ID              车位状态           校验        帧位
-------------------------------------------------------------------------------------------------------------------------------------------------------------------
注:校验是从帧头开始到校验位前面一位结束按位异或校验



我的代码:

import wsock.tcp.client;

var tcpClient = wsock.tcp.client();
var conn = tcpClient.connect("88.88.88.88",8888);

var fr_head = "255";
var fr_flag = "1";
var fr_city = "0000";
var fr_ap = "01";
var fr_bay = "SDM00004";
var fr_idle = "01";
var fr_verify = "00";
var fr_tail = "170";

var msg = string.concat(fr_head,fr_flag,fr_city,fr_ap,fr_bay,fr_idle,fr_verify,fr_tail);
var flag = tcpClient.send(msg,#msg);



但是这样发送过去服务器不能正常解析的,请高手指教下客户端该如何发送数据到服务器


最新评论

夜战歌 发表于 2016-9-21 19:46:32
先直接写成十六进制的发送给服务器看看!
xiaojinhe2 发表于 2016-9-21 22:37:45
是的,我这样试过不行,需要将16进制的字符串用string.unhex转换下在发送才行;但是我不知道aardio里面怎么把10进制的字符转成16进制的???
alajia 发表于 2016-9-22 13:53:16
首先应该把数值和字符区分开,再进行转换。
  1. import console;

  2. encode = function(str){
  3.         if(type(str)==type.number){
  4.                 return string.format("\0x%02X",tostring(tonumber(str,10),16));
  5.         }
  6.         else {
  7.                 c = "";
  8.                 for(i=1;#str;1){
  9.                         c += string.format("\0x%02X",str[i]);
  10.                
  11.                 }       
  12.                 return c;        
  13.         }       
  14. }

  15. var fr_head = 255;
  16. var fr_flag = 1;
  17. var fr_city = "0000";
  18. var fr_ap = "01";
  19. var fr_bay = "SDM00004";
  20. var fr_idle = "01";
  21. var fr_verify = "00";
  22. var fr_tail = 170;

  23. var msg = string.concat(encode(fr_head),encode(fr_flag),encode(fr_city),encode(fr_ap),encode(fr_bay),encode(fr_idle),encode(fr_verify),encode(fr_tail));

  24. console.log(msg);
  25. console.pause(true);
复制代码
xiaojinhe2 发表于 2016-9-23 13:58:34
感谢@alajia,使用string.format("\0x%02X",str[i]);这个转成16进制的字符串很有效
taochunsong 发表于 2016-10-22 18:48:56
学习
爱哭的热带鱼 发表于 2017-7-28 14:28:26
学习一下~~~

手机版|未经许可严禁引用或转载本站文章|站长邮箱|aardio.com|aardio官方社区 ( 皖ICP备09012014号 )

GMT+8, 2017-9-22 07:10 , Processed in 0.062500 second(s), 21 queries , Wincache On.

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表