mbed Weather Platform firmware http://mbed.org/users/okini3939/notebook/mbed-weather-platform-firmware/
Dependencies: ChaNFSSD EthernetNetIf I2CLEDDisp Agentbed ChaNFSUSB ILinterpreter mbed BMP085 WeatherMeters ConfigFile ChaNFS I2CLCD
net.cpp@8:bed0b81794ba, 2012-03-16 (annotated)
- Committer:
- okini3939
- Date:
- Fri Mar 16 15:26:46 2012 +0000
- Revision:
- 8:bed0b81794ba
- Parent:
- 7:f7c98d836f81
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
okini3939 | 1:6c7141895545 | 1 | /* |
okini3939 | 1:6c7141895545 | 2 | * Weather Station - mbed Weather Platform |
okini3939 | 1:6c7141895545 | 3 | * Copyright (c) 2011 Hiroshi Suga |
okini3939 | 1:6c7141895545 | 4 | * Released under the MIT License: http://mbed.org/license/mit |
okini3939 | 1:6c7141895545 | 5 | */ |
okini3939 | 1:6c7141895545 | 6 | |
okini3939 | 1:6c7141895545 | 7 | /** @file |
okini3939 | 1:6c7141895545 | 8 | * @brief Weather Station |
okini3939 | 1:6c7141895545 | 9 | */ |
okini3939 | 1:6c7141895545 | 10 | |
okini3939 | 0:bdb53686c194 | 11 | #include "mbed.h" |
okini3939 | 0:bdb53686c194 | 12 | #include "weather.h" |
okini3939 | 0:bdb53686c194 | 13 | #include "EthernetNetIf.h" |
okini3939 | 0:bdb53686c194 | 14 | #ifdef USE_NTP |
okini3939 | 2:a3e5edf84f74 | 15 | #include "TinySNTP.h" |
okini3939 | 0:bdb53686c194 | 16 | #endif |
okini3939 | 2:a3e5edf84f74 | 17 | #ifdef USE_HTTP |
okini3939 | 3:058292da2cee | 18 | #include "TinyHTTP.h" |
okini3939 | 2:a3e5edf84f74 | 19 | #endif |
okini3939 | 0:bdb53686c194 | 20 | #ifdef USE_EMAIL |
okini3939 | 3:058292da2cee | 21 | #include "TinySMTP.h" |
okini3939 | 0:bdb53686c194 | 22 | #endif |
okini3939 | 3:058292da2cee | 23 | #include "TCPSocket.h" |
okini3939 | 0:bdb53686c194 | 24 | |
okini3939 | 0:bdb53686c194 | 25 | EthernetNetIf *eth; |
okini3939 | 1:6c7141895545 | 26 | DigitalOut led_gayk(p24),led_gkya(p25), led_yk(p26); |
okini3939 | 0:bdb53686c194 | 27 | static DigitalIn eth_link(P1_25), eth_speed(P1_26); |
okini3939 | 0:bdb53686c194 | 28 | static volatile int ethernet_flg = 0; |
okini3939 | 0:bdb53686c194 | 29 | |
okini3939 | 0:bdb53686c194 | 30 | int weatherstations () { |
okini3939 | 2:a3e5edf84f74 | 31 | #ifdef USE_HTTP |
okini3939 | 3:058292da2cee | 32 | Host host; |
okini3939 | 3:058292da2cee | 33 | char buf[FORMAT_STR_SIZE]; |
okini3939 | 3:058292da2cee | 34 | char head[80]; |
okini3939 | 0:bdb53686c194 | 35 | |
okini3939 | 0:bdb53686c194 | 36 | if (! ethernet_flg) return 0; |
okini3939 | 2:a3e5edf84f74 | 37 | if (! conf.stations_id[0] || ! conf.stations_pin[0]) { |
okini3939 | 0:bdb53686c194 | 38 | return -1; |
okini3939 | 0:bdb53686c194 | 39 | } |
okini3939 | 0:bdb53686c194 | 40 | |
okini3939 | 1:6c7141895545 | 41 | LED_NET_ACT_ON; |
okini3939 | 3:058292da2cee | 42 | |
okini3939 | 3:058292da2cee | 43 | format_str("d0=%.2P&d1=%.2T&d2=%.2H&d3=%.2A&d4=%.2V&d5=%.2R&d6=%.2L&d7=%.2U&d8=%.2M&d9=%.2p", buf, sizeof_1(buf)); |
okini3939 | 3:058292da2cee | 44 | snprintf(&buf[strlen(buf)], sizeof_len(buf), |
okini3939 | 3:058292da2cee | 45 | "&fcd=%s&pin=%s", conf.stations_id, conf.stations_pin); |
okini3939 | 0:bdb53686c194 | 46 | |
okini3939 | 2:a3e5edf84f74 | 47 | #ifdef DEBUG |
okini3939 | 3:058292da2cee | 48 | pc.printf("S: %s %s\r\n%s\r\n", conf.stations_id, conf.stations_pin, buf); |
okini3939 | 2:a3e5edf84f74 | 49 | #endif |
okini3939 | 2:a3e5edf84f74 | 50 | // http->resetRequestHeaders(); |
okini3939 | 2:a3e5edf84f74 | 51 | // http->basicAuth(NULL, NULL); |
okini3939 | 3:058292da2cee | 52 | |
okini3939 | 3:058292da2cee | 53 | strncpy(head, "Content-type: application/x-www-form-urlencoded\r\n", sizeof_1(head)); |
okini3939 | 0:bdb53686c194 | 54 | |
okini3939 | 3:058292da2cee | 55 | host.setName("weather.sugakoubou.com"); |
okini3939 | 3:058292da2cee | 56 | host.setPort(HTTP_PORT); |
okini3939 | 3:058292da2cee | 57 | return httpRequest(METHOD_POST, &host, "/p", head, buf) == 200 ? 0 : -1; |
okini3939 | 0:bdb53686c194 | 58 | #endif |
okini3939 | 0:bdb53686c194 | 59 | } |
okini3939 | 0:bdb53686c194 | 60 | |
okini3939 | 2:a3e5edf84f74 | 61 | int pachube () { |
okini3939 | 2:a3e5edf84f74 | 62 | #ifdef USE_HTTP |
okini3939 | 3:058292da2cee | 63 | Host host; |
okini3939 | 3:058292da2cee | 64 | char buf[FORMAT_STR_SIZE]; |
okini3939 | 3:058292da2cee | 65 | char uri[40], head[160]; |
okini3939 | 0:bdb53686c194 | 66 | |
okini3939 | 0:bdb53686c194 | 67 | if (! ethernet_flg) return 0; |
okini3939 | 2:a3e5edf84f74 | 68 | if (! conf.pachube_apikey[0] || ! conf.pachube_feedid[0]) { |
okini3939 | 0:bdb53686c194 | 69 | return -1; |
okini3939 | 0:bdb53686c194 | 70 | } |
okini3939 | 0:bdb53686c194 | 71 | |
okini3939 | 1:6c7141895545 | 72 | LED_NET_ACT_ON; |
okini3939 | 3:058292da2cee | 73 | // body |
okini3939 | 2:a3e5edf84f74 | 74 | format_str(conf.pachube_mesg, buf, sizeof_1(buf)); |
okini3939 | 3:058292da2cee | 75 | // header |
okini3939 | 3:058292da2cee | 76 | snprintf(head, sizeof(head), "Content-type: text/csv\r\nX-PachubeApiKey: %s\r\n", conf.pachube_apikey); |
okini3939 | 3:058292da2cee | 77 | // uri |
okini3939 | 3:058292da2cee | 78 | snprintf(uri, sizeof(uri), "/v1/feeds/%s.csv?_method=put", conf.pachube_feedid); |
okini3939 | 2:a3e5edf84f74 | 79 | #ifdef DEBUG |
okini3939 | 2:a3e5edf84f74 | 80 | pc.printf("P: %s %s %s\r\n", conf.pachube_apikey, conf.pachube_feedid, uri); |
okini3939 | 2:a3e5edf84f74 | 81 | #endif |
okini3939 | 0:bdb53686c194 | 82 | |
okini3939 | 3:058292da2cee | 83 | host.setName("api.pachube.com"); |
okini3939 | 3:058292da2cee | 84 | host.setPort(HTTP_PORT); |
okini3939 | 3:058292da2cee | 85 | return httpRequest(METHOD_POST, &host, uri, head, buf) == 200 ? 0 : -1; |
okini3939 | 0:bdb53686c194 | 86 | #endif |
okini3939 | 0:bdb53686c194 | 87 | } |
okini3939 | 0:bdb53686c194 | 88 | |
okini3939 | 0:bdb53686c194 | 89 | int twitter (int num) { |
okini3939 | 2:a3e5edf84f74 | 90 | #ifdef USE_HTTP |
okini3939 | 3:058292da2cee | 91 | Host host; |
okini3939 | 2:a3e5edf84f74 | 92 | char buf[FORMAT_STR_SIZE]; |
okini3939 | 3:058292da2cee | 93 | char msg[FORMAT_STR_SIZE]; |
okini3939 | 3:058292da2cee | 94 | char head[160]; |
okini3939 | 0:bdb53686c194 | 95 | |
okini3939 | 0:bdb53686c194 | 96 | if (! ethernet_flg || num >= CF_TWITTER_NUM) return 0; |
okini3939 | 2:a3e5edf84f74 | 97 | if (! conf.twitter_user[0] || ! conf.twitter_pwd[0] || ! conf.twitter_mesg[num][0]) { |
okini3939 | 0:bdb53686c194 | 98 | return -1; |
okini3939 | 0:bdb53686c194 | 99 | } |
okini3939 | 0:bdb53686c194 | 100 | |
okini3939 | 1:6c7141895545 | 101 | LED_NET_ACT_ON; |
okini3939 | 3:058292da2cee | 102 | // header |
okini3939 | 3:058292da2cee | 103 | createauth(conf.twitter_user, conf.twitter_pwd, head, sizeof(head)); |
okini3939 | 3:058292da2cee | 104 | strncat(head, "Content-type: application/x-www-form-urlencoded\r\n", sizeof_len(head)); |
okini3939 | 3:058292da2cee | 105 | // post data |
okini3939 | 3:058292da2cee | 106 | format_str(conf.twitter_mesg[num], msg, sizeof_1(msg)); |
okini3939 | 3:058292da2cee | 107 | strcpy(buf, "status="); |
okini3939 | 3:058292da2cee | 108 | urlencode(msg, &buf[strlen(buf)], sizeof_len(buf)); |
okini3939 | 2:a3e5edf84f74 | 109 | #ifdef DEBUG |
okini3939 | 2:a3e5edf84f74 | 110 | pc.printf("T: %s %s %s\r\n%s\r\n", conf.twitter_user, conf.twitter_pwd, conf.twitter_mesg[num], buf); |
okini3939 | 2:a3e5edf84f74 | 111 | #endif |
okini3939 | 0:bdb53686c194 | 112 | |
okini3939 | 3:058292da2cee | 113 | host.setName("api.supertweet.net"); |
okini3939 | 3:058292da2cee | 114 | host.setPort(HTTP_PORT); |
okini3939 | 3:058292da2cee | 115 | return httpRequest(METHOD_POST, &host, "/1/statuses/update.xml", head, buf) == 200 ? 0 : -1; |
okini3939 | 0:bdb53686c194 | 116 | #endif |
okini3939 | 0:bdb53686c194 | 117 | } |
okini3939 | 0:bdb53686c194 | 118 | |
okini3939 | 0:bdb53686c194 | 119 | int email (int num) { |
okini3939 | 0:bdb53686c194 | 120 | #ifdef USE_EMAIL |
okini3939 | 3:058292da2cee | 121 | Host host; |
okini3939 | 2:a3e5edf84f74 | 122 | char buf[FORMAT_STR_SIZE]; |
okini3939 | 0:bdb53686c194 | 123 | |
okini3939 | 0:bdb53686c194 | 124 | if (! ethernet_flg || num >= CF_MAIL_NUM) return 0; |
okini3939 | 2:a3e5edf84f74 | 125 | if (! conf.smtphost[0] || ! conf.mailfrom[0] || |
okini3939 | 2:a3e5edf84f74 | 126 | ! conf.mailto[num][0] || ! conf.mailmesg[num][0]) { |
okini3939 | 0:bdb53686c194 | 127 | return -1; |
okini3939 | 0:bdb53686c194 | 128 | } |
okini3939 | 0:bdb53686c194 | 129 | |
okini3939 | 1:6c7141895545 | 130 | LED_NET_ACT_ON; |
okini3939 | 0:bdb53686c194 | 131 | |
okini3939 | 7:f7c98d836f81 | 132 | snprintf(buf, sizeof(buf), "From: %s\nTo: %s\nSubject: Message from weather\n\n", conf.mailfrom, conf.mailto[0]); |
okini3939 | 3:058292da2cee | 133 | format_str(conf.mailmesg[num], &buf[strlen(buf)], sizeof_len(buf)); |
okini3939 | 2:a3e5edf84f74 | 134 | #ifdef DEBUG |
okini3939 | 2:a3e5edf84f74 | 135 | pc.printf("SMTP %s %s %s\r\n%s\r\n", conf.smtphost, conf.mailfrom, conf.mailto[num], buf); |
okini3939 | 2:a3e5edf84f74 | 136 | #endif |
okini3939 | 0:bdb53686c194 | 137 | |
okini3939 | 3:058292da2cee | 138 | host.setName(conf.smtphost); |
okini3939 | 3:058292da2cee | 139 | host.setPort(conf.smtpport); |
okini3939 | 3:058292da2cee | 140 | return sendmail(conf.mailfrom, conf.mailto[num], buf, &host, conf.smtpuser, conf.smtppwd); |
okini3939 | 0:bdb53686c194 | 141 | #endif |
okini3939 | 0:bdb53686c194 | 142 | } |
okini3939 | 0:bdb53686c194 | 143 | |
okini3939 | 2:a3e5edf84f74 | 144 | int ntp (char *hostname) { |
okini3939 | 0:bdb53686c194 | 145 | #ifdef USE_NTP |
okini3939 | 2:a3e5edf84f74 | 146 | time_t sec; |
okini3939 | 2:a3e5edf84f74 | 147 | |
okini3939 | 2:a3e5edf84f74 | 148 | if (! ethernet_flg) return 0; |
okini3939 | 2:a3e5edf84f74 | 149 | pc.printf("NTP: %s\r\n", hostname); |
okini3939 | 2:a3e5edf84f74 | 150 | |
okini3939 | 2:a3e5edf84f74 | 151 | if (! ntpdate(hostname, &sec)) { |
okini3939 | 2:a3e5edf84f74 | 152 | sec = sec + (60 * 60 * TIMEZONE); |
okini3939 | 2:a3e5edf84f74 | 153 | set_time(sec); |
okini3939 | 2:a3e5edf84f74 | 154 | #ifdef DEBUG |
okini3939 | 2:a3e5edf84f74 | 155 | pc.printf("NTP success %s\r\n", ctime(&sec)); |
okini3939 | 2:a3e5edf84f74 | 156 | #endif |
okini3939 | 2:a3e5edf84f74 | 157 | } else { |
okini3939 | 2:a3e5edf84f74 | 158 | pc.printf("NTP failure\r\n"); |
okini3939 | 2:a3e5edf84f74 | 159 | return -1; |
okini3939 | 2:a3e5edf84f74 | 160 | } |
okini3939 | 2:a3e5edf84f74 | 161 | |
okini3939 | 2:a3e5edf84f74 | 162 | /* |
okini3939 | 2:a3e5edf84f74 | 163 | // NTPClient ntp; |
okini3939 | 0:bdb53686c194 | 164 | Host ntpserver; |
okini3939 | 0:bdb53686c194 | 165 | NTPResult ret; |
okini3939 | 0:bdb53686c194 | 166 | time_t sec; |
okini3939 | 0:bdb53686c194 | 167 | |
okini3939 | 0:bdb53686c194 | 168 | if (! ethernet_flg) return 0; |
okini3939 | 2:a3e5edf84f74 | 169 | pc.printf("NTP: %s\r\n", hostname); |
okini3939 | 0:bdb53686c194 | 170 | |
okini3939 | 1:6c7141895545 | 171 | LED_NET_ACT_ON; |
okini3939 | 0:bdb53686c194 | 172 | ntpserver.setName(hostname); |
okini3939 | 0:bdb53686c194 | 173 | ntpserver.setPort(123); |
okini3939 | 0:bdb53686c194 | 174 | |
okini3939 | 2:a3e5edf84f74 | 175 | ret = ntp->setTime(ntpserver); |
okini3939 | 0:bdb53686c194 | 176 | if (ret == NTP_OK) { |
okini3939 | 0:bdb53686c194 | 177 | sec = time(NULL) + (60 * 60 * TIMEZONE); |
okini3939 | 0:bdb53686c194 | 178 | set_time(sec); |
okini3939 | 0:bdb53686c194 | 179 | } |
okini3939 | 0:bdb53686c194 | 180 | |
okini3939 | 0:bdb53686c194 | 181 | if (ret != NTP_OK) { |
okini3939 | 0:bdb53686c194 | 182 | pc.printf("NTP failure: %d\r\n", ret); |
okini3939 | 0:bdb53686c194 | 183 | return -1; |
okini3939 | 0:bdb53686c194 | 184 | #ifdef DEBUG |
okini3939 | 0:bdb53686c194 | 185 | } else { |
okini3939 | 0:bdb53686c194 | 186 | pc.printf("NTP success %s\r\n", ctime(&sec)); |
okini3939 | 0:bdb53686c194 | 187 | #endif |
okini3939 | 0:bdb53686c194 | 188 | } |
okini3939 | 2:a3e5edf84f74 | 189 | */ |
okini3939 | 0:bdb53686c194 | 190 | #endif |
okini3939 | 0:bdb53686c194 | 191 | return 0; |
okini3939 | 0:bdb53686c194 | 192 | } |
okini3939 | 0:bdb53686c194 | 193 | |
okini3939 | 0:bdb53686c194 | 194 | int init_net () { |
okini3939 | 0:bdb53686c194 | 195 | EthernetErr ethErr; |
okini3939 | 0:bdb53686c194 | 196 | |
okini3939 | 0:bdb53686c194 | 197 | eth_link.mode(PullUp); |
okini3939 | 0:bdb53686c194 | 198 | eth_speed.mode(PullUp); |
okini3939 | 0:bdb53686c194 | 199 | |
okini3939 | 2:a3e5edf84f74 | 200 | if (conf.ipaddr[0]) { |
okini3939 | 0:bdb53686c194 | 201 | |
okini3939 | 1:6c7141895545 | 202 | if (! eth_link) { |
okini3939 | 1:6c7141895545 | 203 | LED_NET_G_ON; |
okini3939 | 1:6c7141895545 | 204 | } |
okini3939 | 1:6c7141895545 | 205 | LED_NET_ACT_ON; |
okini3939 | 1:6c7141895545 | 206 | |
okini3939 | 2:a3e5edf84f74 | 207 | if (conf.ipaddr[0] == 255) { |
okini3939 | 0:bdb53686c194 | 208 | // dhcp ip address |
okini3939 | 0:bdb53686c194 | 209 | eth = new EthernetNetIf; |
okini3939 | 0:bdb53686c194 | 210 | } else { |
okini3939 | 0:bdb53686c194 | 211 | // static ip address |
okini3939 | 2:a3e5edf84f74 | 212 | eth = new EthernetNetIf(conf.ipaddr, conf.netmask, conf.gateway, conf.nameserver); |
okini3939 | 0:bdb53686c194 | 213 | } |
okini3939 | 0:bdb53686c194 | 214 | |
okini3939 | 0:bdb53686c194 | 215 | ethErr = eth->setup(); |
okini3939 | 0:bdb53686c194 | 216 | if (ethErr) { |
okini3939 | 0:bdb53686c194 | 217 | // error |
okini3939 | 1:6c7141895545 | 218 | LED_NET_Y_ON; |
okini3939 | 0:bdb53686c194 | 219 | return -1; |
okini3939 | 0:bdb53686c194 | 220 | } |
okini3939 | 0:bdb53686c194 | 221 | |
okini3939 | 0:bdb53686c194 | 222 | pc.printf("\r\nEthernet: %d.%d.%d.%d\r\n", eth->getIp()[0], eth->getIp()[1], eth->getIp()[2], eth->getIp()[3]); |
okini3939 | 0:bdb53686c194 | 223 | ethernet_flg = 1; |
okini3939 | 0:bdb53686c194 | 224 | pool_net(); |
okini3939 | 0:bdb53686c194 | 225 | |
okini3939 | 2:a3e5edf84f74 | 226 | #ifdef USE_HTTP |
okini3939 | 2:a3e5edf84f74 | 227 | // http = new HTTPClient; |
okini3939 | 2:a3e5edf84f74 | 228 | #endif |
okini3939 | 2:a3e5edf84f74 | 229 | // ntp = new NTPClient; |
okini3939 | 0:bdb53686c194 | 230 | } |
okini3939 | 0:bdb53686c194 | 231 | |
okini3939 | 2:a3e5edf84f74 | 232 | if (conf.ntpserver[0]) { |
okini3939 | 2:a3e5edf84f74 | 233 | ntp(conf.ntpserver); |
okini3939 | 0:bdb53686c194 | 234 | } |
okini3939 | 0:bdb53686c194 | 235 | |
okini3939 | 2:a3e5edf84f74 | 236 | if (conf.snmp_commname[0]) { |
okini3939 | 2:a3e5edf84f74 | 237 | snmp_init(conf.snmp_commname); |
okini3939 | 0:bdb53686c194 | 238 | } |
okini3939 | 0:bdb53686c194 | 239 | |
okini3939 | 0:bdb53686c194 | 240 | return 0; |
okini3939 | 0:bdb53686c194 | 241 | } |
okini3939 | 0:bdb53686c194 | 242 | |
okini3939 | 0:bdb53686c194 | 243 | void pool_net () { |
okini3939 | 0:bdb53686c194 | 244 | |
okini3939 | 0:bdb53686c194 | 245 | if (ethernet_flg) { |
okini3939 | 0:bdb53686c194 | 246 | Net::poll(); |
okini3939 | 0:bdb53686c194 | 247 | |
okini3939 | 1:6c7141895545 | 248 | if (! eth_link) { |
okini3939 | 1:6c7141895545 | 249 | LED_NET_G_ON; |
okini3939 | 1:6c7141895545 | 250 | } else { |
okini3939 | 1:6c7141895545 | 251 | LED_NET_GY_OFF; |
okini3939 | 1:6c7141895545 | 252 | } |
okini3939 | 0:bdb53686c194 | 253 | } |
okini3939 | 0:bdb53686c194 | 254 | } |