DIY远程空调遥控(考研已断更)

Posted llechee

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DIY远程空调遥控(考研已断更)相关的知识,希望对你有一定的参考价值。

现在宿舍都有空调

所以可以搞一搞自己动手干一个遥控器在手机里,下课别人飞奔回宿舍回宿舍开空调的时候,你可以冷静的打开空调,回去就能享受清凉!!!

夏日炎炎,这不香嘛!顺便祝董瑞龙赶紧找到对象♥哈哈哈

更新中

考试中——电赛准备中——划水中——咸鱼中!

开始配置

网络测试

网络通信肯定是最重要的一部分之一,我们比较是不在一个局域网下干活、传消息,所以需要配置一些东西。

怎么确定宿舍有没有WiFi呢?

这里先不要质疑我是不是一个傻X,那有没有WiFi谁不知道啊。
这里我们需要确定一下WiFi是否支持通信
这里我们可以有俩种方法:
1:宿舍的WiFi是需要登录的吗? 如果是的话,那恐怕有些难了。
一般学校的WiFi很多都是给你账号,然后让你连上WiFi之后去登录,然后才可以上网。这种一般每个人连上WiFi都要登录的是不行的。
2:如果宿舍的WiFi是不需要登陆的,那就可以!

还有一种情况是宿舍的WiFi登录一次之后就不需要登录了(我们就是这样),这种你们可以当作没有WiFi也可以保持WiFi一直别掉就行(意思就是你别在外面登录了,例如教室)

那么我们确定好有没有WiFi可用的时候就可以去进行下面的操作了

宿舍有WiFi的看这个《——

有WiFi的比较好办,只要确定我们手机出去了网还在就行!
我们在电脑上敲击Win + R

出现这个(没有cmd就自己打)
然后回车(确认),在蹦出来DOS命令窗口中输入:ipconfig

这里面的IPv4地址:192.168.2.134这就是我们的主机地址,记下
这里每个人显示的可能有差别,但是认准无线局域网这个下面就可以,千万别找错了
知道我们的IP后就比较简单了

内网穿透

原理就不解释了,总之就是将我们的局域网映射到公网上。
百度下载花生壳

然后自己注册,进入,进去之后体验版就够了。

点击右下角内个加号,就出现了上图所示的页面,我们就可以配置啦。
名称自己填,选择TCP,下面俩个自己不填,然后是内网主机,我们填写自己电脑的IP,比如我的就是192.168.2.134,端口号随便填(那当然不是随随便便!网络基础课讲了什么? 太低的端口不能用!!! 所以我们自己填个10000左右的端口就可以啦)

保存生效

测试一下,没有问题

当然,这个只是学习怎么配置内网穿透,大家会了就行,我们后面要映射别的IP !!!

宿舍没有WiFi的看这个《——

这个我们比较麻烦,所以我们只能通过别的平台操作

配置阿里云

关于阿里云,我们配置起来比较容易,关于阿里云的注册,学生的话阿里云前几个月是免费的,大家自己领取

这里我们需要选择Linux的服务器,别选错了

在开启服务器后,我们可以点击控制台,找到实例列表,点击远程连接

点击远程连接->Workbench远程连接->输入密码(密码是你中间自己设置的)后登录,即可看到一个linux的操作界面

这就是一个Linux的操作页面,使用命令操作,常用的命令请看这里:
常用Linux命令
由于已经是root用户,我们直接ifconfig查看一下内网IP,并记下
我们继续使用vi配置一下服务端,关于vi操作可能刚开始大家很难接受。
我简单介绍一下:首先我们在控制台输入:apt install vim,中间停下有个[Y/N],我们输入y 然后回车即可

下载了vim后我们便可以编译程序了,在控制台输入:vi server.c
进入vim界面,注意在vi中是不需要鼠标的,我们按下i,左下角会变成INSERT,我们就可以输入了,这里直接粘贴我的测试代码:

PS:在阿里云里面右键就是粘贴
这里里面俩个地方需要更改
一个是IP,就是刚刚ifconfig里面的IP
还有是端口号,写个10000左右的。
注意!!!:端口号要先在网络与安全->安全组中先添加

点击安全组名称下的蓝字进入

