如何使用python gsmmodem库发送multipart unicode短信?

时间:2016-03-13 05:32:30

标签: python unicode sms gsm

我可以使用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消息?

4 个答案:

答案 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

你很高兴