前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >iOS中的蓝牙开发以及对iOS中设计模式的进一步理解(47,48,49,50周总结)

iOS中的蓝牙开发以及对iOS中设计模式的进一步理解(47,48,49,50周总结)

作者头像
iOS Development
发布于 2019-02-14 10:07:50
发布于 2019-02-14 10:07:50
9480
举报

蓝牙开发之第一次:

忙完IOMix,还在研究iOS的音频框架,老板突然就说要先做蓝牙相关的项目了。于是就开始了第一次开发iOS蓝牙应用。两周时间,厘清了很多之前模糊的地方。

首先有三个事情需要说明:

1、BLE(蓝牙4.0)可以实现1连多(我做的项目就是1台手机连接8个蓝牙模块);

2、iOS这边是拿不到蓝牙模块的mac地址的(安卓可以)(网上说可以通过蓝牙模块额外的返回值传送);

3、iOS BLE的开发,用到的官方框架是CoreBluetooth。当然,会有人基于此封装成其它第三方框架(基本上是将官方的“代理回调”封装成“block回调”),此次开发就是用了第三方的封装框架。

框架的选择。一开始经理建议我可以使用YmsCoreBluetooth,不过我看它的星星数,就感觉有点儿不靠谱儿,后面使用,果不其然,有个坑一直跳不出去(好像是发送指令时peripheral对象一直为空,数据发不出去,当时对蓝牙的整个流程也不熟悉,所以坑没跳出去)。所以后面又上网查了一下,找到BabyBluetooth(有想过用回官方框架,不过2周时间,猜想是来不及了),运行它们demo,看起来不错。又按照demo自己写了一下,可以链接和发数据,于是就决定用这个了。

因为之前开发过Wi-Fi通讯类型的APP,所以对比着Wi-Fi来理解。一开始,我猜想:一个“服务”,会不会就是一条指令,而“服务”下一层的若干“特征”,就是每条指令里面的对应属性?后来又猜想,是不是一个“特征”对应一条指令?上面的猜想都是错的。那“服务”和“特征究竟是什么鬼?

现在手上接触到的蓝牙模块,都只有一个“服务”(我也不知道该对应socket(Wi-Fi)通讯里的哪部分内容),然后“服务”里面的若干“特征”,有一个“特征”的属性是“Data In”的,这个“特征”就是用于写入(发送)数据(指令)给硬件的,没错,就是无论你有多少条指令,都是通过这个“特征”写入。在我们的蓝牙模块中,要用到的“服务”的UUID(唯一标示符)是“FF12”,写入数据的这个“特征”是“FF01”。

所以,你如果要写入(发送)数据,在打包好指令(指令的定义、打包就和socket通讯的类似)后,找到peripheral对象(决定你要发给哪个蓝牙模块.在链接多个蓝牙的时候要鉴别确定,连结单个蓝牙就不需要了),找到“特征”,再利用peripheral对象调用writeValue: forCharacteristic: type:方法(或者说发送writeValue: forCharacteristic: type:消息给peripheral对象),第1个参数传指令内容,第2个参数传写入的“特征”对象,第3个参数传是否有回应。是不是很明白清晰?

所以,(写入)“特征”它就像一个管道、一个通道,表示可以通过它来进行指令的写入,无论你有多少指令,都是利用这个“特征”发送。

硬件返回的数据,就不是走这个“通道了”,它另外有一个“Data Out”的“特征”,这个“特征”专门负责数据从模块发出(发给连结的手机)。只要“监听”了这个“特征”,就能收到从模块发出的数据了。所以,和走tcp传输的Wi-Fi不同,tcp发送和接收数据,都是在同一个“通道”进行;而蓝牙,则数据发送用一个“特征”,数据接收,又用另外一个“特征”,是两个不同的“管道”(容许我暂时这么理解)。

上面说到用writeValue: forCharacteristic: type:方法发送指令,好像没有用到“服务”,那“服务”还有什么用?用于发送数据时找“特征”,因为“服务”和“特征”是树状结构,要找到“特征”,就必须通过“服务”。

