第一 、先上效果圖 c51程序在第四步,app程序在第五步

第二、原理講解
原理簡(jiǎn)述:利用發(fā)布訂閱模式。第一步,先STC89c51獲取各種傳感器數(shù)值,第二步,新建主題,然后c51往這個(gè)主題發(fā)送消息,第三步。app inventor 訂閱這個(gè)主題,因?yàn)閍pp inventor 制作的app 訂閱了這個(gè)主題,就可以收到來自這個(gè)主題的消息,也就是可以收到各種傳感器數(shù)值。 關(guān)于發(fā)布訂閱: 訂閱(訂閱):訂閱給定的一個(gè)主題。 發(fā)布(發(fā)布)將信息發(fā)送到指定的主題。 只有訂閱該主題的設(shè)備才可以收到發(fā)往該主題的消息。 通俗的來講:就是像博客訂閱的場(chǎng)景,什么意思呢,也就是說100個(gè)人訂閱了你的博客,如果博主發(fā)表了文章,那么100個(gè)人就會(huì)同時(shí)收到通知郵件,訂閱/發(fā)布模式就是這樣的原理。
如果還不理解的話再通俗講一下,就像生活中聽收音機(jī),要想聽收音機(jī),肯定就是調(diào)頻啦,只有在正確的頻道上面,我們才能聽得到好聽的節(jié)目,所以說訂閱首先要訂閱一個(gè)頻道/主題,只有訂閱了該主題,我們才能收到發(fā)往該頻道/主題的消息。 在本例程中,c51借助ESP8266推送消息,app訂閱主題,就可以實(shí)時(shí)接收c51發(fā)來的消息了。 第三、c51讀取各種傳感器數(shù)值 由于大家的傳感器不一樣,這里就不統(tǒng)一做例程了,在程序里直接使用了虛擬數(shù)值,大家知道就好。
- <font face="Microsoft YaHei, SF Pro Display, Roboto, Noto, Arial, PingFang SC, sans-serif"><font color="#4d4d4d"> char data1[] = "32"; ////為了演示定義的模擬數(shù)據(jù),可根據(jù)自己傳感器自行采集數(shù)據(jù)
- char data2[] = "27.8"; //
- char data3[] = "45";
- char data4[] = "26";
- char data5[] = "99.12";
- char data6[] = "ON";
- </font></font>
復(fù)制代碼
第四、傳感器數(shù)據(jù)推送到云端 c51示例程序下載:http://cloud.bemfa點(diǎn)com/zip/c51_bemfa_cloud.zip 程序說明,波特率9600,晶振11.0592 由于ESP8266-01默認(rèn)波特率是115200,需要先手動(dòng)調(diào)節(jié)esp8266-01的波特率。 調(diào)整方法:ESP8266-01連接到usb轉(zhuǎn)ttl 五根線 esp8266---------UsbTTL tx----------rx rx----------tx vcc-------3.3v gnd--------gnd en----------3.3v
打開串口調(diào)試助手,設(shè)置波特率115200,找到esp8266的com口并打開,發(fā) - <font face="Microsoft YaHei, SF Pro Display, Roboto, Noto, Arial, PingFang SC, sans-serif"><font color="#4d4d4d">AT+UART=9600,8,1,0,0
- </font></font>
復(fù)制代碼
末尾應(yīng)該加上回車換行,串口會(huì)回復(fù)ok

