fWX228941 / project

all by myself
1 stars 0 forks source link

PDT设计思路 #64

Open fWX228941 opened 2 months ago

fWX228941 commented 2 months ago

1.框架图

Image

Image

Image

Image

Image

备注: 黄色PDTRIL是框架层与PDT Modem模块通信的接口层,标准的接口设计 蓝色PDTSystem 业务框架层,为UI提供服务,管理业务以及管理数据 数据一致性:PDT模块与PDT应用(数据备份,数据存储) 2.用例图

Image

Image

Image

3.业务图 3.1.模式切换状态

Image

3.1.通话切换状态

Image

Image

Image

Image

fWX228941 commented 2 months ago

4.时序图 4.1.PDTSystem创建时序图

Image

Image

4.2.PDTPhone创建时序图

Image

备注:在PDTPhone创建过程中,如果是第一次开机创建PDTPhone 未同步PDT Modem侧数据默认为数字常规模式,如果非第一次开机,以CPS配置和用户保存的信道为准,如果配置为常规模式,则根据用户保存的当前信道,如果当前信道是模拟信道则是模拟常规模式,如果是数字信道则为数字常规模式 4.3.通话状态注册状态

Image

Image

备注: 1)在模式的注册态,才可以进行语音业务 2)常规模式是不需要注册的,切换到常规初始化在REGISTER

4.4.模式切换

Image

Image

备注:切换信道/切换频道/用户切换/扫描 -》模式切换

4.5.切换组

Image

4.6.扫描

Image

4.7.呼叫

Image

Image

Image

Image

备注: 1)申请话权与释放话权与呼叫或来电流程类似 2)呼叫关联拨号规则,平坦拨号:不需要经过拨号规则库,是什么就拨什么,非平坦拨号需要通过拨号规则来转化号码与呼叫类型,拨号规则是通过jni库的方式集成在应用中,应用通过动态加载的方式调用jni接口来解析号码 4.8.紧急报警

Image

Image

备注:紧急报警分为紧急呼叫、鸣笛、发送短消息 4.9.读频

Image

4.10.写频

Image

4.11.上电

Image

备注: 1)模块的上下电是通过写驱动节点/sys/class/zte_gota_pdt/power实现的,驱动会检测节点值的变化on/off来对pdt模块的上下电 2)下电的方式有两种,直接下电不保存模块数据;给模块关机保存数据后再下电 4.12.LTE数据连接

Image

4.13.定位上拉

Image

4.14.上下行录音

Image

Image

下行录音时序图 备注:录音功能分为两块:一个上行录音AudioRecord[发射录音],一个是下行录音[接收录音]底层驱动完成,通过so的方式将接口提供给应用层,并发考量

4.15.专家模式

Image

备注:主动按照一定周期查询系统码,实时刷新;RIL消息上报驱动刷新,按需刷新

fWX228941 commented 2 months ago

5.核心技术 5.1.系统权限 PDT应用升级为系统应用,android:sharedUserId=”android.uid.phone” 5.2.职责划分 业务框架 1)负责管理PDT业务中的四种工作模式和工作模式的切换 2)管理各工作模式下的服务状态,以及服务注册状态下的呼叫各状态 3)负责与PDT Modem数据同步,管理业务相关的数据 4)为UI提供业务请求与事件/状态上报接口 5)负责与PDTRIL进行交互,将业务请求发送给PDTRIL,处理 PDTRIL上报的消息

PDTSystem:对UI提供所有的业务接口,(包括消息注册获取主动上报的消息、业务请求、业务状态信息获取、设置信息的获取等)它是一个服务类,一旦被应用所创建就不销毁,直到应用完全退出

PDTPhone用于实现与PDT Modem相关的所有业务,它负责创建管理PDTPhone的四种业务的工作模式,另外还负责创建PDTRIL,还负责创建负责与PDT Modem数据同步的类。此外还负责读写频的管理等,管理PDT 的各种业务模式,分发RIL消息至各个模式

PDTPhoneResponse 是PDTPhone的辅助类,用于实现各类消息向UI的上报

PDTPhoneDataUpdate 用于实现应用数据与PDT Modem数据同步,主动向RIL发起与数据同步相关的请求,并解析PDTRIL上报的数据包,调用数据库的辅助类存储数据

PDTCallInfo 用于管理PDT呼叫业务相关的数据信息,比如呼叫号码,呼叫类型,也是UI获取呼叫数据信息的类

PDTSettingHelper、PDTGroupHelper、PDTContactHelper、PDTPhoneContactHelper这些类是用于数据库读写的辅助类,主要提供各类数据读写的各方法

PDTModeBase 是PDTPhone四种工作模式的基类,用于实现各模式的公共方法 DMAMode 用于管理PDT业务处于模拟常规模式下的各业务 DMDMode 用于管理PDT业务处于数字常规模式下的各业务 TMAMode 用于管理PDT业务处于模拟集群模式下的各业务 TMDMode 用于管理PDT业务处于数字集群模式下的各业务 此四种模式在任何时候在PDTPhone中只有一种模式处于激活状态

