#include "uart.h" #include "addr.h" #include "debug_printf.h" #include "bl24c512.h" #include "WaterMetermanager.h" #include "Led.h" #include "keywd.h" #include "update.h" #include "Flash.h" #include "PHY.h" #include "rtc_ext.h" #include "hbframe.h" #include "filedata.h" //7E7E //帧起始符 2 //01 //中心站地址 1 //1310020028 //遥测站地址 40=28 5 //1234 //密码 (根据主站下发的变化) 2 //32 //功能码 1 //003C //报文上下行标志及长度 0000 上行 1000 下行 60 = 3C 2 //02 //报文起始符 1 //05FD //流水号 2 //201219013000 //发报时间 6 //F1F1 //地址标识符 2 //1310020028 //地址 5 //49 //遥测站分类码 1 //F0F0 //观测时间标识符 2 //2012190110 //观测时间 5 //282B //取水口流量1标识符 2 //0000000000 //取水口流量 5 //FF012A //取水口累计流量1标识符 3 //0002670300 //取水口累计流量 5 //6033 //水表1剩余水量标识符 2 //000000000000 //水表1剩余水量 6 //4520 //遥测状态及报警息信标识符号 2 //00000001 //遥测状态及报警信息 4 //3812 //电压标志符 2 //0000 //蓄电池电压 2 //FF0208 //CSQ标志符 3 //12 //信号强度CSQ 1 //03 //报文结束符 1 //0BB7 //校验 2 //7E 7E //01 //00 00 00 00 01 //0C 50 //2F //00 08 //02 //00 02 12 12 07 08 56 50 //03 //22 8D //中心站确认帧 //7E 7E //00 //00 00 00 01 01 //0C 51 //32 //80 08 //02 //00 00 12 12 07 08 56 50 //04 ac a5 //0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 //7E 7E 01 13 10 02 00 28 12 34 32 00 3C 02 05 FD 20 12 19 01 30 00 F1 F1 13 10 02 00 28 49 F0 F0 20 12 19 01 10 28 2B 00 00 00 00 00 FF 01 2A 00 02 67 03 00 60 33 00 00 00 00 00 00 45 20 00 00 00 01 38 12 00 00 FF 02 08 12 03 0B B7 //6.6.4.9 中心站查询遥测站实时数据 //报文实例: //(1)取用水类 //1)中心站下行报文 //中心地址 01 遥测站地址 0000000001 密码 0x0c51 功能码 37 发报时间 12-12-07 //7E 7E //01 //00 00 00 00 01 //0C 51 //37 *** //00 3C //02 //00 01 //12 12 09 10 21 07 //F1 F1 //00 00 00 00 01 //50 *** //F0 F0 //12 12 09 10 21 //28 2B //00 00 23 99 99 //FF 01 2A //00 99 99 99 99 //60 33 //00 00 00 20 03 50 //45 20 //00 00 00 03 //38 12 //12 80 //FF 02 08 //26 //03 //72 E4 //6.6.4.17 初始化固态存储数据 //6.6.4.18 恢复遥测站出厂设置 //6.6.4.19 修改密码 //6.6.4.20 设置遥测站时钟 //6.6.4.23 控制水泵开关命令/水泵状态自报 //140 页功能码定义 extern u8 csq_value; extern u8 * hb_getdl_time(); extern void hb_get_time(u8 * time); extern u16 get_crc(u8 * val,u16 len); extern void hb_waterdata_read(u16 count,uint8_t * buf,uint16_t len); bool hb_data_rp_pro(u16 index,u8 * val,u16 * len) { u8 * addr = NULL; u8 * pval = NULL; u16 password = 0; u16 ck = 0; struct hb_struct * p = (struct hb_struct *)val; struct waterdata_struct waterdata; u8 data_crc = 0; hb_waterdata_read(index,(u8*)&waterdata,sizeof(struct waterdata_struct)); data_crc = GetSum((uint8_t*)&waterdata.invalid,WATERDATA_LEN); if(waterdata.crc != data_crc) { return false; } //帧起始符 p->head[0] = 0x7E; p->head[1] = 0x7E; //中心站地址 p->centeraddr = get_center_addr(); //遥测站地址 40=28 addr = get_hb_addr(); MemCpy(p->collectaddr,addr,5); password = get_password(); //密码 hbp2from16(p->pwd,password); //功能码 p->fn = 0x32; // p->fn = HB_DATA_RP_FUN; //报文上下行标志及长度 hbp2from16(p->len,60); //报文起始符 1 p->start = 0x02; //流水号 2 hbp2from16(p->serial, get_send_serial()); pval = (u8*)p + sizeof(struct hb_struct); //////////////////////////////////////////////////////////////// //发报时间 6 hb_get_time(pval); pval = pval + 6; //地址标识符 2 pval[0] = 0xF1; pval[1] = 0xF1; pval = pval + 2; //地址 5 MemCpy(pval,addr,5); pval = pval + 5; //遥测站分类码 1 pval[0] = 0x49; pval = pval + 1; //观测时间标识符 2 pval[0] = 0xF0; pval[1] = 0xF0; pval = pval + 2; //观测时间 5 //MemCpy(pval,hb_getdl_time(),5); pval[0] = waterdata.year; pval[1] = waterdata.mon; pval[2] = waterdata.day; pval[3] = waterdata.hour; /* if(waterdata.hour == 0x00) { if(waterdata.day == 1) { if(waterdata.mon == 1) { waterdata.year = waterdata.year - 1; } else { pval[1] = waterdata.mon-1; } } else { pval[2] = waterdata.day-1; } pval[3] = 0x23; } else { pval[3] = waterdata.hour-1; } */ pval[4] = 0x00; pval[5] = 0; pval = pval + 5; //取水口流量1标识符 2 pval[0] = 0x28; pval[1] = 0x2B; pval = pval + 2; //取水口流量 5 pval[0] = waterdata.current[0]; pval[1] = waterdata.current[1]; pval[2] = waterdata.current[2]; pval[3] = waterdata.current[3]; pval[4] = waterdata.current[4]; pval = pval + 5; //取水口累计流量1标识符 3 pval[0] = 0xFF; pval[1] = 0x01; pval[2] = 0x2A; pval = pval + 3; //取水口累计流量 5 pval[0] = waterdata.sum[0]; pval[1] = waterdata.sum[1]; pval[2] = waterdata.sum[2]; pval[3] = waterdata.sum[3]; pval[4] = waterdata.sum[4]; pval = pval + 5; //水表1剩余水量标识符 2 pval[0] = 0x60; pval[1] = 0x33; pval = pval + 2; //水表1剩余水量 6 pval[0] = waterdata.surplus[0]; pval[1] = waterdata.surplus[1]; pval[2] = waterdata.surplus[2]; pval[3] = waterdata.surplus[3]; pval[4] = waterdata.surplus[4]; pval[5] = waterdata.surplus[5]; pval = pval + 6; //遥测状态及报警息信标识符号 2 pval[0] = 0x45; pval[1] = 0x20; pval = pval + 2; //遥测状态及报警信息 4 pval[0] = waterdata.ala[0]; pval[1] = waterdata.ala[1]; pval[2] = waterdata.ala[2]; pval[3] = waterdata.ala[3]; pval = pval + 4; //电压标志符 2 pval[0] = 0x38; pval[1] = 0x12; pval = pval + 2; //蓄电池电压 2 //pval[0] = waterdata.vol[0]; //pval[1] = waterdata.vol[1]; pval[0] = 0x12; pval[1] = HexToBCD((RTC_GetCounter()%50)); pval = pval + 2; //CSQ标志符 3 pval[0] = 0xFF; pval[1] = 0x02; pval[2] = 0x08; pval = pval + 3; //信号强度CSQ 1 pval[0] = csq_value; pval = pval + 1; //报文结束符 1 pval[0] = 0x03; pval = pval + 1; ck = get_crc(val,75); hbp2from16(pval,ck); *len = 77; return true; } bool hb_data_rp_cur_pro(u8 * val,u16 * len,u8 * currentdata,u8 * sumdata,u8 * surplus,u8 * ala,u8 year,u8 month,u8 day,u8 hour) { u8 * addr = NULL; u8 * pval = NULL; u16 password = 0; u16 ck = 0; struct hb_struct * p = (struct hb_struct *)val; //帧起始符 p->head[0] = 0x7E; p->head[1] = 0x7E; //中心站地址 p->centeraddr = get_center_addr(); //遥测站地址 40=28 addr = get_hb_addr(); //addr[4] = addr[4] + 1; MemCpy(p->collectaddr,addr,5); password = get_password(); //密码 hbp2from16(p->pwd,password); //功能码 p->fn = 0x32; // p->fn = HB_DATA_RP_FUN; //报文上下行标志及长度 hbp2from16(p->len,60); //报文起始符 1 p->start = 0x02; //流水号 2 hbp2from16(p->serial, get_send_serial()); pval = (u8*)p + sizeof(struct hb_struct); //////////////////////////////////////////////////////////////// //发报时间 6 hb_get_time(pval); pval = pval + 6; //地址标识符 2 pval[0] = 0xF1; pval[1] = 0xF1; pval = pval + 2; //地址 5 MemCpy(pval,addr,5); pval = pval + 5; //遥测站分类码 1 pval[0] = 0x49; pval = pval + 1; //观测时间标识符 2 pval[0] = 0xF0; pval[1] = 0xF0; pval = pval + 2; //观测时间 5 //MemCpy(pval,hb_getdl_time(),5); pval[0] = year; pval[1] = month; pval[2] = day; pval[3] = hour; pval[4] = 0x00; pval[5] = 0; pval = pval + 5; //取水口流量1标识符 2 pval[0] = 0x28; pval[1] = 0x2B; pval = pval + 2; //取水口流量 5 pval[0] = currentdata[0]; pval[1] = currentdata[1]; pval[2] = currentdata[2]; pval[3] = currentdata[3]; pval[4] = currentdata[4]; pval = pval + 5; //取水口累计流量1标识符 3 pval[0] = 0xFF; pval[1] = 0x01; pval[2] = 0x2A; pval = pval + 3; //取水口累计流量 5 pval[0] = sumdata[0]; pval[1] = sumdata[1]; pval[2] = sumdata[2]; pval[3] = sumdata[3]; pval[4] = sumdata[4]; pval = pval + 5; //水表1剩余水量标识符 2 pval[0] = 0x60; pval[1] = 0x33; pval = pval + 2; //水表1剩余水量 6 pval[0] = surplus[0]; pval[1] = surplus[1]; pval[2] = surplus[2]; pval[3] = surplus[3]; pval[4] = surplus[4]; pval[5] = surplus[5]; pval = pval + 6; //遥测状态及报警息信标识符号 2 pval[0] = 0x45; pval[1] = 0x20; pval = pval + 2; //遥测状态及报警信息 4 pval[0] = ala[0]; pval[1] = ala[1]; pval[2] = ala[2]; pval[3] = ala[3]; pval = pval + 4; //电压标志符 2 pval[0] = 0x38; pval[1] = 0x12; pval = pval + 2; //蓄电池电压 2 pval[0] = 0x12; pval[1] = HexToBCD((RTC_GetCounter()%50)); pval = pval + 2; //CSQ标志符 3 pval[0] = 0xFF; pval[1] = 0x02; pval[2] = 0x08; pval = pval + 3; //信号强度CSQ 1 pval[0] = csq_value; pval = pval + 1; //报文结束符 1 pval[0] = 0x03; pval = pval + 1; ck = get_crc(val,75); hbp2from16(pval,ck); *len = 77; return true; }