• 物联网数据卡系统源码——通信模块整体概述


    在这个万物互联的时代,物联网应用以及深入到我们生活的方方面面,大到智慧城市、智能交通,小到行车记录仪,各种穿戴设备,智能家居,都有物联网应用的身影,让我们感受到生活品质和档次的提升。

    那么作为程序员的我们,物联网通信到底如何做呢? 

    本系列文章即将带您一起走进物联网系统开发的世界。也希望同行一起分享和讨论物联网相关知识和开发经验。

    首先看一下物联网系统的整体架构,看上一篇文章:物联网数据卡系统源码——整体架构

    本篇将讲解物联网系统中的通信模块实现原理及相关内容

    物联网数据卡系统源码——通信模块

    1.通信模块的功能

    系统发送指令信息到物联网卡,物联网卡接收到指令后做相应逻辑处理,并返回信息给系统。

    2.通信模块实现的原理

    一般是通过运营商(移动、联通、电信)提供的短信网关通信协议,来给物联网数据卡发送信息。

    三大运营商使用的协议不同,分别是:中国移动CMPP协议、联通SGIP协议、电信SMGP协议。

    具体的协议介绍这里就不展开了,参考阅读:协议介绍

    3.使用中国移动CMPP协议实现物联网通信模块

    物联网卡选任何一家运营商合作都没有关系(但个人经验,移动的信号是最好的。^_^根据自己情况选择)

    移动使用的是CMPP协议,此协议2001年出了CMPP2.0版,之后持续升级过CMPP2.1,到2002年出了CMPP3.0版之后就未升级过,一直很稳定,能满足各种应用需求。CMPP3.0扩展手机号为32位,增加了号码类型和linkid等字段,做物联网卡当然选择支持扩展更多且最稳定的CMPP3.0版本。

    下面介绍一款程序,此程序为中国移动CMPP协议程序接口,适合在中国移动申请了短信发送端口的公司使用。

    本程序功能包括:

    1、支持Cmpp2.0、3.0协议;
    
    2、支持一般的短信发送、上行短信接收、状态报告;
    
    3、支持长短信,包括下发长短信、上行接收长短信;
    
    4、支持Ms Sql数据库、MySql数据库;
    
    5、支持普通手机号和物联网卡;
    
    6、集成了邮件群发功能;
    
    7、支持扩展号;比如你的发送号码是1008622,可以扩展成100862201、100862202等

    程序适用于Cmpp3.0、Cmpp2.0协议,可用.Net任何版本编译。短信Win服务程序+MsSql/MySql数据库源码,直接配置好win服务并启动,自己只需往数据库里面写入数据就可以发送短信,接收的短信保存在另一张表中,读取即可收到上行短信。

    4.设计原则

    软件设计的基本原则是“高内聚,低耦合”,本模块遵循此原则。

    此类涉及通讯的应用中,短信通信部分本身是可以不带任何业务逻辑的,即只负责短信收发这一单一功能,所以可以设计成独立模块与其他业务处理模块分开,实现松耦合,独立分布式部署。

    短信通讯模块从数据库读取待发送短信数据,然后放入缓存队列进行多线程发送,这样其他模块只需要往数据库插入数据,就可以发送短信,从而实现了跨语言和跨平台。不管业务系统使用JAVA、PHP、C#、Python或者其他语言,也不管业务系统是在Windows还是在Linux系统部署,只要可以远程访问数据库,就可以使用短信通讯模块的短信收发功能。

    通信模块每天的发送量比较大,每时每刻都在持续运行,这就必须能实现独立部署,提高性能,同时也不影响其他业务功能的性能。

    5.程序实现

    程序设计成一个Windows服务的形式,可以安全的驻存在系统中稳定运行,防止人为因数关闭程序。同时设计成支持Sql Server和MySql两种数据库,且可以通过修改配置项来实时切换。

    根据功能不同又可以细分成专门负责实现CMPP协议格式,与移动网关通信的模块,和专门读取数据库数据,处理发送任务的Windows服务模块。

     

    上图代码为短信win服务代码截图,相关代码模块解释:

     

    Xiaoy.SMS项目:为短信组件源码,负责实现CMPP协议并与短信网关通信.
    SMSWinService项目: 短信服务源码,负责读取数据库待发短信并发送以及上行短信的接收,当然还包括windows服务的安装等功能.
    SMSTest项目:短信测试程序源码,Windows桌面程序,用于短信调试.

     

    下载

    上图为短信调试小程序截图。短信程序开发好之后,联调是一个繁琐的工作,因为协议参数就有几十个,任何一个参数填写错误都有可能导致短信发送不成功,这就需要有一款调试工具来帮忙了,有时候不是你的程序编码有问题,而是移动运营商那边没帮你配置好,或者你填的参数输入错误,造成了发送失败。遇到这种情况,可以通过发送后返回的状态(见上图中红色日志)来判断是哪里的问题。

    短信发送流程如下:

    第一步:程序发送Submit包到网关,网关会返回SubmitResp包,根据包中的Result的值来判断是否发送成功。

    result=0代表发送成功,其他代表失败,失败的原因可以查询返回码的意义:返回码说明

    这时候只是发送到了网关,至于网关是否成功发送到用户手机或物联网卡,尚不知道。比如用户手机关机,或物联网卡未插入设备中则收不到短信。

    第二步:当短信网关成功发送短信到用户手机卡或物联网卡上时,会返回状态报告给SP端(即本程序)。

    如果状态报告中的结果是DELIVRD,则证明信息已经成功发送到物联网卡,并成功接收到。

    也就是说,当第一步result=0的时候,基本SP的发送任务完成了,如果收不到也是卡的问题(欠费、关机、未插卡等)。

    第二步是更精确的知道卡是否收到信息,但有可能一两天才会返回。要接收状态报告,需要在提交Submit包的时候把“RegisteredDelivery”字段设为1。

    上图为短信网关模拟器工具截图。在本地测试需要用到短信网关模拟器。

    由于篇幅有限,本文从整体讲解一个大概,未完待续。

     

     

    本系列文章将继续开新篇讲解CMPP协议模块的实现,和SMSWindows服务模块的实现,欢迎持续关注。小y的QQ 271963990

     

    提纲

    1 物联网数据卡系统源码——前篇

    1.1 物联网技术架构图

    1.2 物联网的主要应用领域

    1.3 物联网传感器61个应用领域

    1.4 物联网常见通信协议梳理

    2 物联网数据卡系统源码——通信模块

    2.1 通信模块整体概述

    2.2 协议封装和实现

    2.3 长短信

    2.4 粘包的处理

    2.5 物联网通讯与普通短信通讯的区别和要注意的地方

    3 物联网数据卡系统源码——Windows服务模块

    3.1 Windows服务模块概述

    3.2 Windows服务模块实现

    3.3 高并发回调处理

    3.4 部署安装

  • 相关阅读:
    “冷面杀手”王励勤赢了
    当VS.NET 无法调试时,不妨尝试一下下面的办法
    Oracle如何调用Windows动态链接库
    根本不值得一提的乒乓球国手王浩
    向总版主提一些建议
    你的家乡话,你还知多少
    黄山三日游(200706020604)
    今天是我的生日,常怀感恩的心
    如果有一个工具可以帮助你将你的代码可视化,你需要吗?
    是社会变化太快,还是我心态有有点怪
  • 原文地址:https://www.cnblogs.com/tuyile006/p/6610895.html
Copyright © 2020-2023  润新知