微信硬件平台
本文目的,使用微信公眾號控制ESP8266的LED開和關。進一步使用微信當遙控器(避免寫APP或者IOS或者小程序),控制一切設備。給兩個關鍵的總教程參考。
作為個人DIY開始使用者可入門,作為商用需要開發更多的東西才能使用。
官方產品視頻 https://v.qq.com/x/page/j0170txx5eb.html
目前整體測試效果
打開微信,關注自己的公眾號
功能結構圖
1 公眾號注冊
1.申請認證公眾號&開通設備功能 1.1公眾號申請: https://mp.weixin.qq.com
個人訂閱號
功能有限,不能有設備管理模塊功能,本教程系列使用的是訂閱號,做一個測試足夠了。
企業服務號
注冊必須要有公司信息,法人等組織代碼,個人用不了。 某寶上可以買個臨時用下測試。
可以擁有設備管理功能,簡單來說可以生產100個設備(例如大氣傳感器),每個用戶可以對應自己的設備
2 自己的服務器搭建
2-0購買新服務器
服務器選擇有很多,國內的騰訊雲、阿里雲、百度雲,美團雲、美橙雲等等,阿里雲算是國內一家獨大的了,但都價格較貴吧。
國外比較推薦的有:
- Vultr 1核1G內存1T流量 $5/月,(也有2.5$的套餐,但是沒貨買不到),新人注冊使用Paypal充值10刀送25刀,真的很優惠。。。
- BandwagonHost(搬瓦工VPS) 1核512M內存500G流量$19.9/年,良心價,我要買的時候沒貨。。。
- DigitalOcean 和vultr差不多的價格。
更多對比請看知乎
我最后選擇了Vultr,東京機房,Centos7,速度方面可以訪問一下我博客感受下,具體購買流程請看:vultr中文網
購買前先注冊一個PayPal賬戶,綁定銀行卡充值10$,就可以領取25$的優惠了(有些銀行需要信用卡,有些不用,我最后用建設銀行的借記卡可以)。
2-1服務器搭建
第一種方案 阿里雲服務器搭建
必須報備后才能使用80端口網頁服務功能,其實報備也很快,但是嫌麻煩沒使用。
第二種方案
找個外國的服務器,沒有報備的限制。
本教程使用的外網服務器
自己買一個。
這里教程是centos6系統鏡像
2-2 開放服務器端口
和微信服務器交互,我們需要80或443端口,服務器端口默認需要開啟,才能被外界訪問。
第一層,登陸網頁服務器管理界面添加安全組
阿里雲如何添加安全組開放端口
參考教程 自己搜
本教程使用的vultr外網服務器如何開啟端口
參考教程 騰訊雲服務器遷移到Vultr
- Vultr的vps其實需要更改兩處地方,相當於雙層防護。
- 一是Vultr官網控制台的防火牆策略組,默認阻止所有訪問。
- 二是系統內默認安裝的firewall。
- 需要配置好這兩處地方,才能開放端口讓你的網站可以被訪問。我這里將要開啟的是80端口提供Web服務,22端口ssh遠程訪問。
點擊Add Firewall Group,需要給個描述,隨便就好,在IPv4的標簽下添加80和22的規則。
IPV6的模塊可以先不管,然后在Linked Instances中綁定當前的vps。
至此,vps已開啟80端口,22端口也是必須的(shell遠程登錄)。
按照這個教程我無法修改防火牆開啟端口,估計是系統版本不一樣。就采用了下面暴力的辦法。
第二層 ,系統(centos6)本身的防火牆開啟端口(測試階段粗暴地關了防火牆)
打開防火牆:service iptables start
關閉防火牆:service iptables stop
查看防火牆狀態:service iptables status
(重啟后還得關一次防火牆???)
永久開啟防火牆: chkconfig iptables on
永久關閉防火牆:chkconfig iptables off
查看狀態:chkconfig --list iptables
登錄服務器
3 搭建Web服務器(apache + php + mysql)
centos6系統下,搭建Web服務器(apache + php + mysql)
安裝apache
安裝yum install httpd
啟動service httpd start
暫停service httpd stop
重啟service httpd restart
檢查開機啟動情況chkconfig --list httpd
默認情況下是全部關閉的,盡量設置開機啟動,以防主機意外關機
設置開機啟動命令chkconfig httpd on
再次檢查啟動情況,看到2,3,4,5為啟動
關閉開機啟動命令chkconfig httpd off
到此Apache安裝完成,在自己瀏覽器中輸入主機IP和端口號能正常打開
(不能打開重啟下服務器)
Apache的默認網站根目錄
/var/www/html
配置文件路徑
/etc/httpd/conf/httpd.conf
安裝php
yum install php yum install php-mysql php-gd php-imap php-ldap php-odbc php-pear php-xml php-xmlrpc yum install php-mysql
以上命令為安裝php及其支持的組件
測試是否安裝成功
在這個文件夾下,創建一個info.php文件
vi /var/www/html/info.php
(不喜歡vi命令編輯的,可以把文件拖到windos上修改,后再復制過去)

