利用Python简单实现环保212协议客户端【HJ212_2017协议的封包发送】

1、文件组成:

config.json——配置信息
HJ212_2017_Helper.py——功能函数
HJ212_2017_CLIENT.py——客户端发送

2、配置文件(JSON格式)

{
    
    
	"server":{
    
    
		"ip":"127.0.0.1", 
		"port":8640
	}, 
	"data":{
    
    
		"ST":"21", 
		"CN":"2011",
		"PW":"123456",
		"MN":"010000A8900016F000169DC0", 
		"Flag":"4"		 				 		
	}
}

3、功能函数(利用Python字典结构做协议封包)

#!/usr/bin/python3
#coding=utf-8
import time


'''
    由数据字典 生成 HJ212_2017 协议字符串
'''
def encode(DIC_HJ212_2017):
    _data=''
    for key,value in DIC_HJ212_2017.items():
        if(key=='CP'):
            _data+='CP=&&'
            for cp_i,cp_item in DIC_HJ212_2017[key].items():                        
                for cp_key,cp_value in DIC_HJ212_2017[key][cp_i].items():
                    _data+=cp_key+'='+str(cp_value)+','
                _data=_data[0:-1] 
                _data+=';'    
            _data=_data[0:-1]                        
            _data+='&&'                        
        else:        
            _data+=key+'='+str(value)+';'

    _head='##'
    _length=len(_data)        
    STR_HJ212_2017=''
    STR_HJ212_2017+=_head
    STR_HJ212_2017+=str(_length).zfill(4)
    STR_HJ212_2017+=_data
    STR_HJ212_2017+=str(crc16(_data)).zfill(4).upper();
    STR_HJ212_2017+='\r\n'
    return STR_HJ212_2017 



'''
    由HJ212_2017 协议字符串数据 生成 字典
'''

def decode(data):
    DIC_HJ212_2017={
    
    }
    DIC_HJ212_2017['HEAD']=data[0:2]
    DIC_HJ212_2017['LENGTH']=data[2:6]
    DIC_HJ212_2017['CRC']=data[-6:-2]
    
    DIC_HJ212_2017['DATA']={
    
    }
    DIC_HJ212_2017['DATA']['CP']={
    
    }    
    
    _d0=data[6:-6].split('&&')
    
    _d1=_d0[0][0:-4].split(';')    
    for _d2 in _d1:
        _d3=_d2.split('=')        
        DIC_HJ212_2017['DATA'][_d3[0]]=_d3[1]   

    _d4=_d0[1].split(';')
    for _d5 in _d4:
        _d6=_d5.split(',')
        for _d7 in _d6:
            _d8=_d7.split('=')
            DIC_HJ212_2017['DATA']['CP'][_d8[0]]=_d8[1]
    _data=data[6:-6]    

    if(int(DIC_HJ212_2017['LENGTH'])==len(_data)):
    	print('数据长度验证通过')

    else:
    	print('数据长度验证未通过')  


    if(DIC_HJ212_2017['CRC']==str(crc16(_data)).zfill(4).upper()):
        print('CRC校验通过')  
    else:
        print('CRC校验未通过') 

    #print(DIC_HJ212_2017)  调试输出 结构为双层字典,类似JAVA对象  
    return DIC_HJ212_2017


'''
    crc16效验

'''
def crc16(text):
    data = bytearray(text, encoding='utf-8')
    crc = 0xffff
    dxs = 0xa001
    for i in range(len(data)):
        hibyte = crc >> 8
        crc = hibyte ^ data[i]
        for j in range(8):
            sbit = crc & 0x0001
            crc = crc >> 1
            if sbit == 1:
                crc ^= dxs
    return hex(crc)[2:]

'''
    QN=年月日时分秒毫秒
'''
def get_time_stamp():
    timestamp=time.time()
    local_time = time.localtime(timestamp)
    data_head = time.strftime("%Y%m%d%H%M%S", local_time)
    data_secs = (timestamp - int(timestamp)) * 1000
    dt_ms = "%s%03d" % (data_head, data_secs)
    # print(dt_ms)
    return dt_ms



