“能用esp8266弄一個(gè)遠(yuǎn)程開電腦的教程嗎?需要設(shè)置路由器嗎?公司路由器設(shè)置不了。”
當(dāng)然可以!而且很簡單~
ESP8266是一個(gè)非常適合用于物聯(lián)網(wǎng)和家庭智能項(xiàng)目的帶wifi模塊的單片機(jī)。它的售價(jià)非常低廉,只需大約10塊
這個(gè)問題可以拆解成兩部分:
問題一:訪問內(nèi)網(wǎng)設(shè)備
問題二:控制電腦開機(jī)
可以使用WOL(Wake on Lan)網(wǎng)絡(luò)喚醒功能。
這里我們就利用阿里云物聯(lián)網(wǎng)平臺(tái)來控制內(nèi)網(wǎng)設(shè)備,再利用ESP8266 NodeMCU這個(gè)性價(jià)比極高的單片機(jī)發(fā)出WOL網(wǎng)絡(luò)喚醒的魔法包來啟動(dòng)目標(biāo)電腦~
ESP8266的介紹和入門指南可以參見我上次寫的這篇文章:十塊錢入門物聯(lián)網(wǎng)!ESP8266新手指南
下面我們就看看具體怎么設(shè)置吧~
首先進(jìn)入阿里云物聯(lián)網(wǎng)平臺(tái)的控制臺(tái)首頁,沒有賬號(hào)的朋友需要先注冊賬號(hào)。
點(diǎn)擊設(shè)備-產(chǎn)品-創(chuàng)建產(chǎn)品。
給新建的產(chǎn)品起一個(gè)名字,然后選擇自定義品類,并設(shè)置為直連設(shè)備,其他設(shè)置如圖:
然后點(diǎn)擊進(jìn)入剛才新建成功的產(chǎn)品內(nèi),點(diǎn)擊產(chǎn)品-Topic類列表-自定義Topic-定義Top類,來新建一個(gè)Topic類。
在新建Topic類的對話框中,設(shè)備權(quán)限選擇“訂閱”,名字輸入“device_boot”。選訂閱權(quán)限是因?yàn)槲覀兊脑O(shè)備只需要接受消息就可以了,不需要發(fā)送消息。后面我們需要用到這個(gè)topic來給我們的esp8266發(fā)送消息來控制電腦開機(jī)~
有了產(chǎn)品之后,我們還需要給產(chǎn)品添加設(shè)備:點(diǎn)擊設(shè)備-添加設(shè)備。
在添加設(shè)備對話框,選擇剛才新建的產(chǎn)品,然后給設(shè)備起一個(gè)名字。
新建完設(shè)備之后,點(diǎn)擊剛才新建出的設(shè)備的查看按鈕來進(jìn)入設(shè)備詳情頁。
進(jìn)入設(shè)備詳情頁后,點(diǎn)擊DeviceSecret的查看按鈕,會(huì)得到3個(gè)碼,把他們復(fù)制出來并保存好,后面我們會(huì)用到這三個(gè)碼來把esp8266連接到阿里云物聯(lián)網(wǎng)平臺(tái)。
對于需要被網(wǎng)絡(luò)喚醒的電腦,按開機(jī)鍵開機(jī),然后不停地點(diǎn)擊進(jìn)入BIOS設(shè)置的相關(guān)熱鍵。進(jìn)入BIOS設(shè)置的熱鍵一般為DEL, F12等。進(jìn)入相關(guān)設(shè)置頁面后,打開網(wǎng)絡(luò)喚醒(Wake on Lan)功能,或者叫做PCIE設(shè)備喚醒(Wake on PCIE Devices)。
這樣即使在電腦關(guān)機(jī)之后,只要電源線和網(wǎng)線沒有拔掉,電腦接受到其他內(nèi)網(wǎng)設(shè)備(例如ESP8266)發(fā)出的的WOL信號(hào),就會(huì)開機(jī)了!
另外,為了定位需要被喚醒的電腦,我們需要獲取目標(biāo)電腦的網(wǎng)卡MAC地址,以windows系統(tǒng)為例:
按win鍵+R,輸入cmd,回車
然后,輸入ipconfig /all,回車,圈出的就是該機(jī)器的網(wǎng)卡MAC地址
首先參照我上次寫的ESP8266新手指南,設(shè)置好基本開發(fā)環(huán)境,這里不再贅述:
十塊錢入門物聯(lián)網(wǎng)!ESP8266新手指南
用Arduino IDE點(diǎn)擊.ino文件打開相關(guān)代碼(具體代碼包和用到的庫和工具我會(huì)打包附于文后):
/**
* Wake on Lan using Aliyun IOT & ESP8266.
* 通過ESP8266 NodeMCU和阿里云IOT平臺(tái)實(shí)現(xiàn)對內(nèi)網(wǎng)主機(jī)的網(wǎng)絡(luò)喚醒(WOL)
*
* 零度橙子OrangeZero Copyright @ 2020
*/
#include <ESP8266WiFi.h>
#include <WiFiUDP.h>
#include <PubSubClient.h> // !!! set MQTT_MAX_PACKET_SIZE=256; MQTT_KEEPALIVE=60 in PubSubClient.h due to restriction in Aliyun IOT mqtt
#include <WakeOnLan.h>
#include "aliyun_mqtt.h" // https://github.com/legenddcr/aliyun-mqtt-arduino
#define WIFI_SSID "ssid"// >>> 替換為自己的wifi名稱::ESP8266只支持2.4G的wifi,不支持5G頻段的wifi
#define WIFI_PASSWD "pwd"// >>> 替換為自己的wifi密碼
#define PRODUCT_KEY "a1G8xxxxxx" // >>> 替換為自己阿里云iot的PRODUCT_KEY
#define DEVICE_NAME "dev1" // >>> 替換為自己的阿里云的DEVICE_NAME
#define DEVICE_SECRET "xxxxxxxxxxxxxxxxxxxxxxxx"// >>> 替換為自己阿里云的DEVICE_SECRET
#define DEV_VERSION "0.0.1" //固件版本信息
#define ALINK_BODY_FORMAT "{\"id\":\"123\",\"version\":\"1.0\",\"method\":\"%s\",\"params\":%s}"
#define ALINK_TOPIC_PROP_POST "/sys/" PRODUCT_KEY "/" DEVICE_NAME "/thing/event/property/post"
#define ALINK_TOPIC_PROP_POSTRSP "/sys/" PRODUCT_KEY "/" DEVICE_NAME "/thing/event/property/post_reply"
#define ALINK_TOPIC_PROP_SET "/sys/" PRODUCT_KEY "/" DEVICE_NAME "/thing/service/property/set"
#define ALINK_METHOD_PROP_POST "thing.event.property.post"
#define ALINK_TOPIC_DEV_INFO "/ota/device/inform/" PRODUCT_KEY "/" DEVICE_NAME ""
#define ALINK_VERSION_FROMA "{\"id\": 123,\"params\": {\"version\": \"%s\"}}"
#define ALINK_TOPIC_DEVICE_BOOT PRODUCT_KEY "/" DEVICE_NAME "/user/device_boot"
const char *MACAddress="04:D9:F5:83:03:EF"; // >>> 替換成需要被喚醒的機(jī)器的MAC地址
IPAddress computer_ip(255, 255, 255, 255);
unsigned long lastMs=0;
WiFiClient espClient;
PubSubClient mqttClient(espClient);
WiFiUDP UDP;
WakeOnLan WOL(UDP);
void init_wifi(const char *ssid, const char *password)
{
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() !=WL_CONNECTED)
{
Serial.println("WiFi does not connect, try again ...");
delay(500);
}
Serial.println("Wifi is connected.");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
void mqtt_callback(char *topic, byte *payload, unsigned int length)
{
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
payload[length]='\0';
Serial.println((char *)payload);
if (strstr(topic, ALINK_TOPIC_DEVICE_BOOT)) {
Serial.print("sending WOL magic packet to: ");
Serial.println(MACAddress);
WOL.sendMagicPacket(MACAddress);
}
}
void mqtt_version_post()
{
char param[512];
sprintf(param, "{\"id\": 123,\"params\": {\"version\": \"%s\"}}", DEV_VERSION);
Serial.println(param);
mqttClient.publish(ALINK_TOPIC_DEV_INFO, param);
}
void mqtt_check_connect()
{
Serial.println("checking mqtt connection...");
while (!mqttClient.connected())
{
while (connect_aliyun_mqtt(mqttClient, PRODUCT_KEY, DEVICE_NAME, DEVICE_SECRET))
{
Serial.println("MQTT connect succeed!");
mqttClient.subscribe(ALINK_TOPIC_PROP_SET);
mqttClient.subscribe(ALINK_TOPIC_DEVICE_BOOT);
Serial.println("subscribe done");
mqtt_version_post();
}
}
}
void setup()
{
/* initialize serial for debugging */
Serial.begin(115200);
Serial.println("Demo Start");
init_wifi(WIFI_SSID, WIFI_PASSWD);
mqttClient.setCallback(mqtt_callback);
}
// the loop function runs over and over again forever
void loop()
{
if (millis() - lastMs >=20000)
{
lastMs=millis();
mqtt_check_connect();
}
mqttClient.loop();
unsigned int WAIT_MS=2000;
delay(WAIT_MS); // ms
//Serial.println(millis() / WAIT_MS);
}
注意,代碼需要替換三處地方:
需要額外安裝的依賴庫有(具體用到的庫我會(huì)打包附于文后):
大家可以通過arduino IDE的包管理器來安裝這些包,如果網(wǎng)絡(luò)不好下不動(dòng)的話,也可以下載我打包好的zip包,再導(dǎo)入到arduino IDE。
需要注意的是,由于阿里云物聯(lián)網(wǎng)平臺(tái)的MQTT協(xié)議的限制,PubSubClient.h文件內(nèi)定義的MQTT_MAX_PACKET_SIZE需要設(shè)置為256,MQTT_KEEPALIVE需要設(shè)置為60。不然于阿里云物聯(lián)網(wǎng)平臺(tái)的通訊會(huì)報(bào)錯(cuò)。從arduino IDE下載PubSubClient庫的朋友需要修改一下這兩個(gè)值。使用我給的zip包的朋友,不需要額外修改了,因?yàn)槲乙呀?jīng)修改好了。
點(diǎn)擊按鈕上傳代碼到ESP8266,并等待上傳完畢
打開arduino IDE中的,工具-串口監(jiān)視器,確認(rèn)傳輸速率為115200波特。查看串口調(diào)試信息,確認(rèn)程序運(yùn)行正常。
接下來,我們只需到阿里云物聯(lián)網(wǎng)平臺(tái),點(diǎn)擊之前創(chuàng)建的設(shè)備,然后找到自定義Topic,找到我們之前新建的Topic:device_boot,點(diǎn)擊發(fā)布消息。
在新建的對話框中,我們就可以給我們的ESP8266發(fā)送消息了!
點(diǎn)擊確認(rèn)發(fā)送消息之后,我們可以通過串口監(jiān)視器看到,WOL信號(hào)已經(jīng)發(fā)出。而且內(nèi)網(wǎng)的目標(biāo)電腦也開機(jī)了!
以后,只要ESP8266保持通電,它就會(huì)自動(dòng)連接阿里云物聯(lián)網(wǎng)平臺(tái)。我們就可以隨時(shí)隨地通過阿里云物聯(lián)網(wǎng)平臺(tái)的控制臺(tái)來遠(yuǎn)程啟動(dòng)內(nèi)網(wǎng)的電腦了!
有興趣的同學(xué)甚至可以利用阿里云物聯(lián)網(wǎng)平臺(tái)制作一個(gè)好看的遠(yuǎn)程開機(jī)界面或者是在家里遠(yuǎn)程開啟公司電腦的實(shí)體按鍵~
大家還有什么想要做的物聯(lián)網(wǎng)或者智能家居項(xiàng)目呢?在下面留言告訴我吧~
我是零度橙子,科技達(dá)人,谷歌認(rèn)證云計(jì)算架構(gòu)師,AWS認(rèn)證devops專家,歡迎大家關(guān)注我,了解有用有趣的科技知識(shí)~
過我們之前文章的朋友都知道,華為之前已經(jīng)對外發(fā)布了旗下的首款云手機(jī)—云鯤鵬手機(jī),雖然叫手機(jī),但這款產(chǎn)品與市面上的傳統(tǒng)手機(jī)完全不同。CPU、內(nèi)存、存儲(chǔ)等等硬件全都存放在華為的服務(wù)器中,我們只需要將一塊屏幕連接網(wǎng)絡(luò)即可使用。
如果我告訴你,現(xiàn)在有一款與云手機(jī)運(yùn)行方式差不多,隨手拿個(gè)卡片大小的東西就能代替電腦,你會(huì)不會(huì)感興趣?
今天上午,在阿里巴巴舉辦的第12屆云棲大會(huì)上,阿里云總裁張建鋒正式發(fā)布了阿里的首款云電腦—無影。與華為的云手機(jī)大致相同,這款電腦沒有本地CPU、硬盤、顯卡、內(nèi)存、顯示器等等設(shè)備,全部都在云端。
不過這款云電腦的運(yùn)行方式就比較特殊了,阿里為用戶專門制造了一個(gè)叫做C-Key的啟動(dòng)硬件,僅有一張卡片大小。當(dāng)用戶想要使用云電腦時(shí),只需要在這個(gè)卡片上進(jìn)行指紋識(shí)別,并且連接到顯示屏和網(wǎng)絡(luò)即可隨時(shí)使用。
乍一看是不是沒啥感覺?別慌,我來給你簡單講解一下它的優(yōu)勢。
相比個(gè)人PC來說,你需要的不僅僅是顯示器和網(wǎng)絡(luò),你還需要另行搭配處理器、內(nèi)存、顯卡、硬盤、電源、機(jī)箱等等設(shè)備,而想要使用這款云電腦,你僅僅需要兩個(gè)東西:互聯(lián)網(wǎng)和顯示器。
另外,云電腦還具有很強(qiáng)的彈性擴(kuò)充屬性。比如你的個(gè)人電腦在裝機(jī)時(shí),選擇的是500G硬盤,如果工作上突然臨時(shí)有個(gè)超大文件項(xiàng)目導(dǎo)致空間不足,你就只能刪除文件,或者再去買一個(gè)硬盤裝上。花錢就不說了,主要的是時(shí)間上的浪費(fèi)。
當(dāng)然,在阿里的無影云電腦上,你不僅可以隨時(shí)增加存儲(chǔ)空間,還可以隨時(shí)擴(kuò)充網(wǎng)絡(luò)和計(jì)算力。若有臨時(shí)的超高算力需求的時(shí)候,單應(yīng)用資源可彈性擴(kuò)展到高達(dá)104核CPU、1.5T內(nèi)存。
相比傳統(tǒng)電腦的三、五年使用壽命,無影云電腦還可以做到無限升級(jí),不需要更換硬件設(shè)備。而在系統(tǒng)方面,它還能實(shí)現(xiàn)跨平臺(tái)、跨終端、Windows/Linux應(yīng)用無縫切換。最最主要的是,它的價(jià)格大約只是同等性能PC的一半。
說了這么多,大家可能還是不太清楚實(shí)現(xiàn)方式,張建鋒也放出了一段視頻來呈現(xiàn)。這里吐槽一下,雖然是為了讓我們更好的理解應(yīng)用場景,但這段視頻內(nèi)所使用的顯示設(shè)備還是有點(diǎn)過于未來化了,總感覺是把《鋼鐵俠》里的高科技全都拿出來了……
簡單點(diǎn)來說就是,在你通過指紋識(shí)別激活并啟動(dòng)了那張C-Key后,與它連接的顯示設(shè)備(比如手機(jī)、平板、電視、投影,甚至是VR眼鏡)通上網(wǎng)絡(luò)后,即可直接進(jìn)入操作系統(tǒng)進(jìn)行游戲、動(dòng)畫渲染、制圖設(shè)計(jì)、軟件開發(fā)等等操作。
值得注意的是,這個(gè)使用場景并不受地點(diǎn)、時(shí)間的限制,只要有顯示設(shè)備和網(wǎng)絡(luò),那你隨時(shí)都可以啟動(dòng)并使用。
張建鋒還表示,用戶在云端所保存的所有數(shù)據(jù)文件,都無須擔(dān)心數(shù)據(jù)丟失,都是與阿里云數(shù)據(jù)中心享有同級(jí)別的安全防護(hù)能力。
不過遺憾的是,這個(gè)產(chǎn)品暫時(shí)只會(huì)面向企業(yè)出售,相信發(fā)展到一定程度后,未來肯定會(huì)有個(gè)人版本出現(xiàn)。
怎么樣,你覺得這個(gè)電腦如何?
運(yùn)維工程師的日常工作中,經(jīng)常需要登錄到服務(wù)器上對應(yīng)用部署和維護(hù),配置修改是很常規(guī)操作。但是在日常運(yùn)維工作中,經(jīng)常也會(huì)遭遇“滑鐵盧”,當(dāng)出現(xiàn)無法遠(yuǎn)程連接服務(wù)器的時(shí)候,我們需要沉著冷靜,耐心分析報(bào)錯(cuò)的癥結(jié),方能更好的定位和排除問題。
今天百曉生就阿里云服務(wù)器ECS無法遠(yuǎn)程連接的問題,分享一波運(yùn)維必備的問題排查方法,認(rèn)同小編的童鞋,文末【點(diǎn)贊+再看】哦~
說明:以下操作在CentOS 6.5 64位操作系統(tǒng)中進(jìn)行過測試
確認(rèn)是否存在CPU負(fù)載過高的情況
確認(rèn)公網(wǎng)帶寬是否不足
無法遠(yuǎn)程連接可能是公網(wǎng)帶寬不足導(dǎo)致的,具體排查方法如下:
確認(rèn)內(nèi)存是否不足
遠(yuǎn)程連接輸入用戶密碼登錄后,不能正常顯示桌面直接退出,也沒有錯(cuò)誤信息。這種情況可能是服務(wù)器內(nèi)存不足導(dǎo)致的,需要查看一下服務(wù)器的內(nèi)存使用情況。具體操作如下:
客戶端無法正常登錄時(shí),先使用不同的SSH客戶端基于相同賬戶信息進(jìn)行登錄測試。如果能正常登錄,則判斷是客戶端配置問題,需要對客戶端配置或軟件運(yùn)行情況做排查分析。關(guān)于如何使用SSH客戶端登錄Linux實(shí)例,您可以參見遠(yuǎn)程連接Linux實(shí)例。
步驟一:使用管理終端登錄實(shí)例
無論何種原因?qū)е聼o法遠(yuǎn)程連接實(shí)例,請先嘗試用阿里云提供的遠(yuǎn)程連接功能進(jìn)行連接,確認(rèn)實(shí)例還有響應(yīng),沒有完全宕機(jī),然后再按原因分類進(jìn)行故障排查。
步驟二:檢查客戶端本地網(wǎng)絡(luò)是否異常
確認(rèn)是否存在用戶本地?zé)o法連接外網(wǎng)的故障。
步驟三:重啟實(shí)例
在確保登錄密碼正確的情況下,確認(rèn)之前是否曾重置過密碼。檢查重置實(shí)例密碼后是否未重啟實(shí)例,如果存在實(shí)例密碼修改記錄,但無重啟實(shí)例記錄,則參考以下操作步驟重啟實(shí)例:
中間網(wǎng)絡(luò)包括網(wǎng)絡(luò)檢查和端口檢查。
網(wǎng)絡(luò)檢查
無法正常遠(yuǎn)程連接Linux實(shí)例時(shí),需要先檢查網(wǎng)絡(luò)是否正常。
1)網(wǎng)絡(luò)異常時(shí),請參見網(wǎng)絡(luò)異常時(shí)如何抓取數(shù)據(jù)包進(jìn)行排查。
2)當(dāng)出現(xiàn)ping丟包或ping不通時(shí),請參見使用ping命令丟包或不通時(shí)的鏈路測試方法進(jìn)行排查。
3)如果出現(xiàn)間歇性丟包,ECS實(shí)例的網(wǎng)絡(luò)一直處于不穩(wěn)定狀態(tài)時(shí),請參見使用ping命令測試ECS實(shí)例的IP地址間歇性丟包進(jìn)行解決。
4)系統(tǒng)內(nèi)核沒有禁ping的情況下,使用ping命令測試ECS服務(wù)器,發(fā)現(xiàn)網(wǎng)絡(luò)不通,請參見Linux系統(tǒng)的ECS中沒有禁PING卻PING不通的解決方法。
網(wǎng)絡(luò)檢查正常后,進(jìn)一步檢查端口是否正常。
1. 使用管理終端登錄實(shí)例,執(zhí)行如下命令,編輯SSH配置文件。
vi /etc/ssh/sshd_config2. 找到“#port 22”所在行,檢查默認(rèn)端口22是否被修改,且前面的“#”是否刪除,如果沒有刪除,可以把前面的“#”刪除,然后將22改為其它的端口,再保存退出即可。
說明:服務(wù)監(jiān)聽能使用的端口范圍為0到65535,錯(cuò)誤配置監(jiān)聽端口會(huì)導(dǎo)致遠(yuǎn)程桌面服務(wù)監(jiān)聽失敗
3. 執(zhí)行如下命令,重啟SSH服務(wù)。
/etc/init.d/sshd restart說明:也可執(zhí)行service sshd restart命令,重啟SSH服務(wù)。
4. 使用Python自帶的Web服務(wù)器創(chuàng)建臨時(shí)的監(jiān)聽端口進(jìn)行測試。
python -m SimpleHTTPServer [$Port]
5. 如果ECS安全組規(guī)則中未放行修改后的端口號(hào),需要將修改后的端口號(hào)添加到ECS安全組規(guī)則中。
說明:ECS的安全組規(guī)則中默認(rèn)放行22端口。修改了遠(yuǎn)程桌面的端口后,需要在安全組規(guī)則中放行修改后的端口號(hào)。
6. 通過上一步獲取的端口,參考如下命令,進(jìn)行端口測試,判斷端口是否正常。
telnet [$IP] [$Port]
說明:
- [$IP]指Linux實(shí)例的IP地址。
- [$Port]指Linux實(shí)例的SSH端口號(hào)。
系統(tǒng)顯示類似如下,例如執(zhí)行telnet 192.168.0.1 22命令,正常情況下,系統(tǒng)會(huì)返回服務(wù)端中SSH的軟件版本號(hào)。
檢查安全組配置,是否允許遠(yuǎn)程連接的端口。
關(guān)注百曉生,笑談云計(jì)算