iOS 逆向入门 - TikTok 调试

一、MonkeyDev 1、简介 MonkeyDev 是一个工具集合,基于 iOSOpenDev 进行升级并集成到 Xcode 里面,可以用来开发越狱机器的插件,可以很方便地注入动态库并重签名安装到非越狱机器,堪称神器。 2、安装 参考官方文档进行安装:https://github.com/AloneMonkey/MonkeyDev/wiki 3、开始使用 新建 MonkeyApp 项目。 拖入 已砸壳 的 ipa 包到指定文件夹 配置开发证书。 如无意外即可运行到手机上。 4、其它运行问题 1. 链接错误 ld: file not found: /usr/lib/libstdc++.dylib 这是由于 Xcode 10 开始就不再集成 libstdc++ 库,需要把相关的库文件重新添加到对应的路径。 使用 GitHub 上的这个库 https://github.com/devdawei/libstdc- 可以比较方便地添加 libstdc++ 库。 2. Bundle ID TikTok 对 Bundle ID 应该有校验,用其它 Bundle ID 会导致无法联网,这时候可以在 Build Settings 里面,找到 MONKEYDEV_DEFAULT_BUNDLEID 设为 YES,这时候重新编辑安装到手机即可。 3. 需要国外手机卡 TikTok 对地区有限制,手机需要插上国外手机卡才能进行开播,这样对调试不太友好。 CTCarrier 是iOS上获取运营商信息的系统框架,我们可以对其进行 Hook,使其返回指定运营商信息。...

September 3, 2021 · Darren Ou

C 语言中利用单引号表示整数

背景 在进行与竟品的性能对比中,需要知道竟品的部分参数,与竟品对齐参数后再进行性能测试。 在 hook TikTok 的摄像头输出参数时发现,PixelFormatType 的值是整数 875704422,这样的一串整数很难知道其含义。 分析 从 key PixelFormatType 可以猜出是 kCVPixelFormatType 枚举中的一个,kCVPixelFormatType 枚举中大部分的值是以 '420f' 这样的单引号形式来表示,通过逐一对比知道,原来 875704422 对应的就是 kCVPixelFormatType_420YpCbCr8BiPlanarFullRange 的值,也就是 '420f'。 那么,为什么 875704422 == '420f' ? 原来,可以通过 ascii 编码进行转换,以 '420f' 为例: 4/2/0/f 的 ascii 编码分别为 52/50/48/102 ,转换为二进制分别为 00110100/00110010/00110000/01100110,合并起来 00110100001100100011000001100110 转换为十进制,刚好就是 875704422。 为方便看出对应的字符串,写了以下转换算法: 转换算法 NSString * changeToTypeStr(int value) { char *str = malloc(10); int count = 0; while (value > 0) { char ch = (char)(value & 0xFF); str[count] = ch; value = value >> 8; count ++; } if (count > 1) { int left = 0, right = count - 1; while (left < right) { char tmp = str[left]; str[left] = str[right]; str[right] = tmp; left ++; right --; } } str[count] = '\0'; NSString *res = [[NSString alloc] initWithUTF8String:str]; free(str); return res; }

September 1, 2021 · Darren Ou

iOS 逆向入门 - 砸壳

一、背景 iOS 手机通过 App Store 安装的应用都经过加密,无法直接进行逆向分析。我们需要对应用进行解密,称为“砸壳”。 我手上的设备是 iPhone 6s,系统是 iOS 13.5.1 二、手机越狱 安装爱思助手,一键越狱的工具里面有很多个工具(不一定需要安装爱思助手,可以直接从官网下载越狱工具)。 这里主要推荐两个:一个是通过硬件漏洞进行越狱的 checkra1n;一个是通过软件漏洞进行越狱的 Unc0ver。 相对来说通过硬件漏洞进行越狱的 checkra1n 会比较稳定,我使用的是 checkra1n。 按照提示进行操作,手机重启后会出现 checkra1n 应用,打开应用安装 Cydia (这个过程手机需要连接代理)。 注意:不同的越狱工具,对手机跟系统都有要求,太新的设备或者太新的系统都有可能不支持,需要仔细阅读官网的文档。另外,保证手机的重要资料都已经备份。 三、通过 SSH 连接手机 1. Wi-Fi 手机安装 Cydia 后,默认安装了 OpenSSH,可以直接通过 Wi-Fi 或者 USB 连接手机。 ssh root@your_device_ip_address // 密码默认为 alpine 2. USB // 安装 usbmuxd brew install usbmuxd // 建立端口映射(把 2222 映射到 22) iproxy 2222 22 // 建立 ssh 连接 ssh -p 2222 root@localhost 建立端口映射时,终端会一直显示 “waiting for connection”,这是正常的,新建一个终端窗口进行其它操作即可。...

