完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
一直想把单片机和java结合起来,但是发现网上这方面的资源很少,所以我自己也是摸索了很久,下面是自己的一些体会
首先最基础的就是wifi模块的使用 void esp8266Init(){ //检测wifi模块是否能回复指令 printf("1.ATrn"); while(atk_8266_send_cmd("AT","OK",20)){ } delay_ms(500); //关闭wifi自动连接 printf("2. CWAUTOCONNrn"); while(atk_8266_send_cmd("AT+CWAUTOCONN=0","OK",20)){ } delay_ms(500); //配置wifi模式 AT+CWMODE=1为sta模式 printf("3. CWMODErn"); while(atk_8266_send_cmd("AT+CWMODE=1","OK",20)){ } delay_ms(500); printf("4. CWJAPrn"); //连接网络 while(atk_8266_send_cmd(ESP8266_WIFI_INFO,"OK",1000)){ } delay_ms(1000); //开启单连接模式,因为透传必须开启单连接模式 printf("5. CIPMUXrn"); while(atk_8266_send_cmd("AT+CIPMUX=0","OK",20)){ } delay_ms(500); //开启透传模式 printf("6. CIPMODErn"); while(atk_8266_send_cmd("AT+CIPMODE=1","OK",20)){ } delay_ms(500); //建立TCP连接 printf("7. CIPSTARTrn"); while(atk_8266_send_cmd(ESP8266_servlet_INFO,"OK",50)){ } delay_ms(500); //进入透传模式 printf("7. CIPSENDrn"); while(atk_8266_send_cmd("AT+CIPSEND","OK",20)){ } delay_ms(500); printf("ESP8266Init ok"); } 其中ESP8266_WIFI_INFO这个宏定义是你连接的wifi名字和密码 #define ESP8266_WIFI_INFO "AT+CWJAP="IOT205","IOT205iot205."" ESP8266_servlet_INFO 这个宏定义,首先这个ip地址可以打开命令行窗口,输入ipconfig查看,后面那个端口是tomcat的默认端口号,因为我java用的servlet,所以用的8080 #define ESP8266_servlet_INFO"AT+CIPSTART="TCP","192.168.1.111",8080" 注意如果wifi想要成功连接,建立tcp连接一定要把服务器先跑起来也就是java程序要先跑起来 java的servlet代码 package com.blb; import com.blb.utils.DBUtils; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.BufferedReader; import java.io.IOException; import java.sql.SQLException; @WebServlet("/dyk") public class ser01 extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { BufferedReader reader = new BufferedReader(req.getReader()); String data = reader.readLine(); String[] datas = data.split("&"); try { DBUtils.execute("insert into test1(temp,wet) values(?,?)",datas[0],datas[1]); } catch (SQLException throwables) { throwables.printStackTrace(); } } } 起初我也一直不清楚wifi模块发的http报文,java这边该如何接收,找了各种资料和函数都没找到,结果最后没有想到就一个这种简单的io流就可以 关于servlet和jdbc的一些基础知识我在这里就不描述过多了大家可以学一下,注意注解的前面的/别掉了,后面发http报文的url访问路径时还会用到的 接下来看一下单片机的发送http报文的函数 void temp_send2(u8 value1,u8 value2) { char p[20]=""; sprintf((char*)p,"%d&%d",value1,value2); u3_printf("POST /dachuang_war_exploded/dyk HTTP/1.1rn"); u3_printf("Host: 192.168.1.111:8080rn"); u3_printf("Content-Length: %drn",strlen(p)); u3_printf("Connection: closern"); u3_printf("rn"); atk_8266_send_data(p,"",20); } 这里我是通过发送一个&符号来区分开温度和湿度的,java那边取数据的时候可以调用split函数分隔出温度和湿度 请求的url路径一定要写完整,我用的idea前面的那个是他自带的/dachuang_war_exploded/dyk,后面那个dyk是我自己在servlet配的注解 有些地方是有空格的不要忘掉,内容前面的换行也千万不能掉了 如果一直不成功可以用USB转ttl模拟一下报文发送,看有没有存到数据库中 然后再改到这个函数里面 当然我这是最简单的发送字符串,有的是可以用json格式来发送java那边也用json来解析,这个我目前还不会,到时候学会了在补上 当然如果你会服务器可以将javaweb项目打成war包导入到服务器上的tomcat运行,注意jdk的版本问题我在这里也卡了几天一直报500的错误。 |
|
|
|
只有小组成员才能发言,加入小组>>
3277 浏览 9 评论
2950 浏览 16 评论
3454 浏览 1 评论
8983 浏览 16 评论
4044 浏览 18 评论
1093浏览 3评论
567浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
564浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2298浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1855浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-19 23:14 , Processed in 1.323266 second(s), Total 80, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号