老 姚
/
meterRead
meter reader
main.cpp@0:34da3db6ec81, 2018-04-19 (annotated)
- Committer:
- yao6116601
- Date:
- Thu Apr 19 13:34:33 2018 +0000
- Revision:
- 0:34da3db6ec81
Meter read
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
yao6116601 | 0:34da3db6ec81 | 1 | #include "mbed.h" |
yao6116601 | 0:34da3db6ec81 | 2 | #include "EthernetInterface.h" |
yao6116601 | 0:34da3db6ec81 | 3 | #include "http_request.h" |
yao6116601 | 0:34da3db6ec81 | 4 | #include "http_response.h" |
yao6116601 | 0:34da3db6ec81 | 5 | DigitalOut myled(PF_12); |
yao6116601 | 0:34da3db6ec81 | 6 | DigitalOut red(PF_14); |
yao6116601 | 0:34da3db6ec81 | 7 | DigitalOut dir(PG_15); |
yao6116601 | 0:34da3db6ec81 | 8 | RawSerial rs485(PE_1,PE_0,9600); |
yao6116601 | 0:34da3db6ec81 | 9 | #define GET_ADDRESS 0x13 |
yao6116601 | 0:34da3db6ec81 | 10 | #define GET_DATA 0x11 |
yao6116601 | 0:34da3db6ec81 | 11 | #define SERVER_PORT 8000 |
yao6116601 | 0:34da3db6ec81 | 12 | #define SERVER_ADDR "192.168.1.10" |
yao6116601 | 0:34da3db6ec81 | 13 | static const char* mbedIp = "192.168.1.120"; //IP |
yao6116601 | 0:34da3db6ec81 | 14 | static const char* mbedMask = "255.255.255.0"; // Mask |
yao6116601 | 0:34da3db6ec81 | 15 | static const char* mbedGateway = "192.168.1.10"; //Gateway |
yao6116601 | 0:34da3db6ec81 | 16 | Thread recv; |
yao6116601 | 0:34da3db6ec81 | 17 | EthernetInterface eth; |
yao6116601 | 0:34da3db6ec81 | 18 | |
yao6116601 | 0:34da3db6ec81 | 19 | void polling(char *address,uint8_t code,char *sbuf,int slen) |
yao6116601 | 0:34da3db6ec81 | 20 | { |
yao6116601 | 0:34da3db6ec81 | 21 | char buf[32]; |
yao6116601 | 0:34da3db6ec81 | 22 | int len,i,k; |
yao6116601 | 0:34da3db6ec81 | 23 | uint8_t checksum; |
yao6116601 | 0:34da3db6ec81 | 24 | checksum=0; |
yao6116601 | 0:34da3db6ec81 | 25 | i=0; |
yao6116601 | 0:34da3db6ec81 | 26 | buf[i++]=0xfe; |
yao6116601 | 0:34da3db6ec81 | 27 | buf[i++]=0xfe; |
yao6116601 | 0:34da3db6ec81 | 28 | buf[i++]=0xfe; |
yao6116601 | 0:34da3db6ec81 | 29 | buf[i++]=0xfe; |
yao6116601 | 0:34da3db6ec81 | 30 | buf[i++]=0x68;checksum=0x68; |
yao6116601 | 0:34da3db6ec81 | 31 | for (k=0;k<6;k++) |
yao6116601 | 0:34da3db6ec81 | 32 | { buf[i++]=address[k]; |
yao6116601 | 0:34da3db6ec81 | 33 | checksum=checksum+address[k]; |
yao6116601 | 0:34da3db6ec81 | 34 | }; |
yao6116601 | 0:34da3db6ec81 | 35 | buf[i++]=0x68;checksum=checksum+0x68; |
yao6116601 | 0:34da3db6ec81 | 36 | buf[i++]=code;checksum=checksum+code; |
yao6116601 | 0:34da3db6ec81 | 37 | buf[i++]=slen;checksum=checksum+slen; |
yao6116601 | 0:34da3db6ec81 | 38 | for (k=0;k<slen;k++) |
yao6116601 | 0:34da3db6ec81 | 39 | { |
yao6116601 | 0:34da3db6ec81 | 40 | buf[i++]=sbuf[k];checksum=checksum+sbuf[k]; |
yao6116601 | 0:34da3db6ec81 | 41 | } |
yao6116601 | 0:34da3db6ec81 | 42 | buf[i++]=checksum; |
yao6116601 | 0:34da3db6ec81 | 43 | buf[i++]=0x16; |
yao6116601 | 0:34da3db6ec81 | 44 | buf[i++]=0xfe; |
yao6116601 | 0:34da3db6ec81 | 45 | buf[i++]=0xfe; |
yao6116601 | 0:34da3db6ec81 | 46 | len=i; |
yao6116601 | 0:34da3db6ec81 | 47 | dir=1; |
yao6116601 | 0:34da3db6ec81 | 48 | for (i=0;i<len;i++) |
yao6116601 | 0:34da3db6ec81 | 49 | rs485.putc(buf[i]); |
yao6116601 | 0:34da3db6ec81 | 50 | // wait(0.03); |
yao6116601 | 0:34da3db6ec81 | 51 | dir=0; |
yao6116601 | 0:34da3db6ec81 | 52 | } |
yao6116601 | 0:34da3db6ec81 | 53 | void CmdParser(uint8_t code,char *rbuf,int len) |
yao6116601 | 0:34da3db6ec81 | 54 | { int i; |
yao6116601 | 0:34da3db6ec81 | 55 | char value[32]; |
yao6116601 | 0:34da3db6ec81 | 56 | double v; |
yao6116601 | 0:34da3db6ec81 | 57 | switch(code) |
yao6116601 | 0:34da3db6ec81 | 58 | { |
yao6116601 | 0:34da3db6ec81 | 59 | case 0x93:{ |
yao6116601 | 0:34da3db6ec81 | 60 | printf("meter Address="); |
yao6116601 | 0:34da3db6ec81 | 61 | for(i=0;i<6;i++) |
yao6116601 | 0:34da3db6ec81 | 62 | printf("%02x",rbuf[5-i]-0x33); |
yao6116601 | 0:34da3db6ec81 | 63 | printf("\n"); |
yao6116601 | 0:34da3db6ec81 | 64 | break; |
yao6116601 | 0:34da3db6ec81 | 65 | } |
yao6116601 | 0:34da3db6ec81 | 66 | case 0x91:{ |
yao6116601 | 0:34da3db6ec81 | 67 | // printf("meter readout"); |
yao6116601 | 0:34da3db6ec81 | 68 | for(i=0;i<4;i++) |
yao6116601 | 0:34da3db6ec81 | 69 | { //printf("%02x",rbuf[7-i]-0x33); |
yao6116601 | 0:34da3db6ec81 | 70 | value[i]=rbuf[7-i]-0x33; |
yao6116601 | 0:34da3db6ec81 | 71 | } |
yao6116601 | 0:34da3db6ec81 | 72 | //printf("\n"); |
yao6116601 | 0:34da3db6ec81 | 73 | v=((value[0]&0xf0)>>4)*100000; |
yao6116601 | 0:34da3db6ec81 | 74 | v=v+(value[0]&0x0f)*10000; |
yao6116601 | 0:34da3db6ec81 | 75 | v=v+((value[1]&0xf0)>>4)*1000; |
yao6116601 | 0:34da3db6ec81 | 76 | v=v+(value[1]&0x0f)*100; |
yao6116601 | 0:34da3db6ec81 | 77 | v=v+((value[2]&0xf0)>>4)*10; |
yao6116601 | 0:34da3db6ec81 | 78 | v=v+(value[2]&0x0f); |
yao6116601 | 0:34da3db6ec81 | 79 | v=v+((double)((value[3]&0xf0)>>4)/10); |
yao6116601 | 0:34da3db6ec81 | 80 | v=v+((double)(value[3]&0x0f)/100); |
yao6116601 | 0:34da3db6ec81 | 81 | sprintf(value,"%.2f",v); |
yao6116601 | 0:34da3db6ec81 | 82 | // printf(value,"%.2f\n",v); |
yao6116601 | 0:34da3db6ec81 | 83 | // uplaod to web server |
yao6116601 | 0:34da3db6ec81 | 84 | char body[32] ;//= "{\"value\":\"world\"}"; |
yao6116601 | 0:34da3db6ec81 | 85 | strcpy(body,"{\"value\":\""); |
yao6116601 | 0:34da3db6ec81 | 86 | strcat(body,value); |
yao6116601 | 0:34da3db6ec81 | 87 | strcat(body,"\"}"); |
yao6116601 | 0:34da3db6ec81 | 88 | HttpRequest* request = new HttpRequest(ð, HTTP_POST, "http://192.168.1.10:8000/readOut"); |
yao6116601 | 0:34da3db6ec81 | 89 | request->set_header("Content-Type", "application/json"); |
yao6116601 | 0:34da3db6ec81 | 90 | HttpResponse* response= request->send(body, strlen(body)); |
yao6116601 | 0:34da3db6ec81 | 91 | delete request ; |
yao6116601 | 0:34da3db6ec81 | 92 | break; |
yao6116601 | 0:34da3db6ec81 | 93 | } |
yao6116601 | 0:34da3db6ec81 | 94 | } |
yao6116601 | 0:34da3db6ec81 | 95 | } |
yao6116601 | 0:34da3db6ec81 | 96 | void receive() |
yao6116601 | 0:34da3db6ec81 | 97 | { uint8_t state,ch; |
yao6116601 | 0:34da3db6ec81 | 98 | int i; |
yao6116601 | 0:34da3db6ec81 | 99 | char rbuf[32]; |
yao6116601 | 0:34da3db6ec81 | 100 | char address[6]; |
yao6116601 | 0:34da3db6ec81 | 101 | uint8_t code,len; |
yao6116601 | 0:34da3db6ec81 | 102 | state=0; |
yao6116601 | 0:34da3db6ec81 | 103 | while(true) |
yao6116601 | 0:34da3db6ec81 | 104 | { |
yao6116601 | 0:34da3db6ec81 | 105 | switch(state) |
yao6116601 | 0:34da3db6ec81 | 106 | { |
yao6116601 | 0:34da3db6ec81 | 107 | case 0:{ |
yao6116601 | 0:34da3db6ec81 | 108 | ch=rs485.getc(); |
yao6116601 | 0:34da3db6ec81 | 109 | if (ch==0xfe) state=1; |
yao6116601 | 0:34da3db6ec81 | 110 | break; |
yao6116601 | 0:34da3db6ec81 | 111 | }; |
yao6116601 | 0:34da3db6ec81 | 112 | case 1:{ |
yao6116601 | 0:34da3db6ec81 | 113 | ch=rs485.getc(); |
yao6116601 | 0:34da3db6ec81 | 114 | if (ch==0x68) {state=2;i=0;} |
yao6116601 | 0:34da3db6ec81 | 115 | else if (ch!=0xfe) state=0; |
yao6116601 | 0:34da3db6ec81 | 116 | |
yao6116601 | 0:34da3db6ec81 | 117 | break; |
yao6116601 | 0:34da3db6ec81 | 118 | } |
yao6116601 | 0:34da3db6ec81 | 119 | case 2:{ // read address |
yao6116601 | 0:34da3db6ec81 | 120 | ch=rs485.getc() ; |
yao6116601 | 0:34da3db6ec81 | 121 | address[i++]=ch; |
yao6116601 | 0:34da3db6ec81 | 122 | if (i==6) state=3; |
yao6116601 | 0:34da3db6ec81 | 123 | break; |
yao6116601 | 0:34da3db6ec81 | 124 | } |
yao6116601 | 0:34da3db6ec81 | 125 | case 3:{ |
yao6116601 | 0:34da3db6ec81 | 126 | ch=rs485.getc() ; |
yao6116601 | 0:34da3db6ec81 | 127 | if (ch==0x68) state=4;else state=0; |
yao6116601 | 0:34da3db6ec81 | 128 | break; |
yao6116601 | 0:34da3db6ec81 | 129 | } |
yao6116601 | 0:34da3db6ec81 | 130 | case 4:{ //code |
yao6116601 | 0:34da3db6ec81 | 131 | ch=rs485.getc() ; |
yao6116601 | 0:34da3db6ec81 | 132 | code =ch; |
yao6116601 | 0:34da3db6ec81 | 133 | state=5; |
yao6116601 | 0:34da3db6ec81 | 134 | break; |
yao6116601 | 0:34da3db6ec81 | 135 | } |
yao6116601 | 0:34da3db6ec81 | 136 | case 5:{ |
yao6116601 | 0:34da3db6ec81 | 137 | ch=rs485.getc() ; |
yao6116601 | 0:34da3db6ec81 | 138 | i=0;len=ch; |
yao6116601 | 0:34da3db6ec81 | 139 | state=6; |
yao6116601 | 0:34da3db6ec81 | 140 | break; |
yao6116601 | 0:34da3db6ec81 | 141 | } |
yao6116601 | 0:34da3db6ec81 | 142 | case 6:{ |
yao6116601 | 0:34da3db6ec81 | 143 | ch=rs485.getc() ; |
yao6116601 | 0:34da3db6ec81 | 144 | rbuf[i++]=ch; |
yao6116601 | 0:34da3db6ec81 | 145 | if (i==len) state=7; |
yao6116601 | 0:34da3db6ec81 | 146 | break; |
yao6116601 | 0:34da3db6ec81 | 147 | } |
yao6116601 | 0:34da3db6ec81 | 148 | case 7:{ |
yao6116601 | 0:34da3db6ec81 | 149 | ch=rs485.getc() ; |
yao6116601 | 0:34da3db6ec81 | 150 | state=8; |
yao6116601 | 0:34da3db6ec81 | 151 | break; |
yao6116601 | 0:34da3db6ec81 | 152 | } |
yao6116601 | 0:34da3db6ec81 | 153 | case 8:{ |
yao6116601 | 0:34da3db6ec81 | 154 | ch=rs485.getc() ; |
yao6116601 | 0:34da3db6ec81 | 155 | if (ch==0x16) { |
yao6116601 | 0:34da3db6ec81 | 156 | CmdParser(code,rbuf,len); |
yao6116601 | 0:34da3db6ec81 | 157 | |
yao6116601 | 0:34da3db6ec81 | 158 | |
yao6116601 | 0:34da3db6ec81 | 159 | } |
yao6116601 | 0:34da3db6ec81 | 160 | else |
yao6116601 | 0:34da3db6ec81 | 161 | printf("err\n"); |
yao6116601 | 0:34da3db6ec81 | 162 | state=0; |
yao6116601 | 0:34da3db6ec81 | 163 | break; |
yao6116601 | 0:34da3db6ec81 | 164 | } |
yao6116601 | 0:34da3db6ec81 | 165 | } |
yao6116601 | 0:34da3db6ec81 | 166 | } |
yao6116601 | 0:34da3db6ec81 | 167 | } |
yao6116601 | 0:34da3db6ec81 | 168 | int main() { |
yao6116601 | 0:34da3db6ec81 | 169 | |
yao6116601 | 0:34da3db6ec81 | 170 | char address[6]; |
yao6116601 | 0:34da3db6ec81 | 171 | char sbuf[16]; |
yao6116601 | 0:34da3db6ec81 | 172 | bool flg; |
yao6116601 | 0:34da3db6ec81 | 173 | /*address[0]=0xaa; |
yao6116601 | 0:34da3db6ec81 | 174 | address[1]=0xaa; |
yao6116601 | 0:34da3db6ec81 | 175 | address[2]=0xaa; |
yao6116601 | 0:34da3db6ec81 | 176 | address[3]=0xaa; |
yao6116601 | 0:34da3db6ec81 | 177 | address[4]=0xaa; |
yao6116601 | 0:34da3db6ec81 | 178 | address[5]=0xaa;*/ |
yao6116601 | 0:34da3db6ec81 | 179 | eth.set_network(mbedIp,mbedMask,mbedGateway); |
yao6116601 | 0:34da3db6ec81 | 180 | eth.connect(); |
yao6116601 | 0:34da3db6ec81 | 181 | printf("\nMy device IP Address is %s\n", eth.get_ip_address()); |
yao6116601 | 0:34da3db6ec81 | 182 | printf("\nServer MAC Address is %s\n", eth.get_mac_address()); |
yao6116601 | 0:34da3db6ec81 | 183 | flg=true; |
yao6116601 | 0:34da3db6ec81 | 184 | dir=0; |
yao6116601 | 0:34da3db6ec81 | 185 | //rs485.set_format(8,UARTSerial::None,1); |
yao6116601 | 0:34da3db6ec81 | 186 | printf("read electricity meter demo\n"); |
yao6116601 | 0:34da3db6ec81 | 187 | recv.start(&receive); |
yao6116601 | 0:34da3db6ec81 | 188 | address[0]=0x00; |
yao6116601 | 0:34da3db6ec81 | 189 | address[1]=0x40; |
yao6116601 | 0:34da3db6ec81 | 190 | address[2]=0x08; |
yao6116601 | 0:34da3db6ec81 | 191 | address[3]=0x13; |
yao6116601 | 0:34da3db6ec81 | 192 | address[4]=0x00; |
yao6116601 | 0:34da3db6ec81 | 193 | address[5]=0x65; |
yao6116601 | 0:34da3db6ec81 | 194 | sbuf[0]=0x33; |
yao6116601 | 0:34da3db6ec81 | 195 | sbuf[1]=0x33; |
yao6116601 | 0:34da3db6ec81 | 196 | sbuf[2]=0x34; |
yao6116601 | 0:34da3db6ec81 | 197 | sbuf[3]=0x33; |
yao6116601 | 0:34da3db6ec81 | 198 | while(1) { |
yao6116601 | 0:34da3db6ec81 | 199 | wait(2); |
yao6116601 | 0:34da3db6ec81 | 200 | polling(address,GET_DATA,sbuf,4); |
yao6116601 | 0:34da3db6ec81 | 201 | // receive(); |
yao6116601 | 0:34da3db6ec81 | 202 | if (flg){flg=false;myled=1;} |
yao6116601 | 0:34da3db6ec81 | 203 | else {flg=true;myled=0;} |
yao6116601 | 0:34da3db6ec81 | 204 | } |
yao6116601 | 0:34da3db6ec81 | 205 | } |