冲顶大会APP技术选型及架构设计

1.7.2    属性表达

     上边是装备具备的特性,请参见。

1)         UserLevel

用户级别属性,包罗:未知用户、普通用户、低级用户和高档用户等多少个级别。

 

2)         IsStartTimer

收获或设置是或不是打开当前设备的钟表,默许不打开。

 

3)         TimerInterval

赢得或设置当前装备时钟的间隔时间,默许为1秒。

 

4)         IsRegLicense

赢得或设施当前装备是还是不是被登记,默许不挂号。

 

5)         RunDevicePriority

获得或设置当前装备运转级别,分为:普通和先期。假使为优先级别,则先调用该举办发送和接收数据。

 

6)         CommunicationType

得到或设置当前设备的报纸发布类型。包蕴:串口和网络三种。

 

7)         CommandCache

收获或设置当前设备命令缓冲,即使有要发送的数额,则优先调用命令缓冲的数额举办发送。

 

8)         IsRunDevice

收获或设置是不是运行当前配备,固然设置false,当前安装不列席运行(发送和接收数据)。

 

9)         DeviceParameter.IsSaveOriginBytes

标识是不是保存原有发送和接到的字节数据,如若保留,默许保存路径在D盘。

 

10)      object Tag

临时标记属性。

 

11)      object SyncLock

同步锁对象

弹幕

弹幕可以做成容易的request请求格局,也足以使用音讯队列。当然新闻队列也可以接纳云服务,但此间大家运用kafka,布署到服务器集群上展开负荷均衡。对于网速较低的用户大家得以默许关闭弹幕功效,以坚实用户体验。关于高并发和时效性,大家前边再谈。

1.7    创设设备驱动

     
“营造协商驱动”和“营造参数和实时数据实例类”两节都是为构建运行设备做的最初准备,将用作运行设备的习性。

      新建一个装备类:MyDevice,它延续自SCL.Device.RunSCLDevice1。

开发者注意到还有一个SCL.Device.RunSCLDevice类,它是相比早的周转设备类,考虑的阳台的包容性,现在还在持续使用,可是新开发的设备模型不提议采纳SCL.Device.RunSCLDevice类。

它们都是连续自IRunSCLDevice接口。

直播

图片 1

店家得以活动搭建直播服务,当然也足以购买云服务。假使那里选拔阿里的视频直播服务。直播环节将视频流编码传输、转码、加快后推送数据流到客户端。

SuperIO相关材料下载:http://pan.baidu.com/s/1pJ7lZWf

任何事情

注册/登录:调用微信OAuth
2.0绽放授权。具体参考微信开放平台接口文档,那里不在赘述。
奖池:在问答环节为止后进行统一分配,业务简单,不在赘述。调用支付宝提现接口。
推送:可以利用push网关,也得以利用http轮询,也足以采纳云服务。
享用:调用各平台分享接口即可。

1.3.1    发送读实时数据命令协议

处理器发送0x61限令为读实时数据命令,共发送6个字节,校验和为从“从机地址”初始的丰硕和,不包涵“数据报头”、“校验和”和“协议甘休”。

出殡指令数据帧如下:

图片 2

  

最后

大家清除人力花费和奖金开支,单独总计技术资金。单次问答直播几乎20min,大家以10G流量峰值每一日进行试算,大约每一日的技能费用是1万元。当然,那是在用户数量达到自然范围之后。在互连网行业,那并不高。所以,在长时间内,一定会有大批量的知识问答APP问世。

正文只在完整角度考量技术达成,并未涉嫌过多细节。但对此一些有经历的信用社,更加是直播类公司,我想做出那种APP,不会超越一个星期。我们拭目以待吧。

正文欢迎评释出处的转载,但微信转发请联系群众号:caiyongji举办授权转发。

1.9    挂载设备模块

在“工业串口和网络软件通信平台_SuperIO”目录下找到【ConfigTool.exe】应用程序,选拔【设备配备】选卡,单击【挂载设备】按钮,把刚刚支付的装置驱动模块挂载到平台下。如下图:

图片 3

UI设计

图片 4

能够说冲顶大会是照搬HQ的生意逻辑、业务逻辑和UI设计。想必在长期内会有愈多的知识问答APP蜂拥出现。对此我不做过多评论,只说背后的技巧落成,毫不相关商业。

1.7.3    事件作证

以下设备事件都是在原来事件的基本功上开展打包的函数,开发者可以直

接调用以下触发事件的函数,软件平台在开行的时候曾经默许加载了这几个事件。

1)         void OnReceiveDataHandler(byte[] revdata);

接触接收数据事件

 

2)         void OnSendDataHandler(byte[] senddata);

