(一)基于阿里云的MQTT遠(yuǎn)程控制(Android 連接MQTT服務(wù)器,ESP8266連接MQTT服務(wù)器實(shí)現(xiàn)遠(yuǎn)程通信控制----簡(jiǎn)單的連接通信)

如果不了解MQTT的可以看這篇文章http://www.cnblogs.com/yangfengwu/p/7764667.html

http://www.cnblogs.com/yangfengwu/p/8026014.html

關(guān)于錢(qián)的問(wèn)題,其實(shí)自己是花錢(qián)買(mǎi)的云服務(wù),雖然自己現(xiàn)在能支付的起,但是呢為了盡量減少支出,自已還有好多好多文章要寫(xiě),好多好多元器件要買(mǎi),所以哈會(huì)在自己的淘寶上賣(mài)源碼2元價(jià)格,一元捐出,一元自己留著當(dāng)親們支付云服務(wù)的費(fèi)用了

如果看不懂也沒(méi)關(guān)系,跟著做就可以了,做完以后您會(huì)發(fā)現(xiàn)原來(lái)MQTT這么好用,也如此簡(jiǎn)單.

對(duì)了我要盡量把程序?qū)懙臓€一些,界面做的爛一些,因?yàn)榧热皇菍W(xué)習(xí)用的應(yīng)該越直觀越好.......說(shuō)一下,自己的服務(wù)器因?yàn)楣_(kāi)了穩(wěn)定性上肯定不好,

數(shù)據(jù)沖突也是可能的,這是第一篇,下面幾篇慢慢的來(lái),咱一塊慢慢完善哈

實(shí)現(xiàn)的功能--手機(jī)和WIFI模塊都連接MQTT服務(wù)器,手機(jī)用按鈕實(shí)現(xiàn)遠(yuǎn)程控制一個(gè)繼電器,然后WIFI模塊采集的DHT11的溫濕度,遠(yuǎn)程發(fā)給手機(jī)

不過(guò)自己這批貼片的板子要等到后天才到..........................




先看一下Android 程序怎么寫(xiě),首先就是下載個(gè)MQTT的jar包

鏈接:https://pan.baidu.com/s/1bpjRzyB?密碼:90vv

新建一個(gè)Android 工程就不說(shuō)了吧...............

將下載的jar包放在一個(gè)地方



我放在了我的Android的源碼的根目錄

現(xiàn)在在Android 工程導(dǎo)入下載的那個(gè)jar包







現(xiàn)在把可能用到的一些權(quán)限加上?


? ? ? ? ? "? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?


現(xiàn)在呢先寫(xiě)個(gè)程序獲取手機(jī)的IMEI號(hào),因?yàn)檫B接的時(shí)候每一個(gè)客戶端的ClientID要求不能一樣,咱就用IMEI號(hào)代表ClientID

其實(shí)就這兩句

TelephonyManager mTm = (TelephonyManager)this.getSystemService(TELEPHONY_SERVICE);?

TelephonyIMEI = mTm.getDeviceId();


現(xiàn)在配置咱的MQTT


