首页 文章 精选 留言 我的

精选列表

搜索[esp8266],共54篇文章
优秀的个人博客,低调大师

[C]NodeMCU(ESP8266)接入阿里云物联网平台

PIR只有三个口,分别是VCC,GND和输出口。接线方法如下(NodeMCU的D7相当于arduino里的Pin 13) 物模型定义 C程序代码 esp8266.ino 代码 #include <ESP8266WiFi.h> /* 依赖 PubSubClient 2.4.0 */ #include <PubSubClient.h> /* 依赖 ArduinoJson 5.13.4 */ #include <ArduinoJson.h> #define SENSOR_PIN 13 /* 连接您的WIFI SSID和密码 */ #define WIFI_SSID "路由器SSID" #define WIFI_PASSWD "密码" /* 设备的三元组信息*/ #de

优秀的个人博客,低调大师

1-51单片机ESP8266学习-AT指令(开发板介绍)

APP可在百度手机助手,安卓市场,91助手,下载安装 源码链接都在后面 前面的都是介绍单独的WIFI,没有和单片机结合起来,因为做项目很少会只用WIFI模块.大多数都是WIFI模块作为中转数据的桥梁,单片机负责 数据采集,控制等等,所以自己准备出一套51单片机+WIFI模块和32+WIFI模块的教程,当然先出51单片机的, 自己的规划是 51单片机: 配合WIFI模块实现采集和控制 WIFI模块: 先讲AT指令开发(TCP,UDP),然后是LUA开发(TCP,UDP,MQTT等等各种功能),最后是SDK开发(TCP,UDP,MQTT等等),当然这些都会配合单片机,和上位机 Android: TCP,UDP,MQTT,数据库,画波形图等等等等 C#: 我的上位机用C#做,TCP,UDP,MQTT,数据库,画波形图等等等等 其它: 这次会把所有的过程写的详详细细的,要做就做完美点,希望写这一次,能够帮到更多的人,突然想起来了一件事情,有个朋友答应我的把他自己买云服务和安装MQTT的详细过程写成文章给我呢!!!!!自己现在不好写...因为自己买过了,如果再买的话..........浪费钱了.. 突然还想再搞搞WIFI远程控制PLC,正好手头有个PLC.... 1,整体测试的功能,APP软件远程控制开发板的一个灯,51采集DHT11的数据通过WIFI模块远程发送给APP 可以绑定许多设备 每个设备都具有的功能 2,开发板,刚自己手工焊接了一个...松香有点黑.....以后直接贴片就好啦....过了清明节就去贴一批板子 3,如何绑定开发板,自己在发货前会下载好这个程序,亲们拿到手就可以直接使用 剩下的功能亲们自己去测试吧!! 现在看STM32 WIFI模块的开发板 没有板载别的传感器,自己是直接把32采集的引脚电压传给APP显示,用32开发板呢除了说一下51开发板所有实现的,还会说一下关于SPI从机(WIFI模块做主机) 国路同学从家里回来了,继续做他的项目,立即让自己轻松了不少,所以继续写这一系列的教程 对于自己以前做的WIFI最小系统的,自己也是默认烧写好现在的直接可以远程控制的程序, 用户拿到手即可用手机APP绑定设备然后实现远程控制继电器 关于源码: 因为自己以后做的凡是物联网的东西皆使用此APP实现远程控制,为了不造成自己或别人的设备被别人控制,所以自己的APP源码不公开,但是自己会一步一步的教大家做这个APP,会另外规定一套协议用在开发的APP上,所以现在不公开APP源码敬请见谅,写完教程以后绝对能让大家轻松的实现自己现在所有实现的功能.这个放心. 但是自己虽然不公开APP源码,但是自己会公开8266的源码,亲们把源码下载进去,就可以用自己的APP实现远程控制. 自己的APP过段时间才能发布到百度手机助手上,方便大家安装更新,以体验更好的功能 不过先以百度云的方式给大家安装包,APP的安装包地址 链接:https://pan.baidu.com/s/1qPfr7Vt6ip7bVXxdZVGwCA 密码:p8gf 淘宝链接: https://item.taobao.com/item.htm?spm=a1z38n.10677092.0.0.26461debilsmqm&id=558508797404 下一篇介绍详细的使用过程和8266底层源码 下一篇链接 http://www.cnblogs.com/yangfengwu/p/8743502.html

优秀的个人博客,低调大师

