【问题标题】:how to send multipart unicode sms using python gsmmodem library?如何使用 python gsmmodem 库发送多部分 unicode 短信?
【发布时间】:2018-05-23 05:28:48
【问题描述】:

我可以使用 python gsmmodem 发送任何单部分或多部分无 Unicode 短信。 这是我的代码:

#!/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 发送多部分 unicode 短信?

【问题讨论】:

    标签: python unicode sms gsm


    【解决方案1】:

    我不熟悉这个库,但 Unicode 字符串不是字节。在传输之前尝试将它们编码为字节。 UTF-8 是一个不错的选择,因为它支持整个 Unicode 范围。

    message.encode('utf8')
    

    但是,错误消息表明库正在尝试进行编码,并且未能附加数据长度。也许库内部的字节编​​码数据不能超过 255?您的样本message 的长度为 277 字节,以 UTF-8 编码。

    【讨论】:

      【解决方案2】:

      sendSms 方法采用 unicode 字符串并自动检测它是否可以编码为 7 位 GSM-7 或 16 位 UCS2。对于 GSM-7,长消息必须拆分为 153 个字符块,而对于 UCS2,它们必须拆分为 67 个字符块(因为是双字节编码)。

      不幸的是,当前 PyPI(0.9 版)上的 python-gsmmodem 试图将 所有 长消息拆分为 153 个字符块,如果消息包含 GSM-7 range 之外的任何字符,则此操作将失败。

      这个问题是fixed in Dec 2013,但尚未包含在当前版本的 python-gsmmodem(2013 年 7 月发布)中。似乎没有任何简单的方法可以对修复进行猴子修补,因此如果您确实需要发送多部分 unicode 消息,您似乎需要从 github 安装最新版本。

      【讨论】:

        【解决方案3】:

        我知道这个问题很老,但对于任何寻求解决方案的人,请使用babca 的 python-gsmmodem 的分叉版本(适用于 python2 和 python3)

        请删除已安装的 python-gsmmodem 并安装此模块:

        pip install python-gsmmodem-new
        

        你很高兴

        【讨论】:

          【解决方案4】:

          我只是在我的应用程序中使用 Python-gsmmodem 来发送和接收 SMS。在使用 Python-gsmmodem 0.9 时,遇到了一些问题,例如 unicode 编码、connect 方法超时,然后我尝试了 Python-gsmmodem-new 0.1,似乎这些问题在这个版本中已经得到修复。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-06-18
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多