概述
Java客户端
- 项目简介
- 用到的技术栈
- 正题
- Java服务器端
- 主题思路
- 部分代码
- 通信协议
- STM32代码
- 所有代码
项目简介
本人机械专业的,但是却对敲代码有浓厚的兴趣,自学了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 {
//初始化服务Socket端口
ServerSocket serverSocket = new ServerSocket(5000);
server_mess.appendText("服务器初始化成功,等待客户端连接rn");
while (true) {
try {
//等待客户端连接
socket = serverSocket.accept();
System.out.println("1111");
//设置Socket超时时间
socket.setSoTimeout(10000);
//获取数据输入流
buffreader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//读取客户端的第一条信息(判断为客户端还是设备)
String clientname = buffreader.readLine();
System.out.println(clientname);
int clientid = 0;
//获取客户端id
if ((clientid = ServerUtils.SetClientid(clientMap, clientname)) != 0) {
//将当前客户端放入集合
clientMap.put(clientid, socket);
//获取连接客户端IP
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 + "rn");
//为客户端创建一个新的线程
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端口rn");
}
}
});
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();//初始化LED灯
DHT11_GPIO_Init();//初始化DHT11引脚
Buzzer_Init();//初始化蜂鸣器引脚
USART_Config();//初始化串口
//初始化ESP8266
if(!ESP8266_Init()) return false;
Buzzer_Tick();//嘀~
Tim_Init();//定时器初始化
//向服务器发送说明自己是设备
ESP8266_TTSendData((uint8_t*)"devidern");
while(1)
{
//ESP8266接收到数据
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("开灯rn");
LED_Open();
}else if(Esp8266_Receive.Receive_Data[3] == 0X00)
{
printf("关灯rn");
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一起交流
-
源码地址
最后
以上就是干净冷风为你收集整理的STM32与Java之间的点灯艺术(一)项目简介用到的技术栈正题的全部内容,希望文章能够帮你解决STM32与Java之间的点灯艺术(一)项目简介用到的技术栈正题所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复