短信网关api(短信网关异常)

网友投稿 341 2023-03-18


本篇文章给大家谈谈短信网关api,以及短信网关异常对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。 今天给各位分享短信网关api的知识,其中也会对短信网关异常进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

如何选择可靠的API短信接口?

由于短信行业并没有一个标准或者标杆性质的企业作为衡量标准,导致用户在如何选择一家优秀的短信平台这个问题上,变得棘手起来。通常来讲,行业内认可的衡量方式有几个方面短信网关api
l 全国范围电信增值业务许可证(sp证)
l 短信下发速度如5秒必达
l 99%到达率
l 短信通道数量
其实市面有很多短信供应商都不错的,只要能解决用户的快速稳定发送问题。短信验证码下发的几个关键要素
1.短信通道速度、质量
每一条通道的可处理短信理速度是不一样的短信网关api;每一条通道的投诉率是不一样的;每一条通道所发送的短信内容是不一样的。而优秀的短信平台作为第三方整合平台,则是通过自身的行业资源以及技术资源,为广大用户提供最优化的解决方案。
如:触发类短信由于其优质的内容,可以通过设置优先级保证触发类短信能够快速稳定的到达。
行业类短信则需要通过严格的审核管理制度,对短信进行风控。
假设有多家行业类短信使用者同时于一条短信通道上进行发送,则有可能造成短信拥堵、投诉率过高等问题,严重将有可能导致通道关闭。
2.服务器承载能力、数据处理速度
10万线并发服务器,满足超级客户的业务需求,应用级容灾机制保证服务稳定。优秀的短信平台,理应以硬件设备,技术驱动作为业务的坚实后盾。如服务发送量超大的企业级客户又或者双11等电商节点的临近,便成为了区分短信平台的分水岭。
3.运营商网关
短信服务一般采用SP直接与某一个SMSC连接,由SMSC直接通过信令网发送短信给用户的方式。但当SP的短信信息服务业务量很大时,全部短信都由与SP直连的SMSC负责转发,造成该SMSC负荷极大,难以满足业务发展的需要。所以就产生了由用户归属地的SMSC负责用户短信信息服务的发送。
通过上图短信网关api我们可以理解为:用户提交数据到平台服务器,平台服务器收到请求,通过防火墙,交换机,再通过负载均衡设备把处理的信息按需合理的分配给web服务器,再提交数据库,分配给不同的运营商,经由运营商网关下发到用户手机上。
我们不难发现,如果某台服务器出现问题,还有其他web服务器处于工作当中,不会由于单台服务器的故障问题,导致短信的发送失败,负载均衡设备还是能够使已提交的内容继续工作下去。
另一方面,对比下技术之外的内容吧——就是服务。这个行业,难免会遇到问题,哪家解决的快、哪家在客户损失无法避免的情况下能给出最妥善的解决方案。

短信api平台哪个靠谱?

短信api平台靠谱的有很多,但是适合自己的却很少。
各个公司优势各不相同,一个好的平台可以给我们带来很多的便利,在选择时可以看资质是否齐全,短信行业对资质要求比较严格,比如sp证、ICP证等,所以购买前可以提出看一下公司的相关资质,比如营业执照、ICP证、sp证等。
在众多的短信平台中,【联麓信息】的口碑好,稳定性高:自主平台,N+通道实时监控更新,智能切换端口,保障服务持续稳定;审核智能:快速审核,报备审核,免审核,各行业分布审核,可以保障客户快速性。

详情点击进入官网~

如何用外国虚拟号码发短信

1、使用外国虚拟号码发短信,首先需要找一家能够提供虚拟号码的网络服务商,然后在他们的网站上注册一个账号,选择一个外国的虚拟号码,然后通过这个虚拟号码登录短信服务,就可以发送短信。
2、第二种方法是使用一些在线服务,例如Twilio,它可以帮助我们发送外国虚拟号码的短信。只要注册一个 Twilio 账号,选择一个外国虚拟号码,然后使用编程语言(如python)来调用 Twilio API 来发送短信即可。
3、最后一种方法是使用短信网关。它是一种连接短信网络的设备,可以接收和发送短信,可以使用外国虚拟号码发送短信。只需要在网关上配置外国虚拟号码,并使用支持的编程语言调用网关的 API 就可以发送短信。

