物联网网络编程、Web编程综述

  如果你不能理解上面这一段话,就记住,物联平台通过路由器1的互联网IP主动发一条消息到设备是不能成功的,但是,当设备发一条消息给物联平台后,物联平台直接响应该数据包(IP源地址和目标地址调换位置)是可以触达设备的。如果是满足一问一答的方式,那么服务器不需要记录这个路由信息,如果需要满足服务器主动发消息给设备的场景,那么服务器是需要记录这个信息的。

  另外,我们知道,网络设备在物理上表现为一个真实的网卡,网卡的MAC地址是6个字节,48位。在一个局域网内通信,网络编程时都是基于IP地址的,路由器或者交换机如何通过IP地址找到对应的MAC地址,即为ARP地址解析协议,这个也是网络层的职责,但是作为开发人员来说,我们了解即可。

  3. 传输层,即TCP/UDP协议。对于传输层,我们需要理解的是,一台PC或者手机上运行的网络运用可能很多,但是他们都对应同样一个IP。操作系统如何将一个数据包分发给对应的网络运用呢?这就依靠传输层所定义的端口来区分。常见的网络应用层协议都会默认传输层端口号,如FTP对应21,HTTP对应80,SMTP对应25等等。传输层除了定义端口号之外,还有两个非常重要的协议,即TCP面向连接的协议和UDP数据包协议。前者可以理解为一个虚拟的电话连接协议,一旦双方打电话建立起连接后双方通话的过程中,所有的数据包均是走同样的路由路径。因为面向连接的协议会在带宽中预留资源来保障,所以面向连接协议能够保证质量,因此适用于一些对数据质量要求严格的网络运用中,如电子邮件应用,如果不保证质量,邮件内容都不保证正确,谁会使用这个邮件系统呢?但是,对于一些音频视频类运用,丢一两帧完全不影响用户体验,则会使用UDP协议,其不是面向连接,发完后之前的路由信息可以不在保存,其是使用最大努力交付(即trymy best)。

  4. 应用层。常见的网络应用协议包括HTTP、FTP、SMTP、POP等等。嵌入式物联应用是建立在这些网络应用协议的基础之上的。这些协议会规范基本的请求连接、响应和数据传输等方面的格式。作为嵌入式物联网应用来说,其应该自行定义应用协议的格式,这些数据格式可以简单自定义,也可以使用成熟的标准格式,如HTML、XML、JSON等等。由于防火墙一般只放开端口为80的HTTP数据包,所以物联网应用一般都会构建在HTTP的基础上。

  所以,我们要区分网络应用层协议HTTP和应用自定义协议。后者使用前者进行传输通信。不管应用自定义协议使用哪一种格式,都需要通信双方同时使用。物联设备和物联平台后台通信时,可以使用简单的XML格式或者JSON格式,而物联平台还要被PC浏览器访问,那么,由于浏览器只支持HTML格式,则要求物联平台后台提供HTML格式的内容服务,同理,物联网平台和手机APP之间的通信可以用XML或者JSON。甚至,我们可以自定义简单的命令来实现功能,但是使用XML或者JSON这些格式有助于数据有良好的可读性,而且也有成熟的类库来解释。

  这些都是建立在HTTP网络应用协议的基础上的。

  二、 socket编程

  socket编程分为TCP和UDP两种方式。分别如下:

  

 

  可见,TCP/UDP的socket套接字在通信之前需要绑定(bind)IP和端口地址。对于TCP来说,服务器需要先侦听listen,而客户端发起connect请求后,服务器才能accept,之后即建立面向连接的通信环境,通过send/recv函数进行通信。

  而UDP编程则很简单,绑定之后可以立即开始数据传输。

  除了掌握基本的socket编程之外,还需要清楚以下知识:

  1)阻塞和非阻塞。网络套接字有阻塞和非阻塞之分。如假设创建的socket是阻塞的,那么其recv函数就一定要等到对方传送数据过来,才会返回,否则会一直处于阻塞状态。而非阻塞状态则是立即看看缓冲有没有数据,如果有就返回数据,没有会返回错误,而不是一直死等。阻塞模式可以简单地理解为同步工作模式,而非阻塞模式可以理解为异步工作模式。

  2)多路复用。作为服务器,可能会存在多个客户端连接,如果轮询每个客户端socket有没有数据,那效率多累啊。Socket编程的select和poll接口用来解决这类多路IO复用的问题,它能够同时侦测多个连接的数据通信。