August 30, 2021 · Darren Ou

iOS 逆向入门 - 工具

iOS 越狱 https://checkra.in/ (基于硬件漏洞,较稳定) https://unc0ver.dev/ (基于软件漏洞,每次重启手机后都要再越狱) App文件系统结构 https://www.i-funbox.com/zh-cn/index.html https://macroplant.com/iexplorer App UI调试工具 https://revealapp.com/ https://lookin.work/ (免费) 反编译工具 https://hex-rays.com/ida-pro/ https://www.hopperapp.com/ MachO https://github.com/gdbinit/MachOView 越狱开发框架 https://github.com/theos/theos ipa砸壳工具 https://github.com/stefanesser/dumpdecrypted https://github.com/KJCracks/Clutch https://github.com/AloneMonkey/frida-ios-dump class-dump http://stevenygard.com/projects/class-dump/ 动态库注入 https://github.com/alexzielenski/optool 获取keychain信息 https://github.com/ptoomey3/Keychain-Dumper 工具集 https://github.com/kokoabim/iOSOpenDev https://github.com/AloneMonkey/MonkeyDev (基于iOSOpenDev开发,可开发非越狱插件) 持续更新。。。

August 29, 2021 · Darren Ou

OpenGL + Xcode 开发环境搭建

一、OpenGL 相关库的下载与安装 GLFW GLFW 是配合 OpenGL 使用的轻量级工具程序库,缩写自 Graphics Library Framework(图形库框架)。GLFW 的主要功能是创建并管理窗口和 OpenGL 上下文,同时还提供了处理手柄、键盘、鼠标输入的功能。 就是用来创建窗口界面。 // 使用 Homebrew 安装: brew install glfw3 // 头文件路径 /usr/local/Cellar/glfw/3.3.4/include/GLFW // 库路径 /usr/local/Cellar/glfw/3.3.4/lib GLEW OpenGL Extension Wrangler Library (GLEW), a cross-platform C/C++ library that helps in querying and loading OpenGL extensions. 实现对底层OpenGL接口封装。 // 使用 Homebrew 安装: brew install glew // 头文件路径 /usr/local/Cellar/glew/2.2.0_1/include/GL // 库路径 /usr/local/Cellar/glew/2.2.0_1/lib Glad 作用与 GLEW 类似。 下载地址:https://glad.dav1d.de/ Language: C/C++ Specification: OpenGL API: Version 3....

August 4, 2021 · Darren Ou

macOS 解决 App Nap 导致 Timer 回调变慢问题

背景 在开发 macOS 上的窗口共享过程中,发现 demo 被其它应用覆盖后,在25s左右,观众收到的窗口画面开始变得卡顿。 经过排查发现问题出在主播端的采集逻辑处。在我的上一篇文章 macOS 屏幕共享开发 提到,窗口共享的实现跟屏幕共享不一样,窗口共享没有现有的系统接口,需要启动一个 Timer 去定时对窗口截图,再对截图进行处理。 通过打印日志发现,demo 进入后台后,Timer 在25s左右,回调开始变慢,大约2s才回调一次,问题的原因就出在这里。 排查原因 为了避免其它逻辑影响了结果,新建一个干净的 demo。 我在窗口共享中用的是 GCD Timer,一开始猜测是 GCD Timer 的某些参数没有设置,查看文档后没找到相关的参数;然后猜测 GCD Timer 的问题,但是换成 NSTimer 后,发现也有一样的问题,这时候我开始猜测是系统导致的问题了。 开始查阅资料,发现了 一篇文章 里面提到: App Nap 是 OS X 10.9 Mavericks 的一项新功能。它能帮你在同时运行多个应用程序时节省电能。 这时候有了切入点,查询关键字 App Nap 就可以发现相关资料。 App Nap 附上苹果官方说明文档:Extend App Nap If an app isn’t performing user-initiated work such as updating content on screen, playing music, or downloading a file, the system may put the app in App Nap....

