173 lines
4.5 KiB
C++
173 lines
4.5 KiB
C++
#include <Arduino.h>
|
||
#include <IRremoteESP8266.h>
|
||
#include <IRsend.h>
|
||
#include <IRrecv.h>
|
||
#include <IRutils.h>
|
||
#include <WiFiUdp.h>
|
||
#include <ESP8266WiFi.h>
|
||
#include <ESP8266HTTPClient.h>
|
||
#include <DNSServer.h>
|
||
#include <ESP8266WebServer.h>
|
||
#include <WiFiManager.h>
|
||
#define URL "http://www.baidu.com"
|
||
|
||
String ssid="";
|
||
String password="";
|
||
|
||
const uint16_t kIrLed = 4; // ESP8266 GPIO pin to use. Recommended: 4 (D2).
|
||
const uint16_t kRecvPin = 14;
|
||
|
||
IRsend irsend(kIrLed);
|
||
IRrecv irrecv(kRecvPin);
|
||
|
||
decode_results results;
|
||
|
||
WiFiUDP udp;
|
||
unsigned int localUdpPort = 9; //本地端口号
|
||
IPAddress remote_IP(255, 255, 255, 255);// 自定义远程监听 IP 地址
|
||
|
||
|
||
|
||
void UDP_IR();
|
||
void IR_UDP();
|
||
void httpClientRequest();
|
||
|
||
const uint16_t tx = 1;
|
||
const uint16_t rx = 3;
|
||
|
||
void setup() {
|
||
WiFiManager wifiManager;
|
||
|
||
//短接 TX RX即可清除WIFI账号密码,然后需要重新配置
|
||
pinMode(tx, OUTPUT);
|
||
digitalWrite(tx, LOW);
|
||
pinMode(rx, INPUT_PULLUP);
|
||
if (digitalRead(rx) == LOW)
|
||
{
|
||
delay(100);
|
||
if (digitalRead(rx) == LOW)
|
||
wifiManager.resetSettings();
|
||
}
|
||
|
||
Serial.begin(115200);
|
||
|
||
// 建立WiFiManager对象
|
||
// 自动连接WiFi。以下语句的参数是连接ESP8266时的WiFi名称
|
||
wifiManager.autoConnect("IR_WIFI");
|
||
|
||
Serial.println("\nWiFi connect succcess!");
|
||
Serial.print("IP address: ");
|
||
Serial.println(WiFi.localIP()); //打印本设备IP
|
||
Serial.print("gateway address: ");
|
||
Serial.println(WiFi.gatewayIP()); //打印网关IP
|
||
httpClientRequest();
|
||
|
||
udp.begin(9); // 指定本地端口号
|
||
Serial.println("UDP started");
|
||
|
||
irsend.begin(); // 启动IR发送
|
||
irrecv.enableIRIn(); // 启动IR接收
|
||
|
||
}
|
||
|
||
|
||
void loop() {
|
||
UDP_IR();
|
||
IR_UDP();
|
||
}
|
||
|
||
// 发送HTTP请求并且将服务器响应通过串口输出
|
||
void httpClientRequest(){
|
||
|
||
WiFiClient client; //新添加
|
||
|
||
//重点1 创建 HTTPClient 对象
|
||
HTTPClient httpClient;
|
||
|
||
//重点2 通过begin函数配置请求地址。此处也可以不使用端口号和PATH而单纯的
|
||
httpClient.begin(client,URL);
|
||
Serial.print("URL: "); Serial.println(URL);
|
||
|
||
//重点3 通过GET函数启动连接并发送HTTP请求
|
||
int httpCode = httpClient.GET();
|
||
Serial.print("Send GET request to URL: ");
|
||
Serial.println(URL);
|
||
|
||
//重点4. 如果服务器响应HTTP_CODE_OK(200)则从服务器获取响应体信息并通过串口输出
|
||
//如果服务器不响应HTTP_CODE_OK(200)则将服务器响应状态码通过串口输出
|
||
if (httpCode == HTTP_CODE_OK) {
|
||
// 使用getString函数获取服务器响应体内容
|
||
String responsePayload = httpClient.getString();
|
||
Serial.println("Server Response Payload: ");
|
||
Serial.println(responsePayload);
|
||
} else {
|
||
Serial.println("Server Respose Code:");
|
||
Serial.println(httpCode);
|
||
}
|
||
|
||
//重点5. 关闭ESP8266与服务器连接
|
||
httpClient.end();
|
||
}
|
||
|
||
void IR_UDP(){
|
||
if (irrecv.decode(&results)) {
|
||
// print() & println() can't handle printing long longs. (uint64_t)
|
||
serialPrintUint64(results.value, HEX);
|
||
uint8_t *p=(uint8_t *)&results.value;
|
||
udp.beginPacket(remote_IP, localUdpPort); //准备发送数据
|
||
udp.write("IR");
|
||
udp.write(*p);
|
||
udp.write(*(p+1));
|
||
udp.write(*(p+2));
|
||
udp.write(*(p+3));
|
||
udp.write(*(p+4));
|
||
udp.write(*(p+5));
|
||
udp.write(*(p+6));
|
||
udp.write(*(p+7));
|
||
udp.endPacket();
|
||
|
||
irrecv.resume(); // Receive the next value
|
||
}
|
||
}
|
||
|
||
|
||
void UDP_IR() {
|
||
// 检查是否有数据包到达
|
||
int packetSize = udp.parsePacket();
|
||
if (packetSize) {
|
||
// 保证数据包长度不超过缓冲区
|
||
if(packetSize > 255) {
|
||
packetSize = 255;
|
||
}
|
||
|
||
// 读取数据并打印
|
||
uint8_t packetBuffer[11]={0};
|
||
int len = udp.read(packetBuffer, packetSize);
|
||
// if (len > 0) {
|
||
// packetBuffer[len] = '\0';
|
||
// Serial.println(packetBuffer);
|
||
// }
|
||
uint64_t nec=0;
|
||
uint8_t *p1=(uint8_t *)&packetBuffer[0];
|
||
uint8_t *p2=(uint8_t *)&nec;
|
||
if(*p1==0x49 && *(p1+1)==0x52)
|
||
{
|
||
Serial.println("NEC");
|
||
if(*(p1+5) ==0x00) //按键码
|
||
{
|
||
*p2 =*(p1+2);
|
||
*(p2+1)=*(p1+3);
|
||
*(p2+2)=*(p1+4);
|
||
*(p2+3)=*(p1+5);
|
||
|
||
}
|
||
else if(*(p1+5)==0xff)
|
||
nec=0xFFFFFFFFUL;
|
||
}
|
||
irrecv.pause(); // Pause collection of received IR data.
|
||
//0x00FF12EDUL : 用户码(一般为0x00)+用户反码(一般为0xFF)+数据码+数据反码 ,注意大小端模式,会造成数据不对应,实际内容是一样的。
|
||
irsend.sendNEC(nec);
|
||
irrecv.resume(); // Receive the next value
|
||
}
|
||
}
|