PDTServiceStatusBase是各种模式下的各状态(注册/非注册、激活/非激活)的基类。在各模式下激活的服务状态只有一个。它管理着如下三个状态: UnRegisterServiceStatus是各模下处于非注册(非激活)状态的基类(是 DMAUnRegisterServiceStatus、DMDUnRegisterServiceStatus、TMAUnRegisterServiceStatus、TMDUnRegisterServiceStatus的基类) 实现各模式处于非注册(非激活)状态的功能 RegisterServiceStatus是各模式处于注册(激活)状态的基类(是DMARegisterServiceStatus、DMDRegisterServiceStatus、TMARegisterServiceStatus、TMDRegisterServiceStatus的基类)实现各模式处于注册状态下的各功能,包括各模式下呼叫状态的管理,在各个模式下激活的呼叫状态也只有一个。 StunStatusBase 是集群模式遥晕与摇毙状态的基类,此状态因只有在集群模式下才有所以它只是TMAStunStatus和TMDStunStatus的基类

CallStatusBase 是各模式下呼叫业务各状态的基类,用于实现与各呼叫状态的公共方法,其子类有如下五个状态 WaitingCallStatusBase 用于实现呼叫开始但还未建立成功的状态,是DMAWaitingCallStatus、DMDWaitingCallStatus、TMAWaitingCallStatus、TMDWaitingCallStatus的基类 IdleCallStatusBase 用于实现呼叫呼叫建立无人讲话的状态,是DMAIdleCallStatus、DMDIdleCallStatus、TMAIdleCallStatus、TMDIdleCallStatus的基类 ListenCallStatusBase 用于实现呼叫呼叫建立处于听的状态,是DMAListenCallStatus、DMDListenCallStatus、TMAListenCallStatus、TMDListenCallStatus的基类 SpeakCallStatusBase 用于实现呼叫呼叫建立处于讲的状态,是DMASpeakCallStatus、DMDSpeakCallStatus 、TMASpeakCallStatus、TMD SpeakCallStatus的基类 DefaultCallStatusBase 用于实现无呼叫建立的状态,是DMADefaultCallStatus、DMDDefaultCallStatus 、TMADefaultCallStatus、TMD DefaultCallStatus的基类

ECSMode 用于管理PDT业务处于加强常规模式下的各业务 PDTServiceStatusBase是各种模式下的各状态(注册/非注册、激活/非激活)的基类。在各模式下激活的服务状态只有一个。它管理着如下三个状态: ECSUnRegisterServiceStatus 实现ECS模式处于非注册(非激活)状态的功能 ECSRegisterServiceStatus实现ECS模式处于注册状态下的各功能,包括各模式下呼叫状态的管理,在各个模式下激活的呼叫状态也只有一个。 CallStatusBase 是各模式下呼叫业务各状态的基类,用于实现与各呼叫状态的公共方法,其子类有如下五个状态 ECSWaitingCallStatusBase 用于实现呼叫开始但还未建立成功的状态 ECSIdleCallStatusBase 用于实现呼叫呼叫建立无人讲话的状态 ECSListenCallStatusBase 用于实现呼叫呼叫建立处于听的状态 ECSSpeakCallStatusBase 用于实现呼叫呼叫建立处于讲的状态 ECSDefaultCallStatusBase 用于实现无呼叫建立的状态

5.3.接口设计

Image

1)消息注册类接口

Image

2)业务请求类接口

Image

3)数据读取相关接口

Image

4)其它

Image

5.4.关键技术 1)采用状态模式管理PDT业务中四种工作模式以及工作模式下各业务状态 PDT业务分为模拟常规、数字常规、模拟集群、数字集群四种工作模式,各工作模式下有不同的服务状态(注册与未注册),注册状态下还有不同的通话呼叫状态,这些工作模式与业务状态该如何有效的管理?因每个时候只可能处于一种工作状态,所有可以采用状态模式来实现,各状态直接才采用事件驱动来切换状态,比如,工作模式切换成功事件驱动工作模式状态的切换;在各个工作模式下服务注册成功事件来驱动服务状态的切换;在通话过程中,用话权事件来驱动通话状态的切换

2)采用外观模式来实现业务框架对UI的统一接口 为了屏蔽复杂的业务类,对UI提供简单的统一接口,减少UI使用的开销,PDTSystem类即为PDT业务框架层的与UI通信的统一对象

3)与PDT modem数据同步 AP侧数据绝大部分数据是从PDT Modem侧同步过来,存放在AP侧数据库,且同步的数据量大,增量批量的同步方法,定时定期的状态同步 4)上报业务消息 为了实现UI与业务状态的同步,PDTSystem提供了UI关注的事件的注册接口,当UI注册了关注事件接口,UI就可以收到事件通知 5)上层主动请求业务 当UI发起业务请求时候,请求业务在框架层转换成事件,发给当前激活的工作模式以及激活的服务状态甚至是激活的呼叫状态处理 6)异常流程

