用python开发物联网终端设备模拟器

用python开发物联网终端设备模拟器

在物联网开发过程中,终端设备接入到不同的云平台是工作量比较大的一块,一方面终端设备上的开发环境多为嵌入式开发,另外平台的稳定性和功能完整性需要并行开发,因此终端设备模拟器是非常有必要的,模拟器不仅可以提前发现平台或者业务的功能设计缺陷,同时为终端设备的接入开发可以提供独立的接入模块。
Python是快速开发物联网终端模拟器的好的编程环境,可以集成第三方开发库(比如阿里的物联网开发SDK)。Python 有非常丰富的数据处理功能,因此可以很快的模拟数据,或者批量数据转换模拟。 同时Python也具备完善的界面开发插件, 本文将介绍如何快速开发物联网终端设备模拟工具DiverseSimulator.

安装Python环境

  1. python3.8 安装见官网https://www.python.org/downloads/release/python-380/
  2. 安装PyQt5, PyQt5 安装时间比较长,看环境,可以参考https://www.jianshu.com/p/1284576c79ff, 我折腾在JetBrains PyCharm 2017.3.1 x64导入PyQt5 到开发环境,主要在Project setting 下导入,或者直接安装,尽量不要让PyCharm创建默认环境。

开发模拟器界面,使用QtDesigner 布局界面,并绑定控件处理事件

界面内容包括下面几块:配置文件路径(配置文件用于参数配置存储)、接入服务器信息(端口,地址,密码,MQTT topic前缀, 网关地址,设备类型,设备地址)、设备属性配置页面、行业模板配置页面、帮助文档。
用python开发物联网终端设备模拟器_第1张图片

代码开发

  1. 代码开发,我们使用了第三方库,所以开发前,安装yaml和paho-mqtt库。
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')
  1. 引入第三方接入SDK(阿里物联网接入SDK)或者自己开发
    这里包括设备类型模板的管理与消息格式模拟,设备模板与消息格式不同物联网平台会不一样,但是这块开发可以被复用到终端设备上。
  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

最后模拟器如下

用python开发物联网终端设备模拟器_第2张图片
用python开发物联网终端设备模拟器_第3张图片

你可能感兴趣的:(用python开发物联网终端设备模拟器)