文章目录

  • 0 前言
  • 1 功能简介
  • 2 ATTitleBar
  • 3 ReactiveCocoa
  • 4 CBCentralManager
  • 5 ATCarouselView
  • 6 细节问题
  • 7 Smart Lamp 要点概述
  • 8 问题分析
  • 9 界面展示

0 前言

蓝牙灯:支持一键设置情景模式、无极调光调色

提示:适合用于课程设计或毕业设计,工作量达标,源码开放


1 功能简介

界面使用最广泛的四页面设计,分别为:主页、情景、设备、发现。

主页是核心功能,实现一键连接蓝牙灯、自由调节颜色、亮度、设置定时关灯等功能。

情景页是保存用户设置的情景模式,可以根据使用场景不同快速切换至对应的工作模式。

设备页可以管理多台蓝牙灯。

发现页提供一些智能家居相关资讯

● 适用平台

iOS 8 ~10.2

2 ATTitleBar

  • 支持横向滑动切换tab,并具有点击涟漪效果
  • titlebar是在app中广泛应用的一种tab设计。
  • 页面较多时采用类似tableview的懒加载模式,只加载需要显示的几页,减少内存占用,提高流畅度。

3 ReactiveCocoa

  • 本项目大量使用了ReactiveCocoa框架进行响应式编程,大幅简化代码、提高可读性。
  • RAC的订阅机制使得一对多传值有了新的选择,如蓝牙中心设备。
  • RAC的信号监听机制使得我更容易根据需要定制个性化控件。如带翻转、旋转效果的tabbar、带缩放和回弹效果的slider等,使app的界面栩栩如生。

4 CBCentralManager

  • CBCentralManager是蓝牙类app的核心,本项目在编写这部分代码时使用了链式语法进行封装,外界调用起来十分方便。

5 ATCarouselView

  • 轮播图也是在app中广泛存在的一种自定义控件,我将这部分代码封装至ATKit中,以Pods导入方式使用,便于维护和扩展,同时也使得本项目代码更加简洁。
  • 部分app的轮播图可以根据下方列表的滑动而改变高度或者添加蒙版效果,我目前实现了改变高度的功能。

6 细节问题

  • 启动动画与侧滑界面
    本项目并没有开启侧滑界面,但是在编写的时候留有接口。
    启动图片与主窗体下层的一个视图的背景图片相同,在启动的时候主窗体在屏幕右侧,以动画形式向左覆盖住图片。

  • UINavigationBar和UITabBar的分割线
    如果需要自定义这两个bar,一般会把系统自带的一条分割线移除掉。
    在模拟器中运行程序,观察层级结构,在执行Layout的时候移除掉对应层级的一个UIImageView。

  • UITabBar中间自定义按钮
    在系统TabBar执行Layout的时候,重新排布原来的四个按钮,调整其大小和位置,然后新建一个按钮放在中间。

7 Smart Lamp 要点概述

  • 核心:中心设备(CBCentralManager)、外设(CBPeripheral)。
  • 中心设备模型通过代理获取中心设备与周边设备之间的各种状态信息。
  • 自定义了主页头视图支持滑动切换页面,并封装成工具类(详见GitHub)。
  • 对第三方库进行了二次封装,减少内部代码对第三方库的依赖,便于后期维护。
  • 中心设备模型对多个页面间的传值采用了Rac信号传值。
  • 中心设备模型使用了链式语法封装,使用方便快捷。
  • 封装了轮播图控件,并自适应header高度的变化。

8 问题分析

  • 蓝牙通信的流程?
    中心设备设置代理、开启扫描、停止扫描、获取周边对象、获取服务、获取特征、发送数据、接收返回数据。
  • 如何实现多连?
    用数组存储多个设备及其特征,发送数据时分别向每个连接的设备发送数据,或单独向选中的设备发送数据。
  • 蓝牙灯硬件响应的极限时间大概在20ms,如果手指滑动取色器太快导致蓝牙灯反应迟钝滞后,这个问题通过定时器来解决,定义一个flag,每隔50ms使其置为1,只有当flag为1的时候才可以发送数据,每次发送完数据使其置为0,这样就保证了发送数据的时间间隔不会小于50ms。
  • 如何选择最合适的传值方式?
    最常用的三种Block、代理、通知。通知的特点是一对多,而代理和block是一对一传值,代理可以批量传递更多的信息,注重过程信息的传递,但是单例不能使用代理。block写法简练,功能强大,可以封装一段代码传递。
  • 开灯时瞬间变亮太刺眼如何进行体验优化?
    创建一个定时器,每次开灯的时候设置亮度为0,每隔50ms左右调用一次增加一点亮度,直至亮度达到关灯前的状态。
  • 关于丢包问题如何解决?
    可以对每一包发送的数据添加到数组里,每次从中取出一包发送,一定时间内没有收到返回值就重发。
  • 如何防止数据被拦截?
    通常采取加密措施。拟定一份加密协议,对数据进行打乱、插值、重组等。

9 界面展示



