最近在折腾工业物联网项目,发现很多同行都在找支持西门子全系PLC的安卓通讯方案。刚好手头有个自研的APP源码可以分享,直接上硬货
这里有个坑要注意:S7-1200/1500在博途环境需要先启用"允许来自远程对象的PUT/GET通信"。欢迎PLC老司机们来提PR,或者分享你们在设备通信中遇到的奇葩问题——上周刚解决个1500PLC的TSAP地址冲突问题,这酸爽...支持S7-200Smart,S7-300,S7-400CPU通讯。支持S7-200Smart,S7-300,S7-400CPU通讯。支持博途S7-1200,S7-1
APP源码。 支持S7-200Smart,S7-300,S7-400CPU通讯。 支持博途S7-1200,S7-1500CPU通讯。 用LIinux或Unbutu系统,使用Android studio编写。 支持安卓手机。 支持阿里云物联网平台。
这个项目最核心的当属PLC通讯模块。针对不同型号的西门子PLC,底层用了两套协议并行处理:
// S7-200Smart/S7-300/400通讯配置
S7Connector s7200Connector = TCPConnector.getConnector()
.withHost("192.168.1.10")
.withPort(102)
.withRack(0)
.withSlot(2)
.build();
// 博途系列使用S7CommPlus协议
S7PlusDriver s1500Driver = new S7PlusDriver()
.setConnectionType(S7PlusConnectionType.BASIC)
.setTargetCpuType(CPUType.S71500);
这里有个坑要注意:S7-1200/1500在博途环境需要先启用"允许来自远程对象的PUT/GET通信"。代码里用的s7netty开源库封装了协议栈,比直接操作PDU省事不少。实测在千兆局域网下,300ms内能完成一轮数据读写。
安卓端的网络权限配置容易被新手忽略,在AndroidManifest.xml里记得加:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
阿里云物联网接入这块,推荐用官方SDK做二次封装。关键代码其实就三板斧:
// 初始化连接
val connection = MqttConnection(
productKey = "你的PK",
deviceName = "设备名",
deviceSecret = "密钥"
)
// 数据上报
fun uploadPLCData(tag: String, value: Any) {
val payload = JSONObject()
.put("ts", System.currentTimeMillis())
.put(tag, value)
connection.publish("/sys/${productKey}/${deviceName}/thing/event/property/post", payload)
}
实测发现JSON格式传输效率不高,后来改用Protocol Buffers序列化,数据包体积直接缩小60%。不过要注意安卓端的protobuf-gradle插件版本要和编译环境兼容,这坑我卡过两天...

APP源码。 支持S7-200Smart,S7-300,S7-400CPU通讯。 支持博途S7-1200,S7-1500CPU通讯。 用LIinux或Unbutu系统,使用Android studio编写。 支持安卓手机。 支持阿里云物联网平台。
项目在Ubuntu 22.04 + Android Studio Flamingo环境下开发,Gradle配置需要特别注意NDK版本:
android {
ndkVersion "25.2.9519653"
externalNativeBuild {
cmake {
cppFlags "-std=c++17"
}
}
}
目前已经实现的功能包括:PLC寄存器轮询、报警推送、历史数据缓存(用Room做的本地持久化)、云端双向通信。在华为Mate40上测试,连续运行72小时内存占用稳定在80MB左右。
完整项目在Github开源了(地址见评论区),下个版本打算加入OPC UA支持。欢迎PLC老司机们来提PR,或者分享你们在设备通信中遇到的奇葩问题——上周刚解决个1500PLC的TSAP地址冲突问题,这酸爽...

更多推荐
所有评论(0)