ThingPark的Python工具

pyThingPark的Python项目详细描述


皮丁帕克

LoRaWAN标准和ThingPark无线隧道API的Python实现

安装

PyThingPark不支持Python2以便将维护保持在最低限度。 要安装Python3,请参考https://www.python.org/downloads

为了实现LoRaWAN MIC计算和加密,pyThingPark使用Python标准密码库cryptography。在

pyThingPark在pip上打包和分发

pip3 install pyThingPark

编译.whl构建的分发文件+焦油gz源,并上传到PyPi上,请参考Python Package instructions

功能

此包作为库实现,不包含可执行文件。这将有助于分析LoRaWAN消息,以及通过隧道接口实现与ThingPark Wireless集成的应用服务器。在

在洛拉旺.py:Python loRaWAN实现

洛拉旺.py实现所有LoRaWAN消息类型:JoinRequest、JoinAccept、ulonofframe、dlunconframe、UlConfFrame、DlConfFrame作为对象。在

可以使用__init__方法创建消息,方法是提供所有子字段,或者直接导入活动LRC日志中显示的物理负载。 例如

^{pr2}$

可以作为JoinRequest消息导入,以便使用以下命令进行分析:

>>> from lorawan import JoinRequest
>>> jr = JoinRequest.fromPayload("0001000171ac293df0bd2d6e6645d32301e2e2f98f810f")
>>> jr
{'MessageType': 'JoinReq', 'MACVersion': '1.0', 'PHYPayload': '0001000171ac293df0bd2d6e6645d32301e2e2f98f810f', 'JoinEUI': 'f03d29ac71010001', 'DevEUI': '0123d345666e2dbd', 'DevNonce': 'e2e2', 'MIC': 'f98f810f'}

而MIC可以通过提供AppKey作为输入进行验证:

>>> jr.computeMIC(AppKey="28125FFD247F3D933834B4A2862CE05D")
'f98f810f'

如果通过fromPayload方法以加密形式提供,JoinAccept将自动解密(在本例中AppKey是必需的)

>>> from lorawan import JoinAccept
>>> JoinAccept.fromPayload("2051b239de5da07db5a8844c4714488cf116815975a04e70bf86282ed11eaa5289", "28125FFD247F3D933834B4A2862CE05D")
{'MessageType': 'JoinAns', 'MACVersion': '1.0', 'PHYPayload': '20096095020000d07e94052301184f84e85684b85e84886684586e8400a782a999', 'JoinNonce': '956009', 'NetId': '000002', 'DevAddr': '05947ed0', 'DLSettings': '23', 'RxDelay': '01', 'CFList': '00846e58846688845eb88456e8844f18', 'MIC': 'a782a999'}

在设备.py:Python LoRaWAN密钥派生实现

设备.py实现了LW1.0密钥派生函数,使得在接收到JoinAccept之后检查设备上是否正确计算了会话密钥变得简单。在

示例代码:

>>> d = Device("FFFFFFAA00AC7000","FFFFFFBB00000000","037407b0a2eb121d99b2ad03b605af3a",None,None)
>>> jr = lorawan.JoinRequest.fromPayload("0x0000000000bbffffff0070ac00aaffffffc3f5d6de8f3e")
>>> ja = lorawan.JoinAccept.fromPayload("202573C61502E510C4802CEE5C076A6D9C1329A8F89689BA77BFE13F5A7CD15809",d.AppKey)
>>> print(d.deriveKeys(ja.JoinNonce, ja.NetId, jr.DevNonce))
('6f10ae090fd5f6ecf0a8e37638abb2da', 'a172e9f886f3835f3f7ebaa51a658b19')

在上行链路隧道.py:Python thingpark无线隧道实现

该库的这一部分旨在提供一个参考,以便在启用安全选项的情况下将AS与TP无线集成。在

DevEUI_uplink将TPW文档解码为XML或JSON格式,并提供解密有效负载的能力,以防它被TPW加密发送(SSM或HSM模式):

