CN105429958A - 一种基于Android开发的企业应用平台系统 - Google Patents
一种基于Android开发的企业应用平台系统 Download PDFInfo
- Publication number
- CN105429958A CN105429958A CN201510730898.2A CN201510730898A CN105429958A CN 105429958 A CN105429958 A CN 105429958A CN 201510730898 A CN201510730898 A CN 201510730898A CN 105429958 A CN105429958 A CN 105429958A
- Authority
- CN
- China
- Prior art keywords
- module
- video
- data
- android
- enterprise
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Classifications
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L65/00—Network arrangements, protocols or services for supporting real-time applications in data packet communication
- H04L65/40—Support for services or applications
- H04L65/4061—Push-to services, e.g. push-to-talk or push-to-video
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L51/00—User-to-user messaging in packet-switching networks, transmitted according to store-and-forward or real-time protocols, e.g. e-mail
- H04L51/56—Unified messaging, e.g. interactions between e-mail, instant messaging or converged IP messaging [CPM]
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L63/00—Network architectures or network communication protocols for network security
- H04L63/08—Network architectures or network communication protocols for network security for authentication of entities
- H04L63/0815—Network architectures or network communication protocols for network security for authentication of entities providing single-sign-on or federations
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L65/00—Network arrangements, protocols or services for supporting real-time applications in data packet communication
- H04L65/1066—Session management
- H04L65/1101—Session protocols
- H04L65/1104—Session initiation protocol [SIP]
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L65/00—Network arrangements, protocols or services for supporting real-time applications in data packet communication
- H04L65/60—Network streaming of media packets
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L65/00—Network arrangements, protocols or services for supporting real-time applications in data packet communication
- H04L65/60—Network streaming of media packets
- H04L65/65—Network streaming protocols, e.g. real-time transport protocol [RTP] or real-time control protocol [RTCP]
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L69/00—Network arrangements, protocols or services independent of the application payload and not provided for in the other groups of this subclass
- H04L69/16—Implementation or adaptation of Internet protocol [IP], of transmission control protocol [TCP] or of user datagram protocol [UDP]
- H04L69/161—Implementation details of TCP/IP or UDP/IP stack architecture; Specification of modified or new header fields
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04N—PICTORIAL COMMUNICATION, e.g. TELEVISION
- H04N7/00—Television systems
- H04N7/14—Systems for two-way working
- H04N7/141—Systems for two-way working between two video terminals, e.g. videophone
- H04N7/147—Communication arrangements, e.g. identifying the communication as a video-communication, intermediate storage of the signals
Abstract
本发明涉及一种基于Android开发的企业应用平台系统,包括设备监控模块,其用于采用Modbus?TCP协议通过Socket流来读取工业现场数据,实现实时监控设备状态;视频通话模块,其用于使用Android设备完成对音视频的采集和编码,并通过SIP协议栈完成对视频通话的发起和控制,通过RTSP和RTP协议的配合将数据打包发送,实现视频流的传播;员工交流模块,其用于提供技术交流平台;信息推送模块,其用于推送企业信息。本发明提出了系统总体功能框架以及软件开发模式,解决了界面死锁、服务器响应延时、音视频的不同步和数据传输率低的问题。
Description
技术领域
本发明涉及Android开发技术领域,特别涉及一种基于Android开发的企业应用平台系统。
背景技术
Android从诞生以来就备受瞩目,各种Android应用如雨后春笋不断的涌入人们的生活。Android移动终端也极大的方便了人们的生活。虽然Android早已大红大紫,但是却很少有人将其与企业应用,视频通话,工业过程监控等联系起来。目前企业应用平台多数都是基于PC版进行开发的,我们知道监控是在工业时代诞生的,随着互联网的兴起,监控也开始由现场监控向远程监控演化。至于视频通话的研发,大家似乎也乐此不疲,当然了,鉴于Android智能设备在某些软硬件方面的局限性,目前市面上针对Android视频通话研发的并不多。视频通话通过手机自带的摄像头和麦克风实现音视频的录制,并通过无线网络来实现人与人之间的通话。视频通话在国内外都有着很广泛的市场需求,目前对视频通话的开发PC版本较多,包括QQ,微信,Skype等等。还有就是在苹果IOS系统6.0以上可以通过安装手机软件FaceTime可以实现在Wifi环境下视频通话,但是,通话双方必须都是苹果手机IOS系统。成本较高,应该范围不广。还有就是现在一些社交软件,包括人人,Facebook等等,都加入了视频通话模块,像Facebook中的FacebookVideoSharing,就是一个用来视频通话和分享视频的模块,但是因为某些原因,Facebook在国内的普及率很低。另外市面上还有一些开源的视频通信手机客户端,包括SipDroid手机网络电话,VoIP,IMSDroid等等,目前已经初具规模,软件也很成熟,但是在中小型企业中却普及度不高,这与中小型企业需求不同,从而导致不能大面积普及是分不开的。考虑到功能,资金,二次开发,以及软件的可维护性上,中小型企业迫切需要一款可以满足企业日常需求的软件系统。
发明内容
本发明目的是提供一种基于Android开发的企业应用平台系统,解决现有技术中存在的上述问题。
本发明解决上述技术问题的技术方案如下:
一种基于Android开发的企业应用平台系统,包括设备监控模块、视频通话模块、员工交流模块和信息推送模块;
所述设备监控模块,其用于采用ModbusTCP协议通过Socket流来读取工业现场数据,实现实时监控设备状态;
所述视频通话模块,其用于使用Android设备完成对音视频的采集和编码,并通过SIP协议栈完成对视频通话的发起和控制,通过RTSP和RTP协议的配合将数据打包发送,实现视频流的传播;
所述员工交流模块,其用于提供技术交流平台;
所述信息推送模块,其用于推送企业信息,其中,所述企业信息包括企业概况和企业最新消息。
本发明的有益效果是:提出了系统总体功能框架以及软件开发模式,解决了界面死锁、服务器响应延时、音视频的不同步和数据传输率低的问题。所述系统利于中小型企业的应用,设备的远程监控和企业员工的信息交流和企业信息的推送。
在上述技术方案的基础上,本发明还可以做如下改进。
进一步,所述员工交流模块包括讨论单元和交流单元;
所述讨论单元,其用于采用群聊文本形式,实现群聊;
所述交流单元,其用于采用内嵌式浏览器的开发,并结合邮箱系统,实现交流。
采用上述进一步方案的有益效果是,讨论单元采用群聊文本形式,利于企业员工日常沟通,即时聊天;交流单元采用内嵌式浏览器的开发,并结合邮箱系统,利于企业员工进行专业信息的交流。
进一步,所述系统还包括登录模块,其用于验证登录信息。。
采用上述进一步方案的有益效果是,为系统的登录提供一个权限验证。
附图说明
图1为本发明一种基于Android开发的企业应用平台系统的系统框图;
图2为本发明一种基于Android开发的企业应用平台系统的设备监控模块的监控平台界面原理框图;
图3为本发明一种基于Android开发的企业应用平台系统的数据读取过程流程图;
图4为本发明一种基于Android开发的企业应用平台系统的音视频的录制过程流程图;
图5为本发明一种基于Android开发的企业应用平台系统的RTP数据打包过程流程图;
图6为本发明一种基于Android开发的企业应用平台系统的UDP数据包的封装示意图;
图7为本发明一种基于Android开发的企业应用平台系统的视频通话过程的建立示意图。
具体实施方式
以下结合附图对本发明的原理和特征进行描述,所举实例只用于解释本发明,并非用于限定本发明的范围。
如图1所示,一种基于Android开发的企业应用平台系统,包括设备监控模块、视频通话模块、员工交流模块和信息推送模块。
所述设备监控模块,其用于采用ModbusTCP协议通过Socket流来读取工业现场数据,实现实时监控设备状态。
企业设备远程监控平台主要是针对现场工业机器的远程监控,通过对寄存器的读取获取现场数据,并显示在手机客户端。开发过程中使用Socket套接字建立网络连接,采用ModbusTCP协议进行数据交换。
由于监控过程需要读取大量的数据,所述设备监控模块的监控平台界面如图2所示,包括五个子模块,分别为:主状态、网络设置、脉冲曲线、IO状态和套色参数;其中,主状态对应3个子显示界面,分别为:张力显示、速度指令和周长初值;网络设置对应1个子显示界面,为网络设置;脉冲曲线对应2个显示页面,分别为动态数组和数据曲线;IO状态对应1个子显示界面,为IO状态;套色参数对应4个子显示界面,分别为套色参数、张力参数、读写参数和套色误差;系统采用ModbusTCP协议从工业现场读取寄存器的值,并显示在各个界面中。
所述设备监控模块是整个系统框架中对于界面要求最高的模块,这里我们牵涉到很多数据,开发中需要对数据进行分组,并且在不同的界面中显示,考虑到平台的适应性,开发中,我们尽量做到适应所有Android分辨率,layout布局文件使用线性布局(LinearLayout),此重要属(android:layout_weight)控制整个布局大小自适应。屏幕主要分为三个部分,上面是Tab,中间是页面主体替换结构,动态添加线性布局下面是Menu选项。tab,menu为layout中的main_tab.xml,main_menu.xml,sub.xml为页面主体设计。
UI布局设计是sub.xml文件的具体体现,编程中我们通过引入Button控件来设置按键,并通过按键监听来执行相应的操作,界面中包括上面四个按键,下面五个按键,Button按键在xml中的实现方式大致如下:
<Button
android:id="+id/menu_1"
android:layout_width="0px"
android:layout_height="fill_parent"
android:text="主状态"
android:textSize="dimen/menu_font_size"
android:layout_weight="1"
android:paddingLeft="65px"/>
然后,需要在java文件中获取该控件ID,并且通过按键监听执行相应的动作,其主要代码如下:
子显示界面布局总体来说跟sub界面布局差不多,也是采用线性布局,通过对sub界面主题切换部分的嵌套实现系统子界面的显示。
对于UI结构的设计这里通过UIActivity类来实现,该类是对Activity的一个继承,为整个界面的基本框架,加载sub.xml布局文件,通过反射实现多个界面的重用,主要方法为:getIntentInfo();InflateSubLayout();setButtonView();setPageTag();控制界面之间的跳转和界面布局的替换。
ModbusTCP协议是对Modbus协议的一种TCP数据包的封装,是一种开放的协议;IANA(InternetAssignedNumbersAuthority),也就是互联网编号分配管理机构,将502赋予Modbus协议作为TCP的端口号。对于Modbus协议的获取我们可以通过网站www.Modbus.org获得。
如果ModbusTCP协议采用TCP/IP以太网的五层结构的话,那么对于每一层可以做如下说明:
第一层:这一层主要用来提供网络的物理接口,我们称之为物理层。
第二层:将传输到源硬件地址或者目的硬件地址的信号格式化成相对应的数据帧格式。我们称之为数据链路层。
第三层:将32位的IP地址封装入数据帧,以实现IP数据包。这一层我们称之为网络层。
第四层:该层的主要目的是用来实现设备之间的可靠连接,包括数据的传输,以及查错重发等,当然还有一些对于数据的端口服务和传输调度。称为传输层。
第五层:我们称之为应用层,这里主要是用于实现Modbus的协议报文。
ModbusTCP的数据帧在TCP/IP以太网上传输,可以支持两种帧格式,包括802.3还有Ethernet。ModbusTCP的数据包包括MBAP报文头,含有七个字节;功能码,含有两个字节;以及数据,含有n个字节。其中,MBAP报文头,英文全称为ModbusApplicationProtocol,也就是Modbus应用协议,该报文头分为四个部分,包括两个字节的事务处理标识箱,两个字节的协议标识符,两个字节的长度,一个字节的单元标识符,总共占有7个字节。
ModBus通信链路层格式:
请求:
byte0:事务处理标识符–由服务器复制–通常为0
byte1:事务处理标识符–由服务器复制–通常为0
byte2:协议标识符=0
byte3:协议标识符=0
byte4:长度字段(上半部分字节)=0(所有的消息长度小于256)
byte5:长度字段(下半部分字节)=后面字节的数量
byte6:单元标识符(原“从站地址”)
byte7:MODBUS功能代码
byte8:起始地址(上半部分字节)
byte9:起始地址(上半部分字节)
byte10:读取寄存器个数(上半部分字节)
byte11:读取寄存器个数(下半部分字节)
byte12on:需要读的数据
响应:
byte0:事务处理标识符–由服务器复制–通常为0
byte1:事务处理标识符–由服务器复制–通常为0
byte2:协议标识符=0
byte3:协议标识符=0
byte4:长度字段(上半部分字节)=0(所有的消息长度小于256)
byte5:长度字段(下半部分字节)=后面字节的数量
byte6:单元标识符(原“从站地址”)
byte7:MODBUS功能代码
byte8:数据长度,按字节计算
byte9on:返回的数据
网络通信模块是该模块的重点,网络通信模块是一个耗时模块,需要另外开启线程,在新的线程中读取数据,读取数据成功后,通过Handler的配合,通知主线程刷新页面。Handler是主线程和子线程沟通的桥梁,子线程通过handler配合子线程更新界面UI,handler主要用于接受子线程发送的数据,并用此数据配合主线程更新UI.当应用程序启动时,Android首先会开启一个主线程(也就是UI线程),主线程为管理界面中的UI控件,进行事件分发,比如说,你要是点击一个Button,Android会分发事件到Button上,来响应你的操作。如果此时需要一个耗时的操作,例如:联网读取数据,或者读取本地较大的一个文件的时候,你不能把这些操作放在主线程中,如果你放在主线程中的话,界面会出现假死现象,5秒钟还没有完成的话,会收到Android系统的一个错误提示"强制关闭".这个时候我们需要把这些耗时的操作,放在一个子线程中,因为主线程涉及到UI更新,Android主线程是线程不安全的,也就是说,更新UI只能在主线程中更新,子线程中操作是危险的.这个时候,Handler就出现了来解决这个复杂的问题,由于Handler运行在主线程中(UI线程中),它与子线程可以通过Message对象来传递数据,这个时候,Handler就承担着接受子线程传过来的(子线程用sendMessage()方法传弟)Message对象,(里面包含数据),把这些消息放入主线程队列中,配合主线程进行更新UI。在使用的过程中,我们首先要创建一些新的handler实例,它会绑定到当前线程和消息的队列中,开始分发数据,并重写handleMessage(Messagemsg)方法,用于接受线程数据。
本实施主要是在子线程中实现,通过建立一个Socket连接,传入主机IP地址和端口号,这里端口号为502。另外对于数据的读取主要是对于寄存器的操作,过程包括读单个寄存器以及批量读取寄存器。数据的读取是一个简单的客户端请求服务器,服务器给出响应数据的过程,所述过程的流程图如图3所示。
MobileClient为所有客户端中该模块的基类,子类可以通过继承获得该基类的属性,这里继承自该父类的子类主要包括MobileTcpClient,用于构造一个基于ModbusTcp协议的客户端,提供网络数据的发送和接收功能,从而实现数据的联通。网络连接部分主要也是借助于Java自身提供的Socket来实现的:
socket=newSocket;
socket.connect(newInetSocketAddress(ipParameters.getHost(),
ipParameters.getPort()),getTimeout());
socket.setSoTimeout(getReadTimeout());
in=socket.getInputStream();
out=socket.getOutputStream();
其中的IP地址及其他相关参数都是通过前面实例化一个MobileClient对象来实现的
IpParametersparams=newIpParameters();
params.setHost(ip);
params.setPort(Integer.valueOf(port));
Constant.mMobileTcpClient=newMobileTcpClient(params,true);
Constant.mMobileTcpClient.setRetries(0);
Constant.mMobileTcpClient.setReadTimeout((int)Constant.REQUEST_TIME_OUT;
对于监控内容,通过对现场数据分析,我们这里需要监控的内容包括一些基本的参数值、IO状态以及对动态数组的读取。对数据的分析中,我们大致总结如下几点:
第一点,对于数据的读取,我们采用读取寄存器的方式获取,为了唯一的确定一个寄存器,我们需要知道从机号偏移地址,另外为了数据显示的更准确,这里我们需要对数据类型进行设置。
第二点,单个寄存器值的获取包括两种形式,一种是对于寄存器数值的获取,在显示到客户端之前,我们需要对其处理,按照要求的数据格式显示;另一种是对于单个寄存器位的获取。
第三点,数据中存在从机号相同,偏移地址连续的寄存器,读取过程中我们可以采取批量读取的形式。
基于此,我们设计了三种请求方式
(1)只需要得到某一个寄存器的值
直接使用MobileTcpClient的getValue方法,这里我们需要传入参数包括从机号,功能码,偏移地址以及数据类型。读取一个寄存器的值还包括对于一个寄存器中的某一位的值的获取,返回布尔型,这里主要用来表示IO状态以及开关量。
(2)一次读取多个寄存器的值
构建一个BatchRead<k>,将要请求的MobileLocator添加到BatchRead中,通MoblieTcpClient发送出去,接收BatchResult<k>,其中K为对应的键值,可以根据K来读取对用的数据。
(3)写寄存器
使用MoblieTcpClient的setValue(MoblieLocatorlocator,Objectvalue)方法写寄存器。可用于后期扩展修改寄存器的值。
总的来说对于数据的读取我们需要知道包括从站号,功能码,偏移地址,和数据类型,为了方便存储这些数据信息,开发过程中我们构造了MoblieLocator结构体。MoblieLocator结构体传入getValue函数,其中该结构体中SlaveAndRange,offset(寄存器偏移地址),datatype(数据类型),bit(有效位),这几个参数可以确定唯一的一个寄存器以及读取数据类型或者要读取的寄存器位。最终通过这些参数构造一MoblieRequest,
MoblieRequest已经是一个有效的modbus协议的数据包装,可以直接通过TCP协议发送。
getValue只读取某一固定偏移以及从机地址的值,调用的顺序是
publicObjectgetValue(MoblieLocatorlocator)
|
public<K>BatchResults<K>send(BatchRead<K>batch)
|
private<K>voidsendFunctionGroup(ReadFunctionGroup<K>functionGroup,BatchResults<K>results,booleanerrorsInResults,
booleanexceptionsInResults)
|
synchronizedpublicResponsesend(MoblieRequestrequest)
还有一点需要说明的是,这里有两种读取寄存器方式,一种为读取单个寄存器。另一种为批量读取寄存器的值,实现过程大致为:首先BatchRead接收一批待请求的数据(包括从站号,功能码,偏移地址,数据类型,当然这些参数可以通过MobileLocator结构体或者KeyedMobileLocator来传入),然后BatchRead先根据从站号将数据分组,把从站号相同的存入functionlist集合中,functionlists集合中存的是functionlist,然后通过调用比较器把每个functionlist里面的元素按照偏移地址(offset)从大到小的顺序排列,进而再判断每个functionlist中排序之后的偏移地址是否连续,如果是连续的,则可以直接从某一偏移地址,连续读取多个寄存器实现批量读取,否则,将一组组排序过的元素切割成有效的functionGroups。当然要注意这里每次的最大读取量,不要越界。
数据曲线图的绘制主要是对于achartengine.jar包的使用,achartengine.jar是google提供的开源图表绘制jar包它功能强大,支持散点图、折线图、饼图、气泡图、柱状图、短棒图、仪表图等多种图表。在我们项目中主要利用此jar包进行折线图绘制。
achartengine中有几个特别重要的数据结构:
XYMultipleSeriesDataset:一个图表中多条曲线的数据集合
XYSeries:图表中某一条曲线的数据集合
XYMultipleSeriesRenderer:图表中曲线的表现形式描述类(如曲线宽度,颜色等等)
GraphicalView:图表视图类,用于图表的渲染
这里有两处用到数据曲线图,一处为套色误差图,一处为脉冲曲线下的数据曲线。
套色误差显示界面继承与SubContent作为主页的中间部分,这里要求套色误差有十一哥通道(2-12),分成11条曲线显示。我们可以通过界面上的按钮选择要显示的曲线。
曲线的显示范围是0——32,考虑到手机屏幕的大小以及显示的可见性,我们设置了分页显示,每页显示8个刻度,分四页显示,所以在从前一页切换到下一页的时候要清楚前一页的数据。对于曲线显示,这里有11个要显示的曲线,但是每次只要一个曲线在页面上,所以我们只需定义
/**存储所有曲线数据的数据库*/
privateXYMultipleSeriesDatasetmDataset=null;
/**整个图表的渲染器,包括坐标,颜色等等*/
privateXYMultipleSeriesRenderermRenderer=null;
各一个,为了存储数据,我们定义一个大小为11的数组
publicstaticXYSeriess_curves[]=null;
脉冲曲线下的数据曲线数据主要实现批量读数据请求的封装,以及服务器响应数据的获取。还有分屏显示的实现。套色误差的从机号为64(SlaveId=64),对数据的读取采取批量读取的形式,偏移地址为1040-1050是一个寄存器的值,为了区别每条曲线,我们定义i,i取值0--10来作为与数据匹配的键值,读取寄存器偏移地址为1040+i,i从0递增到10,来连续读取数据,并将服务器返回的数据存放在result中,函数通过键值getvalue(key)获取相应的数据,其中key=i,并将获取的数据存入s_curses[i]中。然后X轴的起始坐标增加0.005,实现曲线的动态效果,因为这里X轴的起始坐标(s_xStart)是递增的,当s_xStart大于当前页面x的最大坐标或者大于我们设定的X轴的坐标的最大值时,增加一页。然后删除上一页的数据。
脉冲曲线下的数据曲线图是对动态数据获取的图形显示,图像的绘制过程可以参考套色误差显示界面。
所述视频通话模块,其用于使用Android设备完成对音视频的采集和编码,并通过SIP协议栈完成对视频通话的发起和控制,通过RTSP和RTP协议的配合将数据打包发送,实现视频流的传播。
通过移动终端设备自带摄像头和麦克风进行音视频的采集和编码,将编码信息打包成RTP数据包进行传输,通过SIP协议栈的设计和控制来建立会话,模块包括系统客户端以及SIP服务器。
视频通话过程主要是包括对音视频的采集,编码解码,还有播放,这一系列动作都可以在手机上完成,所以如果解决了客户端与SIP服务器的连接问题。视频通话的基本流程看起来就比较简单了。就像过程中的视频采集,我们基本可以直接调用手机摄像头和麦克风来采集,而对于音视频信息的编码解码,自Android4.1以后系统也引入了现在比较常用的编码方式H.264进行编码解码,最后只需要将编码后的数据进行RTP打包通过SIP服务器转发给接收端进行解码。
H.264是在MPEG-4的基础上建立起来的,其算法包括视频编码层以及网络提取层,其中二者各自负责不同的功能模块,高效的视频内容模块主要由视频编码层负责;而当需要对数据进行打包传送(打包的格式要按照网络所要求的恰当的格式)时就需要用到网络提取层。只所以选择使用H.264算法,一个是因为Android4.1版本之后的支持,另外一个就是因为H.264高效的数据编码率,H.264的数据压缩比率特别高,简单来讲,当我们需要对同等图像质量的数据进行压缩时,使用H.264的压缩比要比使用MPEG.2的压缩比高两倍以上,同时也是使用MPEG.4压缩比的1.5~2倍。这些都是以H.264编码度高为代价的,相当于H.263的二到三倍之多。H.264的编解码流程大致可以分成五步,第一步是帧间和帧内预测(Estimation),第二步是变换(Transform)和反变换,第三步是量化(Qunantization)和反量化,第四步为环路滤波(LoopFilter),最后一步,也就是第五步就是指熵编码(EntropyCoding)。
音视频录制及编码因为这里用到了摄像头相关功能,所以同样需要修改AndroidManifest.xml文件,增加以下代码:<uses-permissionandroid:name=”android.permission.USE_SIP”/>
<!--允许使用SIP-->
<uses-permissionandroid:name=”android.permission.CONFIGURE_SIP”/>
<!--允许对SIP进行配置-->
<uses-permissionandroid:name=”android.permission.CAMERA/>
<!--允许使用Camera-->
<uses-featureandroid:name=”android.hardware.camera”/>
<uses-featureandroid:name=”android.hardware.camera.autofocus”/>
<!--添加相应的相机特性-->
权限声明之后,接下来就是在Android上对该功能模块进行开发。对于音视频的录制主要包括开启摄像头,然后对摄像头进行初始化,这里Android通过调用MediaRecorder类、SurfaceView类以及相机Camera类来实现。初始化完成之后调用视频录制函数,部分代码如下:
mediaRecorder=newMediaRecorder();
//构建MediaRecorder对象
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
//设置采样的音频源为手机麦克风
mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
//设置采样的视频源为前置摄像头
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
//设置文件输出格式
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
//设置音频编码方式
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.H264);
//设置视频编码方式,这里采用H.264
音视频录制过程中调用prepare和start方法开始录制,音视频的录制过程包括设置相关权限、初始化MediaRecorder、设置预览窗口、设置回调函数、音视频开始录制、数据回调、视频预览、停止采集和资源回收,所述录制过程的流程图,如图4所示。
Android开发中,音视频的录制和编码在智能手机上完成,而后打包成RTP数据包进行数据传输。如图5所示,RTP数据打包过程包括获取一帧数据,并判断是否获取成功,如成功,则依次进行视频数据打包、生成数据包头、添加数据包头和发送数据包,如未发送完毕,则重新获取一帧数据,反正,结束操作;如失败,则判断是否重新获取,是,则重新获取一帧数据,反正,则结束操作。
RTP协议是一种位于传输层上的协议,作为实时传输协议使用时,RTP一般建立在UDP协议之上,也就是说在实时传输数据时一般通过UDP进行传输。虽然UDP协议不是面向连接的协议,有时候会产生丢包,但是作为实时传输视频数据,这也恰恰成了它的优点,保证了,音视频流的顺利传输,而不会出现信息延迟现象。所以使用UDP协议传输延迟慢,同步性高。UDP数据包的封装如图6所示。
Android手机客户端通过对音视频的采样,并且采用H.264的编码格式编码后把数据块封装到RTP包中,然后将每个RTP数据包封装成UDP消息段,最后再封装到IP数据包中即可传输。由于通过H.264得到的视频编码信息为NAL,位于网络提取层,这些数据包往往要比网络能够传输的数据包大很多,所以有时我们有必要将数据分片传播,保证每一片大小都在网络传输允许的范围内。
SIP通信模块是该视频会议中的重点及难点,在视频通话中起着至关重要的作用。用户通过SIP通信模块向SIP服务器发起注册请求以及开始视频通话请求。
对于SIP通信模块的发起,我们首先需要实例化一个SipManager对象,这个对象主要负责发起SIP会话,发起和接受呼叫,以及注册和注销等内容。
publicSipManagermSipManager=null;
...
If(mSipManager==null){
mSipManager=SipManager.newInstance(this);
}
SIP注册,在发起视频通话之前,我们需要完成客户端在SIP服务器上的注册。一个SIP应用中包含两个或两个以上的用户,所以我们必须要保证每个用户都有一个SIP账户,这样才能够进行通信,在该软件设计中一个SIP用户我们通过一个SipProfile对象来实现。该对象包括SIP账户,还有域名以及服务器信息。下面代码展示了我们如何创建一个SipProfile对象:
publicSipProfilemSipProfile=null;
...
SipProfile.Builderbuilder=newSipProfile.Builder(username,domain);
builder.setPassword(password);
mSipProfile=builder.build();
然后需要将刚创建的对象注册到服务器上即可以完成注册。
Android视频通话包括发起视频通话,结束视频通话等,这里我们通过对于Android客户端发起视频通话的过程进行分析来大致的描述SIP协议通信模块在Android视频会议的开发中的实现。
Android移动设备要开始视频通话,需要向SIP服务器发送INVITE请求,请求过程中SIP服务器接受请求,并且对请求进行处理,同时会返回给请求端180(正在拨打)。如果服务器接受该申请,就会向客户端返回200OK,这意味着响应成功,客户接受该响应信息之后回送给服务器ACK。为了让双方都做好多媒体通信准备,在INVITE信息以及200OK的响应信息中,我们应该包括SIP头还有SDP消息体,连接成功。
实际通话过程中,服务器只是起到一个转发控制的作用,所以此处服务器应该还要与被呼叫端交互,形成视频通话。一个基本的视频通话的全过程,包括主叫终端代理A以及被叫终端代理B,一个基本的视频通话过程的建立应该包括终端代理A以及终端代理B与SIP服务器之间的交互过程,如图7所示。
终端代理表示每一个安装了该视频会议模块的Android手机,大致过程如下:
(1)当用户代理A想发起一个视频通话,通话对象是用户代理B,这时用户代理A首先向服务器发送INVITE请求。
Requestrequest=messageFactory.createRequest(requestRUI,
Request.MESSAGE,callIdHeader,cSeqHeader,
fromHeader,toHeader,ViaHeaders,maxForwards);
//发送INVITE请求
sipProviser.sendRequest(requset);
(2)SIP收到用户代理A发送过来的请求之后,会截取该INVITE请求消息中的Via头域中的内容,如果该内容里面包含了服务器地址,则说明发生了错误。如果没有,服务器向其中插入自己的地址,然后向INVITE请求中消息域里To域中指向的终端代理服务器,也就是要视频通话的被请求者,这里指终端代理用户B,发送新的INVITE请求。
(3)这时候SIP服务器需要向终端代理A返回一个应答消息,正在尝试(100Trying)。
(4)而同样的终端代理用户B此刻也需要给SIP服务器回送一个响应消息,正在尝试(100Trying)。
(5)终端代理用户B收到SIP服务器的INVITE请求,并作出100Trying响应后,进而发出指令,使得被叫用户,也就终端代理用户B振铃,同时将振铃信息回送给SIP服务器180Ringing。
Responseresponse=messageFacyory.createResponse
(responseCache.RINGING,invite);
//发送180Ring
ServerTransactionst=sipProvider.getNewServerTransaction(request);
st.sendResponse(response);
(6)SIP服务器将振铃信息转发给终端代理服务器A。
(7)终端代理服务器B做好了视频通话的准备,然后通过200OK通知SIP服务器,连接成功。
(8)SIP服务器将连接成功的信息转发给终端代理用户A。
(9)终端代理用户A收到该消息后回送ACK消息给服务器进行确认。
(10)SIP服务器将确认信息(ACK)转发给被叫用户(终端代理用户B)。
至此,一个完整的视频通话连接建立完成,然后就可以传输音视频信息进行交流了。
所述员工交流模块,其用于提供技术交流平台。
所述员工交流模块包括讨论单元和交流单元。
所述讨论单元,其用于采用群聊文本形式,实现群聊。是一种C/S模型。服务器的监听过程主要是对于服务器端口的监听;服务器通过对端口号的监听来监听客户端的连接,这里允许多个客户端的接入,但是前提是满足软件最开始的登录条件,就是说只要是已经登录了该系统,点击员工讨论区即可以进入聊天模块。客户端连接到服务器之后可以发送信息,服务器在监听到客户端连接之后向系统所有客户端发送广播信息,发送系统消息,广播XX进入聊天室,另外服务器将接收到的客户端的信息同样以广播的形式发送给其他客户端,这样以来,其他客户端都能够收到信息,以实现聊天室的目的。
对于服务器的构建主要是SeverSocket的方法的使用。在前面的基础知识部分,我们已经介绍过Socket通信中的服务器的构造流程,对于服务器的实现,我们首先需要设置两个常量,服务器端口号:SERVER_PORT=****;以及主机IP地址:SERVER_IP=“***.***.***.***”。需要说明的是对于InetAddress.getByName()方法的使用,此方法起到获取主机IP地址以及验证IP地址是否合法的作用,当传入参数为IP地址,直接验证是否合法并返回真实的IP地址,当传入参数为主机名称时,则返回主机IP地址。然后调用ServerSocket方法创建服务器套接字,部分代码如下:
InetAddressinetAddress=InetAddress.getByName(SERVER_IP);
ServerSocketserverSocket=newServerSocket(SERVER_PORT,
Integer.MAX_VALUE,inetAddress);
为了实现多用户的沟通交流,我们需要做到多用户同时在线,所以我们需要为每一个可以连接到服务器的客户端都开辟一条线程,这样就可以做到对每个线程进行简单的通信。部分代码如下:
run()方法中使用到了同步关键字synchronized,主要是为了防止客户端在连接的过程中被错误的漏掉,然后需要调用服务器Socket中的阻塞方法accept();等待客户端的连接,另外为区分注册昵称和发送消息,这里我们采用在消息前加前缀的方法来区别,比如我们当前缀为NC(昵称)的时候消息为注册昵称,当前缀为MSG时为发送消息,对于前缀的识别主要是调用String类中的startWith()方法。另外程序中还设定了服务器端显示进入聊天室的客户端昵称IP地址等,函数contUsers()是用来统计聊天室人数的。
对于客户端的实现我们依然需要传入端口号和IP地址,SERVER_PORT以及SERVER_IP,知道了服务器端口号以及IP地址后,调用客户端初始化函数对客户端的网络连接进行初始化,这里需要用到Socket对象的getInputStream()方法以及getOutputStream()方法,分别用于输入流和输出流的获取。编码格式都采用“UTF-8”,代码如下:
对于消息的读取,程序是使用BufferReader对象中的readline()方法来实现的,我们前面提到过Socket网络连接是一个耗时的过程,所以一般我们不在主线程中实现,这里需要另外开辟一个线程,线程信息更新完成之后向主线程发送消息,配合主线程更新UI界面,这里主要是通过调用Handler的sendMessage()方法来实现的。
所述交流单元,其用于采用内嵌式浏览器的开发,并结合邮箱系统,实现交流。
引入了两种日常生活中比较普遍的邮箱系统,模块中集成了网易邮箱以及qq邮箱,员工可以通过该模块选择自己常用的邮箱进行收发邮件,更好的增加员工之间的技术交流。通过设计内嵌氏的浏览器,通过将qq邮箱登陆地址或者网易邮箱登陆地址设置成浏览器默认的访问地址来实现。
开发过程主要通过WebView的三个辅助类来实现,这三个辅助类包括WebSettings、WebViewClient以及WebChromeClient,其中WebSettings附属于WebView对象,主要是负责对于WebView各种属性的设置,包括字体颜色、字体大小、页面缩放等级以及是否启用缓存机制等等。WebView对象的创建伴随着WebSettings的创建,同时初始化各项属性值。而WebViewClient的主要作用是处理WebView中的各种事件,通过重写需要处理事件的方法来实现对加载网页的各种操作。另外,WebChromeClient主要是用来处理JavaSript弹出的对话框,在开发过程中可用来验证浏览器的各项操作。
对于该模块的开发,我们首先需要实例化一个WebView事件(privateWebViewwebView;)然后对其进行初始化,部分核心代码如下:
而对于myWebViewClient对象来说,主要包括几个模块,其中包括对于新的网址URL的执行,以及页面加载过程中显示加载进度条,页面加载完成后关闭进度条,还有当网址URL错误时显示错误消息。为了实现页面之间的切换,我们需要设置按键监听,这里我们不设置虚拟键,只通过实体返回键来实现。需要说明的是,对于该模块的设计,我们将模块默认的URL指定为特定邮箱的登录地址,以达到登录当前邮箱的目的。
所述信息推送模块,其用于推送企业信息,其中,所述企业信息包括企业概况和企业最新消息。
通过访问网址加载网页的形式来实现。可以利用Android平台提供的WebView控件来进行页面的显示,该控件是Android平台中专门用于浏览网页的组件,是基于开源的WebKit引擎内核。
WebView最简单的应用只需要在布局文件中定义一个WebView控件,然后在java程序代码中实例化这个控件,实例化该控件之后调用控件的loadUrl方法,传入需要访问的网址即可,可以通过对网页的编写,来传递公司概况以及最新消息通知等信息。核心代码如下:
所述系统还包括登录模块,其用于验证登录信息。主要是一个权限验证,对于该系统的设计,软件没有设计注册模块,在有新员工的加入的时候,只需要工程管理人员后台更新员工信息数据库,当用户登录的过程中,需要向服务器发送数据请求,服务器查询数据库,并且与用户输入信息进行匹配,匹配合适,用户即转向主界面登陆系统。登陆系统的设计包括两个动作,一个是记住密码(Preferences的使用),一个是匹配用户数据(由服务器来完成)。对于用户信息的匹配,主要通过客户端向服务器发送POST请求,该请求中包含了用户基本信息,用户名和密码。服务器接收到该请求后进行数据解析,并查询数据库,判断用户信息是否正确,然后将结果通过响应的形式返回给客户端。如果正确,客户端记录下该用户信息并且转到主界面,登陆成功;否则,弹出对话框提示,用户不存在或密码错误,请重新登陆。
以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
Claims (3)
1.一种基于Android开发的企业应用平台系统,其特征在于,包括设备监控模块、视频通话模块、员工交流模块和信息推送模块;
所述设备监控模块,其用于采用ModbusTCP协议通过Socket流来读取工业现场数据,实现实时监控设备状态;
所述视频通话模块,其用于使用Android设备完成对音视频的采集和编码,并通过SIP协议栈完成对视频通话的发起和控制,通过RTSP和RTP协议的配合将数据打包发送,实现视频流的传播;
所述员工交流模块,其用于提供技术交流平台;
所述信息推送模块,其用于推送企业信息,其中,所述企业信息包括企业概况和企业最新消息。
2.根据权利要求1所述一种基于Android开发的企业应用平台系统,其特征在于,所述员工交流模块包括讨论单元和交流单元;
所述讨论单元,其用于采用群聊文本形式,实现群聊;
所述交流单元,其用于采用内嵌式浏览器的开发,并结合邮箱系统,实现交流。
3.根据权利要求1所述一种基于Android开发的企业应用平台系统,其特征在于,还包括登录模块,其用于验证登录信息。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510730898.2A CN105429958A (zh) | 2015-10-30 | 2015-10-30 | 一种基于Android开发的企业应用平台系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510730898.2A CN105429958A (zh) | 2015-10-30 | 2015-10-30 | 一种基于Android开发的企业应用平台系统 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN105429958A true CN105429958A (zh) | 2016-03-23 |
Family
ID=55507900
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201510730898.2A Pending CN105429958A (zh) | 2015-10-30 | 2015-10-30 | 一种基于Android开发的企业应用平台系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN105429958A (zh) |
Cited By (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106936843A (zh) * | 2017-03-31 | 2017-07-07 | 山东超越数控电子有限公司 | 一种用于管理工业自动化系统的通用协议层体系结构及其管理方法 |
CN107507026A (zh) * | 2017-08-15 | 2017-12-22 | 安徽婧文科技有限公司 | 信息智能推广系统及其处理方法 |
CN108667047A (zh) * | 2018-05-22 | 2018-10-16 | 东南大学 | 一种源网荷频率响应系统 |
CN109361671A (zh) * | 2018-10-23 | 2019-02-19 | 华南理工大学 | 一种基于sip协议的流媒体传输架构方法 |
CN110086745A (zh) * | 2018-01-25 | 2019-08-02 | 上海北玻自动化技术有限公司 | 一种自动化连线数据采集控制系统 |
CN110649984A (zh) * | 2019-09-26 | 2020-01-03 | 北京和利时系统工程有限公司 | 一种时钟同步的方法、装置、计算机存储介质及电子设备 |
CN110996029A (zh) * | 2019-12-19 | 2020-04-10 | 山东广电信通网络运营有限公司 | 一种暗访录像方法、装置、终端及存储介质 |
CN111510362A (zh) * | 2020-04-23 | 2020-08-07 | 宁波伟立机器人科技股份有限公司 | 一种基于ModBus数据服务功能的通信方法及系统 |
CN111654426A (zh) * | 2020-08-04 | 2020-09-11 | 北京和利时系统工程有限公司 | 基于Modbus协议的事件顺序记录事件信息获取方法及相关设备 |
CN112712167A (zh) * | 2020-12-31 | 2021-04-27 | 北京清微智能科技有限公司 | 支持多种卷积神经网络加速的存储器访问方法及系统 |
CN114237739A (zh) * | 2021-12-08 | 2022-03-25 | 广州讯飞易听说网络科技有限公司 | 应用程序的图像加载方法、计算机设备及存储介质 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102547239A (zh) * | 2011-12-29 | 2012-07-04 | 浙江工业大学 | 基于Android移动终端的视频监控系统 |
CN102999030A (zh) * | 2012-11-21 | 2013-03-27 | 用友软件股份有限公司 | Erp系统与硬件设备的连接管理装置和连接管理方法 |
CN203311232U (zh) * | 2013-05-06 | 2013-11-27 | 浙江幸福机电科技有限公司 | 基于Android操作系统的发电机组远程监控系统 |
-
2015
- 2015-10-30 CN CN201510730898.2A patent/CN105429958A/zh active Pending
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102547239A (zh) * | 2011-12-29 | 2012-07-04 | 浙江工业大学 | 基于Android移动终端的视频监控系统 |
CN102999030A (zh) * | 2012-11-21 | 2013-03-27 | 用友软件股份有限公司 | Erp系统与硬件设备的连接管理装置和连接管理方法 |
CN203311232U (zh) * | 2013-05-06 | 2013-11-27 | 浙江幸福机电科技有限公司 | 基于Android操作系统的发电机组远程监控系统 |
Cited By (15)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106936843A (zh) * | 2017-03-31 | 2017-07-07 | 山东超越数控电子有限公司 | 一种用于管理工业自动化系统的通用协议层体系结构及其管理方法 |
CN107507026A (zh) * | 2017-08-15 | 2017-12-22 | 安徽婧文科技有限公司 | 信息智能推广系统及其处理方法 |
CN110086745A (zh) * | 2018-01-25 | 2019-08-02 | 上海北玻自动化技术有限公司 | 一种自动化连线数据采集控制系统 |
CN108667047B (zh) * | 2018-05-22 | 2022-04-05 | 东南大学 | 一种源网荷频率响应系统 |
CN108667047A (zh) * | 2018-05-22 | 2018-10-16 | 东南大学 | 一种源网荷频率响应系统 |
CN109361671A (zh) * | 2018-10-23 | 2019-02-19 | 华南理工大学 | 一种基于sip协议的流媒体传输架构方法 |
CN110649984A (zh) * | 2019-09-26 | 2020-01-03 | 北京和利时系统工程有限公司 | 一种时钟同步的方法、装置、计算机存储介质及电子设备 |
CN110996029A (zh) * | 2019-12-19 | 2020-04-10 | 山东广电信通网络运营有限公司 | 一种暗访录像方法、装置、终端及存储介质 |
CN111510362B (zh) * | 2020-04-23 | 2021-08-24 | 宁波伟立机器人科技股份有限公司 | 一种基于ModBus数据服务功能的通信方法及系统 |
CN111510362A (zh) * | 2020-04-23 | 2020-08-07 | 宁波伟立机器人科技股份有限公司 | 一种基于ModBus数据服务功能的通信方法及系统 |
CN111654426A (zh) * | 2020-08-04 | 2020-09-11 | 北京和利时系统工程有限公司 | 基于Modbus协议的事件顺序记录事件信息获取方法及相关设备 |
CN111654426B (zh) * | 2020-08-04 | 2020-11-03 | 北京和利时系统工程有限公司 | 基于Modbus协议的事件顺序记录事件信息获取方法及相关设备 |
CN112712167A (zh) * | 2020-12-31 | 2021-04-27 | 北京清微智能科技有限公司 | 支持多种卷积神经网络加速的存储器访问方法及系统 |
CN114237739A (zh) * | 2021-12-08 | 2022-03-25 | 广州讯飞易听说网络科技有限公司 | 应用程序的图像加载方法、计算机设备及存储介质 |
CN114237739B (zh) * | 2021-12-08 | 2024-02-02 | 广州讯飞易听说网络科技有限公司 | 应用程序的图像加载方法、计算机设备及存储介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN105429958A (zh) | 一种基于Android开发的企业应用平台系统 | |
US8037191B2 (en) | Low-level remote sharing of local devices in a remote access session across a computer network | |
CN100562095C (zh) | 一种用即时消息系统实现视频会议的方法及系统 | |
CN110213652B (zh) | 一种音视频数据传输方法、装置及存储介质 | |
US20090119408A1 (en) | Method for managing execution by a server of an application providing at least one interactive multimedia service to at least one terminal, corresponding computer program product and server | |
CN102547239A (zh) | 基于Android移动终端的视频监控系统 | |
US20130282820A1 (en) | Method and System for an Optimized Multimedia Communications System | |
CN101854380B (zh) | 一种实现跨平台的p2p视频聊天的方法 | |
CN109327493A (zh) | 一种基于云的远程医疗监控系统及监控方法 | |
CN102075737A (zh) | 视频监控会话方法 | |
CN109688364A (zh) | 视频会议方法、装置、服务器及存储介质 | |
CN103458087A (zh) | 一种基于rtmp的远程手机测试体验方法 | |
EP4262320A1 (en) | Call processing system and call processing method | |
CN103905597B (zh) | 一种计算机控制管理VoIP话机的方法及系统 | |
CN103095752A (zh) | 语音视频的录制方法、装置及系统 | |
KR20130026609A (ko) | 멀티미디어 클라우드 시스템의 클라이언트에서 멀티미디어 클라우드 서비스 제공 장치 및 방법, 그리고 멀티미디어 클라우드 시스템의 소셜 네트워크 서비스 서버에서 멀티미디어 클라우드 서비스 제공 방법 | |
CN103155530B (zh) | 包括将脚本命令下载至用户终端的网络-电信融合 | |
CN110012322A (zh) | 一种视联网业务发起的方法和系统 | |
CN101742265A (zh) | 视频监控方法、固网视频监控业务平台及移动终端 | |
CN113473395B (zh) | 消息处理方法、装置、介质及电子设备 | |
CN103684992A (zh) | 家庭网关、终端和数据共享方法 | |
CN101834894A (zh) | 远程处理方法、装置及系统 | |
CN208061282U (zh) | 一种二维码控制装置及其闸机系统 | |
CN110032427A (zh) | 基于虚拟化实现在线云应用管理的系统及其方法 | |
US20130198399A1 (en) | Input/output communication |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
RJ01 | Rejection of invention patent application after publication |
Application publication date: 20160323 |
|
RJ01 | Rejection of invention patent application after publication |