自从共享单车火了以后物联网应用开发就比较热门了, 甚至一些非物联网的公司也开始切入物联网项目中去,结果用传统的互联网技术和团队开发出来的项目问题多多。核心原因是物联网应用开发本身有一些特殊性需要关注,正好本人从事了多年的物联网软件设计和管理工作,说一说物联网应用开发时应该特别注意的地方。
要知道物联网应用开发的特殊性首先要了解物联网应用与传统互联网项目的使用场景有什么不同。从技术上讲物联网应用与传统项目最大的不同是点是数据产生来源的不同。传统软件或者普通互联网软件的数据都是由人输入的,服务端都要对接收到的数据进行预处理,凡是数据不符合要求时都会返回让用户重新输入数据。举个例子:以用户使用银行APP在线转账为例,如果用户输错了不存在的收款账户或者在转账金额中输入了字母(一般客户端都会对金额输入做控制防止金额栏输入字母这种事发生)那么服务端就会捕捉到这个入参错误并且发回客户端要求重新输入,甚至为了提高开发效率好多开发框架已经把入参合规性检测整合到开发框架中了。
但是物联网的数据基本上都不是靠人工输入产生的,而且好多物联网应用设备长期在高温高湿的环境下使用,只能使用比较低端的操作系统和编程语言,更容易因终端程序错误及网络问题产生数据错乱问题。我把常见问题归类以下下三类并给出解决办法:
1.网络不稳定导致数据包错乱,原因是目前大多数物联网设备采用的是低级操作系统,使用的较底层的通讯协议(主要是TCP和UDP)导致。这里又分两个问题数据包粘包和数据错乱。
(1)数据包粘包指的是终端程序发起的多个数据包被网络层合并起来一起送到服务端,导致服务端无法正确解析数据。
解决办法是约定数据包的包头和包尾,例如以“OX”作为每一个数据包的头和尾
服务端即使收到"OX12345OXOX67890OX"这样的数据也很容易就能把数据还原成"OX12345OX" 和 "OX67890OX"并进行后续处理。
(2)数据错乱指数据在传输过程中被改变了,导致服务端收到的数据是错误的。
解决办法是在发送每一包的数据都增加一个校验位X

服务端每次收到数据先计算校验位X是否正确,如果校验位不正确说明传输过程中数据已不可信,告诉设备重新发送数据即可。
2.通讯超时问题:这里主要指的时终端的数据已经送到服务端,服务端接收数据后通知终端时网络阻塞导致的,
这里的主要问题是终端与服务器状态不一致(终端以为数据没有发送成功,而服务器已经执行了该数据)。

解决办法是服务端要有重复数据处理机制,这里也分两种情况。
(1)不改变业务状态的过程数据:比如共享单车要定时向服务端发送自己所在的位置坐标,当服务器接收到的坐标发现跟之前已经接收过的数据是重复数据时只要丢弃这包数据并告诉终端“接收成功,继续发送下一包数据“即可。
(2)需要改变业务状态的数据:比如学员在学车时先要在教练车的终端设备上做签到,如果9:00分终端向服务器发起签到请求,服务端处理了签到请求并发还给终端设备告知允许签到,这时网络阻塞终端设备没有收到允许签到的回复。这一时刻设备终端学员是非签到状态而在服务端学员已经是签到状态(终端设备的学员状态与服务器端的学员状态产生了不一致)。等到9:01分学员再次尝试签到,这个时候服务端又接收到了签到请求,服务端就需要把学员的签到时间改成9:01分并返回给设备签到成功(这里的处理逻辑与传统程序的处理逻辑不一样了),如果第二次没有产生网路阻塞,终端设备接收到服务端发送过来的允许签到结果后把自己的状态改为学员9:01分签到。最终终端设备和服务器的状态是一致的。
3.终端产生的异常数据:主要原因是大部分物联网终端的应用场景(要求终端体积要小,在室外高温高热环境长期工作)采用的是低级操作系统及开发语言做应用开发,这就需要开发人员人工管理内存(目前的高级开发语言比如JAVA就是系统自动管理内存,不需要开发人员干预),很容易因为内存越界等问题导致数据错乱(例如转账金额变成字母)。这种问题是最麻烦的,因为发回设备重新交互也不会产生正确的结果,只能在服务端把异常数据另外保存起来并记录下终端编号及发生时间,供后续人员排查问题并手工处理异常记录。