接触发送数据事件,当网络通信的时候,应用Self格局的时候,可以透过那么些事件自主发送数据。

 

3)         void OnDeviceRuningLogHandler(string statetext);

把装备运行日志输出到运行监视器

 

4)         void OnUpdateContainerHandler();

接触更新运行监视器事件

 

5)         void OnCOMParameterExchangeHandler(int oldcom, int oldbaud,
int newcom, int newbaud);

串口改变事件。

 

6)         void OnDeviceObjectChangeHandler(object obj);

对象数据变动事件,用于驱动显示、导出、服务等模块。

 

7)         void OnDeleteDeviceHandler();

去除设备事件

业务逻辑

冲顶大会类APP的技巧困难在于高并发和时效性。为此大家要对工作举办解耦合,将登记/登录、直播、弹幕、问答、奖池、推送、分享全体进展作业分别,这样有助于业务拓展,保险高并发以及后续维护难题。

内部最主要的政工难题和根本在直播、弹幕、问答。直播和弹幕是紧要的流量出口,将其分别有助于有限支持高并发和时效性。

图片 5

1.4    新建设施模块

如下图:

图片 6

增加对SuperIO.dll的引用,如下图:

图片 7

    项目标配制请参见:1.2档次配制。

问答

问答环节作为用户最相关的事体逻辑,大家要保险用户”秒级”接收音讯,那里可以选用一个小技巧,即”同步推送,异步反馈”。也就是说,主持人在说出标题后由单一服务器举行难点推送,但考虑到用户的互联网状态存在分裂延迟,大家得以异步接收用户的答题结果,大家得以将异步反馈的最大时效设计为10s、15s。

1.3    假定通信协议

Flutter

能够说自家是谷歌(Google)的脑残粉,据传言谷歌(Google)的Fuchsia OS
UI都是用Flutter设计的,在那边,Android和IOS的适配都可以行使Flutter完结。具体统筹可以完全模拟HQ。

1.1    开发准备

把“开发包”内的享有文件复制到项指标“bin”目录下,或项目下的专用生成目录。开发包文件包括如下图:

图片 8

  SuperIO.dll是软件平台的骨干模块,
SuperIO目录是软件平台的参数配制、数据存储的目录。

高负载

我提出分别在首都、日本首都、Hong Kong拓展负荷均衡服务器的只要,新加坡服务北方用户,香江服务南方用户,香港(Hong Kong)劳务港澳台以及海外用户。技术上接纳hadoop、zookeeper、docker、nginx等。
图片 9

对于分化地理地方的用户IP,需求展开DNS解析,举办流量自动分发和适配。大家设置可以本着用户的地理位置分化而开展弹幕的分区域显示。
使用CDN加速。

1.8    设备调试

本人在6月4日看看虎嗅推送”王思聪撒币”的音信,然后起始商量背后技术。其中提到直播流、实时弹幕、OAuth2.0开花授权、SMS
api、Push网关、支付接口等业务,其技术已毕并不复杂,大家对此开展分析。

1.7.1    常用接口

1)         public override SCL.ProtocolDriver.ISendProtocol SendProtocol

把写好的发送协议类实例化之后,在此重回。例如:MySendProtocol类。

 

2)         public override SCL.ProtocolDriver.IReceiveProtocol
ReceiveProtocol

把写好的吸纳协议类实例化之后,在此重回。例如:MyReceiveProtocol类。

 

3)         public override SCL.Device.IDeviceParameter DeviceParameter

把写好的设施参数类实例化之后,在此再次回到。例如:MyDeviceParameter类。

 

4)         public override SCL.Device.IDeviceRealTimeData
DeviceRealTimeData

把写好的实时数据类实例化之后,在此再次回到。例如:MyDeviceRTData类。

 

5)         public override void InitDevice(int devid)

先河化设备,可以在此间对发送协议、接收协议、设备参数和实时数据等音讯举行初叶化。

 

6)         public override byte[] GetRealTimeCommand()

其一类是回去读实时数据命令,当CommandCache命令缓冲区中有可发送命令的时候,优先读、发送取命令缓冲区中的命令数据;如若CommandCache命令缓冲区没有数据的时候,软件平台会自行调用GetReal提姆eCommand函数接口,重回读实时数据命令,举办发送。

 

7)         public override void DealData(byte[] data)

当报纸公布正常时,软件平台会把接收到的数据自动传入到这些函数,可以调用ReceiveProtocol属性举行解析数据以及处理、分析、保存。通信正常与否和拔取协议类中CheckData函数接口有关。

 

8)         public override void UnRegDevice()

当软件平台没有注册的时候,软件平台会调用这几个函数。

 

9)         public override void UnknownIO()

