首页 文章 精选 留言 我的

精选列表

搜索[分区技术],共10000篇文章
优秀的个人博客,低调大师

浅谈iOS中的蓝牙技术(二) -- CoreBluetooth

在上篇文章中我们提到了 iOS 开发中,使用GameKit 框架实现相同网络的 iOS 设备之间传输数据.但是 GameKit 框架在 iOS7 之后就过时了,那么本文将介绍另一种关于蓝牙的框架 CoreBluetooth. CoreBluetooth 简介 CoreBlueTooth.framework 使用 CoreBluetooth 要求设备必须要支持蓝牙4.0(一般也叫BLE<Bluetooth low energy>)。,并且手机型号必须是iPhone4以上,也就是至少4s手机.使用CoreBluetooth进行开发可实现与第三方设备的数据交互. CoreBluetooth.h 上图是CoreBluetooth 的头文件,在这个框架中最核心的两个东西就是 Central (中心)和 Peripheral(外设). 图片来自网络,如有侵权,请联系 CoreBluetooth 中的对象模型 CBCentralManager 它用于管理发现或远程连接外围设备(CBPeripheral对象),包括扫描,发现和外围设备连接到广告. CBPeripheralManager 它用于管理服务在当地发表外围设备的通用属性配置文件数据库和通知这些服务的中心设备(CBCentral对象). CBPeripheral 它代表远程周边设备,你的应用程序的中央管理器(CBCentralManager)的一个实例——发现广告或当前连接. CBCentral 它代表远程中央设备连接到一个应用程序在本地设备上实现外围的作用. CBService 和 CBMutableService 代表外围的业务数据收集,相关行为完成一个功能或特性的设备(或部分设备).CBMutableService类继承CBService类添加写访问的所有属性. CBCharacteristic及其子类CBMutableCharacteristic 代表进一步外围的信息服务.CBMutableCharacteristic对象代表当的特色周边的服务 CBUUID 它的实例代表128位全局唯一标识符(uuid)属性中使用蓝牙低能量沟通,比如周边的服务,特点,和特征描述符 CBATTRequest 它代表属性协议(ATT)读写请求从远程中央设备(CBCentral对象) 实现通讯 中心管理设计模式 First 导入 CoreBluetooth 头文件,创建中心管理者属性和外设属性,并遵守中心管理者和外设的协议. First 建立中心控制器 懒加载创建中心控制器, 创建的时候设置代理为当前控制器,Peripheral Manager将跑在主线程中。如果你想用不同的线程做更加复杂的事情,你需创建一个队列(queue)并将它放在这儿 -(CBCentralManager*)getCManager{if(!_cManager){ _cManager=[[CBCentralManageralloc]initWithDelegate:selfqueue:dispatch_get_main_queue()options:nil]; }return_cManager; } 更新状态 (只要中心管理者初始化,就会触发此代理方法) 中心管理器的状态 中心管理器 扫描外设 //该方法用于告诉CentralManager,要开始寻找一个指定的服务了.不能在state非ON的情况下对我们的中心管理者进行操作,scanForPeripheralsWithServices方法中sercices为空则会扫描所有的设备.-(void)centralManagerDidUpdateState:(CBCentralManager*)central{switch(central.state){caseCBCentralManagerStateUnknown:NSLog(@"中心管理器状态未知");break;caseCBCentralManagerStateResetting:NSLog(@"中心管理器状态重置");break;caseCBCentralManagerStateUnsupported:NSLog(@"中心管理器状态不被支持");break;caseCBCentralManagerStateUnauthorized:NSLog(@"中心管理器状态未被授权");break;caseCBCentralManagerStatePoweredOff:NSLog(@"中心管理器状态电源关闭");break;caseCBCentralManagerStatePoweredOn: {NSLog(@"中心管理器状态电源开启");//在中心管理者成功开启后开始搜索外设 [self.cManagerscanForPeripheralsWithServices:niloptions:nil]; //搜索成功之后,会调用我们找到外设的代理方法sercices为空则会扫描所有的设备 //-(void)centralManager:(CBCentralManager*)centraldidDiscoverPeripheral:(CBPeripheral*)peripheraladvertisementData:(NSDictionary*)advertisementDataRSSI:(NSNumber*)RSSI;//找到外设 }break;default:break; } } 过滤外设,进行连接 如果找到了设备,则代理会调用该方法,过滤外设 /* *@paramcentral中央管理器提供此更新 *@paramperipheral一个外设对象 *@paramadvertisementData一个包含任何广播和扫描响应数据的字典。 *@paramRSSIRSSI(ReceivedSignalStrengthIndicator)是接收信号的强度指示 * */-(void)centralManager:(CBCentralManager*)centraldidDiscoverPeripheral:(CBPeripheral*)peripheraladvertisementData:(NSDictionary*)advertisementDataRSSI:(NSNumber*)RSSI{if([peripheral.namehasPrefix:@"XXX"]&&(ABS(RSSI.integerValue)>35)){//标记我们的外设,延长他的生命周期 self.peripheral=peripheral;//进行连接 [self.cManagerconnectPeripheral:self.peripheraloptions:nil]; } } 连接状态(成功,失败,断开) 中心管理者连接外设成功,连接成功之后,可以进行服务和特征的发现 -(void)centralManager:(CBCentralManager*)centraldidConnectPeripheral:(CBPeripheral*)peripheral{NSLog(@"%@连接成功",peripheral.name);//获取外设的服务 //设置外设的代理 self.peripheral.delegate=self;//外设发现服务,传nil代表不过滤 //这里会触发外设的代理方法-(void)peripheral:(CBPeripheral*)peripheraldidDiscoverServices:(NSError*)error [self.peripheraldiscoverServices:nil]; }//外设连接失败-(void)centralManager:(CBCentralManager*)centraldidFailToConnectPeripheral:(CBPeripheral*)peripheralerror:(NSError*)error {NSLog(@"%@连接失败",peripheral.name); }//丢失连接-(void)centralManager:(CBCentralManager*)centraldidDisconnectPeripheral:(CBPeripheral*)peripheralerror:(NSError*)error {NSLog(@"%@断开连接",peripheral.name); } 发现服务以及内部的特征 //发现外设的服务后调用的方法-(void)peripheral:(CBPeripheral*)peripheraldidDiscoverServices:(NSError*)error {//判断没有失败 if(error){NSLog(@"error:%@",error.localizedDescription);return; }for(CBService*serviceinperipheral.services){ [peripheraldiscoverCharacteristics:nilforService:service]; } }//发现服务后,让设备再发现服务内部的特征-(void)peripheral:(CBPeripheral*)peripheraldidDiscoverCharacteristicsForService:(CBService*)serviceerror:(NSError*)error {//遍历特征 for(CBCharacteristic*characteristicinservice.characteristics){//获取特征对应的描述 [peripheraldiscoverDescriptorsForCharacteristic:characteristic];//获取特征的值 [peripheralreadValueForCharacteristic:characteristic]; } } 更新特征 //更新特征的描述的值的时候会调用-(void)peripheral:(CBPeripheral*)peripheraldidUpdateValueForDescriptor:(CBDescriptor*)descriptorerror:(NSError*)error { [peripheralreadValueForDescriptor:descriptor]; }//更新特征的value的时候会调用-(void)peripheral:(CBPeripheral*)peripheraldidUpdateValueForCharacteristic:(CBCharacteristic*)characteristicerror:(NSError*)error {for(CBDescriptor*descriptorincharacteristic.descriptors){ [peripheralreadValueForDescriptor:descriptor]; } } 外设写数据到特征中 NS_OPTIONS类型的枚举特征属性,可以是多个值,这里需要注意,由于枚举属性是NS_OPTIONS,所以一个枚举可能对应多个类型,所以在判断的时候不能用 = ,而应该用包含& NS_OPTIONS类型的特征属性 -(void)peripheral:(CBPeripheral*)peripheraldidWriteData:(NSData*)dataforCharacteristic:(nonnullCBCharacteristic*)characteristic {// if(characteristic.properties&CBCharacteristicPropertyWrite){//下面方法中参数的意义依次是:写入的数据写给哪个特征通过此响应记录是否成功写入 [peripheralwriteValue:dataforCharacteristic:characteristictype:CBCharacteristicWriteWithResponse]; } } 通知的订阅和取消订阅 一般来说这两个方法要根据产品需求来确定写在什么地方 -(void)peripheral:(CBPeripheral*)peripheralregNotifyWithCharacteristic:(nonnullCBCharacteristic*)characteristic {//外设为特征订阅通知 [peripheralsetNotifyValue:YESforCharacteristic:characteristic]; } -(void)peripheral:(CBPeripheral*)peripheralCancleRegNotifyWithCharacteristic:(nonnullCBCharacteristic*)characteristic {//外设取消订阅通知 [peripheralsetNotifyValue:NOforCharacteristic:characteristic]; } 断开连接 -(void)dismissConentedWithPeripheral:(CBPeripheral*)peripheral {//停止扫描 [self.cManagerstopScan];//断开连接 [self.cManagercancelPeripheralConnection:peripheral]; } END 外设管理设计模式,跟中心管理设计模式类似,就不赘述,需要遵守 外设管理器协议 和中心协议,设置代理,遵守其中的方法.代码地址:https://github.com/coderqiao/CoreBluetooth. 本文转自 卓行天下 51CTO博客,原文链接:http://blog.51cto.com/9951038/1766787,如需转载请自行联系原作者