另外,writeValue: forCharacteristic: type:的第三个参数,其实只有两种情况,一个是有返回值的CBCharacteristicWriteWithResponse,另外一个是没有返回值的CBCharacteristicWriteWithoutResponse。这个参数可不是你想写哪个就写哪个,要决定于该“特征”的属性(CBCharacteristicProperties类型),有10种可能。CBCharacteristicPropertyWriteWithoutResponse对应的是CBCharacteristicWriteWithoutResponse,CBCharacteristicPropertyWrite对应的是CBCharacteristicWriteWithResponse,不能写错,否则就会发不出去指令。我就之前就掉进这个坑一次。

对iOS中“设计模式”的进一步理解:

随着写项目的数量提升,再回头去看MVC,又有了深一点的认识。

在项目实践中,我发现很难严格遵守MVC模式,当然我不是指大家把MVC三者搞混,而是大家都会想方设法给控制器“C”减肥,将一些其它功能独立出控制器之外。所以无论是《iOS编程》书中提及到的MVCS,还是在网上大家经常讨论的MVVM,两者的目标应该是一致的——给控制器“C”瘦身。

其实从经理写Device类(负责实现和硬件通讯功能的类)开始,项目就不是严格意义上的MVC模式了,它将“负责和硬件通讯的功能”从控制器“V”中独立开来。然后我又将“负责数据本地保存的功能”独立到Store类中。再用一个单例“持有”它们,其它控制器通过这个单例获取对应的能力(和硬件通讯、保存数据)或获取数据。

所以我们以后和硬件通讯类型的APP,我们项目的组织模式可以说是MVCDS了:D负责和硬件通讯,S负责保存数据。也正是用了这种“设计”(其实我并不是事先设计好的),才能实现和同事的分工合作:我专心写和硬件通讯的功能;同事专心实现UI

