我正在开发一个可以向AWS Iot发送mqtt消息的移动应用程序。它需要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'
答案 0 :(得分:1)
如前所述PROTOCOL_TLSv1_2
在后来的Python 2版本中添加了比p4a提供的版本。
您可以尝试使用Python 3构建apk:
requirements
python2
行替换python3crystax
android.ndk_path
更改为指向解压缩的crystax ndk目录buildozer android debug
如果你足够幸运,你将能够使用Python 3构建apk而无需任何其他操作。
答案 1 :(得分:0)
我遇到了类似的问题。我试图在没有做任何事情的情况下导入pydrive。以下是来自logcat。
我尝试了3 os环境,osx,ubuntu,推土机vm。所有人都给了我同样的错误。
I / python(13323):文件“/Users/macuser/test/.buildozer/android/platform/build/dists/myapp/private/lib/python2.7/site-packages/httplib2/init .py“,第960行,in I / python(13323):AttributeError:'module'对象没有属性'HTTPSConnection'
在httplib.py中,我找到了以下代码。
try:
import ssl
except ImportError:
pass
else:
class HTTPSConnection(HTTPConnection):
"This class allows communication via SSL."
所以我怀疑ssl无法成功导入。然后,检查ssl.py并发现PROTOCOL_SSLv3无法成功导入。
from _ssl import PROTOCOL_SSLv3, PROTOCOL_SSLv23, PROTOCOL_TLSv1
直到这里我无法继续前进。我正在使用python3crystax,它仍然不能在这篇文章中作为声明。
由于buildozer将单独下载所有库,我怀疑bulldozer自动下载的python是一个不包含ssl3支持的python版本。