本帖最后由 wxws 于 2015-5-26 09:38 编辑
例子:
用ARDINO给ESP8266编程
单芯片实现 fuhomenet 客户端(支持透网,WEB,APK)
请与这个作一下比较,
arduino+w5500实现的有线网络客户端
http://www.fuhome.net/bbs/forum.php?mod=viewthread&tid=2040&extra=page%3D2- /*
- 8266fuhome.ino:
- by:wxws qq:1103012
- 群:Arduino_ESP8266开发 104345601
- 协议:
- http://www.fuhome.net/api/must/
- 服务器IP:115.28.93.201
- udp端口:7001
- 30s
- 心跳发送: f=1 设备id 密码
- 心跳:f=1&d=设备id&m=密码&from=sb->server
- 心跳收到返回:f=1&d=设备id&from=server->sb1
- 远程收到命令:f=a&d=设备id&n=jyzhkj&com=open&from=server->sb
- 命令返回:f=b 设备id 密码 用户名 响应消息(可自定义)
- 返回:f=b&d=设备id&m=密码&n=jyzhkj&com=open&from=sb->server
- */
- #include <ESP8266WiFi.h>
- #include <WiFiUdp.h>
- #define DHCP 0
- WiFiUDP Udp;
- char ssid[] = "jyzhkj0"; // your network SSID (name)
- char pass[] = "868996310"; // your network password
- unsigned int localPort = 7001; // 本地端口
- IPAddress rip(115, 28, 93, 201); //fuhome的服务器ip
- unsigned int rPort = 7001; // 服务器端口
- String deviceid = "00000000"; //改成你的设备ID,需先在fuhome.net上注册,并增加一个新设备,详见网站
- String deviceps = "0123456789"; //设备密码
- String Heart = "";
- String HeartTemp = "f=1&d=%s1&m=%s2&z=%s3&from=sb->server"; //心跳包模板
- String ReplyTemp = "f=b&d=%s1&m=%s2&n=%s3&com=%s4&from=sb->server"; //命令包模板
- String SendValue = "f=d&d=%s1&m=%s2&num=123&c=1&a=%s3&from=sb->server"; //设备附加传感器数据
- String udpget = "";
- String usename = "";
- String command = "";
- char ttc[200];
- #define LED 16 //板载LED灯 GPIO16口
- int ledstate = 1;
- unsigned int RemoteCount = 0;
- void setup()
- {
- Serial.begin(115200);
- // start the Ethernet and UDP:
- pinMode(LED, OUTPUT);
- digitalWrite(LED, 0);
- WiFi.begin(ssid, pass);
- while (WiFi.status() != WL_CONNECTED)
- {
- delay(500);
- Serial.print(".");
- }
- Serial.println("");
- Serial.println("WiFi connected");
- Serial.println("IP address: ");
- Serial.println(WiFi.localIP());
- Udp.begin(localPort);
- ReplyTemp.replace("%s1", deviceid);
- ReplyTemp.replace("%s2", deviceps);
- SendValue.replace("%s1", deviceid);
- SendValue.replace("%s2", deviceps);
- }
- void loop()
- {
- // if there's data available, read a packet
- int packetSize = Udp.parsePacket();
- if (packetSize)
- {
- udpget = "";
- for (int i = 0; i < packetSize; i++)
- {
- udpget += (char)Udp.read();
- }
- Serial.print(getuptime());
- Serial.print(" R:");
- Serial.println(udpget);
- if (udpget.indexOf("f=a") >= 0)//心跳包不响应
- {
- usename = Findany("&n=");
- command = Findany("&com=");
- if (command == "open")
- {
- ledstate = 1;
- command = "完成" + command;
- }
- if (command == "close")
- {
- ledstate = 0;
- command = "完成" + command;
- }
- if (command == "flash")
- {
- ledstate = 2;
- command = "完成" + command;
- }
- udpget = ReplyTemp;
- udpget.replace("%s3", usename);
- udpget.replace("%s4", command);
- udpget.toCharArray(ttc, 100);
- Serial.print(" Send reply:");
- Serial.println(udpget);
- //Udp.beginPacket( rip,rPort );
- Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
- Udp.write(ttc); //状态响应回复包 f=b&d=设备ID&m=设备密码&n=jyzhkj&com=命令&from=sb->server
- Udp.endPacket();
- RemoteCount++;
- }
- else
- {
- // if (udpget.indexOf("f=1") >= 0) //心跳包
- // Serial.println("Recive f=1.");
- // if (udpget.indexOf("f=b") >= 0) //回复包
- // Serial.println("Recive f=b.");
- }
- }
- LedControl();
- UdpHeart();//心跳
- UpValue();//传感器上传
- }
- //灯状态切换
- void LedControl()
- {
- static long previousMillis = 0;
- static int currstate = 0;
- switch (ledstate)
- {
- case 0:
- currstate = 1;
- break;
- case 1:
- currstate = 0; //点亮
- break;
- case 2:
- if (millis() - previousMillis > 200) //200ms
- {
- previousMillis = millis();
- currstate = 1 - currstate;
- }
- break;
- }
- digitalWrite(LED, currstate);
- }
- //查找参数,下一个“&”为界
- String Findany(String findstr)
- {
- String ttv = "";
- int t1, t2;
- t1 = udpget.indexOf(findstr);
- if (t1 >= 0)
- {
- t2 = udpget.indexOf("&", t1 + 1);
- ttv = udpget.substring(t1 + findstr.length(), t2);
- }
- return ttv;
- }
- //上传 传感器值
- void UpValue()
- {
- static unsigned int previouscount = 999;
- if (previouscount != RemoteCount)
- {
- previouscount = RemoteCount;
- Heart = SendValue;
- Heart.replace("%s1", deviceid); //d
- Heart.replace("%s2", deviceps); //m
- Heart.replace("%s3", String(RemoteCount)); //传感器值
- Serial.print(getuptime());
- Serial.print(" V:");
- Serial.println(Heart);
- Heart.toCharArray(ttc, 200);
- Udp.beginPacket(rip, rPort);
- Udp.write(ttc); //心跳包 f=1&d=设备ID&m=设备密码&from=sb->server
- Udp.endPacket();
- }
- }
- //UDP心跳包
- void UdpHeart()
- {
- static long previousMillis = -4000;
- if (millis() - previousMillis > 30000) //30秒
- {
- previousMillis = millis();
- Heart = HeartTemp;
- Heart.replace("%s1", deviceid); //d
- Heart.replace("%s2", deviceps); //m
- Heart.replace("%s3", getuptime()); //z 状态
- Serial.print("ESP.getFreeHeap():");
- Serial.println(ESP.getFreeHeap());
- Serial.print(getuptime());
- Serial.print(" S:");
- Serial.println(Heart);
- Heart.toCharArray(ttc, 200);
- Udp.beginPacket(rip, rPort);
- Udp.write(ttc); //心跳包 f=1&d=设备ID&m=设备密码&from=sb->server
- Udp.endPacket();
- }
- }
- String getuptime() //从millis转换成 天数:小时:分:秒
- {
- String tts = "";
- long days = 0;
- long hours = 0;
- long mins = 0;
- long secs = 0;
- char ccc[20];
- secs = millis() / 1000; //convect milliseconds to seconds
- mins = secs / 60; //convert seconds to minutes
- hours = mins / 60; //convert minutes to hours
- days = hours / 24; //convert hours to days
- secs = secs - (mins * 60); //subtract the coverted seconds to minutes in order to display 59 secs max
- mins = mins - (hours * 60); //subtract the coverted minutes to hours in order to display 59 minutes max
- hours = hours - (days * 24); //subtract the coverted hours to days in order to display 23 hours max
- sprintf(ccc, "%02d:%02d:%02d:%02d", int(days), int(hours), int(mins), int(secs));
- tts = String(ccc);
- return tts;
- }
复制代码 |