android - Kivy 中用于 Android 开发的 SSL

标签 android python ssl kivy buildozer

我正在开发一个可以将 mqtt 消息发送到 AWS Iot 的移动应用程序。它需要 paho-mqtt 库。它可以包含在 buildozer.spec 要求中。我的问题出在 SSL 部分,因为我需要在代码中导入 SSL,这似乎与运行在 python-for-android 中的 python 版本有问题,即 2.7.2。

代码如下,在PC上可以正常运行,但是在手机上就不行了。

from kivy.lang import Builder
from kivy.app import App
from kivy.uix.label import Label


import paho.mqtt.publish as mqtt
import paho.mqtt.client as mqttclient  
#


class MqttTest(App):
    def build(self):
        topic = "topic1"
        my_ca_cert  = "RootCA.pem"
        my_pri_cert = "my.cert.pem"
        my_key_cert = "my.private.key"


        try:
            import ssl
            mqttc = mqttclient.Client("Python_Ex_Pub")
            mqttc.tls_set(my_ca_cert, 
                certfile=my_pri_cert, 
                keyfile=my_key_cert,
                cert_reqs=ssl.CERT_REQUIRED, 
                tls_version=ssl.PROTOCOL_TLSv1_2, 
                ciphers=None)
            mqttc.connect("myaddress", 8883)
            mqttc.publish(topic, "This is a test pub from Python.")

            return Label(text="Hi it works!")
        except Exception as e:
            import traceback
            a=traceback.format_exc()
            try:
                f1=open("/storage/emulated/0/Download/err.txt","w")
                f1.write(str(a))
                f1.close()
            except:
                pass
            return Label(text=str (a))

if __name__ == '__main__':
    MqttTest().run()

没有在 buildozer.spec 要求中添加任何与 SSL 相关的内容,我收到以下错误:

no module named _ssl

如果我将 openssl 添加为要求之一,则会收到以下错误:

'module' object has no attribute 'PROTOCOL_TLSv1_2'

最佳答案

如前所述,PROTOCOL_TLSv1_2 是在比 p4a 提供的更高的 Python 2 版本中添加的。

您可以尝试使用 Python 3 构建 apk:

  1. 更改 buildozer 的 requirements 行,将 python2 替换为 python3crystax
  2. 下载并解压 crystax ndk here
  3. 更改您的 buildozer 的 android.ndk_path 以指向解压的 crystax ndk 目录
  4. 运行buildozer android debug

如果您足够幸运,您将能够使用 Python 3 构建 apk,而无需任何其他操作。

关于android - Kivy 中用于 Android 开发的 SSL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46960900/

相关文章:

python - reshape python连接文本不规则数据框

python - 无法使用ctypes在python中加载dll

python - 一个不错的 Python 2.5 SSL 库

SSL 警告图标 - 如何摆脱它

java - 如何使用java appium客户端在android中滚动?

Android recyclerview-selection 实现?

Python Datetime 显示 Nonetype

php - 使用 PHP 执行 shell 命令

java - android 数据库中我缺少的列在哪里?

android - 无法将 JSON 数据从 Android 发送到 ROR 服务器