在物联网开发过程中,终端设备接入到不同的云平台是工作量比较大的一块,一方面终端设备上的开发环境多为嵌入式开发,另外平台的稳定性和功能完整性需要并行开发,因此终端设备模拟器是非常有必要的,模拟器不仅可以提前发现平台或者业务的功能设计缺陷,同时为终端设备的接入开发可以提供独立的接入模块。
Python是快速开发物联网终端模拟器的好的编程环境,可以集成第三方开发库(比如阿里的物联网开发SDK)。Python 有非常丰富的数据处理功能,因此可以很快的模拟数据,或者批量数据转换模拟。 同时Python也具备完善的界面开发插件, 本文将介绍如何快速开发物联网终端设备模拟工具DiverseSimulator.
界面内容包括下面几块:配置文件路径(配置文件用于参数配置存储)、接入服务器信息(端口,地址,密码,MQTT topic前缀, 网关地址,设备类型,设备地址)、设备属性配置页面、行业模板配置页面、帮助文档。
res = os.system('pip3 install pyyaml')
res = os.system('pip install paho-mqtt')
res = os.system('pip install python-crontab')
res = os.system('pip install crcmod')
def simulateAndSendMessage(self, deviceType, host, fromPort, toPort, groupId):
#使用主题前缀中解析出的Vxx作为版本
pattern = '/v\d{1,}/\d{3}/'
topicPrefix = self.mqTopicPrefixEdit.toPlainText()
info = re.search(pattern, topicPrefix)
infos = info[0]
vers = infos[1:-1].split('/')
parserVersion = vers[0]
industryVersion = vers[1]
print("版本信息:" + parserVersion + ":" + industryVersion)
factory = DeviceFactory(self.__rootdir)
selectedDevice = factory.create(deviceType, industryVersion)
#根据groupId组装UI控件实例
sendIntervalEdit = eval('self.sendIntervalEdit' + str(groupId + 1))
HOST = self.mqAddressEdit.toPlainText()
mqttSender = MessageProxy()
mqttSender.setUri(HOST, int(self.mqPortEdit.toPlainText()), 'mqtt')
mqttSender.setAccount(self.mqAccountEdit.toPlainText(), self.mqPasswordEdit.toPlainText())
mqttSender.setTopicPrefix(self.mqTopicPrefixEdit.toPlainText())
while (self.__isSendList[groupId]):
for port in range(fromPort, toPort + 1):
#设置电表地址
selectedDevice.setAddress(host, port, 0)
#使用主题前缀中解析出的版本号传入
msg = selectedDevice.simulateMessage(parserVersion, industryVersion)
print('-GROUP' + str(groupId) + '-' + msg)
#hmsg = bytes.fromhex(msg)
mqttSender.send('dtu/up/firemonitor', msg)
time.sleep(int(sendIntervalEdit.toPlainText()) * 60)
Demo例子
#类测试代码
print('-- Basic test for deviceModel --')
factory = DeviceFactory('../rules')
emeter = factory.create('emeter')
print('-- Basic test for messageProxy --')
mqttSender = MessageProxy()
mqttSender.setUri('47.99.93.72', 1883, 'mqtt')
mqttSender.setAccount('sapain', 'password')
mqttSender.setTopicPrefix('/sapain/')
print('-- Send Test Start --')
for ip in range(100, 199):
#设置电表地址
emeter.setAddress('192.168.2.0', ip, 0)
#使用v1解析器和100模板生成模拟数据
msg = emeter.simulateMessage('v1', '000')
mqttSender.send('test', msg)
print('--MSG--' + msg)
print('-- Send Test Over --')
安装pyinstaller
pip install pyinstaller
使用pyinstaller打包
pyinstaller -F console.py