如何远程接受短信验证码

要远程接受短信验证码短信网关api,可以使用短信网关服务短信网关api,例如Twilio或Nexmo等短信网关api,可以在应用中实现短信短信网关api的发送和接收。同时,可以使用第三方短信网关api的短信API服务提供商,也可以使用短信服务平台进行短信的发送和接收。

移动CMPP协议开发,请问下面的代码为什么不能收到CMPP

你的代码呢?
给你点资料,你参考一下吧:
其实说到API的开发,也只是包装了一个通讯协议。让上层用户可以不用去知道详细的协议解释,而专注于自己的业务模块。

对于CMPP2.0协议,要用的指令也就8个,相对来说并不是很复杂
CMPP_CONNECT
=0x00000001; // 请求连接
CMPP_CONNECT_RESP
=0x80000001; // 请求连接应答
CMPP_TERMINATE
=0x00000002; // 终止连接
CMPP_TERMINATE_RESP =0x80000002;
// 终止连接应答
CMPP_SUBMIT
=0x00000004; // 提交短信
CMPP_SUBMIT_RESP
=0x80000004; //
提交短信应答
CMPP_DELIVER
=0x00000005; // 短信下发
CMPP_DELIVER_RESP
=0x80000005; //
下发短信应答
CMPP_QUERY
=0x00000006; // 短信状态查询
CMPP_QUERY_RESP
=0x80000006; //
短信状态查询应答
CMPP_CANCEL
=0x00000007; //
删除短信
CMPP_CANCEL_RESP
=0x80000007; // 删除短信应答
CMPP_ACTIVE_TEST
=0x00000008; //
激活测试
CMPP_ACTIVE_TEST_RESP =0x80000008;
// 激活测试应答

实现CMPP协议模块也就是实现上面的8个指令就可以了。按照上面说的设计模式,同进结合API开发来说一下协议的实现。

对于API对外的接口,一般的定义格式如下:

extern "C" __declspec( dllexport ) int WINAPI ActiveTest()

接下来就是实现接口的功能:

一、建立SOCKET连接
struct sockaddr_in _socaddr ;
_socaddr.sin_family =
AF_INET;
_socaddr.sin_port = htons( _port
);
_socaddr.sin_addr.s_addr = inet_addr( _ismg );
return connect( _soc, (struct
sockaddr *)_socaddr, sizeof( _socaddr ));

致于设置发送超时,接收超时还有阻塞或非阻塞的接收模式,可以自己根据需要去设置不同的目标值。

二、登录短信网关服务器
按CMPP协议,主要的部分是就是AuthenticatorSource = MD5(Source_Addr+9 字节的0 +shared
secret+timestamp),MD5算法在网上可以直接找到源程序,不必要自己重新去写这个内容。这部分内容相对比较简单就不在这里再写出来了。

//计算单向HASH函数的值
strcpy( authsrc, _spid ) ;
char * pos = authsrc + strlen( _spid ) +
9 ; //9 字节的0
strcpy( pos, _passwd ) ;
pos += strlen( _passwd );
strcpy( pos, _timestamp( timestr
)); //时间戳
pos += strlen( timestr );

ctx.update(( unsigned char * )authsrc, (int)( pos -
authsrc ));
ctx.finalize();
ctx.raw_digest( msg-digest
);
//复制转换成MD5的字符串到发送数据中

三、提交短信息
相对于登录来说,提交短信也不会很复杂。只是简单的把客户端程序提交过来的数据复制到发送窗口,发送并等待网关回应的状态就可以了,当然也可以在接收到用户的数据前作一些适当的如:手机号码是否全数字,定时发送或存活时间是否正确等的判断。

