• R/O
  • HTTP
  • SSH
  • HTTPS

ITO-manager5.0: Commit

Nefryで開発するIoTツールです


Commit MetaInfo

Revisionecdb0462b3d170fd786d4d7cbf1662c2c62d1ae5 (tree)
Time2017-06-06 16:43:02
AuthorTomohiro Ito <tomohiro@yzdn...>
CommiterTomohiro Ito

Log Message

ESP8266 wifi connect

Change Summary

Incremental Difference

--- /dev/null
+++ b/trial/HTTP-MEMORY-GenXML-ESP8266/HTTP-MEMORY-GenXML-ESP8266.ino
@@ -0,0 +1,298 @@
1+
2+#include <ESP8266WiFi.h>
3+#include <NTPClient.h>
4+#include <WiFiUdp.h>
5+#include <TimeLib.h>
6+#include <ESP8266HTTPClient.h>
7+#include <string.h>
8+#include <SoftwareSerial.h>
9+WiFiClient client;
10+
11+
12+
13+//NTP test program for Nefry
14+//Nefryの時計をntpで同期するためのサンプルコードです.開発中です.
15+//Nefryのwifi関数を使ってWifiが切れたら再接続するように書き換えた
16+
17+extern "C" {
18+ #include "user_interface.h"
19+}
20+
21+#define DEVICEID ESP.getChipId()
22+#define MAXROW 128
23+#define NodeTypeID 6 //ESP8266
24+#define NumOfUploadDatas 5
25+
26+struct ADData
27+{
28+ long nBootedClock;
29+ long nEphochTime;
30+ int ADValue;
31+};
32+
33+const String szCommandReadBaseURL = "https://a.yamagata-u.ac.jp/amenity/network/M2M/KinomaControlRequest.aspx";
34+const String szDataUploadBaseURL = "http://a.yamagata-u.ac.jp/amenity/network/M2M/ArduinoDataReceiver.aspx";
35+const String szDataUploadBaseURI = "/amenity/network/M2M/ArduinoDataReceiver.aspx";
36+const String FingurePrintSha1 ="A5 23 3B D5 FA 6C E9 C2 8F 30 17 8F EF F9 EA C8 C5 18 49 3F";
37+const char* host = "a.yamagata-u.ac.jp";
38+const int httpPort = 80;
39+const int httpsPort = 443;
40+const double Attenuator=-13.90;//17.8k
41+
42+char toSSID[] = "YUNET_EDU";
43+char ssidPASSWD[] = "wlan@yamagata";
44+bool BlueLED=false;
45+int nCounterWifiReconnect=0;
46+int nCounter1s = 0;
47+int nCounter30s = 0;
48+int nCounter15s = 0;
49+int nCounter5s = 0;
50+int ADvalue = 0;
51+bool bCommandReadingHttp = false;
52+bool bNoNTPupdated = true;
53+ADData AD1[MAXROW];
54+int nADcount=0;
55+int nUploaded =0;
56+long nBootedClock=0;
57+
58+WiFiUDP ntpUDP;
59+// You can specify the time server pool and the offset (in seconds, can be
60+// changed later with setTimeOffset() ). Additionaly you can specify the
61+// update interval (in milliseconds, can be changed using setUpdateInterval() ).
62+NTPClient timeClient(ntpUDP, "ntp.nict.jp", 0, 3600000);
63+
64+void ADRowAdd(){
65+ if (nADcount > MAXROW-1) {
66+ int row;
67+ for(row =1; row <MAXROW; row++){
68+ AD1[row-1] = AD1[row];
69+ }
70+ nADcount=MAXROW-1;
71+ }
72+ AD1[nADcount].nBootedClock = nBootedClock;
73+ AD1[nADcount].nEphochTime=(long)timeClient.getEpochTime();
74+ AD1[nADcount].ADValue = ADvalue;
75+ nADcount++;
76+}
77+
78+String urlencode(String str)
79+{
80+ String encodedString="";
81+ char c;
82+ char code0;
83+ char code1;
84+ char code2;
85+ for (int i =0; i < str.length(); i++){
86+ c=str.charAt(i);
87+ if (c == ' '){
88+ encodedString+= '+';
89+ } else if (isalnum(c)){
90+ encodedString+=c;
91+ } else{
92+ code1=(c & 0xf)+'0';
93+ if ((c & 0xf) >9){
94+ code1=(c & 0xf) - 10 + 'A';
95+ }
96+ c=(c>>4)&0xf;
97+ code0=c+'0';
98+ if (c > 9){
99+ code0=c - 10 + 'A';
100+ }
101+ code2='\0';
102+ encodedString+='%';
103+ encodedString+=code0;
104+ encodedString+=code1;
105+ //encodedString+=code2;
106+ }
107+ yield();
108+ }
109+ return encodedString;
110+
111+}
112+
113+String GenXML(void){
114+ String xml="";
115+ if (nADcount > NumOfUploadDatas){
116+ nUploaded = NumOfUploadDatas;
117+ }else{
118+ nUploaded=nADcount;
119+ }
120+ xml="<?xml version=\"1.0\" ?>\n";
121+ xml+="<ADDatas>\n";
122+ int i;
123+ for (i=nADcount-1;i>=nADcount-nUploaded;i--){
124+ xml+="<ADData>\n";
125+ xml+="<BootedTime>" + (String)AD1[i].nBootedClock + "</BootedTime>\n";
126+ if (AD1[i].nEphochTime<1262239200 && (long)timeClient.getEpochTime() > 1262239200){
127+ AD1[i].nEphochTime = AD1[i].nBootedClock + (long)timeClient.getEpochTime() - nBootedClock;
128+ }
129+ xml+="<ElapsedTime>" + (String)AD1[i].nEphochTime + "</ElapsedTime>\n";
130+ xml+="<ADvalue>" + (String)AD1[i].ADValue +"</ADvalue>\n";
131+ xml+="<Attenuator>" + (String)Attenuator + "</Attenuator>\n";
132+ xml+="</ADData>\n";
133+ }
134+ xml+="</ADDatas>\n";
135+ return (xml);
136+}
137+
138+void timer1_ISR (void) {
139+ if (WiFi.status() != WL_CONNECTED) {
140+ // コネクション確立済み以外のステータスなので
141+ // 無線LAN接続NG 赤色LED点灯
142+ //Nefry.setLed(255, 0, 0);
143+ nCounterWifiReconnect++;
144+ //WiFi.begin();
145+ if (nCounterWifiReconnect>30){
146+ nCounterWifiReconnect=0;
147+ // Nefry.setWifiTimeoutClear();
148+ // Nefry.println("Wifi TimeoutClear");
149+ }
150+ } else {
151+ //コネクションOKなので、青色LED点灯
152+ nCounterWifiReconnect=0;
153+ //Nefry.setLed(0, 0, 64);
154+
155+ }
156+
157+ ADvalue = analogRead(A0);
158+
159+
160+ //char buf[128];
161+ //Nefry.println(ADvalue);
162+ //2014-10-10T13:50:40+09:00 (TIMEZONE JST)
163+ //2014-10-10T04:50:40Z (UTC)
164+ // sprintf(buf,"%04d-%02d-%02dT%02d:%02d:%02dZ",year(), month(), day(),hour(),minute(),second());
165+// Nefry.println(buf);
166+ nCounter1s++;
167+ nBootedClock++;
168+ nCounter30s++;
169+ nCounter15s++;
170+ nCounter5s++;
171+}
172+
173+void stop_timer1() {
174+ timer1_disable();
175+ timer1_detachInterrupt();
176+}
177+
178+void start_timer1(unsigned int nIntervalTime_us) {
179+ timer1_isr_init();
180+ timer1_attachInterrupt(timer1_ISR);
181+ timer1_enable(TIM_DIV16, TIM_EDGE, TIM_LOOP);
182+ timer1_write(clockCyclesPerMicrosecond() / 16 * nIntervalTime_us);
183+}
184+void setup() {
185+ Serial.begin(115200);
186+ Serial.println("");
187+ Serial.println("PG start");
188+
189+ WiFi.mode(WIFI_STA);
190+ WiFi.begin(toSSID, ssidPASSWD);
191+
192+ while (WiFi.status() != WL_CONNECTED) {
193+ delay(500);
194+ Serial.print(".");
195+ }
196+ Serial.println("");
197+ Serial.println("WiFi connected");
198+
199+ //WiFiの状態を表示
200+ Serial.print("IP address: ");
201+ Serial.println(WiFi.localIP());
202+ Serial.print("Device ID:");
203+ Serial.println(DEVICEID);
204+ timeClient.begin();
205+ start_timer1(1000000); //1000000 us間隔でタイマーを起動
206+}
207+
208+void loop() {
209+
210+ if (bNoNTPupdated==true){
211+ if (WiFi.status() == WL_CONNECTED) {
212+ //Nefry.setLed(128, 0, 128);
213+ timeClient.update();
214+ bNoNTPupdated=false;
215+ setTime(timeClient.getEpochTime());
216+ Serial.println(timeClient.getFormattedTime());
217+ //Nefry.setLed(0, 0, 64);
218+ }
219+ }
220+
221+
222+
223+
224+ if (nCounter1s >0) {
225+ if (nBootedClock <= 30) {
226+ ADRowAdd();
227+ }
228+ if (WiFi.status() == WL_CONNECTED && bCommandReadingHttp == false) {
229+ bCommandReadingHttp = true;
230+ //Nefry.setLed(0, 128, 0);
231+ //https://github.com/esp8266/Arduino/tree/master/libraries/ESP8266HTTPClient/examples/BasicHttpClient
232+ /*
233+ //HTTPClinetが同時に動作するとエラーになるので,取り急ぎ,コマンド取得はコメントアウト
234+ HTTPClient http;
235+ String szCommandReadURL = szCommandReadBaseURL + "?DeviceID=" + DEVICEID;
236+ //以下3行は,デバッグ用に追加
237+ szCommandReadURL = szCommandReadURL + "&AD1=" + AD1[nADcount-1].ADValue;
238+ szCommandReadURL = szCommandReadURL + "&EphochTime=" + AD1[nADcount-1].nEphochTime;
239+ szCommandReadURL = szCommandReadURL + "&BootedClock=" + AD1[nADcount-1].nBootedClock;
240+ szCommandReadURL = szCommandReadURL + "&ADCount=" + nADcount;
241+ http.begin(szCommandReadURL,FingurePrintSha1);
242+ int httpCode = http.GET();
243+ if(httpCode == HTTP_CODE_OK) {
244+ String payload = http.getString();
245+ }
246+ http.end();
247+ */
248+ nCounter1s =0;
249+ bCommandReadingHttp = false;
250+ //Nefry.setLed(0, 0, 64);
251+ }
252+ }
253+
254+//HTTPSだと正常にPOSTできなかったので,httpに変更,さらに,payloadが大きいとエラーになるので,payloadが小さくなるように修正
255+if (nCounter5s > 4){
256+ if (WiFi.status() == WL_CONNECTED && nADcount >0 && (long)timeClient.getEpochTime() > 1262239200) {
257+ // Nefry.setLed(128, 0, 128);
258+ nCounter5s=0;
259+ HTTPClient http2;
260+ String dum;
261+ dum="XML="+urlencode(GenXML());
262+ String szDataUploadURL = szDataUploadBaseURL + "?DeviceID=" + DEVICEID +"&NodeTypeID=" + NodeTypeID;
263+ http2.begin(szDataUploadURL,FingurePrintSha1);
264+ http2.begin(szDataUploadURL);
265+ http2.addHeader("Content-Type", "application/x-www-form-urlencoded");
266+ http2.addHeader("Content-Length", (String)dum.length());
267+ int httpCode2=http2.POST(dum);
268+ //Nefry.println(httpCode2);
269+ if(httpCode2 == HTTP_CODE_OK) {
270+ nADcount=nADcount-nUploaded;
271+ }
272+ http2.end();
273+// Nefry.setLed(0, 0, 64);
274+ }
275+}
276+
277+if (nCounter15s>14) {
278+ nCounter15s=0;
279+ if (nBootedClock > 30) {
280+ ADRowAdd();
281+ }
282+
283+}
284+
285+ if (nCounter30s > 29) {
286+ nCounter30s =0;
287+ if (WiFi.status() == WL_CONNECTED ){
288+ timeClient.update();
289+ setTime(timeClient.getEpochTime());
290+ char buf[128];
291+ sprintf(buf,"%04d-%02d-%02dT%02d:%02d:%02dZ",year(), month(), day(),hour(),minute(),second());
292+ Serial.println(buf);
293+ Serial.println(timeClient.getFormattedTime());
294+ }
295+ }
296+}
297+
298+
Binary files /dev/null and b/trial/HTTP-MEMORY-GenXML-ESP8266/HTTP-MEMORY-GenXML-ESP8266.ino.generic.bin differ
Binary files /dev/null and b/trial/HTTP-MEMORY-GenXML-ESP8266/arduino.bin differ
Show on old repository browser