<html> <body> <h1>It's work!</h1> <?php echo 'HELLO WORLD'; phpinfo(); ?> </body> </html>
重啟Apache服務器
在瀏覽器地址欄訪問:http://自己的服務器IP/info.php

安裝mysql
安裝
首先查看主機是否已經安裝
rpm -qa|grep mysql
注意:可能檢查中安裝有php-mysql XXXXX 和 mysql-libXXXX,這是剛剛第二步安裝的php的組件,不必理會
已經安裝的話就執行刪除命令
yum remove mysql
rm -f /etc/my.cnf
然后繼續安裝
使用命令
yum list | grep mysql
來查看yum上提供的mysql數據庫可下載的版本
安裝命令
yum install -y mysql-server mysql mysql-devel
等待一段時間安裝成功
配置
接下來是對mysql的配置(注意:命令中是”mysqld”,不是mysql)
初始化:
service mysqld start
重啟:
service mysqld restart
配置開機自動啟動:
chkconfig mysqld on
為mysql的root賬戶設置密碼:
mysqladmin -u root password '*********'
改密碼后要重啟Mysql服務器
登錄命令
mysql -u root -p
配置Apache使其支持PHP
教程 https://blog.csdn.net/qq_25371579/article/details/78476186
需要在httpd.conf中添加以下代碼,修改后重啟Apache服務
把這個文件拖到windons上,修改
添加
LoadModule php5_module modules/libphp5.so AddType application/x-httpd-php .php AddType application/x-httpd-php-source .phps
然后文件重新復制回去,修改后重啟Apache服務
裝MySql圖形管理界面phpMyAdmin
從官網上下載下來(注意版本號,看是否支持本機的MySql和PHP),直接放在網站根目錄下,在瀏覽器中輸入相應的地址就可以訪問,登陸后即可管理
https://blog.csdn.net/programmer_wei/article/details/45888835
- #安裝phpmyadmin
- yum -y install phpmyadmin
- yum install php-mcrypt
phpmyadmin默認只能使用http://localhost/phpmyadmin來訪問,可以修改/etc/httpd/conf.d/phpmyadmin.conf中對應部分為
- <Directory "/usr/share/phpmyadmin">
- Order Deny,Allow
- # Deny from all
- Allow from All
- </Directory>
phpMyAdmin 的默認安裝目錄是 /usr/share/phpMyAdmin
,同時會在 Apache 的配置文件目錄中自動創建虛擬主機配置文件 /etc/httpd/conf.d/phpMyAdmin.conf
(區分大小寫)。
vi /etc/httpd/conf.d/phpmyadmin.conf
#Alias /phpMyAdmin /usr/share/phpMyAdmin #Alias /phpmyadmin /usr/share/phpMyAdmin
里面的
Require ip 127.0.0.1 Require ip ::1
改成
Require all granted
為該目錄創建符號連接到 phpMyAdmin 安裝目錄(/usr/share/phpMyAdmin
):
ln -sf /usr/share/phpMyAdmin /var/www/html/phpmyadmin
[root@localhost ~]# service httpd restart
測試,在網頁里輸入自己的服務器的IP,自動跳轉php測試樣例
http://localhost/phpmyadmin
至此網頁服務器搭建完畢
4 配置微信SDK
1下載SDK
鏈接:https://pan.baidu.com/s/1YKzOOqNxUyGiso4SlyAc5g
提取碼:tn4x
2 將SDK放在服務器下
注意路徑,后面配置微信公眾號需要用到,不能出錯。
/var/www/html/WeChat
5 配置微信公眾號
5-1 個人申請訂閱號做的測試
公眾號申請: https://mp.weixin.qq.com
訂閱號是不用交錢的,就目前我們控制LED訂閱號是足夠了的
訂閱號公眾號設置
公眾號申請好之后登陸,然后進行開發者設置。
說明:
服務器路徑一定要填寫對,是微信SDK文件下的的index.php
/var/www/html/WeChat
對應填寫 : 服務器IP+/WeChat/index.php
不是/var/www/html/下面的index.php(安裝網頁服務器的測試網頁)
根據實際的sdk路徑填寫地址。
看上圖填寫完成之后就點擊提交,不出意外就顯示提交成功。成功后如上圖
6 測試
打開微信,關注自己的公眾號
現有功能是
7 微信SDK服務分析
核心代碼解析
核心代碼解
這里推薦使用PHPStorm,可以有智能提示,可以追蹤函數實現等。當然你用其他工具也可以。
<?php require('wechat/Wechat.php'); class TestWechat extends Wechat { /** * 收到文本消息時觸發,回復收到的文本消息內容 * * @return void */ protected function onText() { $this->responseText('收到了文字消息:' . $this->getRequest('content')); } } $wechat = new TestWechat(array( 'token' => 'weixin', 'aeskey' => 'xxx', 'appid' => 'xxx', 'debug' => true )); $wechat->run();[/kenrobot_code]
這個是庫里面自帶的例子,功能就是你給你的公眾號發個內容,他在前面加上 收到了文字消息:
我們重點看看onText函數。這個函數里面有兩個函數。
$this->responseText(參數是字符串)這個就是給你回復。 $this->getRequest('content'))這個就是解析你發送來的文字消息返回值是字符串。
8 微信控制LED 對接硬件ESP8266
原教程給的是通過把微信發來的消息保存成txt文件,然后ESP8266不斷請求這個txt文件,獲取內容判斷然后做出開關燈命令。
-------------------------------------------------------------------------------------
作為一個測試足夠了,但是后期多用戶訪問時候,如下問題:
1 涉及身份識別和產品用戶綁定問題.
大白要查詢和控制自己的安防開關,首先服務器要知道是大白發來的請求,其次還要根據產品唯一ID找到大白綁定的設備。不能把小明的觸感器數據發過去。
企業申請的服務號具備這個功能。,例如
https://iot.weixin.qq.com/wiki/new/index.html?page=5-5
智能空調的產品需求及接入微信硬件雲實施方案:
●用戶用微信配置設備聯網&綁定 方案一(推薦):設備上張貼“每種型號唯一的二維碼”,用戶掃碼后通過Airkiss配網並綁定設備(http://iot.weixin.qq.com/wiki/new/index.html?page=4-6) 方案二:設備上張貼“每個產品唯一的二維碼”+用戶掃碼后綁定設備+進入公眾號再通過Airkiss配網 ●空調遙控器 方案一:廠家利用微信提供的標准控制模板,鏈入公眾號菜單 方案二:廠家自己開發的H5控制頁面,鏈入公眾號菜單 ●空調售后服務 方案:廠家開發H5頁面,鏈入公眾號菜單
-------------------------------------------------------------------------------------
用微新給服務器發送字符串"ON"服務器檢測收到字符串"ON"之后就生成一個txt文件,並將“ON”寫入到txt文件。然后ESP8266不斷請求這個文件內容檢測到是ON就開燈。OFF就關燈。
思路就是這樣。那下來開始動手做。方式PHP代碼。
<?php require('wechat/Wechat.php'); class TestWechat extends Wechat { /** * 收到文本消息時觸發,回復收到的文本消息內容 * * @return void */ protected function onText() { $state=$this->getRequest('content'); if($state=="ON" ||$state=="OFF") { $file=fopen("1.txt","w")or die("failed!"); //這一行就是將ON或者OFF以覆蓋方式寫入1.txt fwrite($file,$state); fclose($file); } $this->responseText('主人好,我收到你的消息:' . $this->getRequest('content')); } } $wechat = new TestWechat(array( 'token' => 'weixin', 'aeskey' => 'xxx', 'appid' => 'xxx', 'debug' => true )); $wechat->run();
運行到打開1.txt文件的時候,顯示沒有文件讀取和寫的權限。
發現用記事本創建的1.txt只有讀權限,沒有寫入的權限,好吧問題出在這呢,給1.txt文件提升寫的權限吧:
給與權限(來到根目錄下)
cd ..
ls #查看確認/var路徑出現
sudo chmod 666 /var/www/html/WeChat/1.txt
再次發送消息,OK解決了!
如圖。我們成功實現了微信來控制txt內容。那么下面只需要用ESP8266來不斷請求這個txt的內容就好。
9 微信控制ESP8266,硬件程序燒錄
我們采用arduino IDE方式來編寫ESP82662的代碼。具體的IDE設置請參照 大佬的教程。
版型選擇參數
串口找不到更新下USB串口驅動
直接燒寫到ESP8266里面就好了
#include <ESP8266WiFi.h> const char *ssid = "dongdong";//WIFI賬號 const char *password = "********";//WIFI密碼 const char *host = "192.168.1.1";//服務器地址 公網IP或域名 const int tcpPort = 80;//服務器端口號 WiFiClient sclient; int pinled = D4; // LED燈在D4引腳口 板載測試LED void setup() { Serial.begin(115200); //串口波特率 Serial.setTimeout(100); WiFi.begin(ssid, password); // 鏈接WIFI pinMode(pinled, OUTPUT); //LED引腳初始化,輸出模式 while (WiFi.status() != WL_CONNECTED)//查看WIFI鏈接狀態 { Serial.println("try connect"); delay(500); } } void loop() { connecttoserver(); // 鏈接服務器 sendtoserver(); // 請求網頁服務器文件夾路徑下 /WeCchat/1.txt文件, if (sclient.available()) { String str = sclient.readStringUntil('\r'); // 讀一行 Serial.println(str); //串口打印出來 if (str.indexOf("ON") >= 0) { digitalWrite(pinled, 0);// 開D4口,板載電路設計,給低電平LED亮,其他口和其他自己外接的LED反過來 1是開 } else if (str.indexOf("OFF") >= 0) { digitalWrite(pinled, 1); } } delay(500) ; } void sendtoserver() { String str = "GET /WeChat/1.txt\r\n\r\n\r\n"; // GET 請求網頁服務器默認文件夾下的文件。 根據實際路徑設置 sclient.print(str); } void connecttoserver() { if (!sclient.connected())//幾個非連接的異常處理 { //Serial.println("1" ); if (!sclient.connect(host, tcpPort)) { sclient.stop(); delay(500); } } }
微信發送 “ON”
ESP8266收到消息后,通過串口打印出來給電腦顯示
至此,完成一個粗略的測試級別的微信控制ESP8266點亮LED。
若控制宿舍台燈,直接對應接口加一個繼電器,直接控制220v的通斷。
若想控制傳感器,給芯片裝幾個傳感器,返回數據。