不知道有没有做过环保项目的,现在环保协议是这样的
通讯包的组成有:包头,数据段长度,数据段,CRC校验,包尾。
数据段中有请求编号QN,系统编号ST,命令编号CN,社保唯一标示MN,指令参数CP。
举个例子,上位机要采集实时数据,上位机就发送如下数据段,数据段的内容就包括:QN=20080916000000;ST=32,CN=2011;MN=888888888;
下位机发生实时数据,数据段的内容包括:ST=32;CN=2011;MN=888888888;CP=&&DATATIME=2008091600000;101-RTD(101污染物的数据)=1.1.&&我想请问下,如果这个用SOCKET发送,该如何发送的,想用sendtext发送,已经实现下位机发送A,上位机接受A这种了,
如果要把这个包发送的话,里面的ST=32,CN=2011,这些字母要加进去么?还是只要把32,2011加进去,跟MODBUS那样直接输入数字字符?现在想知道要发送的数据的格式是怎麽样的。谢谢了!!!哪位高手有空,也可以看下这个协议,地址为:http://www.mep.gov.cn/image20010518/5836.pdf

解决方案 »

  1.   

    6.3.2 数据段结构组成
    名称 类型 长度 描述
    请求编号QN 字符 20 精确到毫秒的时间
    戳:QN=YYYYMMDDHHMMSSZZZ,用来唯一
    标识一个命令请求,用于请求命令或通
    知命令
    总包号PNUM 字符 4 PNUM 指示本次通讯总共包含的包数
    包号PNO 字符 4 PNO 指示当前数据包的包号
    系统编号ST 字符 5 ST=系统编号, 系统编号见6.5 中系统
    编码表
    命令编号CN 字符 7 CN=命令编号, 命令编号见6.5 中命令
    列表
    访问密码 字符 6 PW=访问密码
    注意发送长度的字节数,QN=、ST=、CN=这些是要加上的,但是很奇怪,最后的访问密码占6个字节,PW=、MN= 似乎又不需要,因为在后面看到密码为123456,如果加上PW=就会变成9个字节了。感觉是协议制定得有问题。
      

  2.   

    你提供 的协议打不开,
    看协议怎么定的,如果定的是QN=20080916000000;ST=32,CN=2011;MN=888888888;
    下位机发生实时数据,数据段的内容包括:ST=32;CN=2011;MN=888888888;CP=&&DATATIME=2008091600000
    你就发这个,
    如果定的是,只发数字,以??为分隔符,你就按协议发就成了,
    还有定长的,
    主要看协议怎么定的。
      

  3.   

    定义一个符合各个不同功能的规约结构体,定义一个数组,将结构体的数据move到数组中,调用socket的sendBuffer函数发送就ok了
      

  4.   

    用sendtext可以发送不?想定义个数组来把各个字符存入比如定义个数组A(),那么ST=32,CN=2011这些怎么存入数组的?这样定义可以不?A(0)= “ST=32”;A(2)=“CN=2011”,然后直接sendtext 发送定义的数组A()。另外的确有“老之”兄弟所说的问题,密码和MN字符长度又不对,所以问下是不是要加那些QN,ST,CN的,像MODBUS就简单些,只要发送数字命令。另外,如果加了QN,ST,CN这些,上位机收到数据处理的时候,提取数据该怎么把QN,ST,CN这些再去掉的?谢谢了,问题比较多哈,第一次搞协议
      

  5.   

    sendtext估计可以,但最好用流,就是类似字节数组。
    这个协议定得够烂的,一般协议会有固定的结构,比如第几个字节到第几个字节就是ST,而不会要求用ASCII码来传输ST=这样来增加发送数据的长度。
    要做接收数据的解析的时候,只要用Move将指定位置指定长度的数据移到结构体里面,就可以数据解析出来。按照现在的协议的话,只要计算出数据的位置,也可以取出来
      

  6.   

    呵呵,就是,直接用MODBUS就好,这都是利益集团,环保总局非要整个协议出来取数据我已经想到办法了,用POS定位ST,然后用COPY把后面的数据取出来现在想问下,在发送的时候ST=,CN=这些要怎么转换的,能不能A(0):=$ST=32;A():=$CN=2011,这样定义的?好像$后面的内容只可以16进制吧麻烦高手指点下发送的时候要怎么转换的,给个简单例子也可以回答的好可以追加分数,谢谢了