V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
tom
V2EX  ›  问与答

请教下关于 socket 设备通信自定义报文格式的开发问题

  •  
  •   tom · 2018-07-09 10:18:42 +08:00 · 1796 次点击
    这是一个创建于 2090 天前的主题,其中的信息可能已经有所发展或是发生改变。

    因为我之前从来没接触过硬件通信方面的开发,所以对于这方面一窍不通,头大。而且由于种种原因,协议提供方仅仅提供了协议,其他一概没有。 我想请教一下,如果我用 Java 的话,如果根据下面截图的协议格式来实现一个服务端和客户端? 那些 “引导 68 ” “ LL HL ” “ AFN ” 都是啥意思?

    11 条回复    2018-07-12 09:28:52 +08:00
    234235
        1
    234235  
       2018-07-09 10:28:09 +08:00   ❤️ 1
    引导 68 就是十六进制 0x68
    LL HL 下面标注了,就是有效数据的总长度乘 4,看起来是发两遍?而且低字节在前,反过来发。注意都是按照十六字节
    AFN 下面标注查表,应该是标识数据包类型之类的关键字了,对方应该有给你表的。
    tom
        2
    tom  
    OP
       2018-07-09 10:39:00 +08:00
    @234235 #1 多谢多谢!
    应该是这个表吗?


    另外反过来发是啥意思啊,0x68,反过来是 86x0 吗?
    234235
        3
    234235  
       2018-07-09 10:52:10 +08:00   ❤️ 1
    对,看起来 AFN 确实是指代数据包类型,接口检测是 0x02,后面应该还有其他的包 0x03、0x04 等,你看下面的例子,服务器下发给你的 AFN 也是 0x02。
    看来你对十六进制理解的不透彻啊,还是看他给你的这个例子吧,开头是 68 60 00 60 00,这两遍 60 00 就是这个包从控制域 C0 到倒数第三个 TP 位 00 的总长度十进制 24*4=96 转为十六进制就是 0x60,数据包里的长度是十六位的,所以这个包的长度就是 0x0060,高八位是 00,低八位是 60,数据包里要求低字节在前,所以发送时候就是 60 00。
    不管数据长度是多少,究竟是先发高位还是先发低位,都要看协议里的要求,比如你这个里面表地址就是要求先发高位。
    还有如果数据只有八位是不存在高低字节的,就按正常的发,只有数据超过八位了,会涉及这个问题,你需要把数据拆成多个八字节的数据来发送。
    234235
        4
    234235  
       2018-07-09 10:59:23 +08:00   ❤️ 1
    最好是先让对方给你单独开一台测试设备,你用 socket 往上面发消息,看服务器的回复,每个指令都试几次,再开始写协议。特别注意的就是数据长度,包类型和校验位。还有如果你不太熟悉进制转换的话,也要注意进制的问题。
    tom
        5
    tom  
    OP
       2018-07-09 11:28:02 +08:00
    @234235 #4 谢谢谢谢!那我研究研究。
    tom
        6
    tom  
    OP
       2018-07-09 11:32:45 +08:00
    @234235 #4 再多请教一句,设备是有了,但是这设备是直接插个 sim 卡,然后自动就连接对方的服务器了,我干预不了,也拿不到对方的服务器。我看这板子上有个接口,能用线连接到我的电脑直接发指令吗?如果能的话应该用什么样的线?谢谢
    tom
        7
    tom  
    OP
       2018-07-09 11:33:04 +08:00
    234235
        8
    234235  
       2018-07-09 12:30:23 +08:00
    看你协议里写的,这好像是个远程抄表的?
    不知道你是想拿来做什么,如果只是想用相同的协议和服务器通信的话,直接在电脑上开个 TCP 连接到服务器就行,不过你得知道服务器的 IP 和端口号,还有设备的的 ID,就是那个表地址。
    如果你是要破解这个板子,那就有点复杂了,不是很容易能说请了。不知道你有没有 USB 转 TTL 的接口板。
    tom
        9
    tom  
    OP
       2018-07-11 20:44:10 +08:00
    @234235 #8 对,是远程抄表,不破解板子,现在设备有了,设备也能连接到我的服务器,设备给服务器发信息或者图片,服务器给回信息。
    tom
        10
    tom  
    OP
       2018-07-11 20:49:29 +08:00
    @234235 #8 又有个问题想请教您一下,第一张图上有说 “ CS 是从控制域开始到 TP 的累加和”,现在设备给传过来的数据转成 16 进制字符串:

    68 60 00 60 00 68 C0 02 12 77 40 01 00 05 02 00 00 00 04 00 20 18 07 11 11 13 53 00 00 00 5E 16

    按说明应该是从 C0 一直加到 00,加在一起等于 5E。5E 的十进制等于 94,可是前面那些十六进制我转成十进制再加一块远大于 94。

    这到底是怎么个加法?
    234235
        11
    234235  
       2018-07-12 09:28:52 +08:00
    @tom #10 直接取低八位就 ok 了。C0 加到 00 一共是 0x025E,取低八位 5E。
    你直接用八位变量来加,溢出的自动丢掉就行了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5282 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 09:21 · PVG 17:21 · LAX 02:21 · JFK 05:21
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.