资讯动态

海萤物联网教程:Python SDK

发布时间:2026/8/13 16:37:21 来源:尧图企业网站定制
文章目录海萤物联网教程Python SDK简介特点开源安装背景知识API默认参数绑定管道注册服务调用目的节点服务请求和应答数据格式完整示例python版本的ntp服务器开源地址ntp服务介绍读取时间服务1读取时间服务2.返回的是结构体开放服务示例读取时间服务1读取时间服务2海萤物联网教程Python SDK本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明.在线文档地址简介此SDK适用于Python3.5及以上版本。使用此SDK可以让节点连接海萤物联网与其他节点通信。节点可以是终端设备也可以是个人电脑上的程序可以使用此SDK与其他节点通信并可以以服务的形式开放自己的能力。Python SDK是海萤物联网的SDK之一主要有如下功能连接海萤物联网与其他节点通信以服务的形式开放节点自身的能力特点基于此SDK可以极大降低物联网的开发门槛可以实现一行代码连接网络一行代码开放服务一行代码通信开源github上的项目地址gitee上的项目地址安装pip install tziot背景知识海萤物联网教程IA地址格式及地址申请方法海萤物联网教程物联网RPC框架Python DCOMAPIdefbind_pipe_net(ia:int,pwd:str,ip:str,port:int)-int: 绑定网络管道.绑定成功后返回管道号defbind_pipe(ia:int,send,is_allow_send)-int: 绑定管道.绑定成功后返回管道号 :param ia: 设备单播地址 :param send: 发送函数.格式:func(dst_pipe: int, data: bytearray) :param is_allow_send: 是否允许发送函数.格式:func() - bool :return: 管道号 defpipe_receive(pipe:int,data:bytearray):管道接收.pipe是发送方的管道号.如果是用户自己绑定管道,则在管道中接收到数据需回调本函数defis_conn()-bool:是否连接核心网defcall(pipe:int,dst_ia:int,rid:int,timeout:int,req:bytearray)-(bytearray,int): RPC同步调用 :param pipe: 通信管道 :param dst_ia: 目标ia地址 :param rid: 服务号 :param timeout: 超时时间,单位:ms.为0表示不需要应答 :param req: 请求数据.无数据可填bytearray()或者None :return: 返回值是应答字节流和错误码.错误码非0表示调用失败 defregister(rid:int,callback): 注册DCOM服务回调函数 :param rid: 服务号 :param callback: 回调函数.格式: func(pipe: int, src_ia: int, req: bytearray) (bytearray, int) :return: 返回值是应答和错误码.错误码为0表示回调成功,否则是错误码 defconfig_core_param(ia:int,ip:str,port:int):配置核心网参数defconfig_dcom_param(retry_num:int,retry_interval:int): 配置dcom参数 :param retry_num: 重发次数 :param retry_interval: 重发间隔.单位:ms 默认参数当前默认的参数参数值DCOM重发次数5DCOM重发间隔500ms调用config_core_param函数可以修改DCOM参数。config_core_param函数可以修改海萤物联网平台默认地址使用默认值即可不需要调用函数修改。绑定管道tziot包中封装了dcom包在绑定管道时会初始化DCOM。tziot中调用bind_pipe函数可以绑定自定义管道如果使用自定义管道则需应用中调用pipe_receive函数将接收到的数据发送给tziot包。绑定网络管道是绑定管道的一个特例如果节点可以直接连接互联网比如使用以太网或者wifi则调用bind_pipe_net函数即可不需要使用bind_pipe函数和pipe_receive函数。示例绑定网络管道节点地址是0x2140000000000101本地端口号是12021pipebind_pipe_net(0x2140000000000101,pwd,0.0.0.0,12021)返回的是管道号pipe。后续使用call函数与其他节点通信需要使用此管道号。绑定管道后sdk会自动连接海萤物联网可以调用is_conn函数查看连接是否成功。注册服务节点可以通过注册服务开放自身的能力。defregister(rid:int,callback): 注册DCOM服务回调函数 :param rid: 服务号 :param callback: 回调函数.格式: func(pipe: int, src_ia: int, req: bytearray) (bytearray, int) :return: 返回值是应答和错误码.错误码为0表示回调成功,否则是错误码 注册函数中每个服务号rid都可以绑定一个服务。示例假设节点2140::101是智能插座提供控制和读取开关状态两个服务tziot.register(1,control_service)tziot.register(2,get_state_service)defcontrol_service(pipe:int,src_ia:int,req:bytearray)-(bytearray,int):控制开关服务.返回值是应答和错误码.错误码为0表示回调成功,否则是错误码ifreq[0]0:off()else:on()returnNone,dcom.SystemOKdefget_state_service(pipe:int,src_ia:int,req:bytearray)-(bytearray,int):读取开关状态服务.返回值是应答和错误码.错误码为0表示回调成功,否则是错误码returnbytearray([state()]),dcom.SystemOK调用目的节点服务defcall(pipe:int,dst_ia:int,rid:int,timeout:int,req:bytearray)-(bytearray,int): RPC同步调用 :param pipe: 通信管道 :param dst_ia: 目标ia地址 :param rid: 服务号 :param timeout: 超时时间,单位:ms.为0表示不需要应答 :param req: 请求数据.无数据可填bytearray()或者None :return: 返回值是应答字节流和错误码.错误码非0表示调用失败 同步调用会在获取到结果之前阻塞。节点可以通过同步调用调用目标节点的函数或者服务。timeout字段是超时时间单位是毫秒。如果目标节点超时未回复则会调用失败。如果超时时间填0则表示不需要目标节点回复。示例2141::102节点控制智能插座2141::101开关状态为开resp,errCodetziot.call(1,0x2140000000000101,3000,bytearray([1]))示例2141::102节点读取智能插座2141::101开关状态resp,errCodetziot.call(2,0x2140000000000101,3000,None)iferrCodedcom.SystemOK:print(开关状态:,resp[0])请求和应答数据格式建议使用结构体来通信。详情可参考 海萤物联网教程物联网RPC框架Python DCOM 中的数据格式章节。完整示例示例以与海萤物联网中的python版本的ntp服务通信为例。python版本的ntp服务器开源地址github上的项目地址gitee上的项目地址ntp服务介绍python版本的海萤物联网ntp服务上线ntp服务器地址0x2141000000000405当前提供两个服务服务号服务1读取时间12读取时间2.返回的是结构体读取时间服务1CON请求空或者带符号的1个字节。当CON请求为空时则默认为读取的是北京时间时区8。也可以带1个字节表示时区号。这个字节是有符号的int8。小技巧可以使用0x100减去正值即负值。比如8对应的无符号数是0x100-8248。ACK应答当前时间的字符串当前时间字符串的格式2006-01-02 15:04:05 -0700 MST读取时间服务2.返回的是结构体CON请求格式与读取时间服务1一致ACK应答struct{// 时区uint8 TimeZone uint16 Year uint8 Month uint8 Day uint8 Hour uint8 Minute uint8 Second// 星期uint8 Weekday}开放服务示例 Copyright 2021-2021 The jdh99 Authors. All rights reserved. 网络校时服务 Authors: jdh99 jdh821163.com importconfigimporttziotimportdcompyasdcomimportlaganimportsbcfromdatetimeimportdatetime,timedelta TAGntp# 应用错误码# 内部错误ERROR_CODE_INTERNAL_ERROR0x40# 接收格式错误ERROR_CODE_RX_FORMAT0x41# rid号# 读取时间.返回的是字符串RID_GET_TIME11# 读取时间.返回的是结构体RID_GET_TIME22classAckRidGetTime2(sbc.LEFormat):_fields_[# (字段名, c类型)# 时区(time_zone,sbc.c_uint8),(year,sbc.c_int16),(month,sbc.c_uint8),(day,sbc.c_uint8),(hour,sbc.c_uint8),(minute,sbc.c_uint8),(second,sbc.c_uint8),# 星期(weekday,sbc.c_uint8),]defmain():config.init()lagan.load(0)lagan.set_filter_level(lagan.LEVEL_INFO)lagan.enable_color(True)dcom.set_filter_level(lagan.LEVEL_WARN)tziot.bind_pipe_net(config.LOCAL_IA,config.local_pwd,config.LOCAL_IP,config.LOCAL_PORT)tziot.register(RID_GET_TIME1,ntp_service1)tziot.register(RID_GET_TIME2,ntp_service2)defntp_service1(pipe:int,src_ia:int,req:bytearray)-(bytearray,int):校时服务.返回值是应答和错误码.错误码为0表示回调成功,否则是错误码ip,portdcom.pipe_to_addr(pipe)iflen(req)0:time_zone8eliflen(req)1:time_zonereq[0]iftime_zone0x80:time_zone-(0x100-time_zone)else:lagan.warn(TAG,ip:%s port:%d ia:0x%x ntp failed.len is wrong:%d,ip,port,src_ia,len(req))returnNone,ERROR_CODE_RX_FORMAT nowdatetime.utcnow()timedelta(hourstime_zone)iftime_zone0:s%04d-%02d-%02d %02d:%02d:%02d %02d00 MST%(now.year,now.month,now.day,now.hour,now.minute,now.second,time_zone)else:s%04d-%02d-%02d %02d:%02d:%02d -%02d00 MST%(now.year,now.month,now.day,now.hour,now.minute,now.second,-time_zone)lagan.info(TAG,ip:%s port:%d ntp time:%s,ip,port,s)returntziot.str_to_bytearray(s),0defntp_service2(pipe:int,src_ia:int,req:bytearray)-(bytearray,int):校时服务.返回值是应答和错误码.错误码为0表示回调成功,否则是错误码ip,portdcom.pipe_to_addr(pipe)iflen(req)0:time_zone8eliflen(req)1:time_zonereq[0]iftime_zone0x80:time_zone-(0x100-time_zone)else:lagan.warn(TAG,ip:%s port:%d ia:0x%x ntp failed.len is wrong:%d,ip,port,src_ia,len(req))returnNone,ERROR_CODE_RX_FORMAT nowdatetime.utcnow()timedelta(hourstime_zone)tAckRidGetTime2()t.time_zonetime_zone t.yearnow.year t.monthnow.month t.daynow.day t.hournow.hour t.minutenow.minute t.secondnow.second t.weekdaynow.isoweekday()lagan.info(TAG,ip:%s port:%d ntp time:%04d-%02d-%02d %02d:%02d:%02d %02d00 MST,ip,port,t.year,t.month,t.day,t.hour,t.minute,t.second,t.time_zone)returnt.struct_to_bytearray(),0if__name____main__:main()读取时间服务1节点2141::401读取ntp服务器的服务1并打印时间字符串。defmain():pipetziot.bind_pipe_net(0x2141000000000401,pwd,0.0.0.0,12021)whilenottziot.is_conn():passresp,errtziot.call(pipe,0x2141000000000005,1,3000,bytearray())print(err,resp)}输出结果0 b2021-04-03 16:48:50 0800 MST读取时间服务2ntp服务器的2号是结构体形式的时间。importtziotimportsbcclassAckRidGetTime(sbc.LEFormat):_fields_[# (字段名, c类型)# 时区(time_zone,sbc.c_uint8),(year,sbc.c_int16),(month,sbc.c_uint8),(day,sbc.c_uint8),(hour,sbc.c_uint8),(minute,sbc.c_uint8),(second,sbc.c_uint8),# 星期(weekday,sbc.c_uint8),]defmain():pipetziot.bind_pipe_net(0x2141000000000401,pwd,0.0.0.0,12021)whilenottziot.is_conn():passresp,errtziot.call(pipe,0x2141000000000005,2,3000,bytearray())iferr!0:returnackAckRidGetTime()ifnotack.bytearray_to_struct(resp):returnprint(ack.time_zone,ack.year,ack.month,ack.day,ack.hour,ack.minute,ack.second,ack.weekday)if__name____main__:main()输出结果8 2021 4 3 16 47 21 6

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价