Android与物联网设备通信-概念入门

7,771 阅读5分钟

我准备了一个专题Android与物联网设备通信,分为十来个小节完成。泛指Android连接其它硬件设备建立通信。之前的博客比较零零散散,这算是一次小小的挑战。尽量在工作回家后和周末来完成。

面对陌生的事物,举步维艰只是表象。时间会教你的。 --大鸡排

章节

目录

  • 基本概念
  • 指令的本质

基本概念

透过现象去看本质,Android终端与物联网设备开发就是:

在某种可到通信的媒介下,使用一种可控的协议,使Android终端与硬件设备端交换数据。

关键字:通信媒介、传输协议、交换数据。

  • 物理层(真实媒介):蓝牙、红外、声波、WiFi、网口、串口等

  • 传输层协议:TCP UDP

  • 应用层协议:ModBus、MQTT、私有协议等

  • 交换数据(透传):业务类数据交互(在协议体内)

有点蒙圈不?先别管那些协议是什么通信媒介如何传输的,我们先放一边。慢慢来。现在你只需要记住有这么个东西。

指令的本质

现在假设我们有一台android设备和一块独立的硬件。我们倾向于把做某件事、任务、命令当做一个包来从一端(Server)发送给另一端(Client)。

比如手机控制某个设备关闭屏幕:

image.png

Android设备发送命令:{关闭屏幕}
客户端收到命令:{关闭屏幕}

指令有些像是这样的:

image.png

功能码:
0x01 //关闭屏幕
0x02 //重启设备
0x03 //打开热感应红外
0x04 //关闭热感应红外

上面这段0x1则表示关闭屏幕,如果服务端发送一条功能码为0x01的指令给设备,设备就会执行关闭屏幕动作。从接受指令到动作执行。

我们需要弄明白的是,为什么要这样设计,因为更多的时候是我们需要自己定义。

  • 1.报文头和尾在不稳定的传输中可以用来标识一段信息结束和开始。
  • 2.长度字段则用来标识长度字段往后的内容整体长度。
  • 3.校验可以用来验证数据的完整性。
  • 4.功能码和数据用来完成工作定义业务。

上面这次通信设备会完成以下几个步骤:

  • 1.把数据读干净,并校验数据的完整性。
  • 2.按照定义好的格式去切割读取字段。
  • 3.根具协议体内的功能完成相应的动作。
  • 4.按照协议回复服务端表示执行完毕。

这里只提到了功能码,真实的业务场景会比这个复杂一些。会带上更多的数据体。我们会再后面的章节展开讲,这里只做初步的认识。

一般来说我们和硬件进行交互要尽量保持通信的内容简短,包的内容越小越好。这样的话就可以减少和避免产生切割包、丢包重发的情况。因为媒介的环境是不可控的,比如声波、红外会收到干扰,造成数据丢失或外界干扰紊乱。

这样一来,我们对于硬件设备这种特殊的通信采用字节流的方式就会使包变得很小,比如ModBus的协议,简单来说就是发送的包命令,按照事先确定好的。切割成不同的段来作为识别。我们把这种东西叫做报文。通常会包含报文头、内容长度、内容、报文尾(校验)。


好了,今天先讲这么多消化一下。我也是因为近两年的工作需要才真正接触到Android和物联网设备通信的。把自己学到的一些经验分享出来,网上少有看到较好的介绍。一路摸索的过程中踩了不少坑。我尽量保持采用通俗易懂又循序渐进的方式来完成后续的文章。

扯一个跟主题有关的东西,大多数Java或Android程序员因为没有接触过太低层的通信。有些概念一知半解,听说过但也没能实际用过。如果有读者恰巧看到我这篇文章,又正好是浅尝或者工作需要。建议买书从基础的网络通信原理看起。然后再投入到工作中使用。网上的资料零零散散成体系的不多,通信层面上的错误和坑如果没有一定的经验,一般难以排查到问题。切记