发生错误:当我们使用gsm调制解调器或加密狗

时间:2015-09-23 03:18:02

标签: python django python-2.7 pyserial sms-gateway

我是python的初学者,但是这里有问题,当我们发送短信语言unicode(印地语,阿拉伯语等),但短信没有发送。我能做什么,请帮助我。 如果您有任何想法,请告诉我如何使用调制解调器或加密狗发送多语言短信。

def recept(message, recipient):
   time.sleep(0.5)
   phone.write('AT\r\n')
   time.sleep(0.5)
   phone.write('AT+CMGF=1\r\n')
   time.sleep(0.5)
   phone.write('AT+CMGW="'+recipient+'"\r\n')
   out = ''
   time.sleep(1)
   while phone.inWaiting() > 0:
      out += phone.read(1)
   if out != '':
      print ">>" + out
   phone.write(message)
   phone.write('\x1a')
   out = ''
   time.sleep(1)
   while phone.inWaiting() > 0:
      out += phone.read(1)
   if out != '':
      print ">>" + out
   number = get_num(out)
   phone.write('AT+CMSS='+number+'\r\n')
   out = ''
   time.sleep(1)
   while phone.inWaiting() > 0:
      out += phone.read(1)
   if out != '':
      print ">>" + out

def sendSMS(message):
  try:
   phone.open()
   phone.flushInput()
   phone.flushOutput()
   for row in mobileno:
    time.sleep(0.5)
    mobile = row
    recept(message, mobile)
   time.sleep(1)
   phone.write('AT+CMGD=1,4\r\n')
   phone.close()
  finally:
   phone.close()

# type your message here
message = u'लड़की के चक्कर में मत पड़ना भाई'
sendSMS(message)

+++++++++++++++++ ERROR ++++++++++++++++++++++
लड़की के चक्कर में मत पड़ना भाई
>>AT
OK
AT+CMGF=1
OK
AT+CMGW="Phone number with country code"
> 
Traceback (most recent call last):
  File "right.py", line 76, in <module>
    sendSMS(message)
  File "right.py", line 65, in sendSMS
    recept(u'लड़की के चक्कर में मत पड़ना भाई', mobile)
  File "right.py", line 40, in recept
    phone.write(u'लड़की के चक्कर में मत पड़ना भाई')
  File "/usr/local/lib/python2.7/dist-packages/serial/serialposix.py", line 491, in write
    d = to_bytes(data)
  File "/usr/local/lib/python2.7/dist-packages/serial/serialutil.py", line 76, in to_bytes
    b.append(item)  # this one handles int and str for our emulation and ints for Python 3.x
TypeError: an integer or string of size 1 is required

提前致谢

1 个答案:

答案 0 :(得分:0)

看看this question about sending Unicode messages。它是关于C#的,但SMS部分适用。它引用了tutorial on sending SMS,您可能希望查看其“发送Unicode SMS消息”部分。

AFAICT,您的代码有这两个问题

首先,您没有指定编码,这意味着“纯文本”,大约是7位或8位GSM 03.38。您需要配置支持阿拉伯语和印地语的编码,例如HEX:

phone.write('AT+CSCS="HEX"\r\n');

然后你可能需要指定数据编码方案(最后一部分,8,是DCS的相关部分):

phone.write("AT+CSMP=1,167,0,8\r\n")

其次,代码崩溃是因为您传递给phone.write()的邮件属于unicode类型。串行模块需要一个数字列表(代码点)或字节串。如果您选择上面的HEX编码,那么您可以像这样转换文字:

"".join([hex(ord(c)).replace("0x", "0") for c in u"लड़की के चक्कर में मत पड़ना भाई"])

(也许有更好的方法,但是binascii.hexlify没有生成正确的格式。)

在你的情况下,这给出了:

'0932095c0915094002009150947020091a0915094d09150930020092e09470902020092e0924020092a095c0928093e020092d093e0908'

尝试发送此内容,而不是u"लड़की के चक्कर में मत पड़ना भाई"

当然,所有这些都假设您的调制解调器首先支持Unicode消息。请参阅上面提到的有关如何检查的教程。

另请注意,另一个问题的OP与"\r"的行结尾存在问题。如果您遇到问题,请尝试改为使用"\n"

如果您对发送邮件更感兴趣,而在构建它的方面更少,则可能需要考虑提供TwilioNexmo等服务相对易于使用的API,用于发送短信。