物联网应用开发与传统软件开发的区别相关推荐

  1. 软件工程:浅谈人工智能软件开发与传统软件开发的区别

    题目:浅谈人工智能软件开发与传统软件开发的区别 摘要:人工智能的飞速发展带动着软件工程的发展,最终使得软件工程产生新的变革.因为人工智能特有的性质,因而导致了人工智能软件与传统软件的差异性.本文对比了 ...

  2. 减少存储过程封装业务逻辑-web开发与传统软件开发的思维模式不同

    转:减少存储过程封装业务逻辑-web开发与传统软件开发的思维模式不同 本篇文章讨论并不是:不要使用存储过程,因为有些事情还是要存储过程来完成,不可能不用.而是关于:"业务逻辑是不是要封装在存 ...

  3. 超越传统软件开发技术

    王安全:2006年加入阿里巴巴(http://www.alibaba.com/)集团研究院,任软件架构师:2007年阿里集团分拆,进入阿里软件(http://www.alisoft.com/),从事架 ...

  4. 项目周期一般多久_深圳app开发公司的软件开发要多久?

    深圳app开发公司的软件开发要多久?手机APP开发可以帮助企业俘获更多新客户,展示其自身的品牌效果.随着移动互联网的发展,人们的工作重心慢慢的从电脑端转移到手机端了,越来越多的人除了工作需要基本都不会 ...

  5. 区块链游戏开发颠覆传统游戏开发的 5 种方式

    区块链技术已在许多行业中使用,但它尤其扰乱了游戏行业.区块链游戏开发并不是一个新概念,但还是比较新的.公司现在正在寻找在他们的游戏中使用区块链技术的方法. 区块链游戏开发颠覆传统游戏开发的一些方式 包 ...

  6. java开发用怎么软件开发_Java 9中的5个功能将改变您开发软件的方式(还有2个不会)...

    java开发用怎么软件开发 有望在Java 9中发布的最令人兴奋的功能是什么? 近期不要对Java 9相对沉默而分心.JDK提交者正在努力准备下一个版本,预计在2015年12月才完成功能的下一个版本. ...

  7. 普通开发人员与软件工程师的区别

    普通开发人员与软件工程师的区别: 对比1: A.普通开发人员: 掌握了计算机基础知识: 熟悉计算机资源,学会了编程语言,喜欢卖弄技巧,喜欢比较编程语言的优劣: 以能编出某种特殊功能的程序为荣,不懂原理 ...

  8. 恩施软件开发人员每月多少钱_恩施软件开发学习,恩施软件开发学习哪家好,恩施软件开发学习一般能拿多少工资...

    恩施软件开发学习,恩施软件开发学习哪家好,恩施软件开发学习一般能拿多少工资 首页 > 软件 > 恩施软件开发学习 作者:镀金池   发布时间:2017-11-22 18:54 因为cent ...

  9. 软件企业需求的人才(开发人员与软件开发工程师综合对比篇)

    昨天在公司收到一封内部邮件,邮件中有个很有意思的PPT,节选一部分放出来 普通开发人员与软件工程师的区别: 对比1: A.普通开发人员: 掌握了计算机基础知识: 熟悉计算机资源,学会了编程语言,喜欢卖 ...

最新文章

  1. Centos7下安装部署oracle数据库方法及问题汇总
  2. CALL TRANSACTION - bdc_options
  3. 第七节:Trigger(SimpleTrigger、CronTrigger)哑火(MisFire)策略 :
  4. 单向队列、双端队列、栈的模型实现
  5. 使用js 调用 google ads
  6. TensorFlow第九步CNN BP算法学习
  7. SPOJ LCS 后缀自动机
  8. 拿来就能用!用爬虫秒抢到孩子心仪的幼儿园 | CSDN 博文精选
  9. aws 部署python lambda_awslambda-为Lambda工具部署Python项目。-Philipp Gorczak Getting started Usage...
  10. 定时刷新网页脚本python_在特定时间后自动刷新Python脚本
  11. Android MediaPlayer 属性
  12. 计算机上wps表格乘除算法,excel乘法公式-WPS表格乘法运算大全
  13. android 保活 sdk 信鸽,腾讯信鸽推送平台Android sdk推荐_腾讯信鸽推送平台Android sdk使用教程...
  14. OpenSSL 生成CA证书及终端用户证书
  15. UVA10066(DP)
  16. 支付宝支付返回resultStatus:4000(系统繁忙,请稍后再试)
  17. 深大计算机图形学大作业之虚拟场景建模
  18. 智慧公交解决方案-最新全套文件
  19. nodejs读取图片像素
  20. 偏微分方程的基本概念

热门文章

  1. org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManage
  2. 使用Redshift渲染器,怎么选电脑配置!
  3. 投票活动中如何防止恶意刷票?
  4. Unity Android平台读取文件时添加了权限依然报错“Access to the path is denied“
  5. Intellij IDEA 简单配置字体大小
  6. 山东的超级计算机,中支槽波动,山东21日将要开启降雨,超级计算机:开始雨比较弱...
  7. DELL服务器硬件报错解决方法——错误代码寄解决和处理办法
  8. python-imutils包简介使用
  9. 数据库字段为什么要使用NOT NULL
  10. Visual studio code 汉化插件