本文是基于嵌入式物联网研发工程师的视觉对网络编程和web编程进行阐述。对于专注J2EE后端服务开发的童鞋们来说,这篇文章可能稍显简单。但是网络编程和web编程对于绝大部分嵌入式物联网工程师来说是一块真空领域。
的确,物联网研发应该以团队协作分工的方式进行,所以有嵌入式设备端、网关、web前端、APP、后端开发等专属岗位。作为系统架构师,自然需要掌握各种岗位的关键技术。作为嵌入式工程师,掌握网络编程、web编程,能够极大地拓展自己的视野和架构思维,能够主动地对系统的各种协议和应用场景提出优化的见解,而不仅仅是接受任务摊派。至少,能够在不需要依赖后端工程师的情况,能够快速搭建一个物联网demo系统。因此,掌握一些基本的网络编程、web编程技能,对于提升物联网研发工程师的开发能力是非常重要的。
本文可以视为嵌入式企鹅圈发布微信Wifi 接入解决方案的首篇原创技术分享。微信Wifi接入方案系列技术分享将于2016年春节后陆续公开,敬请关注。本篇文章对物联网涉及的知识进行概述,之后的文章再进行详细的指导开发。
一、 OSI七层模型和TCP/IP四层模型
OSI七层模型是网络协议的理论研究模型,或者可以称为理想的模型,而TCP/IP四层模型才是事实标准,是已经被广泛使用的模型。两者之间的关联图示如下:
对于两种模型的解读,我想说的是作为开发人员不必强行去理解各层的含义,例如会话层负责什么,表示层负责什么。当你在开发过程中没有涉及到这些层次所解决的问题的时候,你想理解并记住是比较困难的。但是,当你遇到问题并需要去解决的时候,这时你一定会对这些层次的职责非常清晰。
衡量一个物联网平台或者协议是否实用的非常关键的因素是它提供的消息触达能力,其直接影响物联网应用开发。所以,我们从消息触达能力去分析TCP/IP这个事实标准模型。我们设想以下场景,并进行分析。
1.网络接口层。路由器1和wifi音箱、空调、热水器组成一个家庭局域网,其使用wifi(802.11)协议进行通信。该协议定义了物理信号、数据帧格式、丢包重发机制、流量控制等等。这些都是网络接口层的任务。还有,多个设备共享信道,同时发数据会产生冲突,它是怎么解决的,这也是网络接口层的内容。其实,物联网工程师不必在意这些内容。因为wifi物理信号方面的内容是由wifi芯片厂商负责,而wifi单芯片(wifi+SOC)则会提供SDK包并提供SOCKET编程接口了。所以,我们职责的重点是关注网络层以上的编程开发知识。
2.网络层,即IP协议,最基础的认识是每个IP对应一个物联设备、手机或者一个后方服务器。原则上一个网卡对应一个IP,如图中wifi音箱、wifi热水器均有一个独立的IP。网络之间的通信都是基于IP进行的,网络包会通过路由器最终送到目标IP所对应的设备上。
Wifi音箱等家庭设备加入家庭局域网,其实是各获得一个局域网IP,192.168.*.*,包括路由器1也有一个局域网地址,但是路由器1还有一个互联网IP。只有路由器的互联网IP才能被外界所获知,外界是不能主动获知局域网IP具体对应哪个设备的,只有路由器1才知道,因此所有对外发送的数据包的源IP都是路由器1的互联网IP,外界发送给设备的数据包的目标IP也是路由器的互联网IP。
我们都知道,设备上线时需要向物联平台服务器告知自己的状态,以便于用户控制。因此物联平台服务器的IP必须是一个互联网IP,或者是一个域名(DNS协议可以将域名解析为IP)。如果它是一个局域网IP,那设备是不可能访问到的。
这里,我们还必须要记住一点,设备和物联平台的第一次通信永远都应该设备主动发出,因为就算物联平台知道路由器1的公网IP,它也无法将消息传送到内部的设备的。另外,服务器必须要持续设备到达物联平台最后一跳的路由信息,因为路由信息原路返回的过程中具有路由器1记录是哪个设备发出的信息。如果不记录这个信息,物联平台单靠路由器1的互联网IP是无法触达到具体设备的。