以下内容为本人的学习笔记,如需要转载,请声明原文链接 微信公众号「englyf」https://mp.weixin.qq.com/s/tb5eOFNUZLtPPLipLAh3vA
本文大概 1435 个字,阅读需花 4 分钟
内容不多,但也花了一些精力
如要交流,欢迎评论区留言
谢谢你的点赞收藏分享
目前在家庭物联网这一块,绝大部分的电子消费品都是基于wifi联网的设备。从商家那里达到消费者手中之后,简单开机使用无法体现其全部价值,还是需要经过消费者给设备配网的过程,把设备从信息孤岛接入互联互通的世界。
买回来的电子消费品如果需要基于wifi联网,那么用户就需要先通过指定APP告诉自己的设备如何连接wifi(用户名和密码),设备才基于获取的账户信息接入网络。
设备成功联网之后,距离能充分利用网络的功能还是有差距的。这些设备对于用户来说就是专用的联网设备,它不可以随心所欲一会连接百度,一会又连接抖音,它的才能需要专用的服务器来辅助发挥。
一般物联网设备,都需要在公网搭配专用服务器,基于这些服务器帮助用户实现对设备的随时随地访问,充分沟通用户和设备。因此,接入服务器是第二步。为了服务器和设备安全通信,令牌信息也不可或缺。
一般在配网的最开始阶段,APP 先从服务器请求一个令牌信息。获得令牌返回后,APP 可通过多种方式传递给设备,包括wifi SSID、密码和令牌。接着 APP 开始尝试从服务器获取已激活的设备信息列表。
然后,设备利用收到的相关信息连接路由器,路由器为接入的设备分配新 IP 地址,设备成功接入网络。
设备连接服务器,开始设备认证过程。设备将三元组信息接入服务器,服务器校验信息通过。令牌信息上传给服务器,完成安全激活。
服务器向 APP 返回已激活的设备信息列表,配网过程结束。
配网的主流方式有几种,比如热点配网、智能配网、蓝牙配网等。不同方式之间的主要差异就在于从 APP 传输信息给到设备的不同途径。
热点配网属于 wifi 配网的一种,利用设置设备的 wifi 模组为热点模式,这样允许手机连接设备的热点,使得手机和设备处于同一局域网中,APP 即可把令牌、路由器的 SSID 和密码等信息加密后在局域网内广播。
设备通过接收局域网内的广播包来解析并解密,获取路由器的 SSID 和密码,然后再切换到 Station 模式去连接路由器,连接成功后则可向云端发起激活请求,完成绑定激活流程。
由于热点英文简称 AP,所以也叫 AP 模式。
热点配网流程:
智能配网,利用设置设备的 wifi 模组为监听模式,不断抓取无线报文并对其进行解析,提取需要的信息。手机连接路由器,APP 把令牌、路由器的 SSID 和密码等信息按一定方式进行编码,通过组播或广播方式发射无线报文。
常用的编码方式有两种:
先用 UDP 数据包长度来编码,然后通过 UDP 广播发送。
先用 MAC 地址来编码,然后通过 UDP 组播发送。
智能配网也叫快速配网,有的简称 EZ 配网。
相比于 AP 配网,EZ 配网虽然也属于 wifi 配网的一种,但是对最终用户来说更加便捷。缺点是,EZ 配网对路由器和手机硬件有要求,所以兼容性不足,以及无线干扰产生丢包的问题会更明显,所以 EZ 配网无法保证 100% 成功。
智能配网流程:
蓝牙配网,意思就是手机 APP 通过蓝牙通道传输配网相关信息(令牌信息、路由器的 SSID 和密码等)给到设备,设备基于这些信息完成配网的过程。
流程是,设备首先是通过蓝牙广播暴露设备相关的信息,手机 App 接收并解析蓝牙广播包,如果广播包中包含指定服务,则 APP 发起扫描响应请求,进一步获取设备的详细信息,获取到设备完整的信息后在 App 显示待配网设备。当用户选择绑定设备时,App 与设备建立蓝牙连接,把配网相关信息通过蓝牙通道发送给设备,设备获取到配网信息,完成激活流程。
蓝牙配网的流程如下所示:
我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack
在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/