配置成这样就可以了
注意:出方向和入方向都要添加!!!
然后进入阿里云
我们需要将该端口,拉入防火墙白名单

这里的指令有三个

firewall-cmd --list-all 列出所有端口号白名单
firewall-cmd --add-port=7236/tcp --permanent 添加一个7236端口为白名单
firewall-cmd --reload 更新防火墙操作
然后再执行上面vi内些操作

#include <sys/types.h>
#include <sys/socket.h>
#include<netinet/in.h>
#include <arpa/inet.h>
#include<stdio.h>
#include<stdlib.h>
#include <unistd.h>
#include<string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int initsocket()
	int s_fd=socket(AF_INET, SOCK_STREAM,0);
	if (s_fd==-1)
	
		perror("socket");
		exit(-1);
	
	struct sockaddr_in addr;
	memset(&addr,0,sizeof(struct sockaddr_in));

	addr.sin_family=AF_INET;
	addr.sin_port=htons(6666); //端口号,注意要先在网络与安全->安全组中先添加一个端口
	inet_aton("172.21.0.6",&addr.sin_addr);//IP地址,该ip地址要填内网地址!!

	int bid=bind(s_fd,(struct sockaddr *)&addr,sizeof(struct sockaddr_in));
	listen(s_fd,10);
	int len=sizeof(struct sockaddr_in);
	return s_fd;
	
	int main()
	
	char readbuf[1024]=0;
	int s_fd=initsocket();  //初始化服务器

	printf("wait connect.....\\n");
	
		int fd_a=accept(s_fd,NULL,NULL); 
		printf("connect\\n");
		while(1)
		

		memset(readbuf,0,1024);      
		int r=read(fd_a,readbuf,1024);   
		if(r==-1)
		
			perror("read");
		
		else
		

			printf("get cmd is %s \\n",readbuf);
			memset(readbuf,0,1024);

		
		
	return 0;
	

粘贴之后,按Esc,然后左下角Insert消失,然后直接输入 :wq!就退出了
然后我们敲入命令 gcc server.c -o server
这时候我们输入ls 返现生成了另外颜色的server文件,我们使用 ./server
来执行它

这样子就成功了

测试一下

我们可以使用Windows的Telnet(不懂怎么开的去百度)
外网IP在这里查看
这时候利用这个IP和我们刚刚配置的端口号

输入telnet IP 端口号 即可连接,如果能连接上,就配置成功啦!!!!
也可以用手机连接试试
下载APP名字是TCP连接 输入外网IP和端口号测试哦!

最后: 后面我们还要重新配置,以上只是测试使用。

应用软件测试

android APP

这里我们使用Eclipse作为开发工具,Android studio也差不多,APP部分是比较简易的开发。
安卓部分的核心代码如下

new Thread(new Runnable() 

			@Override
			public void run() 
				// TODO Auto-generated method stub
				try 
					 Socket client = new Socket("192.168.43.2", 8848);//这里填写你需要发送消息的IP以及端口号
					//Socket client = new Socket(StartActivity.IP, Integer.parseInt(StartActivity.Port));
					OutputStream out = client.getOutputStream();
					out.write(message.getBytes());
					
					out.close();
					client.close();

				 catch (Exception e) 
					// TODO Auto-generated catch block
					e.printStackTrace();
				
			
		).start();

注意:这里的socket是客户端,它连接服务端是连上就断开,所以我们要注意服务端代码的编写。

具体发什么在这里改

package com.gec.thesummer;

import com.gec.thesummerlink.R;

import android.app.Activity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;

public class ContrlActivity extends Activity 

	Button uuu;
	

	@Override
	protected void onCreate(Bundle savedInstanceState) 
		super.onCreate(savedInstanceState);

		requestWindowFeature(Window.FEATURE_NO_TITLE);

		getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
	
		getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
		setContentView(R.layout.activity_contrl);
		initView();

	

	void initView() 

		uuu = (Button) findViewById(R.id.btnqian);
		
		uuu.setOnTouchListener(new OnTouchListener() 

			@Override
			public boolean onTouch(View arg0, MotionEvent event) 
				// TODO Auto-generated method stub
				switch (event.getAction()) 
				case MotionEvent.ACTION_DOWN:
					new NetUtils("666").sendMessage();//自己更改内容
					break;
				case MotionEvent.ACTION_UP: 
					new NetUtils("666").sendMessage();//自己更改内容
					break;
				

				
				return false;
			
		);
	
	