串口調(diào)試助手下載工具:https://www.lanzous點(diǎn)com/iax97ih 密碼:1234 如果上一步傳感器數(shù)據(jù)可以成功讀取,那么就可以在上版的基礎(chǔ)上,把數(shù)據(jù)上傳到云端。 用keil 打開程序,需要修改WIFI等信息
- <font color="rgb(77, 77, 77)"><font face="""><font style="font-size: 16px">#define Ssid "newhtc" //WIFI名稱,,修改為自己路由器的WIFI名稱,好像不支持中文
- #define PassWord "qq123456" //WIFI密碼,修改為自己路由器的
- #define Uid "4d9ec352e0376f2110a0c601a2857225" //巴法云UID密鑰,控制臺(tái)獲取
- #define Topic "mytemp" //巴法云控制臺(tái)創(chuàng)建,名稱自定義,app訂閱主題要和這個(gè)推送主題一致
- </font></font></font>
復(fù)制代碼
在巴法創(chuàng)客云控制臺(tái) 新建一個(gè)主題,主題名字隨意,例如mytemp,本實(shí)例用用mytemp,使用示例代碼時(shí)應(yīng)修改為自己的主題名字,字母或數(shù)字或字母加數(shù)字組合。UID為用戶私鑰,在 巴法創(chuàng)客云控制臺(tái) 注冊(cè)登陸后可獲得。 登陸完成后,可在控制臺(tái)看到自己的私鑰UID,如圖所示: 
創(chuàng)建主題,在控制臺(tái),可創(chuàng)建主題。 第一輸入主題,字母或數(shù)字或字母+數(shù)字組合。 
WIFI名稱為自己的路由器WIFI名稱,區(qū)分大小寫,寫錯(cuò)會(huì)導(dǎo)致連接不上網(wǎng)絡(luò)的
- <font color="rgb(77, 77, 77)"><font face="""><font style="font-size: 16px">void POST(void)//POST數(shù)據(jù)函數(shù)
- {
- int dataLen;
- uchar postData[150];
- char strLen[3];
-
- char data1[] = "32"; ////為了演示定義的模擬數(shù)據(jù),可根據(jù)自己傳感器自行采集數(shù)據(jù)
- char data2[] = "27.8"; //
- char data3[] = "45";
- char data4[] = "26";
- char data5[] = "99.12";
- char data6[] = "ON";
-
- //通過&符號(hào)整合需要post的數(shù)據(jù)。傳感器數(shù)據(jù)用#分開,以便app進(jìn)行數(shù)據(jù)分割
- //自己要知道每個(gè)數(shù)據(jù)代表的意思,一會(huì)app端會(huì)按排列分割提取數(shù)值
- sprintf(postData,"uid=%s&topic=%s&msg=#%s#%s#%s#%s#%s#%s#\r\n",Uid,Topic,data1,data2,data3,data4,data5,data6);
- dataLen = strlen(postData); //計(jì)算數(shù)據(jù)長(zhǎng)度
- sprintf(strLen,"%d",dataLen); //int類型轉(zhuǎn)char
- ESP8266_Set("AT+CIPMODE=1"); //開啟透明傳輸模式
- ms_delay(1000);
- ESP8266_Set("AT+CIPSTART=\"TCP\",\"api.bemfa.com\",80"); // 連接服務(wù)器和端口
- ms_delay(1000);
- ESP8266_Set("AT+CIPSEND"); //進(jìn)入透?jìng)髂J,下面發(fā)的都會(huì)無條件傳輸
- ms_delay(1000);
- ESP8266_Set_Only("POST /api/device/v1/data/1/ HTTP/1.1\r\nHost: api.bemfa.com\r\nContent-Type: application/x-www-form-urlencoded\r\nConnection:close\r\nContent-Length:");//ţքdeviceۅ ţքsensorۅ
- ESP8266_Set(strLen);//數(shù)據(jù)長(zhǎng)度(postData數(shù)據(jù)長(zhǎng)度),一定要準(zhǔn)確
- ESP8266_Set("");//回車(發(fā)完數(shù)據(jù)長(zhǎng)度后,有回車,不懂的百度http post 格式)
- ESP8266_Set(postData);//發(fā)送數(shù)據(jù)
- ms_delay(2000);
- ESP8266_Set("+++"); //
- memset(strLen,'\0',3); //重置數(shù)組
- memset(strLen,'\0',sizeof postData);//重置數(shù)組
- }
- </font></font></font>
復(fù)制代碼
利用HTTP POST形式,往服務(wù)器進(jìn)行消息推送,具體接口可參考:巴法云官方文檔
第四 下載程序到STC89c51即可 下載工具STC-ISP:下載:https://www.lanzous點(diǎn)com/iaxa4fc 密碼:1234
STC89c51/52和ESP8266接線問題 c51 ----------8266 P30----------TX P31----------RX 3.3v-----------3.3v Gnd---------Gnd 3.3v-----------EN 試了8266直接接5v也工作,不過不建議使用
如果路由器有網(wǎng)絡(luò)的話,數(shù)據(jù)會(huì)自動(dòng)上傳,可在巴法創(chuàng)客云控制臺(tái) 刷新網(wǎng)頁(yè),即可看到上傳的數(shù)據(jù)。如下圖所示:  第五 app inventor 制作app 接收實(shí)時(shí)數(shù)據(jù)在appInventor 點(diǎn)擊跳轉(zhuǎn)國(guó)內(nèi)站創(chuàng)建賬號(hào),并登陸。 本操作只提供一個(gè)app的demo,界面過于丑陋,大家可自由發(fā)揮更改界面。 app inventor 程序下載:http://cloud.bemfa點(diǎn)com/zip/aia/aiadata.zip 頂部導(dǎo)航欄,依次點(diǎn)擊(項(xiàng)目-->導(dǎo)入項(xiàng)目aia),選擇上一步驟下載的aia文件導(dǎo)入即可。點(diǎn)擊導(dǎo)入的項(xiàng)目,即可看到控制面板,面板主要分為在組建設(shè)計(jì)和邏輯設(shè)計(jì),用戶可在右上角進(jìn)行模式切換。 (組建設(shè)計(jì))面板可以向屏幕添加組建以進(jìn)行二次開發(fā)。(邏輯面板)則進(jìn)行相關(guān)邏輯編寫。 
導(dǎo)入aia文件后,如果只是簡(jiǎn)單使用,只需要修改兩個(gè)地方,一個(gè)是主題名字,一個(gè)是UID,均需開發(fā)者置換成自己的topic(主題名字)和UID(用戶私鑰),均可在創(chuàng)客云控制臺(tái)獲取點(diǎn)擊跳轉(zhuǎn)。此處的主題topic應(yīng)該和ESP8266程序里面設(shè)定的主題修改為一樣,不然會(huì)收不到消息。UID修改為自己的私鑰。 界面還有功能之類的自己可以隨意加,更改好,下載apk文件即可。 關(guān)鍵程序講解程序下載,修改關(guān)鍵參數(shù)后就可直接使用的,以下是關(guān)鍵程序講解: 接收到帶傳感器的數(shù)據(jù)后,依照#號(hào)對(duì)字符串進(jìn)行分割,有幾個(gè)數(shù)值,就分割幾次,自己要記住第幾個(gè)數(shù)值代表哪種傳感器就行了,比如要記住data1是溫度,data2是濕度等等,這里的分割次數(shù)需要和上傳的數(shù)據(jù)個(gè)數(shù)相等,有6個(gè)數(shù)值,就分割6次,7個(gè)數(shù)值就分割7次,就是依次增加或者減少就行。 當(dāng)屏幕初始化時(shí),會(huì)先訂閱主題,只有訂閱了這個(gè)主題,就可以實(shí)時(shí)收到發(fā)到該主題的消息,cmd=1是訂閱指令,就是訂閱主題的意思;cmd=9是遺囑指令,就是獲取服務(wù)器保存的數(shù)值,關(guān)于具體指令格式,可以在接入文檔了解:接入文檔 第六 效果展示app可實(shí)時(shí)展示當(dāng)前各種傳感器信息,可做遠(yuǎn)程監(jiān)控,手機(jī)只要有網(wǎng)絡(luò)就可以收到數(shù)據(jù)信息。不管是2G 3G 4G WIFI都行
|