//要注意的就是可变的用户数据与保留字段的内容:
memcpy( _pkg-data, msg, sizeof( CMPP_SUBMIT ));
//将最后8个字节的保留数据拷贝到适当的位置
memcpy(
( _pkg-data + nsize - sizeof(
msg.reserve ) - sizeof( CMPP_HEAD )),
msg.reserve,
sizeof( msg.reserve ));

四、接收短信息和状态
接收短信后有两种处理方式,
1、 采用回调函数的方式:
这种方式相对于API来说比较简单,只要定义一下接口函数就可以了,客户端程序在初始化时,传入回调函数的函数指针,当API接收到短信网关下发(DELIVER)的短信时,调用函数指针把相关参数据传递给客户端。不必要考虑队列或其它细节的问题。

如下我在API中定义的回调函数:
typedef int ( WINAPI * TProcGetDeliver )(
char *
msgid,
unsigned
char * destnumber,
unsigned
char * serviceid,
unsigned
char tppid,
unsigned
char tpudhi,
unsigned
char msgfmt,
unsigned
char * srcnumber,
unsigned
char delivery,
unsigned
char msglen,
unsigned
char * msgcontent,
unsigned
char * reserve,
unsigned
char * stat,
unsigned
char * submittime,
unsigned char * donetime ) ;

而在API对外接口中只要定义一个参数作为传送函数指针就可以了:如下:

extern "C" __declspec( dllexport ) int WINAPI IFInitInterface( char *ismg,
unsigned short port, TProcGetDeliver fCltGetDeliver );

fCltGetDeliver 就是用户传递过来的回调函数指针,在调用时,直接采用参数开式用调用就可以了。如下所示:
err = _fCltGetDeliver ( (char * )_msgid,
_msg-destnumber,
_msg-serviceid,
_msg-tppid,
_msg-tpudhi,
_msg-msgfmt,
_msg-srcnumber,
_msg-delivery,
_msg-msglen,
_msg-msgcontent,
_msg-reserve,
_stat,
_submittime,
_donetime
) ;
这样所接收到的所有参数就顺利传递到客户端了。

2、 调用API的客户端程序定时检测并从缓冲队列中拾取方式:
对于队列的方式,API内部必需自己建立一个缓冲队列。这个队列对于安全来说,必须是线程安全的(可以用临界区来保护),接收到一个下发信息时,数据暂时保存入队列中:
int nl = sizeof( CMPP_HEAD ) + sizeof(
CMPP_DELIVER ) ;
_pushrecqueue( _recpkg, nl ) ;
下面是_pushrecqueue函数;
void WINAPI _pushrecqueue( void * inval, int nl )
{
char * _queval = new char[ nl + 1 ] ;
memset( _queval, 0, sizeof( nl + 1 )) ;
memcpy( _queval, inval, nl ) ;

_queue._push( _queval ) ;
}
为了保证数据最大安全性,不要接收到过多的数据进入队列。放入队列的数据就等待用户用API接口过来取走就可以了,其相关接口与回调函的参数相差不多,在这里就不多作说明,只要说明一下可以提供一个接口,可以让客户端可以检测队列中是否有可以接收的数据:
extern "C" __declspec( dllexport ) int
WINAPI HasDeliver() ;
这检是否取数据就由客户端去作判断了。

五、发送接口
对于API来说,最重要的一部分就是去做发送数据了。通过SOCKET套接字与网关相连接后,将自己的数据发送出去。
在发送数据前,组装好要发送的数据包,将数据COPY一份到发送窗口,对于不要回应的数据包,只要发送成功,就可以退出发送进程。对于要等待回应的包,启动一个时钟来作为检测是否收到了回应,并返回结果给发送窗口。设置发送的次数标志,如果发送第一次超时,按设定的发送次数,再发送。如果出现一次发送不成功,可以设置一个标志位,去发送一次链路检测标志,如果链路检测失败,应该重新连接或者是在用户发送时直接返回链路断开的结果。

