很火的夏日一键清凉—自己DIY制作大学宿舍远程空调遥控(小白的物联网入门)
Posted L哲哲
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了很火的夏日一键清凉—自己DIY制作大学宿舍远程空调遥控(小白的物联网入门)相关的知识,希望对你有一定的参考价值。
啊吧啊吧啊吧啊吧!!!!!!!!!!!!!!!!!!
前一段时间很火的小程序:随身小风扇 受到了很大的欢迎,但是并不妨碍大家上厕所满头大汗😀
但是!那小程序还是只能(pian)自己哈哈哈哈,我们可以干一些更牛逼的,小白也做一个好玩的(顺便学学东西)
现在宿舍都有空调(应该)🤣
所以可以搞一搞自己动手干一个遥控器在手机里,下课别人飞奔回宿舍回宿舍开空调的时候,你可以冷静的打开空调,回去就能享受清凉!!!
夏日炎炎,这不香嘛!顺便祝董瑞龙赶紧找到对象♥哈哈哈
更新中!!!更新中!!!更新中!!!
很快很快滴 考试中——电赛准备中——划水中——咸鱼中!
开始配置啦!
网络测试
网络通信肯定是最重要的一部分之一,我们比较是不在一个局域网下干活、传消息,所以需要配置一些东西。
怎么确定宿舍有没有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制作大学宿舍远程空调遥控(小白的物联网入门)的主要内容,如果未能解决你的问题,请参考以下文章