当报导链路为null的时候,软件平台会调用这么些函数。例如:串口未打开、网络没有连接等。

 

10)     public override void CommunicateChanged(SCL.Device.IOState
ioState)

当报导状态发送改变的时候,软件平台会调用这一个函数。通信状态包蕴:通讯正常、通讯中断和简报干扰。

 

11)     public override void CommunicateError()

当报导苦恼的时候,软件平台会调用那一个函数。通讯正常与否和吸收协议类中CheckData函数接口有关。

 

12)     public override void CommunicateInterrupt()

当电视发布中断的时候,软件平台会调用这一个函数。通信正常与否和选择协议类中CheckData函数接口有关。

 

13)     public override void CommunicateNone()

当未知通讯状态的时候,软件平台会调用那个函数。一般景色下不会合世此类情形。

 

14)     public override void SaveData()

对处理的数目举办保存。

 

15)     public override void Alert()

认清数据是还是不是丰盛,假使出现很是数据,在开展报警处理。

 

16)     public override void ShowData()

显示数据处理,用于革新设备运行器,以及自定义UI和导出数据。

 

17)     public override void DeviceTimer()

每个设备会分配一个定时器,默许1分钟调用两遍那几个函数。可以通信IsStart提姆er属性启动、截至定时器,通过提姆erInterval属性设置定时器执行间隔。

 

18)     public override SCL.Device.DeviceType DeviceType

归来设备档次,设备档次蕴涵:普通设备、虚拟设备以及任何。

 

19)     public override s y s t e m.Windows.Forms.Control DeviceGraphics

重返设备图形化界面。

 

20)     public override void ShowContextMenu()

来得上下文菜单函数。

 

21)     public override string ModelNumber

回到设备模块编号,也就是设备的型号,那些号码尽量必要不可以重复。

 

24)public void ShowMonitorIODialog();

突显通道监视器窗口

 

25)public void ShowMonitorIOData(byte[] data, string desc);

向运行监视器中显示数据音信

运营

能够说每一次直播都是一回运营,因为有”主持人”因素,所以问答推送和答题结果都是必要”手动”控制的。
具体操作是在直播前准备标题,并且将标题录入数据库,或者某个配置脚本中。在主席互动进度中,进行实时标题推送,并将答题结果上报到主持人。

1.2    项目配制

1)目的框架选拔Framework4.0

图片 10

2)生成的靶子平台选取x86

图片 11

具备事例程序的靶子平台利用x86。首要考虑到32位操作系统与64操作系统的兼容性。

1.3.3    发送和接收数据事例

出殡(十六进制):0x55 0xaa 0x00 0x61 0x61 0x0d

收取(十六进制):0x55 0xaa 0x00 0x61 0x43 0x7a 0x00 0x00 0x43 0xb4 0x15
0x0d

流量数据为:250.00

信号数据为:360.00

1.8.1    界面格局调度

   界面格局测试首若是打造一个主程序,模拟真实的应用程序对装备开展

测试。推荐应用那种测试方法。

1)  引用组件

要害引用DeviceDemo程序集。如下图:

 图片 12

测试设施

界面方式测试是有窗体界面的,必须一连“SCL.UI
.MainForm”类,并用代码把软件平台设置成调试情势“SuperIO.Device.DebugDevice.IsDebug
= true;”,如图:

 图片 13

在Form_Load中起先化实例,并且加载调试设备模块,紧即使开创制备实例、开端化参数、举行设备调试,如:this.DebugDevice((IRunDevice)_myDevice)语句。如下图:

图片 14

3)IO监测器,展现发送和接收的原有十六进制数据,便于调试。如下图:

图片 15

4)用VirtualSerialPortDriver在本机虚拟出来八个串口,八个串口完成了虚拟连接,例如:COM1和COM2;打开串口帮手软件和平台软件(SuperIO平台),分别设置COM1和COM2,依照“1.3如若通信协议”发送和接收数据。相关软件在“协助工具”目录里有。如下图:

图片 16

切切实实测试代码,请参见:FormTest项目。

1.10    在阳台下运作设备

    
把装备驱动挂载好将来,运行“工业串口和网络软件通信平台_SuperIO”目录下的【SuperIO_Run.exe】应用程序,选取【用户管理】->【用户登陆】菜单,选择【工程师】或【管理员】用户,输入默认的密码:123。

登陆到软件平台后,接纳【设备管理】->【扩张设备】菜单,选拔刚刚挂载的装置驱动模块。如下图:

图片 17

支出的好的设备驱动模块同时协助COM(串品)和TCP(互连网)三种简报格局,TCP(网络)通信时帮忙Client和Server三种工作格局。

 

