题目描述:
-
智能家居协议设计
实现一个基于socket的物联网服务器,接收来自客户端的数据。实现一个物联网客户端,模拟设备。客户端产生数据,发送至服务器,服务器根据协议对数据作出处理。
需要模式的设备有:
温度传感器:采集房间温度信息。
湿度传感器:采集房间湿度信息。
空调:可以根据服务器发来的指令进行调节模式(制冷、制热、送风)、设置温度、风速;还可以根据服务器的指令上传子自己的当前状态:模式、温度、风速。
门窗磁:可以根据服务器发来的指令打开或者关闭窗户。
要求:
设计通信协议完成数据的双向传输,应用层协议应包含首部和数据部分。
学校:烟台大学计算机与控制工程学院2017级
完成时间:2019.12
老师:赵老师
具体实现过程参考附带的链接资源,此处只提供源码和一些实验指导,因为已经是放寒假已经半个月了,所以博客写的有些时间久远,大部分思路是在链接资源的实验报告里面:
CSDN资源:
https://download.csdn.net/my
百度云:链接:https://pan.baidu.com/s/1DBFi4i2g1lL3MoQC6MQAGA
提取码:54hx
压缩包里面还有个一复杂版本的,那是我原来从GitHub上找的demo,比较完整,而且实现一些死锁问题的解决方案。
本次实验时间还是比较长的。但是实验还是比较匆忙的完成,因为大家都是提前验收的,没有考虑一些像是死锁一样的问题。
server.cpp
#include<iostream>
#include<stdio.h>
#include<Winsock2.h>
#include<fstream>
#include<cstdio>
using namespace std;
#pragma comment(lib, “ws2_32.lib”)
char recv_buf[100];
char send_buf[100];
void print(char *s)
{
int t, p;
if(s[3] == ‘0’){ //温度传感器
p = 0;
t = 6;
int tem; // 温度
int start_num = s[4] – ‘0’;
int num = s[5] – ‘0’;
cout<<“————————————“<<endl;
cout<<“收到来自”<<num<<“个温度传感器的数据:如下”<<endl;
while(num–){
tem = 0;
tem += (s[t++] – ‘0’)*10;
tem += (s[t++] – ‘0’);
cout<<start_num+p<<“号位置温度为:”<<tem<<“° “;
p++;
}
cout<<“\n————————————“<<endl;
}
else if(s[3] == ‘1’){ //湿度传感器
p = 0;
t = 6;
int shidu; // 湿度
int start_num = s[4] – ‘0’;
int num = s[5] – ‘0’;
cout<<“收到来自”<<num<<“个湿度传感器的数据:”;
while(num–){
shidu = 0;
shidu += (s[t++] – ‘0’)*10;
shidu += (s[t++] – ‘0’);
cout<<start_num+p<<“号位置湿度为:”<<shidu<<“% “;
p++;
}
}
cout<<endl;
return ;
}
int main()
{
WORD wsa = MAKEWORD(2,2);
WSADATA wsaData;
if(WSAStartup(wsa, &wsaData)!=0)
{
cout<<“初始化失败”<<endl; //这进行初始化
return 0;
}
//创建套接字
SOCKET s_server = socket(AF_INET, SOCK_STREAM, 0);
//AF_INET 面向网络的 IPV4
//AF_INET6用于第6版因特网协议(IPv6)寻址
//SOCK_STREAM TCP链接 面向链接 SOCK_DGRAM 无连接 UDP
if(s_server==INVALID_SOCKET) //INVALID_SOCKET是-1 错误标志
{
cout<<“socket创建失败”<<endl;
return 0;
}
//这里配置server配置信息
sockaddr_in server_addr; //创建sockaddr_in结构体
server_addr.sin_family = AF_INET; //IPV4协议
server_addr.sin_port = htons(8888); //本地端口8888
server_addr.sin_addr.S_un.S_addr = INADDR_ANY; //设置地址 监听本地端口
//利用bind函数将socket和配置信息绑定
//bind通常和