#自我测试    
if __name__ == "__main__":

    data='##0131QN=20210730012315231;ST=31;CN=2011;PW=123456;MN=V130427GDSJ001;Flag=4;CP=&&DataTime=20210730012315;avoc01-Rtd=0.021,avoc01-Flag=N&&1A40\r\n'
    #print('时间='+decode(data)['DATA']['CP']['DataTime'])
    print('数据,avoc01-Rtd='+decode(data)['DATA']['CP']['avoc01-Rtd'])
    print('数据,avoc01-Flag='+decode(data)['DATA']['CP']['avoc01-Flag'])
    print('时间,DataTime='+decode(data)['DATA']['CP']['DataTime'])


    DIC_HJ212_2017={
    
    }            
    DIC_HJ212_2017['QN']=get_time_stamp()
    DIC_HJ212_2017['ST']='31'
    DIC_HJ212_2017['CN']='2011'
    DIC_HJ212_2017['PW']='123456'
    DIC_HJ212_2017['MN']='V130427GDSJ001'
    DIC_HJ212_2017['Flag']='4'
        
    DIC_HJ212_2017['CP']={
    
    }
    
    DIC_HJ212_2017['CP'][0]={
    
    }    
    DIC_HJ212_2017['CP'][0]['DataTime']=DIC_HJ212_2017['QN'][0:14]

    DIC_HJ212_2017['CP'][1]={
    
    }        
    DIC_HJ212_2017['CP'][1]['avoc01-Rtd']=0.021
    DIC_HJ212_2017['CP'][1]['avoc01-Flag']='N'

    print(encode(DIC_HJ212_2017))

4、采集报送

# -*- coding:utf-8 -*-
#!/usr/bin/python3
import hj212_2017_helper as hj212
import fun_log as log
import tcp_client
import time

ip='10.122.65.106'
port=5010
ip='127.0.0.1'
port=18009

MN='130481LBYMH001'
# 130481LBYMH001
# 130481BYJH0006
# 130481BYJH0005
# 130481BYMH0002

ST='59'
PW='123456'
Flag='5'



def send_rtd():
    DIC_HJ212_2017={
    
    }            
    # DIC_HJ212_2017['QN']=hj212.get_time_stamp()
    DIC_HJ212_2017['ST']=ST
    DIC_HJ212_2017['CN']=2011
    DIC_HJ212_2017['PW']=PW
    DIC_HJ212_2017['MN']=MN
    # DIC_HJ212_2017['Flag']=Flag
    DIC_HJ212_2017['CP']={
    
    }

    DIC_HJ212_2017['CP'][0]={
    
    }
    DIC_HJ212_2017['CP'][0]['DataTime']=hj212.get_time_stamp()[0:14]

    DIC_HJ212_2017['CP'][1]={
    
    }
    DIC_HJ212_2017['CP'][1]['SCXBH-Rtd']=10.01

    DIC_HJ212_2017['CP'][2]={
    
    }
    DIC_HJ212_2017['CP'][2]['JHGYDZMSJ-Rtd']=10.01

    DIC_HJ212_2017['CP'][3]={
    
    }
    DIC_HJ212_2017['CP'][3]['JHGYDTJSJ-Rtd']=10.01

    DIC_HJ212_2017['CP'][4]={
    
    }
    DIC_HJ212_2017['CP'][4]['JHGYDZMCDL-Rtd']=10.01

    DIC_HJ212_2017['CP'][5]={
    
    }
    DIC_HJ212_2017['CP'][5]['JHGYDTJCDL-Rtd']=10.01

    DIC_HJ212_2017['CP'][6]={
    
    }
    DIC_HJ212_2017['CP'][6]['JHGYDMQSYL-Rtd']=10.01

    DIC_HJ212_2017['CP'][7]={
    
    }
    DIC_HJ212_2017['CP'][7]['CCSSBDCCQQHYC-Rtd']=10.01

    DIC_HJ212_2017['CP'][8]={
    
    }
    DIC_HJ212_2017['CP'][8]['CCSSDCCQRCDL-Rtd']=10.01

    DIC_HJ212_2017['CP'][9]={
    
    }
    DIC_HJ212_2017['CP'][9]['CCSSDCCQRCDY-Rtd']=10.01

    DIC_HJ212_2017['CP'][10]={
    
    }
    DIC_HJ212_2017['CP'][10]['TLSSXSJPHZ-Rtd']=10.01

    DIC_HJ212_2017['CP'][11]={
    
    }
    DIC_HJ212_2017['CP'][11]['TLSSGJLL-Rtd']=10.01

    DIC_HJ212_2017['CP'][12]={
    
    }
    DIC_HJ212_2017['CP'][12]['TLSSGLLL-Rtd']=10.01

    DIC_HJ212_2017['CP'][13]={
    
    }
    DIC_HJ212_2017['CP'][13]['TLSSJYXHBYXZT-Rtd']=10.01

    DIC_HJ212_2017['CP'][14]={
    
    }
    DIC_HJ212_2017['CP'][14]['TLSSSFYHFJDL-Rtd']=10.01

    DIC_HJ212_2017['CP'][15]={
    
    }
    DIC_HJ212_2017['CP'][15]['TXSSYQSD-Rtd']=10.01

    DIC_HJ212_2017['CP'][16]={
    
    }
    DIC_HJ212_2017['CP'][16]['TXSSTXHYJYL-Rtd']=10.01
    
    tcp_client.send(ip,port,hj212.encode(DIC_HJ212_2017))
    log.write(hj212.encode(DIC_HJ212_2017)) 