publicclass MainActivity extends Activity {


? ? String TelephonyIMEI="";


? ? privateMqttClient client;//clientprivateMqttConnectOptions options;//配置? ?

? ? @Override

? ? protectedvoid 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? */privatevoid MyMqttInit()

? ? {


? ? ? ? try? ? ? ? {

? ? ? ? ? ? //(1)主機(jī)地址(2)客戶端ID,一般以客戶端唯一標(biāo)識(shí)符(不能夠和其它客戶端重名)(3)最后一個(gè)參數(shù)是指數(shù)據(jù)保存在內(nèi)存(具體保存什么數(shù)據(jù),以后再說(shuō),其實(shí)現(xiàn)在我也不是很確定)client =newMqttClient("tcp://47.93.19.134:1883",TelephonyIMEI,new MemoryPersistence());

? ? ? ? } catch (MqttException e) {

? ? ? ? ? ? // TODO Auto-generated catch block? ? ? ? ? ? e.printStackTrace();

? ? ? ? }


? ? ? ? options =newMqttConnectOptions();//MQTT的連接設(shè)置? ? ? ?

? ? ? ? options.setCleanSession(true);//設(shè)置是否清空session,這里如果設(shè)置為false表示服務(wù)器會(huì)保留客戶端的連接記錄,這里設(shè)置為true表示每次連接到服務(wù)器都以新的身份連接? ? ? ?

? ? ? ? options.setUserName("username");//設(shè)置連接的用戶名(自己的服務(wù)器沒(méi)有設(shè)置用戶名)? ? ? ?

? ? ? ? options.setPassword("password".toCharArray());//設(shè)置連接的密碼(自己的服務(wù)器沒(méi)有設(shè)置密碼)? ? ? ?

? ? ? ? options.setConnectionTimeout(10);// 設(shè)置連接超時(shí)時(shí)間 單位為秒? ? ? ?

? ? ? ? options.setKeepAliveInterval(20);// 設(shè)置會(huì)話心跳時(shí)間 單位為秒 服務(wù)器會(huì)每隔1.5*20秒的時(shí)間向客戶端發(fā)送個(gè)消息判斷客戶端是否在線,但這個(gè)方法并沒(méi)有重連的機(jī)制? ? ? ?

? ? ? ? client.setCallback(new MqttCallback() {

? ? ? ? ? ? @Override//獲取的消息會(huì)執(zhí)行這里--arg0是主題,arg1是消息publicvoid messageArrived(String arg0, MqttMessage arg1) throws Exception {

? ? ? ? ? ? ? ? // TODO Auto-generated method stub? ? ? ? ? ? ? ?

? ? ? ? ? ? }


? ? ? ? ? ? @Override//訂閱主題后會(huì)執(zhí)行到這里publicvoid deliveryComplete(IMqttDeliveryToken arg0) {

? ? ? ? ? ? ? ? // TODO Auto-generated method stub? ? ? ? ? ? ? ?

? ? ? ? ? ? }


? ? ? ? ? ? @Override//連接丟失后,會(huì)執(zhí)行這里publicvoid connectionLost(Throwable arg0) {

? ? ? ? ? ? ? ? // TODO Auto-generated method stub? ? ? ? ? ? ? ?

? ? ? ? ? ? }

? ? ? ? });

? ? }


?現(xiàn)在連接咱的服務(wù)器,連接成功后打印一下連接成功,連接是阻塞的,所以放在一個(gè)任務(wù)里面執(zhí)行連接


