Python SDK使用指南(联通用户专用)
非联通用户请查看设备接入服务。
本文以提供的应用侧Python SDK Demo为例说明如何使用Python SDK与物联网平台对接。Demo以Python工程为例,以invokeapiTest下的每个类都包含了main方法,可单独运行,旨在演示如何调用SDK接口。
开发环境要求
开发平台 |
开发环境 |
配套要求 |
推荐的操作系统 |
---|---|---|---|
IoT |
|
Python 3.7 |
Windows7 |
SDK包为纯Python的egg包,在使用上没有特殊限制,Python在3.7及以上版本即可。
导入Demo工程
- 将Python SDK解压至本地Python安装路径的“Lib\site-packages”目录下,如,C:\Program Files\Python37\Lib\site-packages。
- 将Python SDK Demo解压到本地。
- 打开PyCharm,选择“Open”,再选择Demo解压后的路径,单击“OK”。
- 配置Project Interpreter。
- 选择
- 选择SDK所在的解释器,如,C:\Program Files\Python37\python.exe,单击“Apply”,最后单击“OK”即可正确配置工程所需要的SDK 。
- 选择
- Python SDK Demo目录结构如下,Demo工程中已包含SDK库。
配置平台信息及证书
配置文件(application.ini)以及证书都分别放置在工作路径“d:/python_sdk/”下面的cert 和resources文件夹中,用户也可自行设置工作路径。
平台IP、端口、appId和密码都是从配置文件中读取的,因此,当这些信息发生变化时,只要修改配置文件,不用修改应用服务器的代码。
[CLIENT_INFO] platformIp = 100.100.100.100 platformPort = 8743 appId = FT8EjQ8O****VbW60Qb8xvga secret = TtuK4Paf*****yAv66himUk8a
在“Constant.py”中,读取证书和CLIENT_INFO。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
class Constant(object): # 工作路径 workPath = os.path.join('d:/python_sdk/') # 读取证书 def readCertificate(self): certFilePath = os.path.join(Constant.workPath, 'cert/client.crt') certFilePath2 = os.path.join(Constant.workPath, 'cert/client.key') cert = (certFilePath, certFilePath2) return cert # 读取配置文件 def readConfFile(self): configFilePath = os.path.join(Constant.workPath, 'resources/application.ini') cf.read(configFilePath) platformIp = cf.get("CLIENT_INFO", "platformIp") platformPort = cf.get("CLIENT_INFO", "platformPort") appId = cf.get("CLIENT_INFO", "appId") secret = cf.get("CLIENT_INFO", "secret") return platformIp, platformPort, appId, secret # 设置平台对接信息 def clientInfo(self): clientInfo = ClientInfo() clientInfo.setPlatformIp((Constant().readConfFile())[0]) clientInfo.setPlatformPort((Constant().readConfFile())[1]) clientInfo.setAppId((Constant().readConfFile())[2]) clientInfo.setSecret((Constant().readConfFile())[3]) clientInfo = DictUtil.dto2dict(clientInfo) return clientInfo |
业务接口调用方法
设置好Constant.py后才能调用其他业务接口。所有业务接口的测试都在“invokeapiTest”中。以如下几个接口为例说明如何调用业务接口:
关于哪些参数需要设置,请查看《应用侧Python SDK API参考》对于可选参数,如果业务不需要,可以不设置。
配置日志
1 2 3 4 5 6 7 8 9 10 11 |
# 在每个业务接口中都配置了日志,具体日志实现可参考LogUtil.py: # 开发者可通过修改入参来控制日志的输出,以下三个参数都可自行设置; # logPath:日志的输出路径,默认在工作路径d:/python_sdk/log/ # level:日志等级,默认DEBUG(最低等级,即大于等于该等级的日志级别都会输出),如果level=0没有日 志输出 # logFilename:日志名称 def setLogConfig(self, logPath=os.path.join(Constant.workPath, 'log/'), level=logging.DEBUG, logFilename="python_sdk.log"): |
鉴权
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# 在AuthenticationTest.py中对鉴权和刷新token接口进行测试: if __name__ == "__main__": from com.huawei.iotplatform.utils.LogUtil import Log # 实例化Authentication() authentication = Authentication() # 调用鉴权类实例authentication提供的业务接口,如getAuthToken ag = authentication.getAuthToken(Constant().clientInfo()) print("====== get access token ======") print("result:", ag + "\n") # 从返回的ag中获取需要的参数,如accessToken authOutDTO = AuthOutDTO() authOutDTO.setAccessToken(json.loads(ag)['accessToken']) print("token", authOutDTO.getAccessToken()) |
订阅
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
# 在SubscriptionManagementTest.py中对订阅订阅平台业务数据接口进行测试: class SubscriptionManagementTest(object): def subDeviceBusinessData(self): sdbdInDTO = SubDeviceBusinessDataInDTO() sdbdInDTO.notifyType = "bindDevice" sdbdInDTO.callbackUrl = "https://XXX.XXX.XXX.XXX:443/callbackurltest" return sdbdInDTO if __name__ == "__main__": from com.huawei.iotplatform.utils.LogUtil import Log # 实例化 smTest = SubscriptionManagementTest() subscriptionManagement = SubscriptionManagement() # get accessToken at first result = Authentication().getAuthToken(Constant().clientInfo()) authOutDTO = AuthOutDTO() authOutDTO.setAccessToken(json.loads(result)['accessToken']) accessToken = authOutDTO.getAccessToken() # 调用订阅类实例subscriptionManagement提供的业务接口,如subDeviceData ss = subscriptionManagement.subDeviceBusinessData(smTest.subDeviceBusinessData(), accessToken) print("====== subscribe to device business data notification ======") print("result:", ss + "\n") |
注册设备
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
# 在DeviceManagementTest.py中对注册设备接口进行测试: class DeviceManagementTest(object): def regDirectDeviceInfo(self): rddInDto = RegDirectDeviceInDTO() rddInDto.nodeId = "AAA" + str(random.randint(0, 9999)) return rddInDto if __name__ == "__main__": from com.huawei.iotplatform.utils.LogUtil import Log # 实例化 dmTest = DeviceManagementTest() deviceManagement = DeviceManagement() # get accessToken at first result = Authentication().getAuthToken(Constant().clientInfo()) authOutDTO = AuthOutDTO() authOutDTO.setAccessToken(json.loads(result)['accessToken']) accessToken = authOutDTO.getAccessToken() # 调用设备管理类实例deviceManagement提供的业务接口,如regDirectDevice dr = deviceManagement.regDirectDevice(dmTest.regDirectDeviceInfo(), None, accessToken) print("====== register a new device ======") print("result:", dr + "\n") # 从返回的dr中获取需要的参数,如deviceId rddod = RegDirectDeviceOutDTO() rddod.setDeviceId(json.loads(dr)['deviceId']) deviceId = rddod.getDeviceId() print("deviceId==", deviceId + "\n") |
回调接口实现及证书制作
回调接口实现
1 2 3 4 5 6 7 8 9 10 11 |
if __name__ == '__main__': # 回调地址和端口 callbackUrl = "XXX.XXX.XXX.XXX" port = 8099 # 这里使用了pyOpenSSL自带证书,注意ssl_context的值必须是adhoc app.run(host=callbackUrl, port=port, ssl_context='adhoc') # 使用自己配置的证书,ssl_context的值配置如下:此处放置的是第8章节步骤3生成的server证书 app.run(host=callbackUrl, port=port, ssl_context=('d:/python_sdk/cert/server.crt', 'd:/python_sdk/cert/server.key')) |
具体业务实现在“PushMessageReceiver.py”中的“PushMessageReceiver”类中,可以参考Demo中的“PushMessageReceiver”类,需要接收哪一类消息就改写对应的方法,如:
1 2 3 4 5 |
class PushMessageReceiver(object): def handleDeviceAdded(self): print("deviceAdded ==> ", request.json) #TODO deal with deviceAdded notification pass |
接收到平台推送的消息后,开发者需要根据业务进行处理,但不建议进行复杂计算、I/O操作或者可能长时间等待的动作,可以先写数据库,应用进入相应界面或者刷新界面再从数据库取数据并进行数据处理。
回调路径已在SDK中设置好了,所以在订阅时要注意设置对应的回调地址。回调的IP地址则是服务器的地址,需要是公网地址,端口自行配置。
回调证书制作
本章节以自签名证书为例。如果是使用商用证书,请直接向CA机构申请。
注:每个步骤的创建证书请求中的配置,请自行设置。“Common Name (e.g. server FQDN or YOUR name) []:”要输入应用服务器的IP或域名。
- 打开windows命令行窗口,输入where openssl,查询是否安装openssl。
1
where openssl
- 创建测试CA证书。
- 创建私钥。
1
openssl genrsa -out ca-key.pem 1024
- 创建证书请求。
1
openssl req -new -out ca-req.csr -key ca-key.pem
- 自签署证书。
1
openssl x509 -req -in ca-req.csr -out ca-cert.pem -signkey ca-key.pem -days 3650
- 创建私钥。
- 生成server证书。
- 创建私钥。
1
openssl genrsa -out server.key 1024
- 创建证书请求。
1
openssl req -new -out server-req.csr -key server.key
- 自签署证书。
1
openssl x509 -req -in server-req.csr -out server.cert -signkey server.key -CA ca-cert.pem -CAkey ca-key.pem -CAcreateserial -days 3650
- 创建私钥。
- 生成client证书。
- 创建私钥。
1
openssl genrsa -out client.key 1024
- 创建证书请求。
1
openssl req -new -out client-req.csr -key client.key
- 自签署证书。
1
openssl x509 -req -in client-req.csr -out client.cert -signkey client.key -CA ca-cert.pem -CAkey ca-key.pem -CAcreateserial -days 3650
- 创建私钥。
- 在Demo工程中,已经配置好生成的server证书。
- 单击“启动”PushMessageReceiverTest,选择“Run” “PushMessageReceiverTest”。
当有数据推送到应用服务器时,就会进入相应的回调函数中。
回调证书导出
- 使用浏览器打开回调地址https://server:8099/v1.0.0/messageReceiver,以Google为例,并查看证书。
server是应用服务器的地址(即本机地址),8099是在application.properties中配置的端口。
- 系统将弹出证书窗口,选择“详细信息”,单击“复制到文件”。
- 单击“下一步”,进入“导出文件格式”界面,选择“Base64编码”,然后单击“下一步”。
- 指定证书的保存路径,完成证书导出。
如果应用服务器最后部署到云上,可能会有多级证书,建议在部署完成后再导出证书。此时需要将证书链上面几级的证书一一导出。
- 在“要导出的文件”界面,单击“浏览”,选择一个路径,输入文件名,单击“保存”,回到证书导出向导,单击“下一步”。
- 单击“完成”,完成证书导出。
- 在“要导出的文件”界面,单击“浏览”,选择一个路径,输入文件名,单击“保存”,回到证书导出向导,单击“下一步”。
- 若存在多级证书,需一一导出。
- 在“证书”窗口,选择“证书路径”,查看多级证书,选中证书路径中的某个证书,单击“查看证书”。
- 系统将弹出证书窗口,选择“详细信息”,然后重复上述导出证书的步骤,导出已选证书。
- 在“证书”窗口,选择“证书路径”,查看多级证书,选中证书路径中的某个证书,单击“查看证书”。
- 使用文本编辑器,将所有导出的证书以首尾相连的方式,合并为一个.pem格式的文件。该文件需要上传到物联网平台相应的应用下。
回调证书上传
- 登录开发中心,进入相关项目。
- 选择“证书管理”。 ,单击
- 单击“添加”,上传证书。
业务接口调用流程及注意事项
- 请按如下流程调用业务接口。
- Demo中使用的Profile如下图所示,只有一个Brightness服务,Brightness服务下有一个brightness属性和一个PUT命令。在调用创建设备命令或设备服务调用等接口时,如果不是使用以下Profile内容,请将相关服务、属性或者命令名称修改为相应的名称。
- 创建新的Profile方法:
登录开发者中心,选择 ,点击“自定义产品”,进入“设置产品信息”页面。填写“产品名称”、“型号”、“厂商ID”、“所属行业”、“设备类型”、“接入应用层协议类型”等产品信息,点击“创建”。然后点击“+新建服务”(根据设备功能添加属性和命令)最后点击“保存”。
- 修改设备信息接口使用到的字段值如“设备类型”、“厂商名”、“厂商ID”、“设备型号”要与Profile定义的保持一致。
- accessToken可以由SDK管理,也可由第三方应用自行管理,具体信息可参考《Python SDK API参考文档》中 章节的说明。