我是SMPP的新手,但我需要通过SMPP协议模拟流量。我找到了教程如何使用Python How to Send SMS using SMPP Protocol
中的smpp lib发送短信我正在尝试编写接收器,但我无法让它工作。请帮忙。 我的代码是:
import smpplib
class ClientCl():
client=None
def receive_SMS(self):
client=smpplib.client.Client('localhost',1000)
try:
client.connect()
client.bind_receiver("sysID","login","password")
sms=client.get_message()
print(sms)
except :
print("boom! nothing works")
pass
sms_getter=ClientCl.receive_SMS
答案 0 :(得分:2)
据我所了解,您正在使用的smpplib是$regex
上可用的smpplib。查看您的代码和客户端代码,我找不到函数client.get_message。也许您有一个旧版本的库?或我的图书馆有误。无论如何,get_message函数很可能不会阻塞并等待消息到达。
看客户端代码,您似乎有两个选择:
如果您查看github文件,它将显示如何设置该库以实现第二个选项(这是更好的选择)。
...
client = smpplib.client.Client('example.com', SOMEPORTNUMBER)
# Print when obtain message_id
client.set_message_sent_handler(
lambda pdu: sys.stdout.write('sent {} {}\n'.format(pdu.sequence, pdu.message_id)))
client.set_message_received_handler(
lambda pdu: sys.stdout.write('delivered {}\n'.format(pdu.receipted_message_id)))
client.connect()
client.bind_transceiver(system_id='login', password='secret')
for part in parts:
pdu = client.send_message(
source_addr_ton=smpplib.consts.SMPP_TON_INTL,
#source_addr_npi=smpplib.consts.SMPP_NPI_ISDN,
# Make sure it is a byte string, not unicode:
source_addr='SENDERPHONENUM',
dest_addr_ton=smpplib.consts.SMPP_TON_INTL,
#dest_addr_npi=smpplib.consts.SMPP_NPI_ISDN,
# Make sure thease two params are byte strings, not unicode:
destination_addr='PHONENUMBER',
short_message=part,
data_coding=encoding_flag,
esm_class=msg_type_flag,
registered_delivery=True,
)
print(pdu.sequence)
client.listen()
...
当接收到消息或送达回执时,将调用client.set_message_received_handler()中定义的功能。在示例中,它是lambda函数。还有一个示例,说明如何设置线程侦听。
如果您更喜欢简单的轮询选项,则应使用poll
函数。对于最简单的实现,您需要做的是:
while True:
client.Poll()
像以前一样,一旦收到消息,就会调用client.set_message_received_handler()中设置的函数。