而关于MVVM这种模式,这两天看到有人翻译的国外一篇《ReactiveCocoa 和 MVVM 入门》的文章,终于有了一点初步认识(之前看的文章,都是不明所以),文章用一个图示说明VM(view model)是分别从控制器“C”及视图“V”中瘦身出来的一部分内容(“C”的占大部分)。所以,我可以从另一个角度去理解MVVM了:VM也可以看作是对“C”瘦身出来的内容,就类似我们的项目瘦身出“D”和“S”的内容,只是大家的瘦身方式不一样,而且VM还包含了部分“V”的内容(不知道是否就是ReactiveCocoa这一部分涉及到的,后续再深入研究)

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2015.12.20 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
iOS蓝牙开发如何更好地收发数据
3月中旬跳槽了,一直在新公司「填坑」,看着「先人」写的代码,觉得是有改善空间的,所以这次想聊下这部分内容——iOS蓝牙开发中如何更好地更好地收发数据。
iOS Development
2019/02/14
2.9K0
iOS开发之ReactiveCocoa下的MVVM
最近工作比较忙,但还是出来更新博客了,今天给大家分享一些ReactiveCocoa以及MVVM的一些东西,干活还是比较足的。在之前发表过一篇博文,名字叫做《iOS开发之浅谈MVVM的架构设计与团队协作》,大体上讲的就是使用Block回调的方式实现MVVM的。在写上篇文章时也知道有ReactiveCocoa这个函数响应式编程的框架,并且有许多人用它来更好的实现MVVM。所以在上篇博客发表后,有些同行给评论建议看一下ReactiveCocoa的东西,所以就系统的看了一下ReactiveCocoa的东西。不过有一
lizelu
2018/01/11
1.4K0
iOS开发之ReactiveCocoa下的MVVM
APP与硬件交互-蓝牙连接测试
7. UUID:蓝牙上的唯一标示符,为了区分不同服务和特征,就用UUID来表示。
用户5521279
2019/07/30
5.5K0
聊聊iOS开发之MVVM的架构设计
而MVVM这种新的代码组织方式就可以解决这些问题,本文就MVVM的架构设计做个简单的个人总结。
進无尽
2018/09/12
8.8K0
聊聊iOS开发之MVVM的架构设计
iOS CoreBluetooth 的使用讲解概念分析代码实战
最近研究了iOS下连接蓝牙打印机,实现打印购物小票的功能,对iOS中BLE 4.0的使用有了一定的了解,这里记录一下对BLE 4.0的理解。 由于很多文章同时讲CBCentralManager和CBPeripheralManager,所以很容易傻傻分不清楚。很少把iPhone作为蓝牙外设在广播发送数据的情形,今天我就从iOS app开发的角度讲一些BLE 4.0的使用。
Haley_Wong
2018/08/22
1.9K0
iOS CoreBluetooth 的使用讲解概念分析代码实战
iOS架构设计:揭秘MVC, MVP, MVVM以及VIPER
你将了解到在iOS环境下如何进行系统架构设计。我们将简单回顾一些流行的框架,并通过实践一些小例子来比较它们的理论。
iOSSir
2023/03/19
1.4K0
iOS架构设计:揭秘MVC, MVP, MVVM以及VIPER
毕业设计So Easy:珠穆朗玛FM音频电台APP
很多计算机专业大学生经常和我交流:毕业设计没思路、不会做、论文不会写、太难了......
不脱发的程序猿
2021/06/21
5680
毕业设计So Easy:珠穆朗玛FM音频电台APP
一文学会iOS蓝牙开发
最近做APP对接蓝牙设备开发,这里分享一下iOS对接蓝牙设备中需要注意的东西,大致包含下面这些方面:
莫空9081
2023/12/27
2.3K0
iOS开发之ReactiveCocoa下的MVVM(干货分享)
转载:http://ios.jobbole.com/83602/ 最近工作比较忙,但还是出来更新博客了,今天给大家分享一些ReactiveCocoa以及MVVM的一些东西,干活还是比较足的。在之前发表过一篇博文,名字叫做《iOS开发之浅谈MVVM的架构设计与团队协作》,大体上讲的就是使用Block回调的方式实现MVVM的。在写上篇文章时也知道有ReactiveCocoa这个函数响应式编程的框架,并且有许多人用它来更好的实现MVVM。所以在上篇博客发表后,有些同行给评论建议看一下ReactiveCocoa的
VV木公子
2018/06/05
5.9K0
超低功耗操作系统的设计经验
导语 续航时长一直是智能手表的最大痛点。目前的安卓智能手表,在正常使用的情况下,最多使用1-2天(那些宣称能使用5天以上的,其实要阉割很多功能,一般只能看时间和计步,与手环没有什么差别)。 如何解决这个问题?行业里没有太好的方案。1.加大电池容量?手表的个头不可能太大,人们需要戴的是手表而不是“手雷”。2.不用全触摸的真彩屏?可以,那就用按键和低功耗的屏幕吧,反正佳明就是这样,这样的操作与显示的效果,与几十年前的电子表有什么区别呢。3.用运算量更小的CPU?那些丰富的安卓手表应用就跑不起来了,还不如直接戴
腾讯Bugly
2019/01/30
2.2K0
超低功耗操作系统的设计经验
iOS简易蓝牙对战五子棋游戏设计思路之一——核心蓝牙通讯类的设计
    本系列博客将系统的介绍一款蓝牙对战五子棋的开发思路与过程,其中的核心部分有两个,一部分是蓝牙通讯中对战双方信息交互框架的设计与开发,一部分是五子棋游戏中棋盘逻辑与胜负判定的算法实现。本篇博客将介绍游戏中蓝牙通讯类的设计思路
