Metro:开发日记 - zhonglong/TPV GitHub Wiki
七月五日
Play Releases
https://www.playframework.com/releases
Play Change Log
https://www.playframework.com/changelog
七月一日
Chrome/Chrumium浏览器默认最小字号是12px,导致地图线路站点拼音显示太大不协调,打开浏览器“设置”-“自定义字体”来调整最小字号。
CEF3通过 CefBrowserSettings 来设置最小字号。
CefBrowserSettings browser_settings;
browser_settings.minimum_font_size = 6;
browser_settings.minimum_logical_font_size = 6;
CefBrowserHost::CreateBrowser(window_info, handler, url, browser_settings, NULL);
六月十九日
cefsimple客制化:
wWinMain
- 加载 loading.html 作为默认页
- 通过 cmslang.txt 保存和读取默认语言
SimpleApp
- 设置窗口名称和大小(最大化)
SimpleHandler
- 出错处理,超过100次自动退出应用
- 各种回调,例如下载,右键菜单等
六月十三日
从 http://opensource.spotify.com/cefbuilds/index.html 下载CEF3源代码,版本号过滤:3.2840.1518。
CEF General Usage(CEF3预览)
https://github.com/fanfeilong/cefutil/blob/master/doc/CEF%20General%20Usage.md
六月十二日
SmartMRT.exe為CefSimple稍微加個Icon,加上Download/Upload 視窗等修改而成。 而CefSimple又是CEF 3(Chromium Embedded Framework) 的應用。 之前的原始碼放在 \172.17.2.17\home\genebuild\media\500a\MetroShare\SmartMRT.exe_source_code (cef_binary_3.2840.1518.gffd843c_windows32_smartmrt_ots.7z) 原始碼可使用Visual Studio Express 2013 for Windows Desktop 開啟。
CefSimple build出來的exe檔,直接覆蓋至bin.7z裡的SmartMRT.exe,即可使用。 bin.7z 裡其他的dll檔,為CEF本身,也就是Chromium核心,若非必要,建議不需要重新Build CEF (libCEF)。 build 一個CefSimple應用,僅需不到幾分鐘時間,而build一個完整的CEF需耗掉數個小時。
若需要重新build CEF 請參考附件,Source code如官網。 當初是為了支援mp4撥放而自己重新build CEF,官網build好的CEF不支援mp4撥放。 要build支援mp4撥放的CEF,要設置這些參數。 set GN_DEFINES=is_official_build=true proprietary_codecs=true ffmpeg_branding=Chrome set GYP_DEFINES=buildtype=Official proprietary_codecs=1 ffmpeg_branding=Chrome
可參考 http://opensource.spotify.com/cefbuilds/index.html CefSimple Windows 32-bit Builds Standard Distribution https://bitbucket.org/chromiumembedded/cef/src/master/ (CEF) https://www.cnblogs.com/think/archive/2011/10/06/CEF-Introduce.html
六月四日
VLC播放器回调函数:
- MediaPlayer.EventListener
- Media.EventListener
Media.EventListener触发频率更高,包括:
public static final int MediaChanged = 256;
public static final int Opening = 258;
public static final int Buffering = 259;
public static final int Playing = 260;
public static final int Paused = 261;
public static final int Stopped = 262;
public static final int EndReached = 265;
public static final int EncounteredError = 266;
public static final int TimeChanged = 267;
public static final int PositionChanged = 268;
public static final int SeekableChanged = 269;
public static final int PausableChanged = 270;
public static final int LengthChanged = 273;
public static final int Vout = 274;
public static final int ESAdded = 276;
public static final int ESDeleted = 277;
public static final int ESSelected = 278;
六月一日
福清开会提出,设计上不能通过锁定IP范围,此点和现有设计不同. 因此陆续移除代码中对IP的依赖,最新代码不再通过IP地址区分图文屏和地图屏,而是采用屏幕宽高比,以3为分界线,低于3代表图文屏,高于3代表地图屏(条形屏)。
支持的分辨率有:
- 图文屏:1920x1080
- 地图屏:1920x360,1920x290
五月三十日
地铁案IP地址规划:
- PC:信发系统,固定用 192.168.101.8
- 地图屏:按照《M37C拨码说明-V1.3.pdf》,由拨码板指定IP地址,用于定位车厢号和左右位置
- 图文屏:由PC端DHCP服务指定网段,现阶段先配置静态IP地址
后续不再根据IP地址来区分地图屏和图文屏。
五月二十九日
PC端集成CEF(Chromium Embedded Framework)内核来渲染网页,基于 Chromium 54 版本,从时间点来看是在2007年上半年。
Chromium Embedded Framework (CEF) Automated Builds
http://opensource.spotify.com/cefbuilds/index.html
五月二十四日
Android端设置界面,视频同步增加一个Enable开关,配合Master开关,作用于多台设备间的视频同步。 其中必须有一台作为Master,其它作为Slave;当只有一台时必须将Enable关闭,否则无法播放视频。
五月二十二日
手机字体偏大问题的分析 Android端 通过WebSettings.setTextSize接口,可以将字体调小,但是显示偏上(没有居中),故不采用。
网页端 涉及三个JavaScript文件,
- standard_elements_render.js,解析pagejson.js布局文件
- layout.js,页面布局,创建text等各种widget,如createStaticText方法
- sizelab.js,三方库,分辨率自适应相关,通过 addClass('sizelab_reCssFont') 样式来实现
测试发现,PC端会走sizelab.js,故字体大小会随页面分辨率缩放,显示正常;但Android端没有走sizelab.js,故字体大小是按1920x1080来显示的,低于此分辨率的屏幕字体显示都偏大。注意Android端网页取得的屏幕宽高是以dp为单位的。
目前对策是修改standard_elements_render.js,针对Android端手动调整字体大小。
function hdpiFontSize(fontsize) {
if (isRunningOnAndroid) {
return fontsize * viewportW() / sizelab_baseWidth;
} else {
return fontsize;
}
}
五月二十日
smartmrt/publish目录下,扩展名为.cms的文件就是推送到Android端的节目包,这是个压缩文件,解压密码是:philips(全小写)。
五月十五日
修改 SmartMRT.nsi 打包脚本,跳过选择安装路径,默认安装到C盘(之前已提及不能安装到其它盘)。 详见skipChoseDirectory函数:
Function skipChoseDirectory
${If} $VERSION_COMP_RESULT == 1
Abort ; dont allow to change directory install
${EndIf}
${If} $VERSION_COMP_RESULT == 0
Abort ; dont allow to change directory install
${EndIf}
${If} $VERSION_COMP_RESULT == 3
Abort ; dont allow to change directory install
${EndIf}
FunctionEnd
SmartMRT数据库,用户名/密码:root/Ab123456,端口:33369,可用phpStudy带的 SQL-Front 工具查看。
五月十四日
源码 cmsserver 目录下新增一个 precompile.bat 脚本,(打包前)双击进行预编译。 优点:不受PC其它Java版本的影响,也无需修改环境变量。
@echo off
set APPDIR=%cd%
set PLAY_DIR=%APPDIR%\play
cd %PLAY_DIR%
set JAVA_HOME=%APPDIR%\jre
play precompile apps\smartmrt
参考 startplay.bat 脚本。
五月十日
Android端节目包有两层index.html,外层index.html通过iframe加载内层的index.html,因此依赖 layout.schedule.js(外层) 和 std/standard_elements_render.js (内层)来相互通信(例如js函数调用)。 故地图屏模板中加入 std/standard_elements_render.js 来解决一直停留在欢迎页面的问题。
修改 SmartMRT/cmsserver/play/startplay.bat 文件,将 -Dprecompiled=true 改为 -Dprecompiled=false,可以不做预编译,直接运行。
媒体屏和地图屏通过IP地址范围来区分,
- 媒体屏:
192.168.101.21 ~ 192.168.101.80(小于等于80) - 地图屏:
192.168.101.81 ~ 192.168.101.100(大于80)备注:按客户要求,通过拨码板指定地图屏的IP地址,图文屏不做限制
五月九日
地图动画是从左向右移动,还是从右向左移动,与地图屏安装位置有关,以上行列车为例,左侧地图屏动画是从左向右,右侧地图屏动画是从右向左,这样动画都是向着列车前进方向;下行列车则方向相反。 地图屏的左右,通过IP地址末位来区分,奇数是左侧,偶数是右侧。
五月七日
播放器 录播:net.protyposis.android.mediaplayer,硬解,优点是精确的seek操作 直播:org.videolan.libvlc,硬解,UDP组播,配合PC端VLC串流
五月六日
将录播节目模板替换成直播节目模板,涉及到三个文件:
- canvasimg.png,预览图
- layout.dbj / layout.json
- pagejson.js
layout和pagejson文件内容很相似,但感觉起作用的是pagejson,待进一步确认。
- "type":["android_video"] 改为 "type":["udpvideo"]
- "data":[...] 改为 "data":[{"elements":[""]}]
为了减少节目包体积,可以删除media目录下的多余文件(视频和视频预览图)。
五月五日
按照《M37C拨码说明-V1.3.pdf》,终端的IP地址末位用于确认设备位置。 每节车厢10个显示屏,6节车厢,占用21~80共60个IP地址。
按照《混合型地鐵顯示屏Demo步驟.docx》,只有终端的IP地址末位在21~180范围内,才会显示在设备管理页面中。
四月三十日
地铁车头控制系统发送实时站点数据,控制页面显示,其调用流程为:
- TrainControl:封装接口,绑定服务
- TrainControlService:UDP组播建立,接收数据
- TrainControlCmd:解析实时站点数据
实时站点数据参考《动态地图-网络通讯协议-V1.2.xlsx》和《北海_LCD动态地图显示器内部通信协议v1.0.docx》,其中序号29~31的三个字节在两份文档描述有差异,代码与《北海_LCD动态地图显示器内部通信协议v1.0.docx》文档一致。
代码中对实时站点只部分信息,根据这些信息来控制网页,
- 22字节,上下行状态,左右车门开关状态
- 23字节,离站/停稳状态
- 25字节,始发站(站点序号从01开始)
- 26字节,终点站
- 27字节,当前站(停稳状态下当前站与下一站一致)
- 28字节,下一站
- 32~35字节,越战控制
四月二十八日
SmartMRT采用 HTML5WebView 来显示节目,大部分内容都通过网页的方式来展现,播放器等少部分内容通过native方式。
native 和 javascript 通过最简单的方式交互,即:
- native通过 WebView.addJavascriptInterface 方法注入新的javascript函数,通过这些函数可以访问native方法
- native通过 WebView.load("javascript:xxx") 方法直接调用javascript函数
具体来说, javascript 调用 native,包括:
- NativeMarquee
- NativeImage
- NativeSlideShow
- NativeWebpage
- NativeVideo/NativeVideoWithSync:录播视频
- NativeUdpVideo:直播视频
- NativeRemoveAllAndroidViews
native 调用 javascript,包括:
- reportVideoPlayEnd
- setstandby
- setjson,控制数据
四月二十六日
按照《簡易測試串流視頻步驟(透過IP分享器).docx》搭建流媒体服务器, 采用 udp multicast 的方式进行视频直播(串流),点击下方的“循环”图标可实现无间断的流媒体。 对于性能较差的PC,串流时激活转码会导致CPU负载高,影响终端流媒体的流程度。应先对视频做转码,再进行串流。
四月二十五日
阶段性总结,以下涉及的资料都上传在:\172.20.30.16\public\share\地铁系统demo
按照《混合型地鐵顯示屏Demo步驟.docx》搭建演示环境,
- 接著安裝pc_tools\SmartMRT_0.0.2_(20171016103837)_CN_T.exe,不能修改默认路径,否则会有各种问题,例如有些图片无法显示,终端无法注册,节目无法预览等;
- 安裝完成後,點擊 注入長沙地鐵四號線站點資訊\inject_ChangSha_L4.bat (免除手動輸入站點資訊的步驟),这一步不需要,本来就已经有这些数据;
- 目前只有在設備IP位址在192.168.101.21 – 192.168.101.180 才會出現在此頁,若超出該範圍則不顯示。此场景对网络有要求,SCMOBILE路由器已按要求配置,请连到这个路由器上测试;
启动SmartMRT可双击exe,或者在浏览器地址栏中输入 “http://localhost:18888” ,服务端LOG保存在 cmsserver\play\apps\smartmrt\logs 目录下。
按照《簡易測試地鐵訊號說明(透過IP分享器).docx》发送站点数据, 节目推送到Android端,默认是欢迎界面,通过《網路調適助手3.7.exe》发送站点数据才能正常播放。
- IP位址確認完之後,勾選「Data from file….」選擇要模擬的發送資料,站点数据采用《M37B-上行全程-(01-19)長沙四號線.txt》。
- 接著在「RemoteIP」欄位填入「234.6.6.6」,在「RemotePort」欄位填入「20480」,先点击左侧的“连接”按钮才会出现IP地址框。
四月二十四日
跟台北同仁确认,SmartMRT采用 play framework (1.2.7版本)工具编译,这是Java语言的Web服务器(类似tomcat)。
根据官网的文档,配置好JRE路径后可以使用play命令创建或者运行新项目。特别注意的是 play framework 1.2.7 最高支持到JRE 1.7,而且对环境变量 %Path% 优先于 %JAVA_HOME%/bin 。
The High Velocity Web Framework For Java and Scala
https://www.playframework.com/documentation/1.2.7/home
四月二十三日
从 SmartMRT.7z 可以找到台北提交代码的SVN,
http://172.17.1.7/CloudCMS/
http://172.17.1.7/metromap/SmartMRT