作者QQ:504547114

交流QQ群:54256083

1.8.2    控制台方式调试

控制台测试,没有UI彰显界面,部分机能可能测试不全。须求通过

SCL.Device.IdebugDevice debug=
SCL.Device.DebugDevice.GetDebugInstance()获得调试实例。其余代码与“界面形式测试”一样。如下图:

图片 18

1.5    营造协商驱动

    新建四个类:MySendProtocol
和MyReceiveProtocol,MySendProtocol继承SCL.Device.DeviceSendProtocol基类,MyReceiveProtocol类继承SCL.Device.DeviceReceiveProtocol。

      MySendProtocol
和MyReceiveProtocol五个类都重写(override)“Function61”函数,MySendProtocol类中的Function61函数完毕打包发送命令操作,MyReceiveProtocol类中的Function61函数已毕解析数据操作,FunctionXX在三个类中都会成对出现,重假诺为着好记。

    
在MySendProtocol实例中得以调用DriverFunction函数,传入相应的下令,例如:0x61。会自行调用“Function61”函数,作为调用相应命令函数的驱动接口。GetSendCmdBytes函数接口是在DriverFunction函数基础上包裹的,同样也足以动用,可是要把“isbox“设置成false,否则会对发送的多寡做特殊的拍卖。

  
在MyReceiveProtocol实例中可以调用DriverFunction函数,传入相应的授命,例如:0x61。会自行调用“Function61”函数,作为调用相应命令函数的驱动接口。GetAnalysisData函数是在DriverFunction函数基础上包裹的,同样可以应用,只是多调用了一层GetCommand函数接口。

    具体代码请参见:DeviceDemo项目。

1.7.4    高级应用

1)         void RunIODevice (SCL.CommunicateController.IDeviceIO io)

可以重写那几个函数,在此间改变设备运行的流程,依照CommunicationType属性指定的广播公布类型,可以把io参数转换为互联网通信接口ISocket或串口通讯接口ICOM,之后可以有针对的对殡葬操作和接到操作进行二次开发。一般不提议重写那么些函数。

 

2)         void Send(SCL.CommunicateController.IDeviceIO io, byte[]
sendbytes)

可以重写那个函数,依照CommunicationType属性指定的简报类型,可以把io参数转换为互联网通信接口ISocket或串口通信接口ICOM,进行发送数据操作。在不重写RunDevice函数的动静下,在方便的应用场景可以重写那一个函数。

 

3)         byte[] Receive(SCL.CommunicateController.IDeviceIO io)

可以重写那个函数,根据CommunicationType属性指定的通信类型,能够把io参数转换为网络通信接口ISocket或串口通信接口ICOM,举行接收数据操作。在不重写RunDevice函数的动静下,在适宜的选取场景可以重写那一个函数。

 

4)         void SaveBytes(byte[] data, string desc)

可以重写这一个函数,对殡葬的多寡和接到的多寡进行自定义保存。默许保存在”d:软件平台
原始数据”目录下。

 

5)         void SocketConnect(string ip, int port)

可以重写这么些函数,当网络通讯的时候,有客户端连接到软件平台会调用那么些函数接口。

 

6)         void SocketDisconnect(string ip, int port)

可以重写这一个函数,当互联网通信的时候,有客户端与软件平台断开会调用这些函数接口。

合法网址:http://www.bmpj.net

源作品地址:http://www.bmpj.net/index.php?m=article&f=view&id=4

1.6    营造参数和实时数据实例类

新建八个类:MyDeviceParameter和MyDeviceRTDataMyDeviceParameter继承SCL.Device.DeviceParameter类,用于保存备参数,可以在此类中加进新的设施参数。

          
MyDeviceRTData继承SCL.Device.DeviceReal提姆eData类,用于保存设备的实时数据,可以按照报导协议自定义设备的实时数据。

     
那多少个类继承基类后会自动一连SaveSerialize和GetSerialize五个泛型函数,SaveSerialize函数是把当前目的系列化成XML,GetSerialize是把序列化的XML反向变化对象实例。

         
SCL.Device.DeviceParameter类和SCL.Device.DeviceReal提姆eData类是持续自SerializeOperation类,他们的接口是IserializeOperation,SerializeOperation只是一个概括的体系化XML操作类库。

    
即使开发者想全盘自定义一个数量持久文件,那么可以继承IserializeOperation接口,重写相应的接口函数,自定义存储数据的办法。

 

1.3.2    解析实时数据协议

   
下位机接收到读实时数据命令后,并校验成功,重临实时数据,校验和为从“从机地址”初阶的拉长和,不包括“数据报头”、“校验和”和“协议截至”。

收受数据帧如下:

图片 19