珲少
2018/08/15
1.2K0
[物联网] 3.3 "上云"的各种姿势
与全球网络相连接 有两种让设备连接到网络的方式,一种是由设备本身直接连接全球网络,另一种是在本地区域内使用网关来连接全球网络(图 3.21)。近来,“生活记录”型的设备越来越多,其结构更接近前面说的第二种方式,例如通过蓝牙把可穿戴设备和智能手机配对,通过智能手机向服务器发送数据。
科控物联
2022/03/29
1K0
[物联网] 3.3 "上云"的各种姿势
Apple主推的智能家居是什么、怎么用?一篇文章带你从零完全入门 HomeKit
如果你对智能家居有所了解,那应该或多或少听人聊起过 HomeKit。由 Apple 开发并主推的的 HomeKit 既因为产品选择少、价格高而难以成为主流,又因其独特的优秀体验和「出身名门」而成为智能家居领域的焦点。HomeKit 究竟是什么?能做什么?怎么做到的?
天天Lotay
2023/03/01
2K0
Apple主推的智能家居是什么、怎么用?一篇文章带你从零完全入门 HomeKit
iOS应用架构谈 view层的组织和调用方案 pragma mark - life cyclepragma mark - life cyclepragma mark - getters and set
前言 《iOS应用架构谈 开篇》出来之后,很多人来催我赶紧出第二篇。这一篇文章出得相当艰难,因为公司里的破事儿特别多,我自己又有点私事儿,以至于能用来写博客的时间不够充分。 现在好啦,第二篇出来了。 当我们开始设计View层的架构时,往往是这个App还没有开始开发,或者这个App已经发过几个版本了,然后此时需要做非常彻底的重构。 一般也就是这两种时机会去做View层架构,基于这个时机的特殊性,我们在这时候必须清楚认识到:View层的架构一旦实现或定型,在App发版后可修改的余地就已经非常之小了。因为它跟业务
rectinajh
2018/05/17
9910
iOS开发学习路线
这里筑梦师,是一名正在努力学习的iOS开发工程师,目前致力于全栈方向的学习,希望可以和大家一起交流技术,共同进步,用简书记录下自己的学习历程.
筑梦师winston
2018/05/10
1.9K0
iOS 常用设计模式汇总
在软件开发中,无论是那种高级语言中总会伴随着一些最为常用的设计模式,下面针对iOS中,MVC模式、代理模式、观察者模式、单例模式、策略模式、简单工厂模式这六大模式进行汇总分析。
网罗开发
2021/01/29
1.9K0
iOS 常用设计模式汇总
iOS电商类APP的研发
前言 本文是研发一个在线超市的电商类APP过程中,对架构的整理。 功能: 1、浏览商品、购买商品、切换商店; 2、查看订单、订单投诉、意见反馈; 3、登陆、退出、收货地址管理; 4、支付、取消订
落影
2018/04/27
2.7K1
iOS电商类APP的研发
基于stm32的室内环境监测系统设计及实现_毕业设计怎么做
这是本科时的毕业设计,想着之后读研了,研究方向是机器学习了,可能不会这么再碰32或者51之类的板子了,就想趁着还没有忘记就来梳理一下,纪念陪伴了我两年的硬件朋友们,也作为一个足迹。
全栈程序员站长
2022/09/27
3K0
基于stm32的室内环境监测系统设计及实现_毕业设计怎么做
如何使用蓝牙实现OTA固件升级
作为一种低成本的近距离无线连接协议,蓝牙在现实生活中的应用非常广泛,各种嵌入式、物联网设备随处可见。基于这一特性,我们今天讲一下如何使用蓝牙实现OTA固件升级。
xiangzhihong
2022/10/31
3.7K0
全网最便宜的OpenHarmony开发板和模组Neptune问世(基于联盛德W800的SoC),9.9元带蓝牙和wifi功能还包邮
比起stm32来虽然没有强大的集成开发环境、仿真调试器和生态资源,但毕竟价格便宜。
杨永贞
2022/01/07
2.7K0
全网最便宜的OpenHarmony开发板和模组Neptune问世(基于联盛德W800的SoC),9.9元带蓝牙和wifi功能还包邮
推荐阅读
相关推荐
iOS蓝牙开发如何更好地收发数据
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档