边缘网关驱动开发说明
准备工作:
1.在准备开发驱动的机器环境上,安装java 1.7以上版本。
2.下载驱动接口包aep-edge-driveninterface-1.0.0.jar。
注*:demo工程中已经包含了驱动接口包,如果自己新建工程开发,需要引用此jar包。
3.下载驱动demo工程driven-demo-0.0.1.zip
注*:demo工程中有3个驱动实现类,实际一个驱动包中只能放一个 驱动 实现类,如果有多个 驱动 实现类,本地启动时可以都加载,但是部署下发启动时,只有一个 驱动 实现类会被加载。
私有TCP/UDP协议开发说明
私有TCP/UDP协议的接入部分由软网关管理,驱动只需要实现上下行的编解码即可。
1.基本接口。需要实现的基本接口如下:
序号 | 接口名称 | 备注 |
1 | public String getProductId() | 获取驱动对应用来解析的产品id,部署时优先使用配置的产品id |
2 | public Integer getPort() | 获取驱动的监听端口 ,部署时优先使用配置的端口 |
3 | public abstract String decode(byte[] in) | 解码设备上报的消息,格式参考自有网关对接/网关接入规范中的子设备上报数据报文,其中productId可以不用加,deviceId也可以不写,只添加deviceSn(即设备编号)即可,软网关会自动添加productId和deviceId |
4 | public abstract byte[] encode(String in) | 编码给设备的指令,指令格式参考自有网关对接/网关接入规范中的平台下行命令给子设备报文 |
5 | public Integer getHeartbeatTimeout() | 设备心跳超时时间 |
6 | public boolean getIsNoAuthLogin() | 设备是否不认证登陆,如果为true,软网关后台自动根据部署下发的设备信息到天翼物联网平台(AIoT)认证 |
2.私有TCP协议驱动开发说明
由于TCP有粘包问题,所以需要区分报文帧。现有2种方式,一种是用特殊字符做分隔符区分报文数据,还有一种是用长度字段来分割报文。
i. TCP分隔符区分报文模式开发说明
继承TcpDelimiterBasedAdaptorHandler抽象类,实现上面的4个基本接口(基本接口1-4),同时再实现下面的抽象接口。
序号 | 接口名称 | 备注 |
1 | public abstract byte[] getDelimiters() | 获取报文分隔符 |
注*:参考demo工程中的MyTcpDelimiterBasedHandler类。
ii. TCP长度字段区分报文模式开发说明
继承TcpLengthFieldBasedAdaptorHandler抽象类,实现上面的4个基本接口(基本接口1-4),同时再实现下面的抽象接口。
序号 | 接口名称 | 备注 |
1 | public int getMaxFrameLength() | 帧的最大长度。 如果帧的长度大于此值,则会抛出{@link TooLongFrameException} |
2 | public abstract int getLengthFieldOffset() | 长度字段的偏移量 |
3 | public abstract int getLengthFieldLength() | 长度字段的长度 |
4 | public abstract int getLengthAdjustment() | 要添加到长度字段值的补偿值 |
5 | public abstract int getInitialBytesToStrip() | 从解码帧中剥离的第一个字节数 |
注*:参考demo工程中的MyTcpLengthFieldBasedHandler类。
3.私有UDP协议驱动开发说明
继承UdpAdaptorHandler抽象类 ,实现基本接口即可。
注*:参考demo工程中的MyUdpHandler类。
4.完全自定义驱动开发说明
自定义驱动开发实现实例可以参考蓝牙驱动示例,驱动打包时需要把所有依赖类都打包到jar包中,否则驱动将无法加载。
继承ICustomDriven接口,实现里面的所有接口即可,接口说明如下:
序号 | 接口名称 | 备注 |
1 | public void setAepInterface(AepInterface* aepInterface) | 设置aep接口,驱动初始化时,网关会调用此接口设置aep接口 参数说明: aepInterface:平台接口实例 |
2 | public void setProductId(String productId) | 设置产品id,部署下发时,网关会调用此接口设置产品id 参数说明: productId:产品id |
3 | public String getProductId() | 获取产品id @return 产品id |
4 | public void setPort(int port) | 设置监听端口,部署下发时,网关会调用此接口设置监听端口 @param port |
5 | public void start() throws Exception | 启动监听服务,注意:这里不能阻塞线程 @throws Exception |
6 | public void stop() throws Exception; | 停止监听服务 @throws Exception |
7 | public void receiveData(String topic, String data) | 收到平台消息 参数说明: topic:主题 data:数据,格式为json |
其中AepInterface中有如下接口可以调用:
序号 | 接口名称 | 备注 |
1 | public void publishDataToAep(String topic, String data) | 推送数据给平台 参数说明: topic:推送的主题 data:推送的数据,格式参考自有网关对接/网关接入规范中的子设备数据上报 |
2 | public Map<String, ProductDto> getDeviceCache() | @return 返回的是平台部署下发的设备信息,key是产品id |
3 | public Result deviceAuth(String productId, String deviceId, String password, ICustomDriven driven) | 设备到平台认证(注:此步骤必须要做,否则设备无法收到平台下发的指令) 参数说明: productId:产品id deviceId:设备id password:密码,也就是特征串 driven:对应的驱动接口,填调用者自己 @return |
注: deviceAuth接口必须在设备上线时调用,否则设备无法收到平台下发的指令