publicclass MainActivity extends Activity {


? ? String TelephonyIMEI="";


? ? privateMqttClient client;//clientprivateMqttConnectOptions options;//配置MqttConnectThread mqttConnectThread =newMqttConnectThread();//連接服務(wù)器任務(wù)? ? @Override

? ? protectedvoid 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();//執(zhí)行連接服務(wù)器任務(wù)? ? }


? ? /*? 初始化配置Mqtt? */privatevoid MyMqttInit()

? ? {

? ? ? ? .........? ? }



? ? /*連接服務(wù)器任務(wù)*/class MqttConnectThread extends Thread

? ? {

? ? ? ? publicvoid run()

? ? ? ? {

? ? ? ? ? ? try

? ? ? ? ? ? {

? ? ? ? ? ? ? ? client.connect(options);//連接服務(wù)器,連接不上會(huì)阻塞在這runOnUiThread(newRunnable() {//publicvoid run() {

? ? ? ? ? ? ? ? ? ? ? ? Toast.makeText(getApplicationContext(), "連接成功",500).show();

? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? });

? ? ? ? ? ? }

? ? ? ? ? ? catch (MqttSecurityException e)

? ? ? ? ? ? {

? ? ? ? ? ? ? ? //安全問(wèn)題連接失敗? ? ? ? ? ? }

? ? ? ? ? ? catch (MqttException e)

? ? ? ? ? ? {

? ? ? ? ? ? ? ? //連接失敗原因? ? ? ? ? ? }

? ? ? ? }

? ? }


?現(xiàn)在下載到手機(jī)試一試


現(xiàn)在呢測(cè)試一下通信,測(cè)試接收消息,用調(diào)試助手發(fā)信息,然后手機(jī)端接收,然后顯示出來(lái)

?調(diào)試助手鏈接

鏈接:https://pan.baidu.com/s/1qYxEeLI?密碼:exfj


?現(xiàn)在先設(shè)置一下APP的訂閱的主題,和接收到消息之后就顯示出來(lái)


publicclass MainActivity extends Activity {


? ? String TelephonyIMEI="";


? ? privateMqttClient client;//clientprivateMqttConnectOptions options;//配置MqttConnectThread mqttConnectThread =newMqttConnectThread();//連接服務(wù)器任務(wù)? ? @Override

? ? protectedvoid 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();//執(zhí)行連接服務(wù)器任務(wù)? ? }


? ? /*? 初始化配置Mqtt? */privatevoid MyMqttInit()

? ? {


? ? ? ? try? ? ? ? {

? ? ? ? ? ? //(1)主機(jī)地址(2)客戶端ID,一般以客戶端唯一標(biāo)識(shí)符(不能夠和其它客戶端重名)(3)最后一個(gè)參數(shù)是指數(shù)據(jù)保存在內(nèi)存(具體保存什么數(shù)據(jù),以后再說(shuō),其實(shí)現(xiàn)在我也不是很確定)client =newMqttClient("tcp://47.93.19.134:1883",TelephonyIMEI,new MemoryPersistence());

? ? ? ? } catch (MqttException e) {

? ? ? ? ? ? // TODO Auto-generated catch block? ? ? ? ? ? e.printStackTrace();

? ? ? ? }


? ? ? ? options =newMqttConnectOptions();//MQTT的連接設(shè)置? ? ? ?

? ? ? ? options.setCleanSession(true);//設(shè)置是否清空session,這里如果設(shè)置為false表示服務(wù)器會(huì)保留客戶端的連接記錄,這里設(shè)置為true表示每次連接到服務(wù)器都以新的身份連接? ? ? ?

? ? ? ? options.setUserName("username");//設(shè)置連接的用戶名(自己的服務(wù)器沒(méi)有設(shè)置用戶名)? ? ? ?

? ? ? ? options.setPassword("password".toCharArray());//設(shè)置連接的密碼(自己的服務(wù)器沒(méi)有設(shè)置密碼)? ? ? ?

? ? ? ? options.setConnectionTimeout(10);// 設(shè)置連接超時(shí)時(shí)間 單位為秒? ? ? ?

? ? ? ? options.setKeepAliveInterval(20);// 設(shè)置會(huì)話心跳時(shí)間 單位為秒 服務(wù)器會(huì)每隔1.5*20秒的時(shí)間向客戶端發(fā)送個(gè)消息判斷客戶端是否在線,但這個(gè)方法并沒(méi)有重連的機(jī)制? ? ? ?

? ? ? ? client.setCallback(new MqttCallback() {

? ? ? ? ? ? @Override//獲取消息會(huì)執(zhí)行這里--arg0是主題,arg1是消息publicvoid messageArrived(String arg0, MqttMessage arg1) throws Exception {

? ? ? ? ? ? ? ? // TODO Auto-generated method stubfinal String topic = arg0;//主題final String msgString = arg1.toString();//消息? ? ? ? ? ? ? ?

? ? ? ? ? ? ? ? runOnUiThread(newRunnable() {//publicvoid run() {

? ? ? ? ? ? ? ? ? ? ? ? Toast.makeText(getApplicationContext(),"主題:"+topic+"消息:"+msgString,500).show();

? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? });

? ? ? ? ? ? }


? ? ? ? ? ? @Override//訂閱主題后會(huì)執(zhí)行到這里publicvoid deliveryComplete(IMqttDeliveryToken arg0) {

? ? ? ? ? ? ? ? // TODO Auto-generated method stub? ? ? ? ? ? ? ?

? ? ? ? ? ? }


? ? ? ? ? ? @Override//連接丟失后,會(huì)執(zhí)行這里publicvoid connectionLost(Throwable arg0) {

? ? ? ? ? ? ? ? // TODO Auto-generated method stub? ? ? ? ? ? ? ?

? ? ? ? ? ? }

? ? ? ? });

? ? }



? ? /*連接服務(wù)器任務(wù)*/class MqttConnectThread extends Thread

