我正在开发一个可以将 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:
- 更改 buildozer 的
requirements
行,将python2
替换为python3crystax
- 下载并解压 crystax ndk here
- 更改您的 buildozer 的
android.ndk_path
以指向解压的 crystax ndk 目录 - 运行
buildozer android debug
如果您足够幸运,您将能够使用 Python 3 构建 apk,而无需任何其他操作。
关于android - Kivy 中用于 Android 开发的 SSL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46960900/