(一)基于阿里云的MQTT远程控制(Android 连接MQTT服务器,ESP8266连接MQTT服务器实现远程通信控制----简单的连接通...

如果不了解MQTT的可以看这篇文章 http://www.cnblogs.com/yangfengwu/p/7764667.html http://www.cnblogs.com/yangfengwu/p/8026014.html 关于钱的问题,其实自己是花钱买的云服务,虽然自己现在能支付的起,但是呢为了尽量减少支出,自已还有好多好多文章要写,好多好多元器件要买,所以哈会在自己的淘宝上卖源码2元价格,一元捐出,一元自己留着当亲们支付云服务的费用了 如果看不懂也没关系,跟着做就可以了,做完以后您会发现原来MQTT这么好用,也如此简单. 对了我要尽量把程序写的烂一些,界面做的烂一些,因为既然是学习用的应该越直观越好.......说一下,自己的服务器因为公开了稳定性上肯定不好, 数据冲突也是可能的,这是第一篇,下面几篇慢慢的来,咱一块慢慢完善哈 实现的功能--手机和WIFI模块都连接MQTT服务器,手机用按钮实现远程控制一个继电器,然后WIFI模块采集的DHT11的温湿度,远程发给手机 不过自己这批贴片的板子要等到后天才到.......................... 先看一下Android 程序怎么写,首先就是下载个MQTT的jar包 链接:https://pan.baidu.com/s/1bpjRzyB 密码:90vv 新建一个Android 工程就不说了吧............... 将下载的jar包放在一个地方 我放在了我的Android的源码的根目录 现在在Android 工程导入下载的那个jar包 现在把可能用到的一些权限加上 <!-- 获取手机信息权限 --> <uses-permission android:name="android.permission.INTERNET"></uses-permission> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" ></uses-permission>" <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"></uses-permission> <uses-permission android:name="android.permission.CHANGE_CONFIGURATION" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <uses-permission android:name="android.permission.WAKE_LOCK"/> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/> <uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.WRITE_SETTINGS" /> <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"></uses-permission> 现在呢先写个程序获取手机的IMEI号,因为连接的时候每一个客户端的ClientID要求不能一样,咱就用IMEI号代表ClientID 其实就这两句 TelephonyManager mTm = (TelephonyManager)this.getSystemService(TELEPHONY_SERVICE); TelephonyIMEI = mTm.getDeviceId(); 现在配置咱的MQTT public class MainActivity extends Activity { String TelephonyIMEI=""; private MqttClient client;//client private MqttConnectOptions options;//配置 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TelephonyManager mTm = (TelephonyManager)this.getSystemService(TELEPHONY_SERVICE); TelephonyIMEI = mTm.getDeviceId(); //Toast.makeText(getApplicationContext(), TelephonyIMEI, 500).show(); MyMqttInit(); } /* 初始化配置Mqtt */ private void MyMqttInit() { try { //(1)主机地址(2)客户端ID,一般以客户端唯一标识符(不能够和其它客户端重名)(3)最后一个参数是指数据保存在内存(具体保存什么数据,以后再说,其实现在我也不是很确定) client = new MqttClient("tcp://47.93.19.134:1883",TelephonyIMEI,new MemoryPersistence()); } catch (MqttException e) { // TODO Auto-generated catch block e.printStackTrace(); } options = new MqttConnectOptions();//MQTT的连接设置 options.setCleanSession(true);//设置是否清空session,这里如果设置为false表示服务器会保留客户端的连接记录,这里设置为true表示每次连接到服务器都以新的身份连接 options.setUserName("username");//设置连接的用户名(自己的服务器没有设置用户名) options.setPassword("password".toCharArray());//设置连接的密码(自己的服务器没有设置密码) options.setConnectionTimeout(10);// 设置连接超时时间 单位为秒 options.setKeepAliveInterval(20);// 设置会话心跳时间 单位为秒 服务器会每隔1.5*20秒的时间向客户端发送个消息判断客户端是否在线,但这个方法并没有重连的机制 client.setCallback(new MqttCallback() { @Override//获取的消息会执行这里--arg0是主题,arg1是消息 public void messageArrived(String arg0, MqttMessage arg1) throws Exception { // TODO Auto-generated method stub } @Override//订阅主题后会执行到这里 public void deliveryComplete(IMqttDeliveryToken arg0) { // TODO Auto-generated method stub } @Override//连接丢失后,会执行这里 public void connectionLost(Throwable arg0) { // TODO Auto-generated method stub } }); } 现在连接咱的服务器,连接成功后打印一下连接成功,连接是阻塞的,所以放在一个任务里面执行连接 public class MainActivity extends Activity { String TelephonyIMEI=""; private MqttClient client;//client private MqttConnectOptions options;//配置 MqttConnectThread mqttConnectThread = new MqttConnectThread();//连接服务器任务 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TelephonyManager mTm = (TelephonyManager)this.getSystemService(TELEPHONY_SERVICE); TelephonyIMEI = mTm.getDeviceId(); //Toast.makeText(getApplicationContext(), TelephonyIMEI, 500).show(); MyMqttInit();//初始化配置MQTT客户端 mqttConnectThread.start();//执行连接服务器任务 } /* 初始化配置Mqtt */ private void MyMqttInit() { ......... } /*连接服务器任务*/ class MqttConnectThread extends Thread { public void run() { try { client.connect(options);//连接服务器,连接不上会阻塞在这 runOnUiThread(new Runnable() {// public void run() { Toast.makeText(getApplicationContext(), "连接成功", 500).show(); } }); } catch (MqttSecurityException e) { //安全问题连接失败 } catch (MqttException e) { //连接失败原因 } } } 现在下载到手机试一试 现在呢测试一下通信,测试接收消息,用调试助手发信息,然后手机端接收,然后显示出来 调试助手链接 链接:https://pan.baidu.com/s/1qYxEeLI 密码:exfj 现在先设置一下APP的订阅的主题,和接收到消息之后就显示出来 public class MainActivity extends Activity { String TelephonyIMEI=""; private MqttClient client;//client private MqttConnectOptions options;//配置 MqttConnectThread mqttConnectThread = new MqttConnectThread();//连接服务器任务 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TelephonyManager mTm = (TelephonyManager)this.getSystemService(TELEPHONY_SERVICE); TelephonyIMEI = mTm.getDeviceId(); //Toast.makeText(getApplicationContext(), TelephonyIMEI, 500).show(); MyMqttInit();//初始化配置MQTT客户端 mqttConnectThread.start();//执行连接服务器任务 } /* 初始化配置Mqtt */ private void MyMqttInit() { try { //(1)主机地址(2)客户端ID,一般以客户端唯一标识符(不能够和其它客户端重名)(3)最后一个参数是指数据保存在内存(具体保存什么数据,以后再说,其实现在我也不是很确定) client = new MqttClient("tcp://47.93.19.134:1883",TelephonyIMEI,new MemoryPersistence()); } catch (MqttException e) { // TODO Auto-generated catch block e.printStackTrace(); } options = new MqttConnectOptions();//MQTT的连接设置 options.setCleanSession(true);//设置是否清空session,这里如果设置为false表示服务器会保留客户端的连接记录,这里设置为true表示每次连接到服务器都以新的身份连接 options.setUserName("username");//设置连接的用户名(自己的服务器没有设置用户名) options.setPassword("password".toCharArray());//设置连接的密码(自己的服务器没有设置密码) options.setConnectionTimeout(10);// 设置连接超时时间 单位为秒 options.setKeepAliveInterval(20);// 设置会话心跳时间 单位为秒 服务器会每隔1.5*20秒的时间向客户端发送个消息判断客户端是否在线,但这个方法并没有重连的机制 client.setCallback(new MqttCallback() { @Override//获取消息会执行这里--arg0是主题,arg1是消息 public void messageArrived(String arg0, MqttMessage arg1) throws Exception { // TODO Auto-generated method stub final String topic = arg0;//主题 final String msgString = arg1.toString();//消息 runOnUiThread(new Runnable() {// public void run() { Toast.makeText(getApplicationContext(),"主题:"+topic+"消息:"+msgString, 500).show(); } }); } @Override//订阅主题后会执行到这里 public void deliveryComplete(IMqttDeliveryToken arg0) { // TODO Auto-generated method stub } @Override//连接丢失后,会执行这里 public void connectionLost(Throwable arg0) { // TODO Auto-generated method stub } }); } /*连接服务器任务*/ class MqttConnectThread extends Thread { public void run() { try { client.connect(options);//连接服务器,连接不上会阻塞在这 client.subscribe("test",0);//设置(订阅)接收的主题,主题的级别是0 runOnUiThread(new Runnable() {// public void run() { Toast.makeText(getApplicationContext(), "连接成功", 500).show(); } }); } catch (MqttSecurityException e) { //安全问题连接失败 } catch (MqttException e) { //连接失败原因 } } } 下载到手机 现在配置一下软件,对了有些参数现在不明白没关系,后面会介绍一下相关的知识, 软件的主题名称要和APP中订阅的主题一样 都是 test 现在连接 现在点击发布消息 看手机端 说明已经能通信了 现在说一下关于主题哈,关于/ 现在把手机端的订阅的主题改为"/#" 然后下载到手机 你会发现手机也能接收消息 手机都能接收到消息 #是一个匹配主题中任意层次数的通配符。比如说,如果你订阅了test/device/#,你就可以接收到以下这些主题的消息。 test/device test/device/后面随便是什么 咱们的设备可以用"/"来进行分类,咱们的APP呢可以指定接收哪一类的产品的数据"XXXX/#"....是不是很方便对了如果现在接收两个已知主题的设备假如说是 第一种方式 第二种方式 结果和上面一样 现在呢在界面加一个按钮,按下发送消息"1",松开发送消息"0" 然后设置发布的主题是"/test/button" public class MainActivity extends Activity { String TelephonyIMEI=""; private MqttClient client;//client private MqttConnectOptions options;//配置 MqttConnectThread mqttConnectThread = new MqttConnectThread();//连接服务器任务 Button button;//发送消息按钮 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); button = (Button) findViewById(R.id.button1);//获取发送消息按钮 button.setOnTouchListener(buttonTouch);//设置按钮的触摸事件 TelephonyManager mTm = (TelephonyManager)this.getSystemService(TELEPHONY_SERVICE); TelephonyIMEI = mTm.getDeviceId(); //Toast.makeText(getApplicationContext(), TelephonyIMEI, 500).show(); MyMqttInit();//初始化配置MQTT客户端 mqttConnectThread.start();//执行连接服务器任务 } /*按钮触摸事件*/ private OnTouchListener buttonTouch = new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { MqttMessage msgMessage = null;//Mqtt消息变量 if (event.getAction() == MotionEvent.ACTION_DOWN) //按下 { msgMessage = new MqttMessage("1".getBytes()); } else if (event.getAction() == MotionEvent.ACTION_UP) //松开 { msgMessage = new MqttMessage("0".getBytes()); } try { client.publish("/test/button",msgMessage);//发送主题为"/test/button"的消息 } catch (MqttPersistenceException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (MqttException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (Exception e) { //其余的状态msgMessage = null;所以加了这个catch (Exception e) } return false; } }; 现在下载到手机, 调试助手订阅一下主题"/test/button" 动作一下按钮 现在把发过来的数据用文本框显示,不让他提示了 接收显示的换一下 runOnUiThread(new Runnable() {//因为操作的是主界面的控件所以用刷新UI的线程,最好用handle哈,我这里怎么简单怎么写 public void run() { //Toast.makeText(getApplicationContext(),"主题:"+topic+"消息:"+msgString, 500).show(); textView.setText("主题:"+topic+"\n消息:"+msgString); } }); 现在试一下 好了,现在咱开始控制咱的WIFI模块了....用咱的手机控制WIFI板子上的继电器,WIFI模块呢采集温湿度,然后显示在手机的文本框中 自己更倾向于用lua开发,所以要刷入lua的固件哈 关于刷固件可以参考 http://www.cnblogs.com/yangfengwu/p/7514336.html 自己已经下载好的固件 链接:https://pan.baidu.com/s/1o8pAISy 密码:9zns 如果亲们自己下载的话别忘了,把mqtt和dht选择上哈 程序--init.lua wifi.setmode(wifi.STATION) RelayPin = 2;--RelayPin gpio.mode(RelayPin,gpio.OUTPUT)--RelayPin gpio.write(RelayPin,0)--RelayPin LedPin = 4;--LedPin gpio.mode(LedPin,gpio.OUTPUT)--LedPin gpio.write(LedPin,0)--LedPin DHT11pin = 5--DHT11 GPIO Temperature = "0";--Storage temperature Humidity = "0";--Store humidity apcfg={} apcfg.ssid="qqqqq" apcfg.pwd="11223344" wifi.sta.config(apcfg) --wifi.sta.connect() wifi.sta.autoconnect(1) clientid = wifi.sta.getmac() mqttClient=nil mqttConnectedFlage = 0; Mymqtt = mqtt.Client(clientid, 120,"user", "password"); --[[The connection serve]] tmr.alarm(0, 1000, 1, function() Mymqtt:connect("47.93.19.134", 1883, 0,ConnectSuccess,ConnectFailed) end) --[[The connection Success]] function ConnectSuccess(client) client:subscribe("/test/button", 0, subscribeSuccess) print("connected") mqttClient = client; tmr.stop(0); mqttConnectedFlage = 1; end --[[The connection fails]] function mqttConnectFailed(client,reason) mqttConnectedFlage = 0; print("failed reason: " .. reason) tmr.start(0); end --[[The subscribe Success]] function subscribeSuccess(client) print("subscribe success") end --[[The Receive Msg]] Mymqtt:on("message", function(client, topic, data) if string.find(data,"1") ~= nil then gpio.write(RelayPin,1) end if string.find(data,"0") ~= nil then gpio.write(RelayPin,0) end end) --[[The Send Msg]] tmr.alarm(1, 1000, 1, function() if mqttClient ~= nil and mqttConnectedFlage == 1 then mqttClient:publish("/test/yang","Temperature="..Temperature..";".."Humidity="..Humidity, 0, 0, function(client) gpio.write(4,1-gpio.read(4)) end) end end) --[[The gather humiture data]] tmr.alarm(5, 2000, 1, function()--Every other 1S local status, temp, humi, temp_dec, humi_dec = dht.read11(DHT11pin)--Gathering temperature and humidity if status == dht.OK or status == dht.ERROR_CHECKSUM then Temperature = temp; Humidity = humi; --print("DHT Temperature:"..temp..";".."Humidity:"..humi) end end) printip = 0 wifi.eventmon.register(wifi.eventmon.STA_DISCONNECTED, function(T) printip = 0 end) wifi.eventmon.register(wifi.eventmon.STA_GOT_IP, function(T) if printip == 0 then ip,netmask,gateway = wifi.sta.getip() print(gateway) end printip = 1 end) 现在说一下个个部分的功能,对了关于语法问题和其余的问题就请大家参考我的,其实上面的代码就是参考的官方给的API函数, 我希望亲们最重要的是有自学的能力,而不是需要别人灌输东西的机器. 好了亲们可以自己去测试了 源码链接 https://item.taobao.com/item.htm?id=565355106226 wifi的就是上面的,直接复制粘贴过去就好啦 自己淘宝店的链接呢在最上面

优秀的个人博客,低调大师

10-51单片机ESP8266学习-AT指令(单片机采集温湿度数据通过8266发送给C#TCP客户端显示)

https://yq.aliyun.com/articles/580125?spm=a2c4e.11155435.0.0.34723312e7QrBf 先写单片机端的程序先把源码和资料链接放到这里 链接:https://pan.baidu.com/s/10MxI8-Q33-M_R2WEHqEi1A 密码:j1sz 等等哈,,,,我自己做一个android版本的TCP调试助手再接着写....发现别人的不好使.......老有问题,我担心让初学者感觉麻烦,所以自己做一个 稳定的调试助手再接着讲 现在接着说, APP可在百度手机助手,安卓市场,91助手,下载安装(搜索"小五物联")今天刚做好,增加了TCP客户端和服务器,其实前天做好了TCP客户端,但是测试出来问题了......在修改的过程中就把TCP客户端和服务器做到 可一个Pager做到了一起,这样以后再添加MQTT,WEB,蓝牙等功能的时候直接做到这里面刚发布出去,如果亲们不是我上面的界面说明还没审核通过,亲们可以用自己的调试助手,我就用自己做的,,因为做的功能 很全,很方便 等一下,,我先看看上一篇写到哪种程度了 咱先用TCP调试助手给单片机发指令,然后看一下回传的数据 先做单片机程序,就在上一篇的基础上增加功能 /** * @brief WIFI模块发送数据的命令 * @param id--发给哪一个连接的设备 * @param Length--数据的长度 * @param *SendData--数据 * @retval Overtime--接收命令的超时时间ms * @example **/ void ESPSendData(unsigned char id,unsigned char Length,unsigned char *SendData,int Overtime) { unsigned char Send [20]; int SendLength = 0; sprintf (Send, "AT+CIPSEND=%d,%d\r\n",(int)id, (int)Length); SendLength = 16; if(Length>=10){ SendLength = 17;} if(Length>=100){ SendLength = 18;} UartSendTI(Send,SendLength);//发送发送数据的命令 while(Overtime--) { if(UsartFlage == 1) { UsartFlage = 0; if(strstr(UsartReceive, ">"))//收到回复 { DelayMs(50); break; } } DelayMs(1); } if(Overtime>0)//没有超时 { UartSendTI(SendData,Length); } } 这地方 if(Length>=10){ SendLength = 17;} if(Length>=100){ SendLength = 18;} 是因为 AT+CIPSEND=0,8rn 数据少于10个 16个字符AT+CIPSEND=0,12rn 数据少于10个 17个字符AT+CIPSEND=0,103rn 数据少于10个 18个字符主函数里面现在用手机连接模块的无线--先用调试助手测试,即使是做项目也是先用调试助手测试...还记得咱规定的命令不 启动服务器成功以后就进入while(1) 循环, 接收到数据 0xaa,0x55,0x01,0x01 则发送自己的温湿度数据 0xaa,0x55,温度(16进制表示),湿度(16进制表示) 假设 接收到 0xaa,0x55,0x01,0x01 温度10度,湿度50% 0xaa,0x55,,0x01,0x0a,0x32 这一节不加任何的校验位,后期再加 接收到数据 0xaa,0x55,0x02,0x00 控制小灯熄灭 接收到数据 0xaa,0x55,0x02,0xff 控制小灯点亮现在试一下数据是 返回的数据是 aa 55 01 15 1C 15化成十进制是21度 1C是28% 温度21度 相对湿度28% 说明可以采集了也能返回数据了,咱现在做C#采集端 说一下,自己想了想就不用委托和回调了,因为想起了自己以前学C#,感觉对于初学者而言怎样简单就怎样做,不要去太追究规则和约束,等真正入门了再去考虑那些东西. 其实这节是看着高大上但是却最是最简单的.... 咱前些日子写到现在增加几句话收到aa5501回复aa5501,对于为什么说不直接接收数据显示,因为你要先确定好确实可以接收,用串口调试助手先测试, 可能有人直接就接收显示了,也可以,不过以经验来说,最好还是先这样做,因为自己这样上过当,反正C#的串口接收就必须用空闲中断类似 的函数接收才行,因为每次接收到的不一定是一条数据.......... 我就先连接我的手机的TCP服务器调试一下,关于软件的使用可以看使用说明现在自己的APP还是有点问题会产生多余的发送任务,所以点击了一下发送,发送了好几次.................... 上一版本的没有这种情况,但是测试发现上一版本在5.1版本上任务却不让那样用,,,,郁闷,后期再找解决方法 先不管它,先做现在的上位机 现在添加一个定时器,每隔1S发送一次命令 private void timer1_Tick(object sender, EventArgs e) { SendBuffer[0] = 0xaa; SendBuffer[1] = 0x55; SendBuffer[2] = 0x01; SendCnt = 3; } 现在测试一下是不是每隔1S发送一次数据 连接手机测试好现在显示温湿度看了看我的单片机程序 采集温湿度的命令是aa 55 01

优秀的个人博客,低调大师

8-51单片机ESP8266学习-AT指令(测试TCP服务器--51单片机程序配置8266,做自己的手机TCP客户端发信息给单片机控制小灯的...

http://www.cnblogs.com/yangfengwu/p/8776712.html 先把源码和资料链接放到这里 链接:https://pan.baidu.com/s/10MxI8-Q33-M_R2WEHqEi1A密码:j1sz 先做手机的,然后做C#的 详细点的可以看我这篇文章,请参考着这篇看这篇文章,这篇文章会解决一些细节问题 http://www.cnblogs.com/yangfengwu/p/5212570.html 咱们不做很复杂的直接越简单越好,就做成这样 先编译一下 不用管,后期的话咱会用一下 最后做成这样子 发现还是有点大.. 把像素低的放到像素高的里面图片显示出来会缩小,把像素高的放到像素低的里面图片显示出来会放大 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); imageViewLamp = (ImageView) findViewById(R.id.imageView1); switchLamp = (Switch) findViewById(R.id.switch1); switchLamp.setOnCheckedChangeListener(switchLamplistener);//设置SWITCH的状态改变事件 } private OnCheckedChangeListener switchLamplistener = new OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { // TODO Auto-generated method stub // Toast.makeText(getApplicationContext(), isChecked+"", 500).show(); if (isChecked) {//切换图片 imageViewLamp.setImageResource(R.drawable.ledon); } else { imageViewLamp.setImageResource(R.drawable.ledoff); } } }; 现在做点击连接按钮就连接服务器 刚看到............... 有点迫不及待的想试一试腾讯云了, 下面做的是:点击连接按钮,连接TCP服务器,连接上以后启动数据接收任务,因为数据接收任务可以判断是不是和服务器断开了连接 然后按钮显示"断开",如果意外断开了连接也显示断开.... public class MainActivity extends Activity { ImageView imageViewLamp;//灯的图片 Switch switchLamp;//灯的控制开关 EditText editTextIPAdress,editTextPort;//ip地址和端口号的编辑框 Button buttonConnect;//连接按钮 Socket socket;//cocket boolean ConnectFlage = false;//连接标志,控制按钮显示连接和断开 ThreadConnectService threadConnectService = new ThreadConnectService();//建立一个连接任务的变量 InputStream inputStream;//获取输入流,可以用来判断有没有断开连接 ThreadReadData threadReadData = new ThreadReadData();//接收数据的任务的变量 boolean threadReadDataFlage = false;//接收数据任务一直运行控制 byte[] ReadBuffer = new byte[1024];//存储接收到的数据 int ReadBufferLengh = 0;//接收到的数据个数 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); editTextIPAdress = (EditText) findViewById(R.id.editText1); editTextPort = (EditText) findViewById(R.id.editText2); buttonConnect = (Button) findViewById(R.id.button1); buttonConnect.setOnClickListener(buttonConnectClick); imageViewLamp = (ImageView) findViewById(R.id.imageView1); switchLamp = (Switch) findViewById(R.id.switch1); switchLamp.setOnCheckedChangeListener(switchLamplistener); } /*指示灯控制开关*/ private OnCheckedChangeListener switchLamplistener = new OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (isChecked) { imageViewLamp.setImageResource(R.drawable.ledon); } else { imageViewLamp.setImageResource(R.drawable.ledoff); } } }; /*按钮点击连接事件*/ private OnClickListener buttonConnectClick = new OnClickListener() { @Override public void onClick(View v) { if (ConnectFlage) { try { threadConnectService.start();//启动连接任务 } catch (Exception e) //预防任务还没关闭呢又点击开始 { threadConnectService.run(); } } else { ConnectFlage = true; buttonConnect.setText("连接"); try { socket.close();//关闭socket inputStream.close();//关闭数据流 } catch (Exception e) { // TODO: handle exception } } } }; /** * 连接服务器的任务 * @author yang * */ class ThreadConnectService extends Thread { public void run() { InetAddress ipAddress; try { ipAddress = InetAddress.getByName(editTextIPAdress.getText().toString());//获取IP地址 int port =Integer.valueOf(editTextPort.getText().toString());//获取端口号 socket = new Socket(ipAddress, port);//创建连接地址和端口 inputStream = socket.getInputStream();//获得通道的数据流变量 threadReadDataFlage = true;//一直接收数据 try { threadReadData.start(); } catch (Exception e) {//预防任务还没关闭呢又点击开始 threadReadData.run(); } runOnUiThread(new Runnable() {//修改界面的UI最好用Handle,这里力求简单,下几节再用 public void run() { ConnectFlage = false; buttonConnect.setText("断开"); Toast.makeText(getApplicationContext(), "连接成功", 500).show(); } }); } catch (Exception e) { e.printStackTrace(); } } } /** * 接收数据的任务 * @author yang * */ class ThreadReadData extends Thread { public void run() { while (threadReadDataFlage) { try { ReadBufferLengh = inputStream.read(ReadBuffer);//服务器断开会返回-1 if (ReadBufferLengh == -1) { threadReadDataFlage = false; runOnUiThread(new Runnable() {//修改界面的UI最好用Handle,这里力求简单,下几节再用 public void run() { ConnectFlage = true; buttonConnect.setText("连接"); Toast.makeText(getApplicationContext(), "与服务器断开连接", 500).show(); } }); } } catch (Exception e) { // TODO Auto-generated catch block Log.e("error", ReadBufferLengh+""); e.printStackTrace(); } } } } /** 当活动(界面)不再可见时调用 */ @Override protected void onStop() { threadReadDataFlage = false;//结束接收数据任务 super.onStop(); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } } 忘了说一件事情....加权限 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.yfw456.tcpclientdemo" android:versionCode="1" android:versionName="1.0" > <!-- 获取手机信息权限 --> <uses-permission android:name="android.permission.INTERNET"></uses-permission> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" ></uses-permission>" <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"></uses-permission> <uses-permission android:name="android.permission.CHANGE_CONFIGURATION" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <uses-permission android:name="android.permission.WAKE_LOCK"/> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/> <uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.WRITE_SETTINGS" /> <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"> </uses-permission> <uses-permission android:name="android.permission.RECEIVE_SMS"/> <uses-sdk android:minSdkVersion="17" android:targetSdkVersion="21" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > 我把上面做的打包了 好现在接着写发数据(控制灯的亮灭) public class MainActivity extends Activity { ImageView imageViewLamp;//灯的图片 Switch switchLamp;//灯的控制开关 EditText editTextIPAdress,editTextPort;//ip地址和端口号的编辑框 Button buttonConnect;//连接按钮 Socket socket;//cocket boolean ConnectFlage = true;//连接标志,控制按钮显示连接和断开 ThreadConnectService threadConnectService = new ThreadConnectService();//建立一个连接任务的变量 InputStream inputStream;//获取输入流,可以用来判断有没有断开连接 OutputStream outputStream;//获得输出流 ThreadReadData threadReadData = new ThreadReadData();//接收数据的任务 ThreadSendData threadSendData = new ThreadSendData();//发送数据的任务 boolean threadReadDataFlage = false;//接收数据任务一直运行控制 boolean threadSendDataFlage = false;//接收数据任务一直运行控制 byte[] ReadBuffer = new byte[1024];//存储接收到的数据 byte[] SendBuffer = new byte[1024];//存储发送的数据 int ReadBufferLengh = 0; int SendDataCnt = 0;//控制发送数据的个数 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); editTextIPAdress = (EditText) findViewById(R.id.editText1); editTextPort = (EditText) findViewById(R.id.editText2); buttonConnect = (Button) findViewById(R.id.button1); buttonConnect.setOnClickListener(buttonConnectClick); imageViewLamp = (ImageView) findViewById(R.id.imageView1); switchLamp = (Switch) findViewById(R.id.switch1); switchLamp.setOnCheckedChangeListener(switchLamplistener); } /*指示灯控制开关*/ private OnCheckedChangeListener switchLamplistener = new OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (isChecked) { imageViewLamp.setImageResource(R.drawable.ledon); SendBuffer[0] = (byte) 0xaa; SendBuffer[1] = 0x55; SendBuffer[2] = 0x02; SendBuffer[3] = (byte) 0xff; } else { imageViewLamp.setImageResource(R.drawable.ledoff); SendBuffer[0] = (byte) 0xaa; SendBuffer[1] = 0x55; SendBuffer[2] = 0x02; SendBuffer[3] = 0x00; } SendDataCnt = 4;//控制发送数据的个数 } }; /*按钮点击连接事件*/ private OnClickListener buttonConnectClick = new OnClickListener() { @Override public void onClick(View v) { if (ConnectFlage) { try { threadConnectService.start();//启动连接任务 } catch (Exception e) //预防任务还没关闭呢又点击开始 { threadConnectService.run(); } } else { ConnectFlage = true; threadSendDataFlage = false;//关掉发送任务,预防产生多的任务 threadReadDataFlage = false;//关掉接收任务,预防产生多的任务 buttonConnect.setText("连接"); try { socket.close();//关闭socket inputStream.close();//关闭数据流 } catch (Exception e) { // TODO: handle exception } } } }; /** * 连接服务器的任务 * @author yang * */ class ThreadConnectService extends Thread { public void run() { InetAddress ipAddress; try { ipAddress = InetAddress.getByName(editTextIPAdress.getText().toString());//获取IP地址 int port =Integer.valueOf(editTextPort.getText().toString());//获取端口号 socket = new Socket(ipAddress, port);//创建连接地址和端口 inputStream = socket.getInputStream();//获得通道的数据流 outputStream = socket.getOutputStream();//获得通道的输出流 threadReadDataFlage = true;//一直接收数据 threadSendDataFlage = true;//一直循环的判断是否发送数据 try { threadReadData.start(); } catch (Exception e) {//预防任务还没关闭呢又点击开始 threadReadData.run(); } try { threadSendData.start(); } catch (Exception e) { threadSendData.run(); } runOnUiThread(new Runnable() {//修改界面的UI最好用Handle,这里力求简单,下几节再用 public void run() { ConnectFlage = false; buttonConnect.setText("断开"); Toast.makeText(getApplicationContext(), "连接成功", 500).show(); } }); } catch (Exception e) { e.printStackTrace(); } } } /** * 接收数据的任务 * @author yang * */ class ThreadReadData extends Thread { public void run() { while (threadReadDataFlage) { try { ReadBufferLengh = inputStream.read(ReadBuffer);//服务器断开会返回-1 if (ReadBufferLengh == -1) { threadSendDataFlage = false;//关掉发送任务,预防产生多的任务 threadReadDataFlage = false;//关掉接收任务,预防产生多的任务 SendDataCnt = 0;//清零发送的个数 ConnectFlage = true; runOnUiThread(new Runnable() {//修改界面的UI最好用Handle,这里力求简单,下几节再用 public void run() { buttonConnect.setText("连接"); Toast.makeText(getApplicationContext(), "与服务器断开连接", 500).show(); } }); } } catch (Exception e) { // TODO Auto-generated catch block Log.e("error", ReadBufferLengh+""); e.printStackTrace(); runOnUiThread(new Runnable() {//修改界面的UI最好用Handle,这里力求简单,下几节再用 public void run() { buttonConnect.setText("连接"); Toast.makeText(getApplicationContext(), "与服务器断开连接", 500).show(); } }); ConnectFlage = true; threadSendDataFlage = false;//关掉发送任务,预防产生多的任务 threadReadDataFlage = false;//关掉接收任务,预防产生多的任务 SendDataCnt = 0;//清零发送的个数 } } } } /** * 发送数据任务 * @author yang * */ class ThreadSendData extends Thread { public void run() { while (threadSendDataFlage) { if (SendDataCnt>0) //要发送的数据个数大于0 { try { outputStream.write(SendBuffer,0,SendDataCnt);//发送数据 SendDataCnt = 0;//清零发送的个数 } catch (Exception e) { runOnUiThread(new Runnable() {//修改界面的UI最好用Handle,这里力求简单,下几节再用 public void run() { buttonConnect.setText("连接"); Toast.makeText(getApplicationContext(), "与服务器断开连接", 500).show(); } }); ConnectFlage = true; threadSendDataFlage = false;//关掉发送任务,预防产生多的任务 threadReadDataFlage = false;//关掉接收任务,预防产生多的任务 SendDataCnt = 0; } } } } } /** 当活动(界面)不再可见时调用 */ @Override protected void onStop() { threadReadDataFlage = false;//结束接收数据任务 threadSendDataFlage = false;//结束发送数据任务 SendDataCnt = 0; super.onStop(); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } } 发送数据是写在了一个任务里面 整体的源码 本来想这一节也写好C#的,不过感觉写的够多的了,所以C#的放到下一节 下一篇 http://www.cnblogs.com/yangfengwu/p/8785516.html

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册