>>> uplink = DevEUI_uplink("<?xml version='1.0' encoding='UTF-8'?><DevEUI_uplink xmlns='http://uri.actility.com/lora'><Time>2019-08-05T17:33:51.362+02:00</Time><DevEUI>0123D345666E2DBD</DevEUI><FPort>1</FPort><FCntUp>1</FCntUp><MType>2</MType><FCntDn>1</FCntDn><payload_hex>afac18845bbe3771708042</payload_hex><mic_hex>dcdcc1f5</mic_hex><Lrcid>00000127</Lrcid><LrrRSSI>-65.000000</LrrRSSI><LrrSNR>12.500000</LrrSNR><SpFact>9</SpFact><SubBand>G1</SubBand><Channel>LC3</Channel><DevLrrCnt>1</DevLrrCnt><Lrrid>C000146F</Lrrid><Late>0</Late><LrrLAT>43.640781</LrrLAT><LrrLON>7.017418</LrrLON><Lrrs><Lrr><Lrrid>C000146F</Lrrid><Chain>0</Chain><LrrRSSI>-65.000000</LrrRSSI><LrrSNR>12.500000</LrrSNR><LrrESP>-65.237602</LrrESP></Lrr></Lrrs><CustomerID>100118249</CustomerID><CustomerData>{'alr':{'pro':'LORA/Generic','ver':'1'}}</CustomerData><ModelCfg>0</ModelCfg><AppSKey>439d42627c5afe3d4d536340646621a2</AppSKey><BatteryLevel>0</BatteryLevel><BatteryTime>2019-08-05T17:33:51.362+02:00</BatteryTime><Margin>7</Margin><InstantPER>0.000000</InstantPER><MeanPER>0.000000</MeanPER><DevAddr>05947ED0</DevAddr><AckRequested>0</AckRequested><rawMacCommands>060007</rawMacCommands><TxPower>16.000000</TxPower><NbTrans>1</NbTrans></DevEUI_uplink>")
>>> ASTK = "dbfb0939c448ff1fbf84e84d6ac8ce98"
>>> uplink.decryptPayload(ASTK)

UplinkTunnel以HTTP查询参数作为额外输入,可以计算或验证UL安全令牌(以传输接口应用程序密钥TIAK为输入)

>>> query_params = 'AS_ID=sink&LrnFPort=1&Time=2019-04-29T18:21:17.290+02:00&Token=d306f33c239a9c45d160e0cd6e4071e22a4f4b426f892a0651cf622e81369f3d&LrnDevEui=0024AEB3C02BE1C4&LrnInfos=TWA_100122002.8962.AS-1-4458785'
>>> TIAK = 'bec499c69e9c939e413b663961636c61'
>>> tunnel = UplinkTunnel(uplink, query_params,TIAK)
>>> expectedToken = tunnel.token()

在dxMaker.py:Python DX maker包装器

dxMaker.py是一个使用DX API的Python包装器。 它可以用于在TP labs实例上简单地在ThingPark激活中提供设备。在

为了使用DX,您必须首先获得用于身份验证的承载令牌。 这可以使用DxAdmin类和必要的凭据来完成:

>>> dx = DxAdmin("my-account@acme.fr", "a_clever_password", platform="js-labs-api")
>>> bearerToken = dx.getBearerToken()

一旦有了承载令牌(当然也可以直接在DX Admin上生成),就可以使用它创建DxMaker实例,并通过DX在TP Labs上创建FactoryDevice:

>>> bearerToken = "bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzY29wZSI6WyJTVUJTQ1JJQkVSOjEwMDAwMDA4NSJdLCJleHAiOjE1Njk4MzM4NTMsImp0aSI6ImM4ZGI4Y2RmLTcxNGYtNGE3OS1hNGZiLTI0OWYxNWVhMGIxYiIsImNsaWV94FDpZCI6ImpzLWxhYnMtYXBpL3JhcGhhZWwuYXBmZWxkb3JmZXItanMtbGFicy1zdWJAYWN0aWxpdHkuY29tIn0.KQaDUlrp6lcPJU9Gz5Re25WlHzMvIW75aef1oECCBGMOcIw9u_I7SyyZOMp1K9-AuJOY60DyfXLnVMIm_3CWaw"
>>> dx = dxMaker.DxMaker(bearerToken)
>>> device = dxMaker.FactoryDevice(DevEUI=my.devEUI, JoinEUI=my.joinEUI, TkmInfo=my.tkmInfo)
>>> dx.postFactoryDevice(device)
>>> dx.deleteFactoryDevice(device.deviceJson["deviceEUI"])

提供了一个简单的FactoryDevice类来存储Join服务器所需的设备信息,目前只支持Microchip ECC608配置。此版本只支持Join服务器的预调试,因此包装器中没有实现ASTK处理。在

扩展包

未来发展可能包括

  • 完成剩余LoRaWAN消息的执行
  • MAC命令解码
  • 劳拉旺1.0.4/B级
  • 洛拉旺1.1
  • 下行链路消息

这个包被实现为一个库,每个函数实现在main部分作为一组assert进行验证,因此我们可以轻松地测试非回归。在

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java安卓,如何从一个私有的内部类更新视图元素,这个类是一个异步任务   如果代码中没有数字,则返回true的java方法   java是否将liferay service builder数据放入api?   java如何在javafx中显示单元格中的字符串数组   javascript如何从另一个GUI类获取变量?   创建多个对象后的java REST API POST响应?   java中静态块中声明的变量的范围是什么?   jsp Java,Spring MVC,从服务器中提取任何类型的文件(.png,.jpg,.pdf,.doc等)并提供给用户下载的最简单方法?   java应用程序运行在其他应用程序之上   java正则表达式匹配字符串是否应包含“;”特定字符串前后   C++的java原生源代码。awt。机器人   用于访问/共享单个目录的java多个Xodus应用程序   java将方法传递给另一个活动   java如何获取Struts 2中XWWWForMurlen编码的contenttype的参数