最近在学校科创社摸鱼,看到了一块十分便宜(十块多钱)的物联网模块,可以联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号端口就会在加载页面时卡住,网上说是休眠模式之类的,不清楚。但是有几次用浏览器缓存发送的请求竟然成功了,虽然过了十秒才响应。