? ? {

? ? ? ? publicvoid run()

? ? ? ? {

? ? ? ? ? ? try

? ? ? ? ? ? {

? ? ? ? ? ? ? ? client.connect(options);//連接服務(wù)器,連接不上會(huì)阻塞在這? ? ? ? ? ? ? ?

? ? ? ? ? ? ? ? client.subscribe("test",0);//設(shè)置(訂閱)接收的主題,主題的級(jí)別是0? ? ? ? ? ? ? ?

? ? ? ? ? ? ? ? runOnUiThread(newRunnable() {//publicvoid run() {

? ? ? ? ? ? ? ? ? ? ? ? Toast.makeText(getApplicationContext(), "連接成功",500).show();

? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? });

? ? ? ? ? ? }

? ? ? ? ? ? catch (MqttSecurityException e)

? ? ? ? ? ? {

? ? ? ? ? ? ? ? //安全問(wèn)題連接失敗? ? ? ? ? ? }

? ? ? ? ? ? catch (MqttException e)

? ? ? ? ? ? {

? ? ? ? ? ? ? ? //連接失敗原因? ? ? ? ? ? }

? ? ? ? }

? ? }

下載到手機(jī)?


?現(xiàn)在配置一下軟件,對(duì)了有些參數(shù)現(xiàn)在不明白沒(méi)關(guān)系,后面會(huì)介紹一下相關(guān)的知識(shí),

軟件的主題名稱要和APP中訂閱的主題一樣 都是 test

現(xiàn)在連接


?現(xiàn)在點(diǎn)擊發(fā)布消息


看手機(jī)端


說(shuō)明已經(jīng)能通信了

現(xiàn)在說(shuō)一下關(guān)于主題哈,關(guān)于/

現(xiàn)在把手機(jī)端的訂閱的主題改為"/#"


然后下載到手機(jī)

你會(huì)發(fā)現(xiàn)手機(jī)也能接收消息

手機(jī)都能接收到消息

#是一個(gè)匹配主題中任意層次數(shù)的通配符。比如說(shuō),如果你訂閱了test/device/#,你就可以接收到以下這些主題的消息。

test/device

test/device/后面隨便是什么

咱們的設(shè)備可以用"/"來(lái)進(jìn)行分類,咱們的APP呢可以指定接收哪一類的產(chǎn)品的數(shù)據(jù)"XXXX/#"....是不是很方便

對(duì)了如果現(xiàn)在接收兩個(gè)已知主題的設(shè)備

假如說(shuō)是

第一種方式



第二種方式

結(jié)果和上面一樣


?現(xiàn)在呢在界面加一個(gè)按鈕,按下發(fā)送消息"1",松開(kāi)發(fā)送消息"0"

然后設(shè)置發(fā)布的主題是"/test/button"




publicclass MainActivity extends Activity {


? ? String TelephonyIMEI="";


? ? privateMqttClient client;//clientprivateMqttConnectOptions options;//配置MqttConnectThread mqttConnectThread =newMqttConnectThread();//連接服務(wù)器任務(wù)? ?

? ? Button button;//發(fā)送消息按鈕? ? @Override

? ? protectedvoid onCreate(Bundle savedInstanceState) {

? ? ? ? super.onCreate(savedInstanceState);

? ? ? ? setContentView(R.layout.activity_main);


? ? ? ? button = (Button) findViewById(R.id.button1);//獲取發(fā)送消息按鈕button.setOnTouchListener(buttonTouch);//設(shè)置按鈕的觸摸事件? ? ? ?

? ? ? ? TelephonyManager mTm = (TelephonyManager)this.getSystemService(TELEPHONY_SERVICE);?

? ? ? ? TelephonyIMEI = mTm.getDeviceId();

? ? ? ? //Toast.makeText(getApplicationContext(), TelephonyIMEI, 500).show();MyMqttInit();//初始化配置MQTT客戶端mqttConnectThread.start();//執(zhí)行連接服務(wù)器任務(wù)? ? }


? ? /*按鈕觸摸事件*/privateOnTouchListener buttonTouch =new OnTouchListener() {


? ? ? ? @Override

? ? ? ? publicboolean onTouch(View v, MotionEventevent)

? ? ? ? {

? ? ? ? ? ? MqttMessage msgMessage =null;//Mqtt消息變量if(event.getAction() == MotionEvent.ACTION_DOWN)//按下? ? ? ? ? ? {

? ? ? ? ? ? ? ? msgMessage =newMqttMessage("1".getBytes());

? ? ? ? ? ? }

? ? ? ? ? ? elseif(event.getAction() == MotionEvent.ACTION_UP)//松開(kāi)? ? ? ? ? ? {

? ? ? ? ? ? ? ? msgMessage =newMqttMessage("0".getBytes());

? ? ? ? ? ? }


? ? ? ? ? ? try

? ? ? ? ? ? {

? ? ? ? ? ? ? ? client.publish("/test/button",msgMessage);//發(fā)送主題為"/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) {

? ? ? ? ? ? ? ? //其余的狀態(tài)msgMessage = null;所以加了這個(gè)catch (Exception e)? ? ? ? ? ? }



? ? ? ? ? ? returnfalse;

? ? ? ? }

? ? };


現(xiàn)在下載到手機(jī),

調(diào)試助手訂閱一下主題?"/test/button"


?動(dòng)作一下按鈕



現(xiàn)在把發(fā)過(guò)來(lái)的數(shù)據(jù)用文本框顯示,不讓他提示了

? ? ?接收顯示的換一下



runOnUiThread(newRunnable() {//因?yàn)椴僮鞯氖侵鹘缑娴目丶杂盟⑿耈I的線程,最好用handle哈,我這里怎么簡(jiǎn)單怎么寫(xiě)publicvoid run() {

? ? ? ? ? ? ? ? ? ? ? ? //Toast.makeText(getApplicationContext(),"主題:"+topic+"消息:"+msgString, 500).show();textView.setText("主題:"+topic+"\n消息:"+msgString);

? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? });


現(xiàn)在試一下




好了,現(xiàn)在咱開(kāi)始控制咱的WIFI模塊了....用咱的手機(jī)控制WIFI板子上的繼電器,WIFI模塊呢采集溫濕度,然后顯示在手機(jī)的文本框中

自己更傾向于用lua開(kāi)發(fā),所以要刷入lua的固件哈

關(guān)于刷固件可以參考

http://www.cnblogs.com/yangfengwu/p/7514336.html

自己已經(jīng)下載好的固件

鏈接: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)

? ? ifstring.find(data,"1") ~= nil then

? ? ? ? gpio.write(RelayPin,1)

? ? end

? ? ifstring.find(data,"0") ~= nil then

? ? ? ? gpio.write(RelayPin,0)

? ? end


end)--[[The Send Msg]]

tmr.alarm(1,1000,1, function()

? ? ifmqttClient ~= 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? ? ? ? ? ? ? ?

? ? ifstatus == dht.OK or status == dht.ERROR_CHECKSUM then

? ? ? ? Temperature = temp;

? ? ? ? Humidity = humi;

? ? ? ? --print("DHT Temperature:"..temp..";".."Humidity:"..humi)

? ? end

end)

printip =0wifi.eventmon.register(wifi.eventmon.STA_DISCONNECTED, function(T)

? ? printip =0end)

wifi.eventmon.register(wifi.eventmon.STA_GOT_IP, function(T)

? ifprintip ==0 then

? ? ? ip,netmask,gateway = wifi.sta.getip()

? ? ? print(gateway)

? end

? printip =1end)


現(xiàn)在說(shuō)一下個(gè)個(gè)部分的功能,對(duì)了關(guān)于語(yǔ)法問(wèn)題和其余的問(wèn)題就請(qǐng)大家參考我的,其實(shí)上面的代碼就是參考的官方給的API函數(shù),

我希望親們最重要的是有自學(xué)的能力,而不是需要?jiǎng)e人灌輸東西的機(jī)器.