【毕业设计_课程设计】蓝牙灯:支持一键设置情景模式、无极调光调色相关推荐

  1. 【毕业设计_课程设计】基于python的微信公众平台机器人的设计与实现

    文章目录 0 项目说明 项目介绍 项目工程 0 项目说明 基于python的微信公众平台机器人的设计与实现 提示:适合用于课程设计或毕业设计,工作量达标,源码开放 项目介绍 1.NGINX做负载均衡, ...

  2. 【毕业设计_课程设计】面向高考招生咨询的问答系统设计与实现(源码+论文)

    文章目录 0 项目说明 1 项目说明 2 系统设计 3 系统功能 3.1 问答 3.2 问题模板 4 实验结果 5 论文目录 6 项目工程 0 项目说明 面向高考招生咨询的问答系统设计与实现 提示:适 ...

  3. 【毕业设计_课程设计】基于大数据个性化音乐推荐算法分析

    文章目录 0 前言 1 研究目的 2 研究方法 2.1 传统推荐算法 2.2 基于LightGBM决策树模型的推荐算法 3 研究结论 4 最后 0 前言 基于大数据个性化音乐推荐算法分析 提示:适合用 ...

  4. 【毕业设计_课程设计】汉语多音字注音研究

    文章目录 0 项目说明 1 准确率 2 调研阶段 3 数据统计 4 语料处理 5 模型搭建 6 按照多音字的读音的分类方法 7 仿照词性标注问题的分类方法 8 项目源码 0 项目说明 汉语多音字注音研 ...

  5. 【毕业设计_课程设计】基于微信小程序的共享雨伞租借系统

    文章目录 0 项目说明 1 简介 2 功能模块 3 关于登录与注册 4 页面展示 5 页面目录 6 项目工程 0 项目说明 基于微信小程序的共享雨伞租借系统 提示:适合用于课程设计或毕业设计,工作量达 ...

  6. 【毕业设计_课程设计】基于opencv、dilb的员工人脸识别考勤系统

    文章目录 0 项目说明 1 需求分析 2 总体设计 3 详细设计 4 效果展示 5 实验心得 6 项目源码 7 最后 0 项目说明 基于opencv.dilb的员工人脸识别考勤系统 提示:适合用于课程 ...

  7. 【毕业设计_课程设计】基于微信小程序端的视频社交软件+后台管理系统(源码+论文)

    文章目录 0 项目说明 1 项目说明 2 开发环境 3 系统功能 3.1 微信小程序端 3.2 后台管理系统 4 界面展示 5 论文概览 6 项目工程 0 项目说明 基于微信小程序端的视频社交软件 + ...

  8. 【毕业设计_课程设计】基于mtcnn的实时高精度人脸检查算法实现

    文章目录 0 前言 1 简介 2 模型理解 3 环境说明 4 代码介绍 5 下载数据 6 运行 7 效果展示 8 最后 0 前言 基于mtcnn的实时高精度人脸检查算法实现 提示:适合用于课程设计或毕 ...

  9. 【毕业设计_课程设计】基于Spring MVC的博客系统设计与实现

    文章目录 0 项目说明 1 关于项目 2 效果预览 2.1 前台效果图 2.2 后台效果图 3 使用注意 4 使用步骤 5 项目源码 0 项目说明 基于Spring MVC的博客系统设计与实现 提示: ...

最新文章

  1. AI 技术与人类主体想象 ——基于人工直觉在线讨论的研究
  2. 红帽企业集群和存储管理之DRBD+Heartbeat+NFS实现详解
  3. 京东2017校招前端主观题汇总
  4. EntityFramework用法探索(一)DatabaseFirst
  5. EditText获得焦点后,如何关闭软键盘
  6. 消费者关注的 Win8 问题汇总(中)
  7. 从源码剖析SpringBoot中Tomcat的默认最大连接数
  8. java多线程流式写入文件夹_java多线程写入同一文件
  9. javascript 西瓜一期 15 数据的存储单位
  10. 【Elasticsearch】wildcard、fuzzy、regexp、prefix
  11. matlab车牌识别课程设计,matlab车牌识别课程设计报告模板(附源代码)
  12. matlab工具箱安装
  13. Pycharm菜单栏消失,(File 、view消失)快速调出来的方法。(Professional Edition 2022版)
  14. javascript 判断参数是否为非0整数数字或者整数数字字符串的简单方法(小装逼)
  15. Unity打Android包报错Error building Player Exception OBSOLETE - Providing Android resources in AssetsPlug
  16. 游戏《迷你世界》如何吸引小鸡到鸡窝里?这些道具很重要!
  17. linux php-fpm 配置文件,linux下php-fpm开启与关闭方法
  18. 利用AIDA64对电脑进行简单的稳定性测试的技巧分享
  19. MyBatis自定义自定义动态SQL解析方式
  20. FHS和一些文件相关的操作命令

热门文章

  1. DS栈—波兰式,逆波兰式
  2. html5 页面回退,一种基于浏览器堆栈管理的H5页面动态回退方法与流程
  3. 如何搭建一个属于自己的博客网站?(小白教程)
  4. 为什么 MongoDB 索引选择B-树,而 Mysql 选择B+树(精干总结)
  5. php图片留白,PHP:图片不变形处理(留白处理与截取处理)-奇乐网
  6. c语言中反比例函数定义,初三数学反比例函数的定义知识点
  7. 基于Robei:如何利用Lora与机器人进行无线通讯
  8. 合工大机器人足球仿真考试题56题(底层uva)
  9. 2021秋季《数据结构》_EOJ 1063.树的双亲存储法(parent+child / parent)
  10. 常见图片格式(HTML)