这里我们再编译安卓APP时候右击我们的工程,里面有一个run as,点击就可以。
建议最好拿模拟器来弄apk,虚拟机感觉不舒服
下载夜深安卓模拟器
找到Eclipse软件安装的位置,用cmd进入到platform-tools文件夹内执行

dir查看一下目录内容,然后执行adb connect 127.0.0.1:62001
即可

这是eclipse安卓开发环境的工具:
链接:https://pan.baidu.com/s/1HZjcEJbarMPe0un5HYW_2g
提取码:u0k8
复制这段内容后打开百度网盘手机App,操作更方便哦–来自百度网盘超级会员V1的分享
顺便把工程扔给大家 大家可以自行更改:
链接:https://pan.baidu.com/s/1lJuS-zirvCN_CX-en5IJVg
提取码:8eln
复制这段内容后打开百度网盘手机App,操作更方便哦–来自百度网盘超级会员V1的分享

再layout下可以更改内容,有一点基础的可以去改改
如果要更改APP的名字,图标啊啥的,我们需要再在
这里改,可以百度
目前做的很简陋,按一下开,按一下关,属实拉跨,最近要考试没有时间干了。 😏(偷懒)

小程序(目前不会)

完了找个大佬做

网页控制(不会)

这个比小程序可能还要复杂,还得挂云上把应该,以后再说

硬件测试

这里有很多方案,常见的主控例如51、32这些,emmmm可以用可以不用,但是还是需要esp8266,所以我们不如直接干8266
这里我们必须购买红外编解码模块
这个样子,还有这个东东
以及需要一个软件
串口驱动: 链接:https://pan.baidu.com/s/1e6E4fHcDi70pbO01qtK-mg
提取码:k0kq
复制这段内容后打开百度网盘手机App,操作更方便哦–来自百度网盘超级会员V1的分享
串口助手:
链接:https://pan.baidu.com/s/1w6T8lqZzn3MpUHHSh6Qswg
提取码:tnq3
复制这段内容后打开百度网盘手机App,操作更方便哦–来自百度网盘超级会员V1的分享

第一步解码


vcc连接vcc,gnd连接gnd,txd和rxd交叉连接!!!
把TTL插入到电脑USB接口,打开串口调试小助手,波特率等信息都要设置好哦,USB驱动一定记得装

这时我们拿着遥控器对着红外模块按一下:

这个勾上,然后就会返回一堆编码
然后按照特定的格式发回去,一定要按照16进制发送哦,红外设备对准空调,看是否有反应 (记得16进制编码前面加上A1 F1)
这时候,硬件的第一部分就完成了

8266测试

这里我们把8266配置成客户端
我是用32给8266供电 3.3v 8266和usb转ttl串口线交叉连接