?好了親們可以自己去測(cè)試了

源碼鏈接

https://item.taobao.com/item.htm?spm=a1z38n.10677092.0.0.7a8f8764Ey3xGc&id=563674399702

wifi的就是上面的,直接復(fù)制粘貼過(guò)去就好啦

APP源碼鏈接:https://pan.baidu.com/s/1pLKGLrt

自己淘寶店的鏈接呢在最上面

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 前言 MQTT是IBM開(kāi)發(fā)的一個(gè)即時(shí)通訊協(xié)議,面向M2M和物聯(lián)網(wǎng)的連接,采用輕量級(jí)發(fā)布和訂閱消息傳輸機(jī)制,并且有可...
    閼男秀閱讀 10,435評(píng)論 8 46
  • 整體思路ESP8266作為T(mén)CP服務(wù)器,,手機(jī)作為T(mén)CP客戶端,自己使用Lua直接做到了芯片里面,省了單片機(jī),,節(jié)...
    楊奉武閱讀 6,087評(píng)論 0 5
  • 好久沒(méi)有寫(xiě)博客了,眼看自己的項(xiàng)目就要快做完了,先分享一下基于MQTT的遠(yuǎn)程控制,自己買(mǎi)了一個(gè)阿里的云端,然后在云端...
    楊奉武閱讀 4,568評(píng)論 0 0
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,695評(píng)論 19 139
  • 生活中總有那么些乖巧、懂事,不讓人操心的女孩,她們就是小時(shí)候父母嘴中“別人家的孩子”。 乖巧的女孩在別人眼中有很多...
    敘情軒晚霞閱讀 635評(píng)論 0 1

友情鏈接更多精彩內(nèi)容