华为云短信服务教你用C++实现SGIP协议

本文分享自华为云社区《华为云短信服务教你用C++实现Smgp协议》,作者:张俭。

中国联合网络通信有限公司短消息网关系统接口协议(SGIP)是中国网通为实现短信业务而制定的一种通信协议,全称叫做Short Message Gateway Interface Protocol,用于在短消息网关(SMG)和服务提供商(SP)之间、短消息网关(SMG)和短消息网关(SMG)之间通信。

Perl的IO::Async模块提供了一套简洁的异步IO编程模型。

SGIP 协议基于客户端/服务端模型工作。由客户端(短信应用,如手机,应用程序等)先和短信网关(SMG Short Message Gateway)建立起 TCP 长连接,并使用 SGIP 命令与SMG进行交互,实现短信的发送和接收。在SGIP协议中,无需同步等待响应就可以发送下一个指令,实现者可以根据自己的需要,实现同步、异步两种消息传输模式,满足不同场景下的性能要求。

时序图

连接成功,发送短信

连接成功,从SMGW接收到短信

协议帧介绍

SGIP Header

  • Message Length:长度为4字节,整个PDU的长度,包括Header和Body。
  • Command ID:长度为4字节,用于标识PDU的类型(例如,Login、Submit等)。
  • Sequence Number:长度为8字节,序列号,用来匹配请求和响应。

使用C++实现SMGP协议栈里的建立连接

CMakeLists.txt:用来生成Makefile和编译项目

examples:存放示例代码

  • smgp_client_login_example.cpp:存放Smgp的login样例

include/sgipcpp:包含所有的C++头文件和实现文件

  • BoundAtomic.h:递增工具类,用来生成SequenceId
  • Client.h:Smgp定义,负责与Smgp服务进行通信,例如建立连接、发送短信等
  • Protocol.h:存放PDU,编解码等
  • impl/BoundAtomic.cpp:BoundAtomic类的实现
  • impl/Client.cpp:Client类的实现
  • impl/Protocol.cpp:Protocol中相关函数的实现

实现SequenceId递增

SequenceId是从1到0x7FFFFFFF的值,使用**

BoundAtomic

**类实现递增:

头文件

内容

实现SMGP PDU以及编解码函数

在**

Protocol.h

**中定义SMGP PDU以及编解码函数:

头文件

内容

实现客户端和登录方法

在**

Client

**中实现客户端和登录方法:

头文件

内容

运行example,验证连接成功

相关开源项目

  • netty-codec-sms 存放各种SMS协议(如cmpp、sgip、smpp)的netty编解码器
  • sms-client-java 存放各种SMS协议的Java客户端
  • sms-server-java 存放各种SMS协议的Java服务端
  • cmpp-python cmpp协议的python实现
  • cngp-zig cmpp协议的python实现
  • sgip-cpp sgip协议的cpp实现
  • smgp-perl smgp协议的perl实现
  • smpp-rust smpp协议的rust实现

总结

本文简单对SGIP协议进行了介绍,并尝试用C++实现协议栈,但实际商用发送短信往往更加复杂,面临诸如流控、运营商对接、传输层安全等问题,可以选择华为云消息&短信(Message & SMS)服务通过HTTP协议接入,华为云短信服务是华为云携手全球多家优质运营商和渠道,为企业用户提供的通信服务。企业调用API或使用群发助手,即可使用验证码、通知短信服务。


点击关注,第一时间了解华为云新鲜技术~

未经允许不得转载:大白鲨游戏网 » 华为云短信服务教你用C++实现SGIP协议