meter reader

Dependencies:   mbed-http

Committer:
yao6116601
Date:
Thu Apr 19 13:34:33 2018 +0000
Revision:
0:34da3db6ec81
Meter read

Who changed what in which revision?

UserRevisionLine numberNew 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(&eth, 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 }