fWX228941 commented 2 months ago

6.类图与流程图

Image

Image

CPS写频

Image

模式切换 备注:自动切换开关打开的情况下,pdt模块不会下电而且需要待机在集群模式下。手动切换切到非pdt模式时,pdt模块会下电。

Image

动态组

Image

自上而下,应用主动向模块发起请求业务的事件

Image

自下而上,模块主动上报状态的事件 7.数据库设计 组呼联系人:ECSGroupContact

Image

UriString: [content://com.zte.pdt.dataprovider.pdtcontactprovider/ecs_group_all_contacts]

个呼联系人/电话联系人:ECSPhoneContact

Image

UriString: [content://com.zte.pdt.dataprovider.pdtcontactprovider/ecs_phone_all_contacts]

ECS紧急报警联系人:ECSEmergency

Image

UriString: [content://com.zte.pdt.dataprovider..pdtemergencyprovider/all_ecsemergencys]

组群:ECSSubGroup

Image

共用数据库表 ECS模式需要增加的字段 Setting:

Image

Image

UriString: [content://com.zte.pdt.dataprovider.pdtsettingsprovider/dm_all_settings]

快捷文本:QStatusText

Image

数据来源于PDT模块和用户产生的人机交互数据,结构化的数据存入数据库,而非结构化简单的数据存入Preference中,固定不变的字段以代码String-Array的方式存储

8.与其他模块的交互设计以及并发设计 1)双模就是并发设计,非PDT模式下,PDT模块不下电,公专网的并发 2)对外提供jar包服务,比如对外提供DMR数据传输接口

fWX228941 commented 2 months ago

9.RIL设计 9.1.框架

Image

Image

备注:RIL是AP与Modem连接的管理通道,每个请求事件,都会有一个接口提供给Gota System调用,一个事件一个接口(包括注册与注销)

9.2.Ril Java

Image

Image

9.3.Ril C Gota RIL的守护进程,开机时被init守护进程调用启动,里面仅有main函数作为入口点,负责完成RIL的初始化和加载工作,动态加载Gota RIL的.so文件,执行RIL_startEventLoop()开启消息队列以进行事件监听,通过执行GotaRIL的rilInit()方法来进行Gota RIL与libril的关系建立,打开LTE 4G的CP模块,然后利用这个终端控制硬件执行,在编译时libril被链入rild,它为rild提供了event处理功能,还提供了在rild与Gota RIL之间传递请求和响应消息的能力,RIL_register()方法的主要功能是启动名为rild 的监听端口,等待java 端通过socket进行连接

9.4.原生的Ril 9.4.1.框架

Image

Image

Image

Image

Android RIL提供了无线硬件设备与电话服务之间的抽象层,rild它负责socket与应用程序框架进行通信,Vendor RIL,这个部分负责向下是通过两种方式与radio进行通信,它们是直接与radio通信的AT指令通道和用于传输数据包的通道,数据通道用于手机的上网功能。

RILJ 一个是RIL模块,这个模块主要用于与下层的rild进行通信;一个是Phone模块,这个模块直接暴露电话功能接口给应用,供他们调用以进行电话功能的实现.

Image

9.4.2.Ril C 所在目录结构:/hardware/ril/  |-- ril     (无线电抽象层) |   |-- include    (头文件ril.h) |   |-- libril    (库) |   |-- reference-cdma-sms (cdma短信参考) |   |-- reference-ril    (ril参考) |   |-- rild     (ril后台服务程序 RIL守护进程,在rild文件夹中还包括一个radiooptions.c文件,它的作用是通过串口将一些radio相关的参数直接传给rild来对radio进行配置)

9.4.2.Ril Java RILRequest:代表一个命令请求 RIL.RILSender:负责AT指令的发送 RIL.RILReceiver:用于处理主动和普通上报信息 RIL.RILSender与RIL.RILReceiver是两个线程。 RILRequest提供了obtain()方法,用于得到具体的request操作,这些操作被定义在RILConstants.java中(RILConstants.java中定义的request命令与RIL原生代码中ril.h中定义的request命令是相同的),然后通过send()函数发送EVENT_SEND,在RIL_Sender线程中处理这个EVENT_SEND将命令写入到stream(socket)中去。Socket是来自常量SOCKET_NAME_RIL,它与RIL 原生代码部分的s_fdListen所指的socket是同一个 Phone模块: 供上层应用程序用户使用电话功能相关的接口 TelephonyRegistry.java 提供了一个通知机制,将底层来的上报通知给框架中需要得到通知的部分 DefaultPhoneNotifier.java 将具体的事件转化为函数调用

10.二开与车载

Image

Image

11.UI设计

Image

Image