优秀的个人博客,低调大师

架构如何为业务和技术“服务”(2)

3 ,来年的架构 从2010年初设立架构组,到后来的架构组名存实亡,中心的架构工作充满了问题和认识上的误区。在新的一年,我们的架构可以做些什么呢?下面我提一点初步设想。 3.1 ,目标一:建立 “企业架构” 按照企业架构的定义,结构,采用适当的工具,推动中心建立自己的“企业架构”。 具体来说,分为两个部分: 3.1.1 ,梳理业务架构 将目前的FT,WFT,FTS,MB,玖富银行家,高阳空间等之间的业务关系,结构,层次进行梳理,寻找“核心业务架构”,分离各个业务上的流程和关注点,从而为新的业务、产品的快速搭建提供业务上的基础。 该工作需要公司管理层主动推进,靠架构人员是不可能完成的。 下图是2009年整理的FT和MB业务架构图,现在的情况已经发生了较大的变化,需要重新梳理。 (FT业务架构图) (MB业务架构图) 本文转自深蓝医生博客园博客,原文链接:http://www.cnblogs.com/bluedoctor/archive/2012/06/23/2559110.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

Docker虚拟化技术系列之-命令详解

虚拟化原理:虚拟化解决方案的底部是要进行虚拟化的物理机器。这台机器可能直接支持虚拟化,也可能不会直接支持虚拟化;那么就需要系统管理程序层的支持。系统管理程序(Virtual machine monitor),或称为VMM,可以看作是平台硬件和操作系统的抽象化。在某些情况中,这个系统管理程序就是一个操作系统;此时,它就称为主机操作系统。 随着docker不断的学习,我们要想进一步去维护docker,就需要掌握docker日常使用的命令,如下为docker常用命令: 一、容器基础命令 docker version#查看版本 docker search centos#搜索可用docker镜像(附执行结果哦) docker images查看当前docker所有镜像 docker pullcentos #下载镜像 二、容器导入导出 1 2 3 4 5 cat centos. tar |docker import -centos6 #Docker导入镜像 docker export id >cenos6. tar #Docker导出镜像 dockerruncentos echo "helloword" #在docker容器中运行helloworld! dockerruncentosyuminstallntpdate #在容器中安装ntpdate的程序 docker ps -l命令获得最后一个容器的 id ,docker ps -a查看所有的容器。 运行docker commit提交刚修改的容器,例如: docker commit 2313132centos:v1 三、运行容器命令 运行启动一个容器命令: 1 2 dockerrun-i-tcentos /bin/bash 在容器里启动一个 /bin/bashshell 环境,可以登录进入操作,其中-t表示打开一个终端的意思,-i表示可以交互输入。 dockerrun-dcentos:v1 /bin/bash ,-d表示在后台启动,以daemon方式启动。 1 2 3 dockerstopid关闭容器 dockerstartid启动某个容器 dockerrmid删除容器,dockerrmiimages删除镜像 1 dockerrun-d-p80:80-p8022:22centos:v2,解析:-p指定容器启动后docker上运行的端口映射及容器里运行的端口,80:80,第一个80表示docker系统上的80,第二个80表示docker虚拟机里面的端口。用户默认访问本机80端口,自动映射到容器里面的80端口。 四、进入容器命令 docker exec -it container_id /bin/bash (容器ID) 用这种方式可以直接exit退出容器,容器继续运行; docker attach container_id 如果用这种方式进入,需要用ctrl+a+q退出容器;当然了,容器使用还有非常多的命令,例如docker inspect ID可以查看容器的详细信息等等; 本文转自 wgkgood 51CTO博客,原文链接:http://blog.51cto.com/wgkgood/1899812

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册