打开串口助手(下面的操作在发送前要打一个回车
记得EN也接到3.3v最好
输入AT+CWMODE=1配置成WiFi模式
输入AT+RST重启生效
连接无线指令AT+CWJAP="DRLsb","19407010220."根据自己修改

成功后,可以输入查询指令:AT+CIFSR查看本设备的IP地址

客户端小测试

我们打开云服务器服务端

在串口助手 输入连接指令AT+CIPSTART="TCP","8.140.19.147",7236

成功
客户端怎么发送消息呢? 使用AT+CIPSEND=4 4是你要发送多少个字节的消息 ,然后会出现>符号 说明等待发送,然后就正常发送


神奇(吧)
但是每次输入前都要先发送命令AT+CIPSEND有点麻烦,所以我们可以开启透传模式
AT+CIPMODE=1 //开启透传模式
AT+CIPSEND //开始透传

看来不支持中文
要结束透传的话需要发送+++
8266暂时就这些 后面会加速更新!

宿舍没有WiFi情况!重要!!!配置8266成为WiFi

首先是连线
我是用32给8266供电(3.3v)同时给8266EN脚也供3.3v
同时usb转ttl和8266用txd和rxd交叉连接(这些上面都有)

接下来开始配置
第一条指令是选择 WIFI 的应用模式:AT+CWMODE=3
重启模块指令:

AT+RST


启动多连接指令:AT+CIPMUX=1
建立服务器server指令: AT+CIPSERVER=1,9782(记得是英文逗号)

修改wifi

AT+CWSAP="8266","12345678",11,3

然后可以连接了

当然没有网,这时候
我们AT+CIFSR查看一下IP


发现ping不通
我们内网穿透
怎么穿透以及说过啦!去操作,结果:

ping一下,成功!!!

这时候我们便可以把这个放在宿舍,通电就行。
然后结合云服务器!干事情
更新中!!!

整合以及Tips

第一种方式:WEMOS+红外(宿舍有WIFI的)


这种基于arduino的开发板集成了8266,也不贵,我觉得是较为简单的一种方式
在这里我们用wemos作为服务端!


#include <ESP8266WiFi.h>  
char ssid[] = "DRLsb";   //自己家的WIFI账号
char passwd[] = "19407010220."; //WIFI密码

const byte data_off[] = 

    0xA1,0xF1,0x80,0x7F,0x01  //空调的开关码    一般开和关的码一致
       
;
const byte data_on[] = 

    0xA1,0xF1,0x80,0x7F,0x01
       
;
 
void initWifiSta()

  WiFi.mode(WIFI_STA);         // 设置STA模式
  WiFi.begin(ssid, passwd);   //连接网络
  while (WiFi.status() != WL_CONNECTED)   
         Serial.print(".");
         delay(500);
   
   Serial.println(WiFi.localIP());  //打印IP地址
    
   delay(500);
  

int port = 6842;  //端口号,随便设置
WiFiServer server(port); // 设置服务器端口号
void setup() 

  Serial.begin(9600);   //设置波特率(和红外设相连接的波特率)
  initWifiSta();
 /* while(!Serial)                  //串口未成功则循环等待
      
        delay(1000);                //  延迟1秒
    
    Serial.println("串口启动成功"); //通知串口
 */

void loop() 
 /*
  if(Serial.available())            //是否有数据传入 (数据只会一个一个读取)
      
        Serial.write(Serial.read());  //串口接收后再串口发送/输出数据 
        // ESP.restart();               // 重启设备    
    
   
 */
    WiFiClient client = server.available();   //设置为服务端
    server.begin();//服务初始化 
    Serial.println(WiFi.localIP());   //打印IP
   while (client.connected())    //等待客户端的连接
   
         while (client.available() > 0)  
         char cmd = client.read();  //从客户端读取数据
         Serial.println(cmd);  //打印读取的数据
         if(cmd=='666')  
         
 //             Serial.println("recv 1");
 
            Serial.write(data_on,(sizeof(data_on) / sizeof(data_on[0]))); //给红外设备发送开灯码
            
          
          else if(cmd=='666')
          

//              Serial.println("close light\\r\\n");
              Serial.write(data_off,(sizeof(data_off) / sizeof(data_off[0])));//给红外设备发送关灯码   其实是一样的  嘻嘻嘻
          
          
         
   

怎么连线就不说了 比较简单
这里的疑问可能是:
为什么接受的消息要用666判断呢? 之前砸门APP里面按下去就会发送666哦,当然大家也可以自己设置

注意: 第一次先别连接,先烧进去代码,打开串口监视器,看一下wemos的IP地址,代码里有!
我们获取到wemos的IP之后,我们再内网穿透
具体怎么穿透前面已经说了
然后得到穿透后的公网IP放进去APP中。别忘了APP要改IP和你设置的端口号!!!

然后将app运行放在手机,就可以试试操作啦!!!拜!

更新中…

以上是关于DIY远程空调遥控(考研已断更)的主要内容,如果未能解决你的问题,请参考以下文章

自己DIY制作大学宿舍远程空调遥控(小白的物联网入门)

很火的夏日一键清凉—自己DIY制作大学宿舍远程空调遥控(小白的物联网入门)

用手机控制空调

零代码开发AI语音红外遥控

遥控器终结者——万能红外遥控器开发方案详解来了!

STM32单片机WIFI-APP智能温控空调冷热可调红外遥控