最近在学校科创社摸鱼,看到了一块十分便宜(十块多钱)的物联网模块,可以联wifi感觉挺有意思,虽然对代码一窍不通(背不出),但还是买回来玩玩。
信息
软件:Arduino
型号:CH3406(最便宜的)
需要安装的驱动:CH341SER(详情见板子后面)
一、接入阿里云物联网(未成功,在探索)
参考文档:(2条消息) ESP-8266接入阿里云开关LED_maction的博客-CSDN博客
库:AliyunIoTSDK
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
| // 引入 wifi 模块,并实例化,不同的芯片这里的依赖可能不同 #include <ESP8266WiFi.h> static WiFiClient espClient;
// 引入阿里云 IoT SDK #include <AliyunIoTSDK.h>
// 设置产品和设备的信息,从阿里云设备信息里查看 #define PRODUCT_KEY "gjr6cVo????" #define DEVICE_NAME "sbsbsb" #define DEVICE_SECRET "?????????" #define REGION_ID "cn-shanghai"
// 设置 wifi 信息 #define WIFI_SSID "ChinaNGB-????" #define WIFI_PASSWD "????"
void setup() { Serial.begin(115200); // 初始化 wifi wifiInit(WIFI_SSID, WIFI_PASSWD); // 初始化 iot,需传入 wifi 的 client,和设备产品信息 AliyunIoTSDK::begin(espClient, PRODUCT_KEY, DEVICE_NAME, DEVICE_SECRET, REGION_ID); // 绑定一个设备属性回调,当远程修改此属性,会触发 powerCallback // PowerSwitch 是在设备产品中定义的物联网模型的 id AliyunIoTSDK::bindData("SBSB1", powerCallback); // 发送一个数据到云平台,LightLuminance 是在设备产品中定义的物联网模型的 id AliyunIoTSDK::send("SBSB1", 1); }
void loop() { AliyunIoTSDK::loop(); }
// 初始化 wifi 连接 void wifiInit(const char *ssid, const char *passphrase) { WiFi.mode(WIFI_STA); WiFi.begin(ssid, passphrase); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("WiFi not Connect"); } Serial.println("Connected to AP"); }
// 电源属性修改的回调函数 void powerCallback(JsonVariant p) { int PowerSwitch = p["PowerSwitch"]; if (PowerSwitch == 1) { // 启动设备 } }
|
到现在也没发现问题在哪,烧录后根本没反应
二、建立server服务(半成功)
参考文档:(2条消息) 从零开始的ESP8266探索(06)-使用Server功能搭建Web Server_Naisu的各种笔记-CSDN博客_esp8266 webserver
最终代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157
| #include <ESP8266WiFi.h>
/*** 该工程可以在2.4.0版本esp8266库中运行,没在更高版本库中进行测试 ***/
const char *ssid = "ChinaNGB-?????"; const char *password = "idL???8i";
WiFiServer server(80);
String readString = ""; //建立一个字符串对象用来接收存放来自客户的数据
//响应头 String responseHeaders = String("") + "HTTP/1.1 200 OK\r\n" + "Content-Type: text/html\r\n" + "Connection: close\r\n" + "\r\n";
//网页 String myhtmlPage = String("") + "<html>" + "<head>" + " <title>luqizhi's web</title>" + " <script defer=\"defer\">" + " function ledSwitch() {" + " var xmlhttp;" + " if (window.XMLHttpRequest) {" + " xmlhttp = new XMLHttpRequest();" + " } else {" + " xmlhttp = new ActiveXObject(\"Microsoft.XMLHTTP\");" + " }" + " xmlhttp.onreadystatechange = function () {" + " if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {" + " document.getElementById(\"txtState\").innerHTML = xmlhttp.responseText;" + " }" + " }," + " xmlhttp.open(\"GET\", \"Switch\", true);" + " xmlhttp.send(); " + " }" + " </script>" + "</head>" + "<body>" + " <div id=\"txtState\">Unkwon</div>" + " <input type=\"button\" value=\"Switch\" onclick=\"ledSwitch()\">" + "</body>" + "</html>";
bool isLedTurnOpen = false; // 记录LED状态
void setup() { digitalWrite(9, LOW); // 点亮LED
Serial.begin(115200); Serial.println();
Serial.printf("Connecting to %s ", ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(" connected");
server.begin(); Serial.printf("Web server started, open %s in a web browser\n", WiFi.localIP().toString().c_str());
digitalWrite(9, HIGH); // 熄灭LED }
void loop() {
WiFiClient client = server.available(); //尝试建立客户对象 if (client) //如果当前有客户可用 { boolean currentLineIsBlank = true; Serial.println("[Client connected]");
while (client.connected()) //如果客户端建立连接 { if (client.available()) //等待有可读数据 { char c = client.read(); //读取一字节数据 readString += c; //拼接数据 /************************************************/ if (c == '\n' && currentLineIsBlank) //等待请求头接收完成(接收到空行) { //比较接收到的请求数据 if (readString.startsWith("GET / HTTP/1.1")) //如果是网页请求 { client.print(responseHeaders); //向客户端输出网页响应 client.print(myhtmlPage); //向客户端输出网页内容 client.print("\r\n"); } else if (readString.startsWith("GET /Switch")) //如果是改变LED状态请求 { if (isLedTurnOpen == false) { digitalWrite(9, LOW); // 点亮LED client.print("LED has been turn on"); delay(1000); isLedTurnOpen = true; }
else { digitalWrite(9, HIGH); // 熄灭LED client.print("LED has been turn off"); delay(1000); isLedTurnOpen = false; } } else { client.print("\r\n"); } break; }
if (c == '\n') { currentLineIsBlank = true; //开始新行 } else if (c != '\r') { currentLineIsBlank = false; //正在接收某行中 } /************************************************/ } } delay(1); //等待客户完成接收 client.stop(); //结束当前连接: Serial.println("[Client disconnected]");
Serial.println(readString); //打印输出来自客户的数据 readString = ""; } }
|
不知道为什么只有把文章内的端口号改成esp8266自带的led9号端口就会在加载页面时卡住,网上说是休眠模式之类的,不清楚。但是有几次用浏览器缓存发送的请求竟然成功了,虽然过了十秒才响应。