def send_his(CN):
    DIC_HJ212_2017={
    
    }            
    DIC_HJ212_2017['QN']=hj212.get_time_stamp()
    DIC_HJ212_2017['ST']=ST
    DIC_HJ212_2017['CN']=CN
    DIC_HJ212_2017['PW']=PW
    DIC_HJ212_2017['MN']=MN
    DIC_HJ212_2017['Flag']=Flag

    DIC_HJ212_2017['CP']={
    
    }

    DIC_HJ212_2017['CP'][0]={
    
    }
    DIC_HJ212_2017['CP'][0]['DataTime']=DIC_HJ212_2017['QN'][0:14]

    DIC_HJ212_2017['CP'][1]={
    
    } # PH值
    DIC_HJ212_2017['CP'][1]['w01001-Min']=6.9394
    DIC_HJ212_2017['CP'][1]['w01001-Avg']=6.9394
    DIC_HJ212_2017['CP'][1]['w01001-Max']=6.9394
    DIC_HJ212_2017['CP'][1]['w01001-Flag']='N'

    DIC_HJ212_2017['CP'][2]={
    
    } # 化学需氧量 
    DIC_HJ212_2017['CP'][2]['w01018-Cou']=72.4002
    DIC_HJ212_2017['CP'][2]['w01018-Min']=72.4002
    DIC_HJ212_2017['CP'][2]['w01018-Avg']=72.4002
    DIC_HJ212_2017['CP'][2]['w01018-Max']=72.4002
    DIC_HJ212_2017['CP'][2]['w01018-Flag']='N'

    DIC_HJ212_2017['CP'][3]={
    
    } # 氨氮
    DIC_HJ212_2017['CP'][3]['w21003-Cou']=2.5283
    DIC_HJ212_2017['CP'][3]['w21003-Min']=2.5283
    DIC_HJ212_2017['CP'][3]['w21003-Avg']=2.5283
    DIC_HJ212_2017['CP'][3]['w21003-Max']=2.5283
    DIC_HJ212_2017['CP'][3]['w21003-Flag']='N'

    DIC_HJ212_2017['CP'][4]={
    
    }# 氰化物
    DIC_HJ212_2017['CP'][4]['w21016-Cou']=0.0367
    DIC_HJ212_2017['CP'][4]['w21016-Min']=0.0367
    DIC_HJ212_2017['CP'][4]['w21016-Avg']=0.0367
    DIC_HJ212_2017['CP'][4]['w21016-Max']=0.0367
    DIC_HJ212_2017['CP'][4]['w21016-Flag']='N'

    DIC_HJ212_2017['CP'][5]={
    
    }# 污水
    DIC_HJ212_2017['CP'][5]['w00000-Cou']=29.2936
    DIC_HJ212_2017['CP'][5]['w00000-Min']=29.2936
    DIC_HJ212_2017['CP'][5]['w00000-Avg']=29.2936
    DIC_HJ212_2017['CP'][5]['w00000-Max']=29.2936
    DIC_HJ212_2017['CP'][5]['w00000-Flag']='N'

    DIC_HJ212_2017['CP'][6]={
    
    }# 挥发酚
    DIC_HJ212_2017['CP'][6]['w23002-Cou']=0.0401
    DIC_HJ212_2017['CP'][6]['w23002-Min']=0.0401
    DIC_HJ212_2017['CP'][6]['w23002-Avg']=0.0401
    DIC_HJ212_2017['CP'][6]['w23002-Max']=0.0401
    DIC_HJ212_2017['CP'][6]['w23002-Flag']='N'
    
    tcp_client.send(ip,port,hj212.encode(DIC_HJ212_2017))
    log.write(hj212.encode(DIC_HJ212_2017))   

def avg(data):
    return sum(data)/len(data)


def main():
    
    send_rtd()
    log.write('发送完成')    
    return     
    

    send_his(2051)  
   

    while  True:
        timestamp=time.time()
        local_time = time.localtime(timestamp)        
        if local_time.tm_sec==55:#每分钟
            send_rtd()
            send_his(2051)  
            log.write('发送分钟值') 
        if local_time.tm_sec==55 and local_time.tm_min==59:  #每小时
            send_his(2061)
            log.write('发送小时值') 
        if local_time.tm_sec==55 and local_time.tm_min==59 and local_time.tm_hour==23:  #每天
            send_his(2031)
            log.write('发送日值')             
        time.sleep(1) 
#自我测试    
if __name__ == "__main__":
    main()

5、运行调试

在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/lzl640/article/details/113394845
212
今日推荐