项目简介
本人机械专业的,但是却对敲代码有浓厚的兴趣,自学了STM32和Java后,开始整花活了,虽然这个项目可能对大佬的你来说太过简单,但我还是决定将本项目全部开源,帮助初学者吧。全方位点灯,客户端,网页,小程序,App,目前只能网页,暂时先这样。有时间再加其他的。
用到的技术栈
1.STM32标准库编程,ESP8266 AT指令开发 2.Java IO流,JavaFx 3.SpringBoot,SpringMVC,MyBatis 4.Android开发…
正题
Java服务器端
主要负责与ESP8266,客户端之间建立TCP连接,实现客户端与设备之间的信息转发。
主题思路
部分代码
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try {
ServerSocket serverSocket = new ServerSocket(5000);
server_mess.appendText("服务器初始化成功,等待客户端连接\r\n");
while (true) {
try {
socket = serverSocket.accept();
System.out.println("1111");
socket.setSoTimeout(10000);
buffreader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String clientname = buffreader.readLine();
System.out.println(clientname);
int clientid = 0;
if ((clientid = ServerUtils.SetClientid(clientMap, clientname)) != 0) {
clientMap.put(clientid, socket);
String ipaddr = socket.getInetAddress().getHostAddress();
Platform.runLater(() -> {
ListUtil.AddData(client_list, ipaddr);
client_count += 1;
client_num.setText(String.valueOf(client_count));
});
server_mess.appendText("客户端" + ipaddr + "已上线" + "id=" + clientid + "\r\n");
ServerThread serverThread = new ServerThread(socket);
serverThread.start();
} else
throw new IOException();
}catch(Exception e){
System.out.println("当前不是合法客户端");
if (buffreader != null)
buffreader.close();
if (socket != null)
socket.close();
e.printStackTrace();
}
}
} catch (IOException e) {
server_mess.appendText("服务器初始化失败,请检查是否占用5000端口\r\n");
}
}
});
thread.start();
}
通信协议
通讯协议为自定义协议。
1.上传(设备–>客户端)
起始位 | ID | 长度(data字节数) | data | 结束位 |
---|
0XFD | 0X?? | 0X?? | 0X?? 0X?? 0x?? | 0xDF |
例:0XFD 0X01 0X02 0X00 0X00 0XDF
2.下发(客户端–>设备)
起始位 | ID | 长度(data字节数) | data | 结束位 |
---|
0XFC | 0X?? | 0X?? | 0X?? 0X?? 0x?? | 0xCF |
例:0XFC 0X01 0X02 0X00 0X00 0XCF
STM32代码
int main(void)
{
SysTick_Init();
LED_Init();
DHT11_GPIO_Init();
Buzzer_Init();
USART_Config();
if(!ESP8266_Init()) return false;
Buzzer_Tick();
Tim_Init();
ESP8266_TTSendData((uint8_t*)"devide\r\n");
while(1)
{
if(Esp8266_Receive.Receive_FinshFlag == 1)
{
Esp8266_Receive.Receive_FinshFlag = 0;
if(Esp8266_Receive.Receive_Data[0] == 0XFC && Esp8266_Receive.Receive_Data[(Esp8266_Receive.Receive_Data[2] + 3)] == 0XCF)
{
if(Esp8266_Receive.Receive_Data[3] == 0X01)
{
printf("开灯\r\n");
LED_Open();
}else if(Esp8266_Receive.Receive_Data[3] == 0X00)
{
printf("关灯\r\n");
LED_Close();
}
}
Esp8266_Receive.Receive_Length = 0;
memset(Esp8266_Receive.Receive_Data,0,RECEIVE_MAX_Length);
}
if(time_1s)
{
time_1s = 0;
if(DHT11_Read_Dat() == SUCCESS)
{
uint8_t ledflag = GPIO_ReadInputDataBit(LED_GPIO_PORT,LED_GPIO_PIN);
if(ledflag)
updata[7] = 0X00;
else
updata[7] = 0X01;
updata[3] = DHT11_Data[2];
updata[4] = DHT11_Data[3];
updata[5] = DHT11_Data[0];
updata[6] = DHT11_Data[1];
ESP8266_TTSendArray(updata,9);
}
}
}
}
所有代码
目前只开源了JavaTcp服务器和STM32设备端的代码,看这篇文章的效果,决定是否开源剩余代码。。。。有任何疑问可以加QQ 2452213156一起交流
-
源码地址
|