CMPP_PACKAGE * _pkg = ( CMPP_PACKAGE * )buf ;
int err = API_E_UNKNOW_ERR ;
if( _soc == INVALID_SOCKET ) return API_E_INVALT_SOC ;
while( _pkg-n 0 )
{
_pkg-n = _pkg-n - 1
; //发送次数
_lastacttime = time( NULL ) ;

EnterCriticalSection(
_csec_soc ) ;
try
{
err =
send( _soc, buf, len, 0 ) ;
}
catch( ... )
{
}
LeaveCriticalSection(
_csec_soc ) ;

if( err < len ) //发送不成功
{
err =
API_E_SO_SENDERR ;
continue
;
}

//不要回应结果的直接跳出
if( _pkg-resp == false )
{
err = 0
;
break
;
}

//等待回应事件
…………
}
//如果发送超时,设置发送链路检测标志开
if( err == API_E_SO_OVETIME )
{
_needacttest = _needacttest + 1
;
}
return err;

六、接收接口
对于数据的接收,因为发送短信的接口的数据量并不是很大,所以可以采用接收到
一部分,解释一部分的功能,这样的就可以减少设计上的难度,当然也可以一次接收缓冲中的数据,再一段段去分析,也不是很难。
对于接收,启用一个新的线程,这样也可以保证接收的及时性与可调度性。先接收包头信息确定整个数据包的长度,直到接收到一个完整的包的内容才进行下一个包的接收,有些包也可能是没有包体结构的,所以也可以在收到正确的包头后就进行分析结构如下:

//先接收包头部分,以确定包的大小、类型
err = _pscoket-_recv(
_pscoket-_rec_window, sizeof( CMPP_HEAD )) ;
if( err == SOCKET_ERROR || err ==
API_E_INVALT_SOC ) continue ;

CMPP_PACKAGE * _recpkg = (
CMPP_PACKAGE * )_pscoket-_rec_window ;
if( ntohl( _recpkg-head.size )
0 )
{
//接收包体
_reclen =
0 ; //已接收长度
_recdatalen = ntohl( _recpkg-head.size ) - sizeof( _recpkg-head ) ;
do
{
Sleep( 1 ) ;
_recdatalen = _recdatalen - _reclen ;
err = _pscoket-_recv(
_recpkg-data + _reclen, _recdatalen );
if( err == SOCKET_ERROR || err == API_E_INVALT_SOC ) continue ;
_reclen = err ;
} while(
_recdatalen - _reclen 0 ) ;
if(
_recdatalen _reclen ) continue ;
}
try
{
_pscoket-_analysisrecpack( _recpkg ) ; //分析包的内容
}
catch( ... )
{
}


七、分析协议包
接收到CMPP的一个完整的协议包后,根据命令字去作分析,相对来说并不是一个很难的事情,不过要注意是就是要把网络数据流转化为主机数据流这个问题。
unsigned char _result = 0 ;
CMPP_DELIVER * _msg = ( CMPP_DELIVER * )_recpkg-data
;
DELIVER_CONTENT * _pcont = ( DELIVER_CONTENT
*)_msg-msgcontent ;

if( _msg-msglen <= 0 )
{
_result = 4
; //接收到的长度前误,要求网关服务器重发这个包
}
else if( _msg-msglen 200 )
{
_result = 6
; //接收到的长度前误,要求网关服务器重发这个包
}
else if( _msg-delivery != 0 || _msg-delivery !=
1 )
{
_result = 1
; //接收到的协议格式有误,要求网关服务器重发这个包
}

//接收到错误的信息直接返回
if( _result 0 )
{
_deliverresp(
_recpkg-head.seqid, _msg-msgid, _result ) ;
return ;
}

if( _fCltGetDeliver )
{
//如果客户端程序采用的是回调函数来取得接收到的短信或状态,调用回
//调函数传递数据
……………
}
else
{
//如果客户端采用的是自已从队列中提取的方式,把数据直接PUSH到队//列中等待用户提取
………….
}

关于短信网关api和短信网关异常的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。 短信网关api的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于短信网关异常、短信网关api的信息别忘了在本站进行查找喔。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Java线程之线程同步synchronized和volatile详解
下一篇:微信小程序实现选项卡功能
相关文章

 发表评论

暂时没有评论,来抢沙发吧~