安装kivy
用pip安装:
(版本为1.11.1)
pip3 install kivy
安装完成测试:
python3
>>>import kivy
如上则kivy安装成功
安装并使用buildozer
1.安装buildozer
安装依赖项
sudo apt update
sudo apt install -y git zip unzip openjdk-8-jdk python3-pip autoconf libtool pkg-config zlib1g-dev libncurses5-dev libncursesw5-dev libtinfo5 cmake libffi-dev libssl-dev
pip3 install --user --upgrade Cython==0.29.19 virtualenv
添加环境变量
export PATH=$PATH:~/.local/bin/
初始化并编译
buildozer init
#在buildozer.spec中更改一些必要的元素,如:android API接口等
buildozer android debug deploy run
buildozer android debug 这一步是报错的核心,buildozer会将很多东西自动下载下来但会由于各种原因以及bug会产生各种各样的错误。这里罗列一些我遇到的问题。
报错整理
整理了三类常规的报错,其他报错可以在buildozer官网或者github上的相关问题中找到部分解答。
1.下载报错
python-for-android
下载这个包时,可能会因为网络原因导致下载中断报错。
解决办法:根据终端下载的地址或在github上找到python-for-android的对应的包自行下载。
接下来去buildozer.spec文件中进行修改:
# (str) python-for-android git clone directory (if empty, it will be automatically cloned from github)
p4a.source_dir =/home/jiang/buildozer/python-for-android
# (str) python-for-android branch to use, defaults to master
p4a.branch = master
(上述是我的spec文件)
gradle
与上述的python-for-android类似,官方给出的下载源限速十分严重,并随时可能中断。建议手动下载并模仿官方下载的格式命名文件及文件夹等。
(https://downloads.gradle-dn.com/distributions/gradle-6.4.1-all.zip)
2.缺少文件报错
aidl
缺少该包的原因不清楚。
我的解决方法是手动下载android studio,并将下载时自动配置好的aidl包复制到buildozer自动下载的目录下。
ndk
缺少ndk很大的一个可能是下载中断,但当他再次执行下载命令时,系统找到了以ndk命名的包并认为ndk已经被完全下载完毕。
因此其解决方法是当发现报错提示找不到ndk包的时,删除原先下载的ndk包并重新下载。另一种方法是通过android studio下载对应版本的ndk包并复制到相对应的目录下。
3.权限不够
./gradlew
buildozer android debug 在执行过程中会用到这样一步命令。而该命令需要在gradlew的目录下进行,但那个gradlew文件很可能缺少一定权限导致报错
例如:./gradlew CommandnotFound
cd /home/jiang/buildozer/.buildozer/android/platform/build-armeabi-v7a/dists/myapp__armeabi-v7a
chmod 777 gradlew
我需要配置的gradlew文件在上述目录下,因此需要给他权限。
电脑端与PLC通信
安装pyads
pip3 install pyads
import成功则安装成功
通信
import pyads
pyads.open_port()
pyads.set_local_address('169.254.15.226.1.1')
SENDER_AMS = '169.254.15.226.1.1'
PLC_IP = '169.254.64.20'
USERNAME = 'Administrator'
PASSWORD = '1'
ROUTE_NAME='RouteToxxx'
HOSTNAME = '169.254.15.226'
PLC_AMS_ID = '5.52.74.54.1.1'
pyads.add_route_to_plc(SENDER_AMS, HOSTNAME, PLC_IP, USERNAME, PASSWORD,route_name=ROUTE_NAME)
plc = pyads.Connection('5.52.74.54.1.1', 801, '169.254.64.20')
plc.open()
print(plc.read_by_name(".mHmi.DB_index", pyads.PLCTYPE_INT))
plc.write_by_name(".mHmi.DB_index", 1, pyads.PLCTYPE_INT)
print(plc.read_by_name(".mHmi.DB_index", pyads.PLCTYPE_INT))
plc.close()
如上,该样例通信完成,并可以进行读写变量。
手机端与PLC通信
1.获取本机ip
通过
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect(('8.8.8.8', 80))
ip = s.getsockname()[0]
2.打开buildozer.spec中网络开关
# (list) Permissions
android.permissions = INTERNET
参考资料:
1):https://kivy.org/doc/stable/installation/installation-linux.html
2):https://buildozer.readthedocs.io/en/latest/
3):https://buildozer.readthedocs.io/en/latest/quickstart.html
4):https://blog.csdn.net/davied9/article/details/93361566
5):https://www.cnpython.com/pypi/pyads