July 5, 2021 · Darren Ou

macOS 屏幕共享开发

一、屏幕录制权限 应用首次创建屏幕截图或者窗口截图时(以下任一接口都可以),就会显示系统的权限申请弹窗,通过选中Screen Recording里面的相关应用,重启应用后即可开启权限。 CGDisplayCreateImage() CGDisplayCreateImageForRect() CGWindowListCreateImage() CGWindowListCreateImageFromArray() 二、获取screenId 通过AppKit的NSScreen.screens或者通过CoreGraphics的CGGetActiveDisplayList()都可以获取当前的所有显示器信息,下面用NSScreen.screens举例子: [NSScreen.screens enumerateObjectsUsingBlock:^(NSScreen * _Nonnull screen, NSUInteger idx, BOOL * _Nonnull stop) { NSNumber *screenNumber = screen.deviceDescription[@"NSScreenNumber"]; if (screenNumber) { CGDirectDisplayID displayId = screenNumber.unsignedIntValue; NSLog(@"displayId: %d", displayId); } }]; 注意:如果是镜像显示,则只会打印一个显示器信息。 三、获取windowId 1、获取windowId列表 通过接口CGWindowListCopyWindowInfo()可以获取windowId列表。 其中kCGWindowListExcludeDesktopElements参数表示从列表中排除所有属于桌面元素的窗口。 CGWindowListCopyWindowInfo()返回的是一个CFArrayRef,使用完后需要主动release。 这里有一个技巧,利用CFBridgingRelease()函数,可以把CFArrayRef桥接到NSArray,并且会把内存管理转移到ARC,就是说我们不需要再去主动release了。 NSArray *windowDictArr = CFBridgingRelease(CGWindowListCopyWindowInfo(kCGWindowListOptionAll | kCGWindowListExcludeDesktopElements, 0)); 2、过滤无用windowId 通过以上接口获取到的windowId列表可能会包含很多我们不关心的windowId: 1. 没显示出来的window 通过kCGWindowLayer跟kCGWindowAlpha两个key,可以获取到当前window是否有layer以及是否透明,我们需要过滤掉不可见的window。 2. 过滤信息不全的window kCGWindowNumberkey可以从字典里获取到windowId,需要过滤没有windowId的字典信息。 3. 过滤无法获取截图的window 通过CGWindowListCreateImage()接口,传入对应windowId,可获取到window的截图,如果无法获取到截图,可能没有录屏权限、不是window主体、window不可见。 3、获取window frame 通过CGRectMakeWithDictionaryRepresentation()可获取窗口的frame,某些业务可能需要用到frame。 四、屏幕共享 屏幕共享的视频输入总体来说跟摄像头的视频输入相当类似,可以理解成视频流从摄像头改成了屏幕输入(AVCaptureDeviceInput->AVCaptureScreenInput),视频输出的处理则跟摄像头的输出处理完全一样。 1、关键代码: - (void)startCapture { self....

May 18, 2021 · Darren Ou

群晖 NAS - 购置篇

为什么想要购买NAS 我的理解NAS无非就两个作用,一个是作为资料存储容器,一个是作为个人服务器 作为资料存储容器 这个很容易理解,NAS就是一块很大的磁盘(空间大),足够我接下来三年的资料存储需要。两块磁盘以上组raid(安全)。 作为个人服务器 这个就很好玩了,可以说是只有想不到,没有做不到。 举几个例子: 文件共享服务器,可以在任意地方访问我的NAS里面的文件(局域网或公网); Homebridge服务器,把Homebridge部署到NAS里面,可以轻松桥接小米智能家居; Gitlab服务器,把仓库放在自己家,放心; 资料备份,Mac可以直接通过Time Machine备份到NAS,手机也有相应的工具备份; 下载工具、邮件服务器、娱乐中心…… 选购 明确需求 我选购前就明确了几方面的需求,优先级由高到低排序: 数据安全优于一切; 系统成熟稳定,考虑到家人也会使用,需要足够易用; 双盘位以上,用于组raid保障数据安全; 作为第一个NAS,有一定的性价比; 系统选择 对比了几个系统: 群晖,各大博主推荐; 威联通,很多人把威联通比作安卓,群晖比作iOS; TrueNAS,开源的NAS系统,前身是FreeNAS,功能非常强大,但对硬件有一定门槛,且操作也不足够易用; Linux或Windows自组系统,需要有一定运维能力,使用不太友好。 综上,最终选择群晖系统。 品牌选择 确认需要群晖系统后,有两种选择,一个是选择群晖官方的机器,一个是购买其它的机器刷入黑群晖系统。 考虑到其它机器不一定能很好地兼容群晖系统,而且黑群晖系统没有官方的技术支持与QuickConnect功能(黑群晖洗白后可支持),作为第一台NAS,我还是买群晖官方的机器会更有安全感。 型号选择 明确了需求已经很好选择了,最终选择了群晖DS220+。 硬盘 NAS是7x24运行,而且数据安全非常重要,所以选择硬盘需要相当谨慎。 酷狼是希捷主推的NAS专用硬盘,大部分店家都是推荐酷狼,在没有了解过硬盘信息的情况下,闭着眼睛选酷狼就可以了。 于是我买了两块酷狼8T硬盘。不过我后悔了。 因为希捷还有一个银河系列,专为企业用户打造。对比酷狼转速跟缓存都更高,意味着读写速度更快,官方宣称的无故障时长比酷狼多出两倍,而且质保是5年,比酷狼多出两年,价格还比酷狼便宜(2021.3)。 所以我是首推希捷银河系列,其次是酷狼系列。 至于西数,我还没用过西数的产品,我后面估计会换一个西数的硬盘,毕竟鸡蛋不能放在一个篮子里。 UPS UPS 即不间断电源 (Uninterruptible Power Supply) 虽说酷狼硬盘是专为NAS打造,但是突然断电对硬盘的伤害非常大,非常容易造成数据的丢失,非常多的博主都建议买一个UPS,避免突然断电造成数据丢失。 UPS我选择的是施耐德BK650M2,原因是它跟群晖有很好的兼容性,可以实现断电后UPS备用电将要耗尽时通知群晖关机。 路由器 我原来在用的路由器是小米路由器mini,说是千兆路由器,但实际上远远没有千兆(这个我还排查了很久,珍惜生命远离小米路由器),这肯定会影响NAS的使用体验。趁着这次,顺便把路由器也换了。 需要有WiFi6、链路聚合功能,主要在考虑华硕路由器的两个型号:AX82U、AX86U 我最终选择了AX82U,价钱是AX86U的一半,我觉得最大的不足就是没有2.5G网口。 其它 内存 群晖DS220+是2G内存,考虑到会使用docker,2G内存可能不太够,我添加了根三星4G内存条。 机柜 我喜欢整洁,还买了个家用机柜收纳上面的设备。 总支出(2021年3月购买) 群晖DS220+(2250) + 希捷酷狼8T * 2(2360) + 施耐德UPS(420) + 三星4G内存条(140) + 华硕路由器AX82U(770) + 机柜(130) = 6070...

March 20, 2021 · Darren Ou

购房小记

2020.11.15 到现场看房 之前也断断续续地看过不同的房子,新房二手房都有看过,新房如亚运城、品秀星瀚,二手房如雅居乐、祈福新村、市桥的老小区等。 总体感觉雅居乐比较满意,首先是小区环境比较好管理比较完善,其次位置靠近番禺CBD靠近华快入口,升值空间应该比较大,但是比较新的将近4w的单价,感觉有点超预算。 其它的要不太远、要不太旧、要不人口密度太高,没有特别喜欢的。 当天总共看了三个楼盘,靠近市桥地铁站的璞悦台,禺山西路的龙光天瀛跟大华紫悦府。 璞悦台附近都是村庄,周边环境一般,教育资源比较一般,距离地铁站还有一定距离,虽然单价较低,但是也比较快就否决了。 龙光天瀛跟大华紫悦府比较相近,资源上应该差不多,龙光就在环境监测站的旁边,环境应该是最好的,而且单价比大华便宜。大华建在大路边,环境略逊一筹。 但看中大华的有几点: 1、靠近海伦堡创意园,相对靠近市桥地铁站,升值空间应该会更大; 2、教育资源相对确定,幼儿园已建好,小学初中正规划中; 3、验收标准较高,配置大金中央空调。 最终跟老婆商量还是大华紫悦府更加适合。 2020.11.17 给定金 这天刚好是一位同事新房入伙请吃饭,我就请了一个下午的假。下午过去大华再确认了一些细节,还有谈价格。 谈价格我跟老婆都不太行,最终只是争取了个8w的车位抵用券,最终还不一定用得上。 最终签完合同都快要7点了,要赶去同事那吃饭。这中间还出了个小插曲,天气降温导致车胎的气压不够,触发了胎压告警,我还以为是车胎被扎了打车过去同事那,吃完饭回来再开车去修,最终发现是虚惊一场。 2020.11.23 给首付、签署合同 这天是老婆生日,定在这天去交首付,豪气的把房子当作生日礼物? 签署的合同特别多,签名不下几十个,应该是签名最多的一天了。签署的合同大部分当天无法拿到手,最后到手的是一信封的收据。 搞定后,去百合里吃了顿好的。 2020.12.09 公积金面签 公积金面签需要夫妻双方都要到场,律师让我不用预约,直接到现场取号。 我们来的比较早,那天也没很多人,一个小时内搞定了,回到公司还没有迟到。 2021.01.06 不动产预告备案 这个是我自己过去番禺政务中心办理的,来的比较早,也很快就搞定了。 这天特别塞车。 2021.02.01 公积金放款 想不到的是公积金放款比商贷快。 2021.02.03 商贷放款 公积金放款两天后商贷就放款了。之前还传言说银行收紧了放款,老婆还担心工作变动导致放款不顺利,现在算是顺利放款了。 我倒是不太担心,贷款是银行妥妥的业绩啊,而且晚一点放款就晚一点还房贷,也挺好的。

February 5, 2021 · Darren Ou

iOS UI 自动化测试简介

前言 发布内测版的时候,每次在提交代码前、上传ipa包前、发布前都需要手动地跑一下主流程,比如在视频详情页划几页,在直播页划几个直播间等。都是比较重复且有规律的操作,可以利用自动化测试来代替手工操作。 我们在Jenkins上面打包时,会有一个UI自动化测试的选项,是架构组自己弄的一套自动化测试环境,想要自己搭建估计不太方便。所以需要有一套轻量级切足够易用的UI自动化测试框架。 XCUITest 简介 XCUITest是苹果在iOS9.3提供的自动化测试框架(iOS9.3之前提供的是UI Automation),Xcode自带的框架,不需要搭建其它环境,由于是苹果提供的框架,运行稳定。使用Swift或者OC编写测试用例(可能对于测试不是很友好)。 使用 func testExample() throws { // UI tests must launch the application that they test. let app = XCUIApplication(bundleIdentifier: "appium.test") app.launch() // 启动应用 for _ in 1 ..< 5 { app.swipeUp() // 上划 } for _ in 1 ... 3 { app.swipeRight() // 右划 } app.swipeDown() // 下划刷新 sleep(5) // 等待5s再执行下一步 app.cells.firstMatch.tap() // 点击当前的第一个cell for _ in 1 ... 5 { app.swipeUp() // 上划 sleep(2) // 等待2s再执行下一步 } app....

November 28, 2020 · Darren Ou

在树莓派上搭建 Homebridge,实现 HomeKit 控制智能家居

一、什么是Homebridge Homebridge is a lightweight NodeJS server you can run on your home network that emulates the iOS HomeKit API. It supports Plugins, which are community-contributed modules that provide a basic bridge from HomeKit to various 3rd-party APIs provided by manufacturers of “smart home” devices. HomeKit是苹果的智能家居平台,是iOS系统层面支持的平台,拥有其它平台无法比拟用户体验。可惜大部分米家设备及其它平台的设备都不支持HomeKit,但是可以通过Homebridge作为桥接,实现HomeKit控制其它平台的设备。 二、如何在树莓派上搭建Homebridge https://github.com/homebridge/homebridge/wiki/Install-Homebridge-on-Raspbian 三、安装插件 在这个网址https://www.npmjs.com/search?q=keywords%3Ahomebridge-plugin上可以通过关键字搜索插件, 常用插件: 1.Aqara套装:homebridge-mi-aqara 2.米家空调伴侣:homebridge-mi-acpartner 3.米家yeelight台灯:homebridge_yeelight 4.小米风扇:homebridge-mi-fan 5.米家智能摄像机:homebridge-mi-camera 6.米家智能排插:homebridge-mi-outlet 7.米家空气净化器:homebridge-mi-airpurifier 8.飞利浦灯泡:homebridge-mi-philips-light 9.智能插座:homebridge-mi-outlet ... 四、配置设备 在Homebridge上,插件利用设备的IP地址及设备的token即可以实现控制某个设备,IP地址我们可以登录路由器查看已连接的设备获取,获取token有以下几种方法: 1、使用安卓手机下载旧版本的米家app,导出里面的数据库找到设备token 2、使用miio discover命令获取(米家新的设备基本都隐藏了token,这种方法基本失效) 3、利用Charles抓包 Homebridge具体配置如下:...

October 11, 2020 · Darren Ou

【利用基于 Lint 的启动代码监控 Android 进房间流程】iOS 平台的可行性调研

一、目的 通过标识关键代码,利用Lint定期检测关键代码,当关键代码发生变更时,可以在报告中体现,避免引入意外的修改。 二、Lint Lint介绍 Lint 作为一种工具程序,主要负责静态源码分析,负责代码规范、代码缺陷等检测。(https://zh.wikipedia.org/wiki/Lint) Android 原生已经提供了 Lint 静态分析工具,而 iOS 则有对应的 OCLint 和 SwiftLint。 三、android实现代码监控的原理 Android Lint可以对Java/Kotlin源码使用uast进行语法分析,最后生成一棵AST抽象语法树,这棵树的每个节点都是一个方法,包含方法签名和方法体。 通过自定义的Lint规则,找到应用启动的入口方法。从入口方法开始遍历整棵调用树,即可对每个方法节点的代码段进行分析。 1. 获取关键代码段 open fun shouldMonitor(node: UMethod): Boolean { return node.getAnnotations().find { it.qualifiedName == LINT_MONITOR_ANNOTATION } != null } android通过注解的方式,标识需要检测的方法实现。通过Android Lint的自定义规则判断注解标识的方法,找到入口方法,然后对代码段进行分析。 iOS对应的OCLint也可以通过自定义规则进行静态分析,但是iOS没有注解,iOS如果需要标识关键代码段,目前想到的只能hardcode检测列表(包括类和方法名)来实现标识关键代码段的效果。但是这样的维护成本比较大。 iOS可以利用类似以下的代码片段进行类和方法的判断: for(auto it = parent->meth_begin(), end = parent->meth_end(); it != end; ++it) { const auto method = *it; if(declHasEnforceAttribute(method, *this)) { const auto selector = method->getSelector(); if(!implementation->getMethod(selector, method->isInstanceMethod())) { const string className = parent->getNameAsString(); const string methodName = selector....

August 20, 2020 · Darren Ou

利用 git worktree 并行开发

一、什么是worktree? Manage multiple working trees attached to the same repository. A git repository can support multiple working trees, allowing you to check out more than one branch at a time. 管理连接到同一存储库的多个工作树。一个git仓库可以支持多个工作树,允许一次迁出多个分支。 二、为什么要用worktree? 场景:正在开发新的需求,这时候还需要对已提测功能的bug fixes 方法1:先stash正在开发的代码,再check out到原分支进行bug fixes 缺点:分支切换后需要重新pod install,然后xcode重建索引并重新编译,耗时耗力 方法2:clone两个仓库 缺点:.git目录会占空间,且两个仓库之间毫无关联,无法相互查看本地提交 方法3:git worktree 三、worktree的相关命令 ➜ worktree_test git:(develop) git worktree -h usage: git worktree add [<options>] <path> [<commit-ish>] or: git worktree list [<options>] or: git worktree lock [<options>] <path> or: git worktree move <worktree> <new-path> or: git worktree prune [<options>] or: git worktree remove [<options>] <worktree> or: git worktree unlock <path> 四、常用操作 1、添加一个worktree git worktree add ....

May 10, 2020 · Darren Ou

树莓派简介

一、树莓派是什么 树莓派是一款基于ARM的微型电脑主板,系统基于Linux,以MicroSD卡为磁盘,树莓派主板有4个USB接口,一个以太网接口,一个3.5mm音频口,一个HDMI视频接口,40-pin的GPIO连接端口 https://www.raspberrypi.org/products/ 二、树莓派可以干什么 可以当做一个微型服务器,作为FTP文件服务器、网站服务器、代码托管等 游戏机(刷入游戏模拟器系统,可玩大部分复古游戏)https://www.jianshu.com/p/feffa629084a 遥控车(手机通过socket连接控制小车,且小车装有红外线传感器,可以自动避障), 可以结合其他传感器搭建智能家居 三、DHT11温湿度传感器 传感器文档 价格便宜,体积小,功耗低,缺点是精度不高 有四个针脚:正极、负极、串行数据总线、空脚 DHT11温湿度传感器数据读取原理 代码: __author__ = 'DuShu' import time import RPi.GPIO as GPIO def getIntVal(binayList): idx = 0 binaryStr = '' while idx < len(binayList): binaryStr += str(binayList[idx]) idx += 1 return int(binaryStr ,2) def getHumidity(): GPIO_DATA = 18 GPIO_HIGH = GPIO.HIGH GPIO_LOW = GPIO.LOW GPIO.setmode(GPIO.BCM) #一秒后开始工作 time.sleep(1) #设置GPIO接口为输出数据模式 GPIO.setup(GPIO_DATA,GPIO.OUT) #输出一个低电平信号 GPIO.output(GPIO_DATA, GPIO.LOW) time.sleep(0.02) #0.018 #0.02秒后输出一个高电平信号,启动模块测量 GPIO.output(GPIO_DATA, GPIO.HIGH) #设置GPIO接口为读取读取数据模式 GPIO....

March 20, 2020 · Darren Ou

直播间横屏技术方案

一、背景 目前直播间已支持PC推流直播,但只支持竖屏播放,导致观看体验不佳,故需要把横屏模式加上。 二、面临的问题 1、只有两天开发时间,时间紧迫; 2、屏幕切换时存在UI异常风险; 3、横屏模式需要应用全局支持横屏方向,存在影响其他业务风险; 三、方案 1、切换横屏入口的显示(加开关) joinChannel/joinGroup成功 -> roomType == BSRoomType_PCRoom -> 判断开关 -> 显示入口 2、横竖屏切换初步方案 1.项目配置: 在AppDelegate里重写方法: - (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window { UIViewController *topViewController = [BaseViewController bl_findTopMostViewController]; if (topViewController && [topViewController isKindOfClass:NSClassFromString(@"DSLandscapeViewController")]) { return topViewController.supportedInterfaceOrientations; } return UIInterfaceOrientationMaskPortrait; } 2.竖屏转横屏: 新建一个支持横屏的DSLandscapeViewController并重写UIViewController的方法: - (UIInterfaceOrientationMask)supportedInterfaceOrientations { return UIInterfaceOrientationMaskLandscapeRight | UIInterfaceOrientationMaskPortrait; // 这里加上竖屏,是因为横屏转竖屏时,需要把当前vc先转过来,后面会讲到 } - (BOOL)shouldAutorotate { return YES; } 从竖屏vc(DSLiveShowViewController)旋转时,初始化横屏vc(DSLandscapeViewController),并把竖屏vc当前持有的BLLiveRoomAudienceSession传递给横屏vc。然后在当前navigationController的子vc中,把竖屏vc替换成横屏vc(原竖屏vc会销毁)。 - (void)switchToLandscapeView { DSLandscapeViewController *viewController = [[DSLandscapeViewController alloc] initWithAudienceSession:self....

January 4, 2020 · Darren Ou