我可以使用python gsmmodem发送任何单个部分或多部分无Unicode sms消息。 这是我的代码:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from __future__ import print_function
import logging
PORT = '/dev/ttyUSB2'
BAUDRATE = 115200
PIN = None
from gsmmodem.modem import GsmModem
def main():
print('Initializing modem...')
modem = GsmModem('/dev/ttyUSB2', 115200 )
modem.smsTextMode = False
modem.connect(PIN)
try:
message = u'ننننننننننننن نننننننتتتتتتتتتتت تتتتتتتتتتتتتتتت تتتتتتتتتتتتت تتتتتتتتت تتتتتتتتتتتتتتتتتتت تتتتتتت تتتتتتتتتتتتتتت تتتتتتتتتتتتتت تتتتتتتتتت'
modem.sendSms('09355666238' , message)
finally:
modem.close();
if __name__ == '__main__':
main()
它成功发送一部分Unicode消息(少于70个字符)但对于超过70个字符的消息会抛出此错误消息:
File "/usr/local/lib/python2.7/dist-packages/gsmmodem/modem.py", line 631, in sendSms
pdus = encodeSmsSubmitPdu(destination, text, reference=self._smsRef)
File "/usr/local/lib/python2.7/dist-packages/gsmmodem/pdu.py", line 341, in encodeSmsSubmitPdu
pdu.append(userDataLength)
ValueError: byte must be in range(0, 256)
如何使用python发送multipart unicode sms消息?
答案 0 :(得分:1)
我不熟悉库,但Unicode字符串不是字节。尝试在传输之前将它们编码为字节。 UTF-8是一个不错的选择,因为它支持整个Unicode范围。
message.encode('utf8')
但是,错误消息表明库正在尝试进行编码,并且无法附加数据长度。也许库内部的字节编码数据不能超过255?样本message
的长度是以UTF-8编码的277个字节。
答案 1 :(得分:1)
sendSms
方法采用unicode字符串并自动检测它是否可以编码为7位GSM-7或16位UCS2。对于GSM-7,长消息必须分成153个字符块,对于UCS2,它们必须分成67个字符块(由于双字节编码)。
不幸的是,PyPI上的当前python-gsmmodem(版本0.9)尝试将所有长消息拆分为153个字符块,如果消息包含{{{}之外的任何字符,则会失败3}}
此问题为GSM-7 range,但尚未包含在当前版本的python-gsmmodem(2013年7月发布)中。似乎没有任何简单的方法来修补修补程序,因此如果您确实需要发送多部分unicode消息,您似乎需要从github安装最新版本。
答案 2 :(得分:0)
我只是使用Python-gsmmodem为我的应用程序发送和接收短信。使用Python-gsmmodem 0.9,我遇到了一些问题,比如unicode编码,连接方法超时,然后我尝试了Python-gsmmodem-new 0.1,似乎这个问题已在这个版本中得到修复。
答案 3 :(得分:0)
我知道这个问题很老但是对于寻找解决方案的人来说,使用babca的python-gsmmodem的分叉版本(适用于python2和python3)
请删除已安装的python-gsmmodem并改为安装此模块:
pip install python-gsmmodem-new
你很高兴