精华内容
下载资源
问答
  • LinearLayout中控件不能居右对齐

    千次阅读 2016-04-12 12:44:12
    在LinearLayout布局时使用对齐(android:layout_gravity="right")控件对齐方式不生效,需要设置 android:layout_weight="1" 才能对齐控件,原因在于后把位置平分了。   LinearLayout an

    转自:http://blog.sina.com.cn/s/blog_7dbac1250101mmjc.html

    LinearLayout布局时使用右对齐android:layout_gravity="right")控件对齐方式不生效,需要设置 android:layout_weight="1" 才能右对齐控件,原因在于后者把位置平分了。

     

    <LinearLayout android:gravity="right" android:layout_margin="2dip"

           android:orientation="horizontal" android:layout_gravity="center_vertical"

           android:layout_width="wrap_content" android:layout_height="wrap_content"

           android:layout_weight="1" >

     

           <</span>Button android:id="@+id/btnCommonExpress" android:width="50dip"

               android:layout_width="wrap_content" android:layout_height="wrap_content"

               android:layout_alignParentRight="true" android:text="常用" />

           <</span>Button android:id="@+id/btnAll" android:width="50dip"

               android:layout_width="wrap_content" android:layout_height="wrap_content"

               android:layout_alignParentRight="true"android:layout_alignRight="@+id/btnCommon"

               android:text="所有" />

     </LinearLayout>

    
    展开全文
  • 解决LinearLayout中控件不能居右对齐  在LinearLayout布局时使用右对齐(android:layout_gravity="right")控件对齐方式不生效,需要设置 android:layout_weight="1" 才能右对齐控件,原因在于后把位置...

    解决LinearLayout中控件不能居右对齐  

    LinearLayout布局时使用右对齐android:layout_gravity="right")控件对齐方式不生效,需要设置 android:layout_weight="1" 才能右对齐控件,原因在于后者把位置平分了。

     

    <</span>LinearLayout android:gravity="right" android:layout_margin="2dip"

           android:orientation="horizontal" android:layout_gravity="center_vertical"

           android:layout_width="wrap_content" android:layout_height="wrap_content"

           android:layout_weight="1" >

     

           <</span>Button android:id="@+id/btnCommonExpress" android:width="50dip"

               android:layout_width="wrap_content" android:layout_height="wrap_content"

               android:layout_alignParentRight="true" android:text="常用" />

           <</span>Button android:id="@+id/btnAll" android:width="50dip"

               android:layout_width="wrap_content" android:layout_height="wrap_content"

               android:layout_alignParentRight="true"android:layout_alignRight="@+id/btnCommon"

               android:text="所有" />

     </</span>LinearLayout>

    展开全文
  • 智能家居调研

    千次阅读 2018-05-06 11:09:38
    智能家居作为一个方兴未艾的产业,受到越来越多行业的追捧。国内外家电厂商开始推行网络家电的概念,房地产开发公司利用智能家居的噱头抬高房价,中国网络运营企业的推出的家庭网络共享,电视点播及多媒体综合服务...

    目录
    一、国内外研究现状及趋势
    1. 国外智能家居系统发展现状
    2. 国内智能家居系统发展现状
    2.1海尔的U.Home智能家居系统
    2.2 快思聪智能家居系统
    3.智能家居发展现阶段存在问题
    3.1智能化功能仍需提升
    3.2市场产业链合作仍需建设

    二、智能家居产业规模预测及市场分析
    1.智能家居产业规模预测
    2.国内外智能家居市场分析
    2.1市场介绍
    2.2目前市场的机会
    2.3目标市场
    2.4目标市场分析
    2.5市场定位

    三、智能家居市场发展建议

    四.小结

    近年来,随着国民经济和科学技术水平的提高,特别是计算机技术、网络技 术、通信技术、控制技术的迅速发展,促使了社会信息化的加速,使人们的工作、 生活和通讯的关系日益紧密。信息化的社会在改变人们工作习惯与生活方式的同 时,对传统住宅的自动化,信息化,环境舒适化、安全化提出了挑战。信息化影 响到人们生活的各个方面,改变了人们生活习惯,提高了入们生活质量,家居智 能化也正是在这种形势下应运而生。 智能家居系统是利用先进的计算机、嵌入式系统和网络通讯技术,将家庭中 的各种设备(如照踞系统、环境控制、安防系统、网络家电)透过家庭网络连接到 一起。一方面,智能家居将让用户有更方便的手段来管理家庭设备,比如,通过 无线遥控器、电话、互联网或者语音识别方式控制家用设备;另一方面,智能家家居内的各静设备相互闻可以通讯,不需要用声控制也能根据不溺的状态互动运 行,它对改善现代人类的生活质量,创造舒适、安全、便利的生活空间有着非常 重要的意义。 智能家居的开发与建设是2l世纪科技发展的必然趋势。由于信息技术的大 力普及和应用,极大推动了家居智能化建设的进程,更为家居智能化提供了可靠 的技术保障,实施起来更加容易和简捷。由于智能家居系统具有安全、方便、高 效、快捷、智能纯和个性化的独特魅力,因此具有非常广阔的市场前景,相信不 久的将来就会在普通家庭中普及。

    一、国内外研究现状及趋势

    1.国外智能家居系统发展现状

    智能家屠的概念最早起源于美国,英文为Smart Home。自从世界上第一幢智能建筑1984 年在美国出现后,美国、加拿大、欧洲、澳大利亚和东南亚等经济比较发达的国家和地区先后提出了各种智能家居的方案。目前智能家居系统在美国、德国、新加坡、日本等国都有了广泛应用。面对智能家居的巨大市场,像思科、英特尔、北电、摩托罗拉、朗讯、3Corn、IBM、爱立信和LG 等公司都纷纷加入这个领域,研发智能信息家电和智能家居系统。

    比较有代表性的国外智能家居系统有:
    (1) NEYWELL 公司的智能家庭产品:它可以通过设在家庭内的控制面板、电话或连网的计算机来监控智能家居的报警系统、照明系统、智能家用电器和智能调温设备。
    (2) HAL 公司的NI 智能家居系统:主要有三类产品,OMNILT、OMNI、OMNIPRO,分别适用于普通家庭、办公室及高级住宅。可用于协调控制这些地方的照明、调温、保安等系统。所有OMNI 产品都配有内置的串口,可用来与INTERNET 连接。用户可借助于HAl 公司的软件Web.Link,通过网络对控制器进行设置。
    (3) HAL 公司的ALdeluxe 智能家居系统:它在PC 机上集成了家居系统的所有控制,包括电灯、空调系统、电话、保安系统、家庭影院和互联网系统等。用户可以在任意地点通过声控实现对这些系统的控制。由于也也是通过房间里现有的电源线从PC 机上传送命令,用户不需要对房间进行重新布线。
    (4) Vantage(旺帝)公司的·Vantage 家居自动化系统:Vantage 从事智能家居行业已有30 多年的历史,是世界上最早实现智能家居产品规模化的品牌。唯一一家同时与微软、INTER 和惠普合作的智能家居品牌。其家居控制系统是把被控制的设备群视为一个有机的整体,既对它们分别进行相对独立的有针对性的控制,又能协调它们共同完
    成某项工作,所以功能非常强大,而且质量可靠。整个控制系统完全实现设备及功能的模块化,组建系统非常灵活、易升级、易扩展、性价比极高。
    (5) LG 公司的“LG HomNet”智能家居系统:该系统在中国获得了“2008 年智能家居突出贡献奖”,是指LG 电子全套家庭网络解决方案。LG HomNet 以自身研发的通讯接口标准LnCP(Living Network Control Protoc01)作为基础,LnCP 主要适用于对空调、家电、照明、窗帘、安防、防灾、出入控制等系统,和一系列的远程读表系统等。另外此系统具有易于扩展的优点。在系统构建好之后,针对日后持续技术变化和生活方式的变化,可实现相应的系统扩展和功能更改。
    (6)三星homevita 家电控制解决方案:整个系统由以下几个子系统组成:保障便利生活的“门禁解决方案”、“家电产品控制解决方案”、‘’VolP 可视通话解决方案”、保障经济生活的“远程抄表解决方案”、保障生活安全的“安防防灾解决方案”、“监视解决方案”。该方案带给用户便利、安全的居住环境。而通过网关控制器将用户智能终端和核心设备集为一体,使用户更加简便地控制居住环境,这将有利于节省居住空间和施工费用。

    2.国内智能家居系统发展现状

    国内对智能家居系统的研究起步相对较晚,大约8 年前智能家居的概念才逐步引入中国,随后有部分厂家加入到智能家居的开发和应用行业中来。2003 年~2009 年逐步有中国自主研发生产的智能家居产品小规模应用于市场,但也形成了很多不同的标准,以下是目前国内几种智能家居系统:

    2.1海尔的U.Home只能家居系统:智能社区,智能家居,智能酒店
    2.2快思聪智能家具系统:AV控制解决方案,灯光控制解决方案

    3.智能家居发展现阶段存在问题

    3.1智能化功能仍需提升

    毋庸置疑,智能家居系统绝对少不了智能化的功能,目前智能家居市场的智能化功能比较丰富,且能为用户提供许多安全、舒适与便利的生活享受。例如,用户不但可以通过家庭遥控器来直接控制智能家居系统,还可以由固定电话、手机等触发智能家居系统软件来远程控制家里的电器、灯光等设备,以便达到智能化的控制。此外,智能化的功能也在以往基础之上推陈出新。
    目前,在智能家居系统内,一些智能化功能为用户提供舒适生活起到了良好的保障。在整个智能家居系统中,除了报警、对讲等安防系统外,其它一些智能化的功能也是用户迫切需求的。例如,室内温湿度调节、能耗等的智能化控制就是家居智能化控制子系统较突出的例子。尼科信息技术(上海)有限公司陈鹏表示,如今许多小区、别墅用户除了对灯光、窗帘等需要智能控制以外,更加需要一个人性化的管理系统。目前已有一种特定为室内温湿度调节控制、带有节能功耗的“电子鼻”系统;用户只需将室内所需的温湿度范围、灯光和空调等耗能值等参数信息预先设置好,一旦这些电器运行数值超过预先设置的标准,“电子鼻”系统便可通过传感器检测到超标信息,随后控制器会将超标信息与设置好的参数进行比较分析,并发出指令控制相关设备,自动将温湿度、能耗值调节到可接受范围。该系统犹如一套智能化的感官系统,确保了用户有一个舒适的家居环境。
    虽然智能家居在智能化功能上取得了不小的成绩,但是仍然有一些更加实用的功能尚需不断完善和开发,以满足用户需要。视得安罗格朗的张达勇表示,“老人看护”是一套非常实用的智能化系统,其功能需要研发一套复杂的捕捉系统,因人的形体定位难以把握,要准确地识别出老人摔跤及受伤与否是非常困难的,一旦对于老人的姿态进行了错误的判断,便会发出错误报警,从而造成不必要的麻烦。当前国内的技术还达不到实现的可能,美国也正在研制这种捕捉系统,预计这种系统的出现还会有一个较漫长的过程。包括三个方面:
    3.1.1:个性化需求不断增长
    3.1.2:娱乐功能不可忽视
    3.1.3:网络功能强势凸显
    3.2市场产业链合作仍需建设
    智能家居作为一个方兴未艾的产业,受到越来越多行业者的追捧。国内外家电厂商开始推行网络家电的概念,房地产开发公司利用智能家居的噱头抬高房价,中国网络运营企业的推出的家庭网络共享,电视点播及多媒体综合服务等。这说明,智能家居市场正在朝着大家预想的方向“蓬勃”发展。市场有了更多更有影响力的企业参与进来才能
    推进得更快、更好、更成熟。可我们看到更多的是,向上面所说的有一定影响力的企业并未就智能家居继续投入更多的精力与金钱,大家更多的是持一种观望的态度。存在三个方面:
    3.2.1:资金实力太弱
    3.2.2:产品两级分化
    3.2.3:渠道建设需要加强
    3.2.4:工程商服务需要提升

    二、智能家居产业规模预测及市场分析

    1.智能家居产业规模预测

    随着社会、经济水平的发展,人们的生活开始追求个性化、自动化、快节奏,追求充满乐趣的生活方式。因此,人们对家居品质的要求也越来越高,要求居住环境舒适化、安全化,家居生活人性化、智能化。在中国,智能家居的发展时间虽不长,但是从国内家电巨头及网络巨子的纷纷出手试水智能家居市场以及许多国际大企业对国内智能家居厂家并购案可以看出,中国智能家居市场潜在着巨大商机。全国房地产业蓬勃发展,小区智能化已成为一项基本要求,再配上智能家居,“全智能”的概念必然给房地产业带来新的卖点和活力,因此“全智能”是二十一世纪房产开发商力推的主题,这也意味着,我国智能家居产业迎来发展契机。
    根据中国建设部数据显示,中国富有阶层正在形成,该部分家庭户均年收入在5.6万元以上,人口约4460 万人,1400 多万户,占城市人口的 10%,总人口的3.5%,占全社会消费购买力总和6 万亿元的17%左右,因此主要针对这部分人的智能家居系统其市场总量为1400 万套。正是在这种情况下,近两年来,智能家居系统的销售数量和总销售额都呈现连续攀升的势头,智能家居市场从南方沿海地区和内地大中型城市已经辐射到西部地区。
    我国2008 年建筑总面积达到480.5 亿平方米,根据预测,2009 年-2012 年,国内建筑面积将分别达到500.5 亿平方米、518.5 亿平方米、537.5 亿平方米和557.5 亿平方米。根据国脉物联网技术研究中心最新推出的《2010-2015 中国智能家居产业发展趋势与投资机会研究报告》预测:2015 年我国建筑总面积将达到632.7 亿平方米,较2009年新增132.2 亿平方米。同时,我国2009 年智能家居市场规模达到420 亿元,由于一系列向好因素的刺激作用,之后几年市场规模增速将超过20%,预计2010 年将达到510亿元,2015 年将达到1240 亿元。

    2.国内外智能家居市场分析

    2.1市场介绍
    (1)国外市场介绍
    国际市场的智能家居行业属于成熟期,比如美国X10 技术已成为美国智能家居系统主流技术之一,智能家居产品的用户已经超过1,400 万,占据全球智能家居产品消费的70%。新加坡8X 系统是唯一被美国通过UL 认证的家庭保安与火灾报警系统产品,并于1995、1998 年荣获美国家庭智能化协会颁发的最佳科技奖,该系统在美国和新加坡等全世界20 多个国家或地区被广泛采纳和应用。
    (2)国内市场介绍
    目前国内智能家居市场属于导入期,中国人口众多,城市住宅也多选择密集型的住宅小区方式,因此很多房地产商会站在整个小区智能化的角度来看待家居的智能化,市场上较为成熟的国产智能住宅设备大致可分为安防报警系统、三表抄送系统、可视对讲系统等单一功能产品。
    2.2目前市场的机会
    近几年随着中国经济持续快速增长国内逐渐形成富有人群,国内的别墅和公寓销售市场也大规模增长,这为智能家居市场提供了有力的动力基础。目前别墅和公寓业主有很强烈智能家居的需求,但国内没有那家公司能提供这方面的服务,其主要原因是有两个:
    智能家居和普通住房装修是两个完全不同门类技术,智能家居的技术含量非常高牵涉的技术种类非常多,一般的装修公司提供不了智能家居的设计和施工,某些大型的装修公司也只是提供单一的安放产品和可视对讲产品的安装,这很难满足一般购买别墅或者公寓得业主要求。
    别墅和公寓的智能家居不是某个厂家的产品能够满足其需求的,是根据用户需求由不同产品的组合和集成形成为一个完整系统。但目前国内智能家居的厂商或者经销商提供不了这样的服务,没有专业做这方面设计和集成的公司。这两个主要的原因造成别墅和公寓智能家居市场出现市场的真空,这是我们的市场机会。
    2.3目标市场
    对于目前普通中国人来讲主要解决基本居住问题对于智能家居而言目前不是必需品,但对于先富起来有能力购买公寓和别墅的人士则更讲究的是高品质的生活,智能家居则满足了这部分消费群体的需求。目前国内的智能家居处于市场导入期,消费群体集中在高端用户,但一旦进入市场的成熟期智能家居产品就能进入千家万户。我们目前的目标用户是刚刚购买了别墅或者公寓还没有装修的业主,还有就是购买了二手别墅或者公寓将要进行旧房改造的业主。
    2.4目标市场分析
    2009 年是美林集团和凯捷咨询连续第十年发布《全球财富报告》,该报告每年针对富裕人士(High Net Worth Individual,HNWI)进行定向研究,并进行大量严密的数据和区域分析,如今已成为业内最具权威的财富报告之一。该报告显示:中国(大陆地区)富裕人士人数在2005 年增加了6.8%,达到32 万人。中国富裕人士人均财富高达500 万美元,另外一组鲜明的数字是中国富翁的年龄77%介于30~55 岁,中国富裕人士70%是企业家,并且大部分是在二十年左右的时间内白手起家的,这些人的年龄也多在45 岁左右,富裕人士大部分集中在北京、上海、广州这三座城市,北京每年别墅和公寓销售量在8000套左右,并且逐年递增,这些数字说明目前的智能家居市场潜力非常大,目标市场人群对智能家居现实和潜在的需求巨大表现在以下几点:
    (1)奢华舒适的享乐需求
    (2)方便性需求
    (3)风格、情调的时尚需求
    (4)娱乐性需求
    (5)体现主人品位和文化内涵需求
    (6)体现主人身份和地位的象征需求
    (7)设计个性化,异满足炫耀心理
    (8)实用性需求
    2.5市场定位
    我们创造一种全新的居家观念“家不但是居住的场所,也是是休闲娱乐、工作的场所”颠覆一种传统的居住观念,使用智能家居就是现代家居生活的体现。对于目前的目标用户来讲,我们提供的服务和产品,它既不是必需品也不应该是奢侈品,应该是有实用价值的奢侈品和服务,智能家居不是炫耀的摆设,而是为人类现代智能化生活服务的,只是在目前市场导入期相对一般的消费者而言是奢侈品,随着国内消费者的各种条件的改善,人们不再满足普通的家居生活,智能家居将进入千家万户。

    三、智能家居市场发展建议

    从技术角度来看,在我国发展智能住宅并没有太大难题。但是由于近期内智能家居不同的技术标准还难以统一,尤其在标准化接口和通讯协议(协议问题,即诸多家电和网络能够彼此相容)等方面,为智能家居的迅速普及带来了很大的障碍。除此以外,我们认为还有诸多阻碍属于“非技术问题” 带来的问题同样是不可忽视。我们坚信“问题就是机会”,智能家居市场所面临的问题当中,恰恰蕴藏着未来发展的巨大机会。只有科学的、有预见的处理好这些“非技术问题”,才能更快、更好地启动智能家居市场。下面我们针对智能家居发展中存在的问题,再议九大并举,或许是在我国发展智能家居、快速启动市场的九大出路。当然它们并非完全是等量齐观,今后随着智能家居的不断发展,也许有主有次,也许有取有舍。

    四、小结

    随着技术的进步,特别是建筑结构、住宅功能与人们观念的变迁,加之通讯成本的下降,“智能家居”开始被越来越多的人们所关注。这时,一个新的细分的行业诞生—-智能化装修行业。人们对于装修的内容从开始的“四白落地”,发展到追求“富丽堂皇”;从只重视建筑结构的装修,发展到“重装饰,轻装修”文化层面。随着现代的装修市场竞争越来越激烈,大家都希望能为业主提供一个前卫的设计方案,从而在众多的对手中脱颖而出,但竞争都停留在造型、材料、做工、价格等方面。智能家居近年来频繁地出现在各大媒体上,一时间,成了人们耳熟能详的词汇。很多装修公司抓住了这个机会,他们与智能家居厂家合作,在专修的同时加入智能化的产品。这样不仅可以在视觉上为业主提供一个美丽的家,而且可以让业主住进一个智能、舒适的家。
    就目前这样的发展趋势分析,国内专业智能家居厂家的数量正在迅速增长,智能家居市场在未来的三五年内会高速增长,新技术新产品也会不断出现并投入应用。预计今后两年内将有更多的家庭构建智能家居网络。至2010 年,50%以上的新房将具有一定的智能家居功能.自1999 年开始,我国政府部门就已密切注意到这个动向和趋势,国家信息产业部\国家科委\建设部等部委组织有关专家论证和规划在我国如何发展智能家居和住宅小区的计划,开始着手研究和制定有关我国家庭智能化的标准,使我国在智能家居技术领域得以有序和迅速的发展。同时,这些新型家居将适宜于普通消费者。
    随着社会全面的信息化、智能化和自动化,家庭智能化必将成为未来家居装饰潮流发展的新方向!

    展开全文
  • 智能家居

    千次阅读 2016-11-16 12:43:49
    //添加蓝牙广播接受 IntentFilter filter = new IntentFilter(); // 开始扫描的广播 filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED); // 扫描完成的广播 filter.addAction...

    课程简介

    智能家居是在互联网的影响之下物联化体现。智能家居通过物联网技术将家中的各种设备连接到一起,提供各种控制或者定时控制的功能和手段。与普通家居相比,智能家居不仅具有传统的家庭居住功能,同时还兼备建筑、网络通信、信息家电、设备自动化功能,提供全方位的信息交互功能。

    在本课程中一共有两个案例,第一个是智能摄像头,我将演示如何通过自己编写Android应用控制网络摄像头,实现远程监控功能。第二个是蓝牙继电器,通过手机的蓝牙跟智能设备进行通信进而控制开关,实现电器设备的“智能化”。

    智能家居发展情况

    智能家居起源

    智能家居的概念起源很早,但是直到1984年美国联合科技公司(United Technologies Building System)将建筑设备信息化、整合化概念应用于美国康涅狄格州(Connecticut)哈特佛市(Hartford)的CityPlaceBuilding时,才出现了首栋的“智能型建筑”,从此揭开了全世界争相建造智能家居派的序幕。智能家居从开始到现在主要经历了四个阶段。

    1、家庭自动化

    通过一个中央微处理机接受相关电子产品(检测环境变化)的信息,再发送给其他产品。

    2、家庭网络

    家庭网络是在家庭范围内将家电(安全系统、照明系统)和广域网相连接的一种新技术。

    3、网络家电

    利用数字技术、网络技术及智能控制技术设计改进的新型家电产品,比如网络空调。

    4、信息家电

    能够通过网络系统交互信息的家电产品。

    国内发展现状

    智能家居在我国还是一个新生产业,处于一个导入期与成长期的临界点,我国政府在2013年8月14日发表了关于促进信息消费扩大内需的若干意见,大力发展宽带业务,也为智能家居打下了坚实的基础,加之智能家居市场消费观念还未形成,市场的消费潜力必然是巨大的,产业前景光明。

    1、萌芽期/智能小区期(1994年-1999年)

    概念熟悉、产品认知的阶段,还没有出现专业的智能家居生产厂商。

    2、开创期(2000年-2005年)

    成立了五十多家智能家居研发生产企业,没有进入国内市场。

    3、徘徊期(2006-2010年)

    过分夸大智能家居的功能,行业用户、媒体开始质疑智能家居的实际效果 ,国内企业转型,国外企业进入(罗格朗、霍尼韦尔)。

    4、融合演变期(2011-2020年)

    进入2014年以来,各大厂商已开始密集布局智能家居,经过一年多产业磨合,2015年合作企业已普遍进入到出成果时刻,智能家居新品已经层出不穷的出现了。

    智能家电

    智能灯泡
    智能摄像头
    智能空调

    蓝牙灯泡

    什么是蓝牙灯泡

    智能家居的一部分,将蓝牙模块和灯泡相结合,通过手机和蓝牙模块进行通讯,控制电灯中的电压板,从而控制灯泡的打开、关闭、点动等操作。

    应用场景

    住家、卧室、客厅、厨房、浴厕,办公室、会议室、地下 室、汗蒸房、美容院、医院、疗养院等等地方。

    优缺点

    优点:方便、快捷、能耗低、寿命长、扩展性好
    缺点:受距离限制(5-10米),不稳定

    基本组成

    灯泡

    智能家居

    蓝牙模块

    智能家居

    手机,目标:通过手机控制灯泡的打开、关闭、点动操作

    基本流程

    智能家居

    //获取本地蓝牙适配器
    BluetoothAdapter mBluetoothAdapter =  BluetoothAdapter.getDefaultAdapter();
    
    //打开手机蓝牙
    mBluetoothAdapter .enable();     
    //关闭手机蓝牙
    mBluetoothAdapter.disable();
    
    //扫描蓝牙设备
    mBluetoothAdapter.startDiscovery();
    //取消扫描蓝牙设备,减少资源的消耗
    mBluetoothAdapter.cancelDiscovery();

    startDiscovery()和cancelDiscovery()必须在工程中注册一个蓝牙广播接受者

    //添加蓝牙广播接受者
    
    IntentFilter filter = new IntentFilter();
    // 开始扫描的广播
    filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED);    
    // 扫描完成的广播
    filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);   
    // 发现一个可用的设备的广播
    filter.addAction(BluetoothDevice.ACTION_FOUND);
    mBluetoothReceiver = new BluetoothReceiver();
    //注册监听
    registerReceiver(mBluetoothReceiver, filter);
    

    蓝牙广播接受者

    class BluetoothReceiver extends BroadcastReceiver {
    
            @Override
            public void onReceive(Context context, Intent intent) {
                    //获取蓝牙设备
            }
    }
    

    连接设备

    public void connectServer(final BluetoothDevice device) {
        new Thread(new Runnable(){
            @Override
            public void run() {
            try {
                        System.out.println(randomUUID.toString());
                        BluetoothSocket clientSocket = device.
                createRfcommSocketToServiceRecord(
            UUID.fromString("00001101-0000-1000-8000-00805f9b34fb"));
                        clientSocket.connect();
                        out = clientSocket.getOutputStream();
                        System.out.println("连接成功");
                        Looper.prepare();
                       Toast.makeText(BluetoothDemoActivity.this, "连接成功", 0).show();
                       Looper.loop();
            } catch (IOException e) {
                       e.printStackTrace();
            }
            }}).start();
        }
    

    注意:蓝牙2.1版本不用使用匹配的UUID也可以,但不保证准确性,蓝牙4.0版本需要使用匹配的UUID,为了兼容性都使用匹配的UUID
    UUID: 00001101-0000-1000-8000-00805f9b34fb
    匹配密码:1518(高版本为了低功耗不用密码验证)

    Looper :是用来封装消息循环和消息队列的一个类,用于在android线程中进行消息处理
    Looper.prepare() :在一个线程中运行一个消息循环,通过perpare开启消息循环
    Looper.loop() :循环处理消息,直到循环结束为止

    打开灯泡

    private void openLight() {
            if(out == null) return;
            try {
                // 向服务端写数据
                byte[] b = new byte[5];
                b[0] = (byte) 0x01;
                b[1] = (byte) 0x99;
                b[2] = (byte) 0x10;
                b[3] = (byte) 0x10;
                b[4] = (byte) 0x99;
                out.write(b);
                out.flush();
            } catch (IOException e) {
                Toast.makeText(this, "打开失败", 0).show();
                e.printStackTrace();
            }
        }
    

    注销广播接受者

    @Override
    protected void onDestroy() {
            super.onDestroy();
            unregisterReceiver(mBluetoothReceiver);
    }

    智能摄像头

    准备工作

    网络摄像头,我这里采用的是 品牌: EasyN/易视眼 型号: TM007 ,产品图片如下。
    智能家居

    对应SDK

    智能家居

    我们开发的软件是基于第三方智能网平台的,因此需要使用到第三方的SDK。

    工作原理

    首先当我们将网络摄像头买回来的时候,需要给其设置wifi账号和密码,以让我们的硬件能够连接到物联网云平台。在我们这个案例中使用到的物联网云平台是台湾TUTK公司http://www.tutk.com/推出的IOTC(Internet of Things Cloud 物联网云)平台。摄像头使用的是深圳市普顺达科技有限公司 http://www.easyn.cn/的硬件设备。

    这两家公司的网页首页截图如下:

    智能家居

    智能家居

    当我们的摄像头通上电并设置好网络后会自动连接到IOTC服务器。然后处于等待状态,等待接收来自App端发送的指令。App通过硬件设备的UID、用户名、密码登陆到IOTC服务器,然后发送指令。IOTC获取到App的指令后在转发给设备,然后设备将返回结果(可能是状态数据也可能是摄像机画面)在返回给IOTC,IOTC再将这些结果数据传给App。这样整个就实现了手机和摄像头的互联互动。在这整个过程中IOTC平台是核心部分,也可以看出智能家居其实拼的就是服务平台。

    智能家居

    代码实现

    我们要做的案例效果图如下,总共有两个界面,第一个界面是登录界面,在文本框中输入名称、UID、密码,其中名称是我们自己给自己的摄像头设备起的名称,可以随意写。UID在设备上有,我们直接抄过来,是设备的唯一标识,不可以修改。密码是设备出厂时给了默认的,我们后期可以修改的。为了防止被黑客给黑掉,其实我们只要UID不外漏即可。

    智能家居

    编写布局文件 布局文件共两个,第一个登录界面的布局太简单了,就不给出来了。值给出第二个布局文件。

    activity_camera.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                  android:layout_width="match_parent"
                  android:layout_height="match_parent"
                  android:orientation="vertical" >
        <com.tutk.IOTC.Monitor
            android:id="@+id/monitor"
            android:layout_width="400dp"
            android:layout_height="320dp" />
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center_horizontal"
            android:orientation="horizontal" >
    
            <TextView
                android:id="@+id/tv_state"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="连接状态:" />
        </LinearLayout>
        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="200dp"
            android:layout_gravity="center"
            android:gravity="bottom" >
            <View
                android:id="@+id/center"
                android:layout_width="10dp"
                android:layout_height="10dp"
                android:layout_centerInParent="true"
                android:layout_margin="20dp"
                android:background="#ff0000" />
            <ImageButton
                android:id="@+id/ib_left"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerVertical="true"
                android:layout_toLeftOf="@id/center"
                android:background="@drawable/left"
                android:contentDescription="@null" />
            <ImageButton
                android:id="@+id/ib_right"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerVertical="true"
                android:layout_toRightOf="@id/center"
                android:background="@drawable/right"
                android:contentDescription="@null" />
            <ImageButton
                android:id="@+id/ib_bottom"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_below="@id/center"
                android:layout_centerHorizontal="true"
                android:background="@drawable/bottom"
                android:contentDescription="@null" />
            <ImageButton
                android:id="@+id/ib_top"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_above="@id/center"
                android:layout_centerHorizontal="true"
                android:background="@drawable/top"
                android:contentDescription="@null" />
        </RelativeLayout>
    </LinearLayout>

    添加类库 如下图所示,考虑到类库的保密性在该文档中就不再给出下载地址。

    智能家居

    核心代码 总共有两个Activity,分别是MainActivity和CameraPlayActivity

    MainActivity代码如下:

    package com.example.smartcamera;
    
    import android.content.Intent;
    import android.os.Bundle;
    import android.support.v7.app.ActionBarActivity;
    import android.text.TextUtils;
    import android.view.View;
    import android.widget.EditText;
    import android.widget.Toast;
    
    import com.google.testapp.R;
    
    public class MainActivity extends ActionBarActivity {
        public static final String NAME = "name";
        public static final String PSW = "psw";
        public static final String UID = "uid";
        private EditText et_name;
        private EditText et_pwd;
        private EditText et_uid;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            initView();
        }
        /**
         * 初始化子控件
         */
        private void initView() {
    
            et_name = (EditText) findViewById(R.id.et_devname);
            et_pwd = (EditText) findViewById(R.id.et_psw);
            et_uid = (EditText) findViewById(R.id.et_uid);
        }
        /**
         * 点击Button 开始链接
         *
         * @param view
         */
        public void connect(View view) {
            String name = et_name.getText().toString();
            String pwd = et_pwd.getText().toString();
            String uid = et_uid.getText().toString();
            if (TextUtils.isEmpty(name) || TextUtils.isEmpty(pwd) ||
                    TextUtils.isEmpty(uid)) {
                Toast.makeText(this, "数据不能为空。", Toast.LENGTH_SHORT).show();
                return;
            }
            Intent intent = new Intent(this, CameraPlayActivity.class);
            intent.putExtra(NAME, name);
            intent.putExtra(PSW, pwd);
            intent.putExtra(UID, uid);
            //跳转到播放页面
            startActivity(intent);
        }
    }

    CameraPlayActivity代码如下:

    package com.example.smartcamera;
    
    import android.app.Activity;
    import android.content.Intent;
    import android.graphics.Bitmap;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.ImageButton;
    import android.widget.TextView;
    
    import com.google.testapp.R;
    import com.tutk.IOTC.AVIOCTRLDEFs;
    import com.tutk.IOTC.AVIOCTRLDEFs.SMsgAVIoctrlPtzCmd;
    import com.tutk.IOTC.Camera;
    import com.tutk.IOTC.IRegisterIOTCListener;
    import com.tutk.IOTC.Monitor;
    
    public class CameraPlayActivity extends Activity implements OnClickListener,
            IRegisterIOTCListener {
        private Monitor     monitor;
        private ImageButton ib_left;
        private ImageButton ib_right;
        private ImageButton ib_top;
        private ImageButton ib_bottom;
        private TextView    tv_state;
        private String      mName;
        private String      mPsw;
        private String      mUID;
        private Camera      mCamera;
        Handler handler = new Handler() {
            @Override
            public void handleMessage(android.os.Message msg) {
                switch (msg.what) {
                    // 针对不同的连接状态做不同的处理
                    case Camera.CONNECTION_STATE_CONNECT_FAILED:
                        tv_state.setText("连接失败");
                        break;
                    // 如果是已经连接成功
                    case Camera.CONNECTION_STATE_CONNECTED:
                        tv_state.setText("已连接");
                        // 调用play()方法,完成Camera 和Monitor 的绑定,最终将画面显示出来
                        play();
                        break;
                    case Camera.CONNECTION_STATE_CONNECTING:
                        tv_state.setText("连接中...");
                        break;
                    case Camera.CONNECTION_STATE_DISCONNECTED:
                        tv_state.setText("未连接");
                        break;
                    case Camera.CONNECTION_STATE_TIMEOUT:
                        tv_state.setText("连接超时");
                        break;
                    case Camera.CONNECTION_STATE_UNKNOWN_DEVICE:
                        tv_state.setText("未知设备");
                        break;
                    case Camera.CONNECTION_STATE_UNSUPPORTED:
                        tv_state.setText("不支持的设备");
                        break;
                    case Camera.CONNECTION_STATE_WRONG_PASSWORD:
    
    
                        tv_state.setText("密码不正确");
                        break;
                    case Camera.CONNECTION_STATE_NONE:
                        tv_state.setText("未知错误");
                        break;
                    default:
                        tv_state.setText("未知" + msg.what);
                        break;
                }
            }
    
            ;
        };
    
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_camera);
            // 初始化控件
            initView();
            // 初始化数据
            initData();
            // 开始连接网络
            connectNet();
        }
    
        /**
         * 显示画面的核心方法
         */
        protected void play() {
            /**
             * 如果条件满足则<br>
             * 1 将界面monitor 和Camera 进行绑定<br>
             * 2 开始播放Camera 画面
             *
             */
            if (mCamera != null && mCamera.isChannelConnected(Camera.DEFAULT_AV_CHANNEL)) {
                monitor.attachCamera(mCamera, Camera.DEFAULT_AV_CHANNEL);
                mCamera.startShow(Camera.DEFAULT_AV_CHANNEL, true);
            }
        }
    
        private void connectNet() {
            // 初始化摄像头内部加载c 语言库
            Camera.init();
            // 新创建一个Camera 实例不是Android 中的Camera 而是com.tutk.IOTC.Camera.Camera
            mCamera = new Camera();
            /**
             * 给Camera 注册IOTC 监听<br>
             * IOTC Internet of Things Cloud 物联网云平台<br>
             * 该平台是台湾TUTK 公司推出,有偿使用,因此SDK 不开源
             */
            mCamera.registerIOTCListener(this);
            /**
             * 连接到IOTC 云平台<br>
             * 连接传入的是UID <br>
             * 每个硬件设备出厂时都有唯一的UID编号,并且出厂时已经将该编号注册到IOTC平台服务器<br>
             * 硬件在连接服务器的时候需要带着自己的身边标识(就是UID)
             */
            mCamera.connect(mUID);
            /**
             * 仅仅让硬件连接网络还是不够了,作为终端用户我们想看到云平台上的摄像头画面那么还需要用户
             * 通过用户名和密码登陆进行身份验证<br>
             *
             * @parameter Camera.DEFAULT_AV_CHANNEL
             * 我们可以把一个摄像头硬件理解为一个电视机,那么电视机可以有多个频道,这里我
             * 们使用默认频道即可
             * @parameter mName 用户名<br>
             * @parameter mPsw 密码<br>
             *
             * 当开始连接的时候,由于之前注册了Camera 监听,因此接收到的数据会以回调的形
             * 式传到形参中
             * ,因此这个时候我们就去IRegisterIOTCListener 的回调方法中等数据就行了
             */
            mCamera.start(Camera.DEFAULT_AV_CHANNEL, mName, mPsw);
        }
    
        /**
         * 从上一个Activity 中获取用户数据
         */
        private void initData() {
            Intent intent = getIntent();
            mName = intent.getStringExtra(MainActivity.NAME);
            mPsw = intent.getStringExtra(MainActivity.PSW);
            mUID = intent.getStringExtra(MainActivity.UID);
        }
    
        /**
         * 当前类已经实现了OnClickListener 接口因此绑定点击事件只需要传递this 即可
         */
        private void initView() {
            monitor = (Monitor) findViewById(R.id.monitor);
            ib_left = (ImageButton) findViewById(R.id.ib_left);
            ib_right = (ImageButton) findViewById(R.id.ib_right);
            ib_top = (ImageButton) findViewById(R.id.ib_top);
            ib_bottom = (ImageButton) findViewById(R.id.ib_bottom);
    
            tv_state = (TextView) findViewById(R.id.tv_state);
            // 初始化点击事件
            ib_bottom.setOnClickListener(this);
            ib_left.setOnClickListener(this);
            ib_right.setOnClickListener(this);
            ib_top.setOnClickListener(this);
        }
    
        /**
         * 上下左右点击事件的绑定
         */
        @Override
        public void onClick(View v) {
            switch (v.getId()) {
                case R.id.ib_left:
                    /**
                     * 发送左移动画面指令<br>
                     * PTZ :在安防监控应用中是Pan/Tilt/Zoom 的简写,代表云台全方位(左右/上下)移
                     * 动及镜头变倍、变焦控制。<br>
                     * 因为上下左右都需要发送指令,因此我抽取出一个方法
                     */
                    sendPTZ(AVIOCTRLDEFs.AVIOCTRL_PTZ_LEFT);
                    break;
                case R.id.ib_right:
                    sendPTZ(AVIOCTRLDEFs.AVIOCTRL_PTZ_RIGHT);
                    break;
                case R.id.ib_bottom:
                    sendPTZ(AVIOCTRLDEFs.AVIOCTRL_PTZ_DOWN);
                    break;
                case R.id.ib_top:
                    sendPTZ(AVIOCTRLDEFs.AVIOCTRL_PTZ_UP);
                    break;
            }
        }
    
        ;
    
        /**
         * 发送移动指令
         */
        private void sendPTZ(int type) {
            /**
             * 给摄像头发送指令
             *
             * @parameter Camera.DEFAULT_AV_CHANNEL 默认频道
             * AVIOCTRLDEFs.IOTYPE_USER_IPCAM_PTZ_COMMAND 指令类型
             * SMsgAVIoctrlPtzCmd.parseContent((byte) type, (byte) 0,
             * (byte) 0, (byte) 0, (byte) 0, (byte)
             * Camera.DEFAULT_AV_CHANNEL)
    
             * 指令数据,第三个参数是字节数组我们直接使用SMsgAVIoctrlPtzCmd 类的
             * parseContent 方法生成即可
             *
             */
            mCamera.sendIOCtrl(Camera.DEFAULT_AV_CHANNEL,
                    AVIOCTRLDEFs.IOTYPE_USER_IPCAM_PTZ_COMMAND, SMsgAVIoctrlPtzCmd.parseContent((byte
                            ) type, (byte) 0, (byte) 0, (byte) 0, (byte) 0, (byte) Camera
                            .DEFAULT_AV_CHANNEL));
        }
    
        // 销毁时退出摄像头
        @Override
        protected void onDestroy() {
            super.onDestroy();
            quit();
        }
    
        /**
         * 当接收到服务器的数据时回调该函数
         *
         * @param resultCode 返回状态码
         */
        @Override
        public void receiveChannelInfo(Camera arg0, int channel, int resultCode) {
            Message msg = Message.obtain();
            msg.what = resultCode;
            handler.sendMessage(msg);
        }
    
        @Override
        public void receiveFrameData(Camera arg0, int arg1, Bitmap arg2) {
        }
    
        @Override
        public void receiveFrameInfo(Camera arg0, int arg1, long arg2, int arg3, int arg4,
                                     int arg5, int arg6) {
    
        }
    
        @Override
        public void receiveIOCtrlData(Camera arg0, int arg1, int arg2, byte[] arg3) {
        }
    
        @Override
        public void receiveSessionInfo(Camera arg0, int arg1) {
        }
    
        @Override
        public void onBackPressed() {
            super.onBackPressed();
    
    
            quit();
        }
    
        /**
         * 断开连接
         */
        private void quit() {
            if (monitor != null) {
                // 1.解除绑定
                monitor.deattachCamera();
                // 2.停止显示
                mCamera.stopShow(Camera.DEFAULT_AV_CHANNEL);
                // 3.断开连接
                // 3.1 取消渠道号
                mCamera.stop(Camera.DEFAULT_AV_CHANNEL);
                // 3.2 断开连接
                mCamera.disconnect();
                // 4.注销监听
                mCamera.unregisterIOTCListener(this);
            }
        }
    }

    添加访问网络权限 因为我们的App是访问网络的,当然得记得添加权限

    <uses-permission android:name="android.permission.INTERNET"/>

    智能继电器

    智能继电器目前多用于控制家庭电器的断电与通电。智能继电器跟普通继电器的不同之处就是上面内置了蓝牙芯片,该蓝牙芯片允许手机蓝牙进行连接,然后接收手机蓝牙发送的指令,根据不同的指令打开或者关闭开关,从而间接实现控制家用电器的功能。

    准备工作

    1、智能继电器

    从网上购买了蓝牙继电器。产品详情链接(可能有做广告嫌疑):https://detail.tmall.com/item.htm?id=44157073788&spm=a1z09.2.9.133.cmtDUE&_u=2am3rd62f16

    2、灯泡组 电池 电线 螺丝刀工具等

    该继电器是针对220v居民用电设计的,但是我们是实验的用途因此用3v的电池即可,灯泡就是用发光二极管即可,这样保证了绝对的安全。

    3、发光二极管详情:https://detail.tmall.com/item.htm?id=17637399755&spm=a1z09.2.9.100.cmtDUE&_u=2am3rd662b0

    4、不需要开发SDK,只需要知道继电器蓝牙的指令集即可,在购买的界面商家提供了所有的指令集

    工作原理

    手机搜索到继电器的蓝牙,然后通过蓝牙的配对密码连接上继电器,继电器就是开关,只不过这里用的是继电器上有多个开关组,手机通过蓝牙给继电器发送指令,继电器把指令解析成相应的开或者关的动作,这样就实现了手机控制电器的操作。我自己做成以后的真实图如下。中间方形的是蓝牙继电器,右侧是发光二极管,二极管使用干电池供电。手机通过软件控制灯泡的开和关。

    智能家居

    代码实现

    软件总共有2个界面,运行效果图如下所示。
    第一个界面用于查找周围的蓝牙设备。将找到的蓝牙用ListView显示出来,然后点击智能继电器对应的蓝牙设备,进入第二个界面,在第二个界面完成对智能继电器的多种操作。

    智能家居

    activity_main.xml对应第一个界面:

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                  android:layout_width="match_parent"
                  android:layout_height="match_parent"
                  android:orientation="vertical" >
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            >
            <Button
                android:layout_width="0dp"
                android:layout_weight="1"
                android:layout_height="wrap_content"
                android:layout_margin="5dp"
                android:onClick="checkBluetooth"
                android:text="监测蓝牙设备" />
            <Button
                android:id="@+id/btn_scan"
                android:layout_width="0dp"
                android:layout_weight="1"
                android:layout_height="wrap_content"
                android:layout_margin="5dp"
                android:onClick="scanBluetooth"
                android:text="扫描蓝牙" />
        </LinearLayout>
        <ListView
            android:id="@+id/lv"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            >
        </ListView>
    </LinearLayout>

    activity_control.xml对应第二个界面

    <?xml version="1.0" encoding="utf-8"?>
    <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
                android:layout_width="match_parent"
                android:layout_height="match_parent">
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">
    
            <Button
                android:id="@+id/btn_kaiguan1"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_margin="5dp"
                android:text="开关1"/>
    
            <Button
                android:id="@+id/btn_kaiguan2"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_margin="5dp"
                android:text="开关2"/>
    
            <Button
                android:id="@+id/btn_kaiguan3"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_margin="5dp"
                android:text="开关3"/>
    
            <Button
                android:id="@+id/btn_kaiguan4"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_margin="5dp"
                android:text="开关4"/>
    
            <Button
                android:id="@+id/btn_kaiguan5"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_margin="5dp"
                android:text="开关5"/>
    
            <Button
                android:id="@+id/btn_kaiguanAll"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_margin="5dp"
                android:text="全部"/>
    
            <Button
                android:id="@+id/btn_kaiguan5_diandong"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_margin="5dp"
                android:text="开关5 点动1s"/>
    
            <Button
                android:id="@+id/btn_kaiguan5_husuo"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_margin="5dp"
                android:text="开关5 互锁"/>
    
            <Button
                android:id="@+id/btn_kaiguan5_zisuo"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_margin="5dp"
                android:text="开关5 自锁"/>
        </LinearLayout>
    </ScrollView>

    MainActivity.java是入口Activity

    package com.example.bluetoothtest;
    
    import android.support.v7.app.ActionBarActivity;
    
    package com.example.bluetoothtest;
    
    import android.bluetooth.BluetoothAdapter;
    import android.bluetooth.BluetoothDevice;
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.content.IntentFilter;
    import android.os.Bundle;
    import android.support.v7.app.ActionBarActivity;
    import android.view.View;
    import android.widget.AdapterView;
    import android.widget.AdapterView.OnItemClickListener;
    import android.widget.ArrayAdapter;
    import android.widget.Button;
    import android.widget.ListView;
    import android.widget.Toast;
    
    import com.google.testapp.R;
    
    import java.util.ArrayList;
    
    public class MainActivity extends ActionBarActivity {
        private static final String BTN_SCANING       = "正在扫描蓝牙设备...";
        private static final String BTN_SCAN          = "扫描蓝牙设备";
        private static final int    REQUEST_ENABLE_BT = 1;
        private BluetoothAdapter mBluetoothAdapter;
        private ArrayList<String> mArrayAdapter = new ArrayList<>();
        private Button btn_scan;
        private ArrayList<BluetoothDevice> devices = new ArrayList<>();
        private ListView             mListView;
        private ArrayAdapter<String> mAdapter;
        // Create a BroadcastReceiver for ACTION_FOUND
        private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
            public void onReceive(Context context, Intent intent) {
                String action = intent.getAction();
                // When discovery finds a device
                if (BluetoothDevice.ACTION_FOUND.equals(action)) {
                    // Get the BluetoothDevice object from the Intent
                    BluetoothDevice device =
                            intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                    // Add the name and address to an array adapter to show in a ListView
                    mArrayAdapter.add(device.getName() + "\n" + device.getAddress());
                    devices.add(device);
                    mAdapter.notifyDataSetChanged();
                }
            }
        };
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            initView();
        }
    
        private void initView() {
            mListView = (ListView) findViewById(R.id.lv);
            mAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1,
                    mArrayAdapter);
            mListView.setAdapter(mAdapter);
            mListView.setOnItemClickListener(new OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position,
                                        long id) {
                    Intent intent = new Intent(MainActivity.this,
                            ControlActivity.class);
                    intent.putExtra("device", devices.get(position));
                    mBluetoothAdapter.cancelDiscovery();
                    btn_scan.setText(BTN_SCAN);
                    startActivity(intent);
                }
            });
            btn_scan = (Button) findViewById(R.id.btn_scan);
            mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
        }
    
        /**
         * 监测蓝牙是否开启,如果没有开,请求打开
         *
         * @param view
         */
        public void checkBluetooth(View view) {
    
            if (mBluetoothAdapter == null) {
                Toast.makeText(this, "对不起,您的设备不支持蓝牙。", 0).show();
                return;
            }
            //监测蓝牙是否可用
            boolean enabled = mBluetoothAdapter.isEnabled();
            if (!enabled) {
                Intent enableBtIntent = new
                        Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
                startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
                return;
            }
            //查询已经配对的蓝牙
            queryingPairedDevices();
        }
    
        private void queryingPairedDevices() {
            mArrayAdapter.clear();
            devices = new ArrayList(mBluetoothAdapter.getBondedDevices());
            // If there are paired devices
            if (devices.size() > 0) {
                // Loop through paired devices
                for (BluetoothDevice device : devices) {
                    // Add the name and address to an array adapter to show in a ListView
                    黑马程序员——只要学不死,就往死里学,冲击年薪20 万!
    
                    mArrayAdapter.add(device.getName() + "\n" + device.getAddress());
                }
                mAdapter.notifyDataSetChanged();
            } else {
                Toast.makeText(this, "没有找到已经配对的蓝牙", 0).show();
            }
        }
    
        /**
         * 扫描蓝牙
         *
         * @param view
         */
        public void scanBluetooth(View view) {
            if (mBluetoothAdapter.isEnabled() && !mBluetoothAdapter.isDiscovering()) {
                boolean startDiscovery = mBluetoothAdapter.startDiscovery();
                if (!startDiscovery) {
                    Toast.makeText(this, "开始扫描失败", 0).show();
                    return;
                }
                Toast.makeText(this, "开始扫描", 0).show();
                mArrayAdapter.clear();
                devices.clear();
                btn_scan.setText(BTN_SCANING);
                // Register the BroadcastReceiver
                IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
                // Don't forget to unregister during onDestroy
                registerReceiver(mReceiver, filter);
            } else {
                String scan_state = btn_scan.getText().toString();
                if (BTN_SCANING.equals(scan_state)) {
                    boolean cancelDiscovery = mBluetoothAdapter.cancelDiscovery();
                    if (cancelDiscovery) {
                        btn_scan.setText(BTN_SCAN);
                    }
                    unregisterReceiver(mReceiver);
                }
            }
        }
    
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            if (resultCode == RESULT_OK) {
                Toast.makeText(this, "蓝牙已经可以使用", 0).show();
                checkBluetooth(null);
            } else if (resultCode == RESULT_CANCELED) {
                Toast.makeText(this, "对不起,您的设备没有打开蓝牙,无法使用该应用咯", 0).show();
                return;
            }
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            if (mBluetoothAdapter.isDiscovering()) {
                mBluetoothAdapter.cancelDiscovery();
                btn_scan.setText(BTN_SCAN);
            }
        }
    }

    ControlActivity.java是核心类,用于发送指令

    package com.example.bluetoothtest;
    
    import android.annotation.SuppressLint;
    import android.app.Activity;
    import android.bluetooth.BluetoothDevice;
    import android.bluetooth.BluetoothSocket;
    import android.content.Intent;
    import android.os.Bundle;
    import android.os.Looper;
    import android.os.SystemClock;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.Toast;
    
    import com.google.testapp.R;
    
    import java.io.IOException;
    import java.io.OutputStream;
    import java.util.UUID;
    
    public class ControlActivity extends Activity implements OnClickListener {
        /**
         * 用于设置开关的状态,显示在Button 上的文字就是
         */
        private final static String KAIGUAN1_STATE_OPEN = "开关1 已经打开";
        private final static String KAIGUAN2_STATE_OPEN = "开关2 已经打开";
        private final static String KAIGUAN3_STATE_OPEN = "开关3 已经打开";
        private final static String KAIGUAN4_STATE_OPEN = "开关4 已经打开";
        private final static String KAIGUAN5_STATE_OPEN = "开关5 已经打开";
        private final static String KAIGUAN1_STATE_CLOSE = "开关1 已经关闭";
        private final static String KAIGUAN2_STATE_CLOSE = "开关2 已经关闭";
        private final static String KAIGUAN3_STATE_CLOSE = "开关3 已经关闭";
        private final static String KAIGUAN4_STATE_CLOSE = "开关4 已经关闭";
        private final static String KAIGUAN5_STATE_CLOSE = "开关5 已经关闭";
        private final static String KAIGUANALL_STATE_OPEN = "所有开关已经打开";
        private final static String KAIGUANALL_STATE_CLOSE = "所有开关已经关闭";
        /**
         * 产生一个唯一序列值,用于跟智能继电器的蓝牙连接的时候给自己的蓝牙设备做一个标记作用
         */
        public static final UUID MY_UUID = UUID.randomUUID();
        /**
         * 打开对应的开关的指令集<br>
         * 这些指令大家在卖家的产品说明中有,直接抄过来的<br>
         * 通过这些指令大家发现通信的时候每一个指令都是一个字节数组
         *
         */
        private static final byte[] COMMAND_OPEN_1 = new byte[] { (byte) 0x01, (byte) 0x99,
                (byte) 0x10, (byte) 0x10, (byte) 0x99 };
        private static final byte[] COMMAND_OPEN_2 = new byte[] { (byte) 0x01, (byte) 0x99,
                (byte) 0x20, (byte) 0x20, (byte) 0x99 };
        private static final byte[] COMMAND_OPEN_3 = new byte[] { (byte) 0x01, (byte) 0x99,
                (byte) 0x30, (byte) 0x30, (byte) 0x99 };
        private static final byte[] COMMAND_OPEN_4 = new byte[] { (byte) 0x01, (byte) 0x99,
                (byte) 0x40, (byte) 0x40, (byte) 0x99 };
        private static final byte[] COMMAND_OPEN_5 = new byte[] { (byte) 0x01, (byte) 0x99,
                (byte) 0x50, (byte) 0x50, (byte) 0x99 };
        /**
         * 关闭对应的开关指令
         */
        private static final byte[] COMMAND_CLOSE_1 = new byte[] { (byte) 0x01, (byte)
                0x99, (byte) 0x11, (byte) 0x11, (byte) 0x99 };
        private static final byte[] COMMAND_CLOSE_2 = new byte[] { (byte) 0x01, (byte)
                0x99, (byte) 0x21, (byte) 0x21, (byte) 0x99 };
        private static final byte[] COMMAND_CLOSE_3 = new byte[] { (byte) 0x01, (byte)
                0x99, (byte) 0x31, (byte) 0x31, (byte) 0x99 };
        private static final byte[] COMMAND_CLOSE_4 = new byte[] { (byte) 0x01, (byte)
                0x99, (byte) 0x41, (byte) 0x41, (byte) 0x99 };
        private static final byte[] COMMAND_CLOSE_5 = new byte[] { (byte) 0x01, (byte)
                0x99, (byte) 0x51, (byte) 0x51, (byte) 0x99 };
        /**
         * 全部开关控制指令
         */
        private static final byte[] COMMAND_OPEN_ALL = new byte[] { (byte) 0x01, (byte)
                0x99, (byte) 0x64, (byte) 0x64, (byte) 0x99 };
        private static final byte[] COMMAND_CLOSE_ALL = new byte[] { (byte) 0x01, (byte)
                0x99, (byte) 0x65, (byte) 0x65, (byte) 0x99 };
        /**
         * 开关5 点动1s 所谓的点动1s 就是通电1s 后断点
         黑马程序员——只要学不死,就往死里学,冲击年薪20 万!
    
         */
        private static final byte[] COMMAND_DIANDONG_5 = new byte[] { (byte) 0x01, (byte)
                0x99, (byte) 0x53, (byte) 0x53, (byte) 0x99 };
        /**
         * 互锁自锁这两个概念不好理解互锁的效果是把开关5 打开了,把开关4 关闭了。自锁的效果跟开关
         * 很类似,不过稍微有差异,对于我们来讲可以忽略
         */
        private static final byte[] COMMAND_HUSUO_5 = new byte[] { (byte) 0x01, (byte)
                0x99, (byte) 0x54, (byte) 0x54, (byte) 0x99 };
        private static final byte[] COMMAND_ZISUO_5 = new byte[] { (byte) 0x01, (byte)
                0x99, (byte) 0x55, (byte) 0x55, (byte) 0x99 };
        private Button btn_kaiguan1;
        private Button btn_kaiguan2;
        private Button btn_kaiguan3;
        private Button btn_kaiguan4;
        private Button btn_kaiguan5;
        private Button btn_kaiguanAll;
        private Button btn_kaiguan5_diandong;
        private Button btn_kaiguan5_husuo;
        private Button btn_kaiguan5_zisuo;
        //蓝牙设备
        private BluetoothDevice mDevice;
        //通过蓝牙设备获取到的流
        private BluetoothSocket socket;
        // 是否连接成功用于记录连接状态
        private boolean isConnected = false;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_control);
            initView();
            initData();
            initConnection();
        }
        /**
         * 初始化视图
         */
        private void initView() {
            btn_kaiguan1 = (Button) findViewById(R.id.btn_kaiguan1);
            btn_kaiguan2 = (Button) findViewById(R.id.btn_kaiguan2);
            btn_kaiguan3 = (Button) findViewById(R.id.btn_kaiguan3);
            btn_kaiguan4 = (Button) findViewById(R.id.btn_kaiguan4);
            btn_kaiguan5 = (Button) findViewById(R.id.btn_kaiguan5);
            btn_kaiguanAll = (Button) findViewById(R.id.btn_kaiguanAll);
            btn_kaiguan5_diandong = (Button) findViewById(R.id.btn_kaiguan5_diandong);
            btn_kaiguan5_husuo = (Button) findViewById(R.id.btn_kaiguan5_husuo);
            btn_kaiguan5_zisuo = (Button) findViewById(R.id.btn_kaiguan5_zisuo);
            // 设置点击事件
            btn_kaiguan1.setOnClickListener(this);
            btn_kaiguan2.setOnClickListener(this);
            btn_kaiguan3.setOnClickListener(this);
            btn_kaiguan4.setOnClickListener(this);
            btn_kaiguan5.setOnClickListener(this);
            btn_kaiguanAll.setOnClickListener(this);
            btn_kaiguan5_diandong.setOnClickListener(this);
            btn_kaiguan5_husuo.setOnClickListener(this);
            btn_kaiguan5_zisuo.setOnClickListener(this);
            // 设置默认状态
            btn_kaiguan1.setText(KAIGUAN1_STATE_CLOSE);
            btn_kaiguan2.setText(KAIGUAN2_STATE_CLOSE);
            btn_kaiguan3.setText(KAIGUAN3_STATE_CLOSE);
            btn_kaiguan4.setText(KAIGUAN4_STATE_CLOSE);
            btn_kaiguan5.setText(KAIGUAN5_STATE_CLOSE);
            btn_kaiguanAll.setText(KAIGUANALL_STATE_CLOSE);
        }
        /**
         * 初始化数据
         */
        private void initData() {
            Intent intent = getIntent();
            BluetoothDevice device = intent.getParcelableExtra("device");
            if (null == device) {
                Toast.makeText(this, "没有获取到数据", 0).show();
                finish();
            }
            this.mDevice = device;
        }
        /**
         * 初始化蓝牙连接<br>
         * 因为蓝牙连接是线程阻塞且耗时的操作,因此需要放到子线程中,当连接成功后修改连接状态为true
         */
        private void initConnection() {
            Toast.makeText(this, "蓝牙开始连接", 0).show();
            new Thread(new Runnable() {
                @SuppressLint("NewApi")
                @Override
                public void run() {
                    if (socket == null) {
                        try {
                            /**
                             * 通过蓝牙设备获取蓝牙Socket 流
                             */
                            socket =
                                    mDevice.createRfcommSocketToServiceRecord(MY_UUID);
                        } catch (IOException e) {
                            Looper.prepare();
                            Toast.makeText(ControlActivity.this, "连接失败。" + e, 0).show();
                            Looper.loop();
                            e.printStackTrace();
                            return;
                        }
                    }
                    if (!socket.isConnected()) {
                        try {
                            socket.connect();
                        } catch (IOException e) {
                            e.printStackTrace();
                            Looper.prepare();
                            Toast.makeText(ControlActivity.this, "连接失败。" + e, 0).show();
                            Looper.loop();
                            return;
                        }
                    }
                    if (outputStream == null) {
                        try {
                            /**
                             * 通过socket 获取输出流
                             */
                            outputStream = socket.getOutputStream();
                            Looper.prepare();
                            Toast.makeText(ControlActivity.this, "连接成功。", 0).show();
                            isConnected = true;
                            Looper.loop();
                            isConnected = true;
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }).start();
        }
        //如果频繁点击则拒绝,因为对继电器的物理损坏比较大,一秒只能点击一次
        long time = SystemClock.uptimeMillis();
        @Override
        public void onClick(View v) {
            //如果还没连接成功则拒绝往下操作
            if (!isConnected) {
                Toast.makeText(this, "蓝牙正在连接中。。。", 0).show();
                return ;
            }
            if (SystemClock.uptimeMillis() - time < 1000) {
                Toast.makeText(this, "您的操作太频繁了,请稍后再试", 0).show();
                time = SystemClock.uptimeMillis();
                return;
            }
            Button button = (Button) v;
            String state = button.getText().toString();
            int id = v.getId();
            switch (id) {
                case R.id.btn_kaiguan1:
                    if (KAIGUAN1_STATE_CLOSE.equals(state)) {
                        //发送对应的指令
                        sendCommand(COMMAND_OPEN_1);
                        btn_kaiguan1.setText(KAIGUAN1_STATE_OPEN);
                    } else {
                        sendCommand(COMMAND_CLOSE_1);
                        btn_kaiguan1.setText(KAIGUAN1_STATE_CLOSE);
                    }
                    break;
                case R.id.btn_kaiguan2:
                    if (KAIGUAN2_STATE_CLOSE.equals(state)) {
                        sendCommand(COMMAND_OPEN_2);
                        btn_kaiguan2.setText(KAIGUAN2_STATE_OPEN);
                    } else {
                        sendCommand(COMMAND_CLOSE_2);
                        btn_kaiguan2.setText(KAIGUAN2_STATE_CLOSE);
                    }
                    break;
                case R.id.btn_kaiguan3:
                    if (KAIGUAN3_STATE_CLOSE.equals(state)) {
                        sendCommand(COMMAND_OPEN_3);
                        btn_kaiguan3.setText(KAIGUAN3_STATE_OPEN);
                    } else {
                        sendCommand(COMMAND_CLOSE_3);
                        btn_kaiguan3.setText(KAIGUAN3_STATE_CLOSE);
                    }
                    break;
                case R.id.btn_kaiguan4:
                    if (KAIGUAN4_STATE_CLOSE.equals(state)) {
                        sendCommand(COMMAND_OPEN_4);
                        btn_kaiguan4.setText(KAIGUAN4_STATE_OPEN);
                    } else {
                        sendCommand(COMMAND_CLOSE_4);
                        btn_kaiguan4.setText(KAIGUAN4_STATE_CLOSE);
                    }
                    break;
                case R.id.btn_kaiguan5:
                    if (KAIGUAN5_STATE_CLOSE.equals(state)) {
                        sendCommand(COMMAND_OPEN_5);
                        btn_kaiguan5.setText(KAIGUAN5_STATE_OPEN);
                    } else {
                        sendCommand(COMMAND_CLOSE_5);
                        btn_kaiguan5.setText(KAIGUAN5_STATE_CLOSE);
                    }
                    break;
                case R.id.btn_kaiguanAll:
                    if (KAIGUANALL_STATE_CLOSE.equals(state)) {
                        sendCommand(COMMAND_OPEN_ALL);
                        btn_kaiguan1.setText(KAIGUAN1_STATE_OPEN);
                        btn_kaiguan2.setText(KAIGUAN2_STATE_OPEN);
                        btn_kaiguan3.setText(KAIGUAN3_STATE_OPEN);
                        btn_kaiguan4.setText(KAIGUAN4_STATE_OPEN);
                        btn_kaiguan5.setText(KAIGUAN5_STATE_OPEN);
                        btn_kaiguanAll.setText(KAIGUANALL_STATE_OPEN);
                    } else {
                        sendCommand(COMMAND_CLOSE_ALL);
                        btn_kaiguan1.setText(KAIGUAN1_STATE_CLOSE);
                        btn_kaiguan2.setText(KAIGUAN2_STATE_CLOSE);
                        btn_kaiguan3.setText(KAIGUAN3_STATE_CLOSE);
                        btn_kaiguan4.setText(KAIGUAN4_STATE_CLOSE);
                        btn_kaiguan5.setText(KAIGUAN5_STATE_CLOSE);
                        btn_kaiguanAll.setText(KAIGUANALL_STATE_CLOSE);
                    }
                    break;
                case R.id.btn_kaiguan5_diandong:
                    sendCommand(COMMAND_DIANDONG_5);
                    break;
                case R.id.btn_kaiguan5_husuo:
                    sendCommand(COMMAND_HUSUO_5);
                    break;
                case R.id.btn_kaiguan5_zisuo:
                    sendCommand(COMMAND_ZISUO_5);
                    break;
                default:
                    break;
            }
        }
        private OutputStream outputStream;
        /**
         * 发送指令考虑到发送数据也是耗时操作,因此也在子线程中执行
         */
        @SuppressLint("NewApi")
        private void sendCommand(final byte[] command) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        outputStream.write(command);
                        outputStream.flush();
                    } catch (IOException e) {
                        Looper.prepare();
                        Toast.makeText(ControlActivity.this, e.toString(), 0).show();
                        Looper.loop();
                        e.printStackTrace();
                    }
                }
            }).start();
        }
        //释放资源
        @SuppressLint("NewApi")
        @Override
        protected void onDestroy() {
            super.onDestroy();
            if (outputStream != null) {
                try {
                    outputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (socket != null) {
                if (socket.isConnected()) {
                    try {
                        socket.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                socket = null;
                isConnected = false;
            }
        }
    }

    Android视频教程

    展开全文
  • div对象盒子向偏移设置,使用css让div靠一定距离-div向移教程实例篇 div向偏移一定距离,可采用margin外边距实现、也可以使用padding来实现,这就要看不同情况下...两个盒子前者是蓝色的div,后是红色的...
  • 智能家居与人工智能

    万次阅读 多人点赞 2019-01-16 11:00:45
    一般实现的功能是可以呼叫、可视、对讲等功能,但是通过“品奇”的整合部已经将很多不同平台的产品实现了统一,增强了整套系统控制部分的优势,让室内主机也可以控制家里的灯光和电器了。 7、家庭影院系统 对于...
  • 小米智能家居技术分析

    千次阅读 2018-09-29 11:33:41
    小米智能家居以小米多功能网关为中心,搭配门窗传感器、人体传感器和无线开关。其中门窗传感器可以配合智能灯泡、空气净化器等设备,完成进门自动开灯、关窗后自动开启空气净化器等功能。人体传感器可以和多功能网关...
  • Home Assistant 中空调伴侣以自定义组件的方式加入,此组件为爱好 Mac_zhou 制作,欢迎大家前往 项目地址 点赞。 插件使用前需获取设备的 token:进入『米家』应用,点击空调伴侣,选择上角『•••』—— ...
  • 前端按钮靠

    千次阅读 2019-12-03 09:31:38
    < button style=“float:right” class=“layui-btn” lay-submit="" lay-filter=“febs-form-group-submit”>立即提交< /button>...靠样式 style=“float:right” 真的很有效呀 ...
  • 智能家居系统是人们的一种居住环境,以住宅为平台安装有智能家居系统,实现家庭生活更加安全,节能,智能,便利和舒适。智能家居必将是新时代的潮流趋势,有理由相信,未来,智能家居将向汽车一样,逐渐普及至普通...
  • 智能家居管理系统

    千次阅读 2013-01-07 15:58:47
    MSP43F2616内部自带12位的AD和DA,还有高达120Kfash存储区,4KARM存储区,2个SPI接口、4个串口等,最大特点是可以在线编程和这样可以为编程调试程序提供很大的便利。低功耗特点非常适合用在对功耗要求非常...
  • 有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学...
  • 关于printf输出之对齐

    千次阅读 2019-08-20 19:34:18
    #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int main(void) { char ch1,ch2; int N = 5; ch1 = 'A'; ch2 = 'A'; for (int i = 0; i < 5; i++) { ch1 = ch2;... ...
  • 物联网架构下的智能家居

    千次阅读 2015-03-02 15:56:25
    物联网架构下的智能家居 ...本文将就以物联网技术为主的智能家居,展开对发展背景、发展历史、基本理念、关键技术、发展前景的详细论述与研究。 关键词:智能家居;物联网技术;调研报告   目 录
  • CSS对齐实现方法

    千次阅读 2014-07-30 16:44:01
    用CSS实现对齐,这似乎是一个太过基础的例子啊,不过越基础越容易出错,有时候甚至找不到头绪了,这也是我本人在刚开始写CsS的时候所遇到的问题,今天才次向CSS初学演示一款极其简单的CSS对齐代码,希望对你的...
  • 在一款新产品的开发中,常常才有“种子用户”的方式:通过招募一些技术爱好作为种子用户,根据他们的反馈和实际使用情况,对早起的产品进行不断地优化,把一些常用的定制化功能变得标准化,便可以有效的权衡好两个...
  • 汉字拆左右偏旁

    千次阅读 2013-12-21 18:03:41
    卧臣卜 项工页 功工力 攻工攵 荆茾刂 邪牙阝 雅牙隹 期月 欺欠 斯斤 鞭革便 勒革力 划戈刂 敬苟攵 鹳雚鸟 欧区欠 切七刀 鞋革圭 鄞堇阝 勤堇力 陌阝百 陈阝东 隐阝急 降阝夅 队阝人 防阝方 院阝完 阳阝日 际阝...
  • CC2530, 各种智能家居通信技术比较

    千次阅读 2016-05-17 09:49:30
    2)没有外接FLASH的设备,image的大小 (片上FLASH空间 - bootloader空间) / 2。 从第2个条件不难看出,空中升级的原理是将新的image下载到flash空闲区域,然后用新的image替换老的image。 但由于即使最优化...
  • 东方网4月15日消息:在恒隆工作的白领张小姐前几天在吴江路红宝石购买饭后甜点时,发现明星产品“奶油小方”悄悄涨价了,两块装一盒“奶油小方”售价从12元涨至13元。这已经不是周围第一家涨价的面包店,2月底至3...
  • 智能家居系统设计与实现

    万次阅读 2018-07-15 23:17:20
    接下来就要实现能实时获取到酷痞中的开关传感器的状态“0”或者“1”,之后就将酷痞、嵌入式开发板、Arduino开发板三联系在一起。 上图展示了嵌入式开发板与Arduino开发板通信的三脚,从左往看,分别是GND、TX、...
  • 虽然G1上市后曾受到消费指责,称该产品存在很多不足,如电池续航能力差、触摸屏功能失效等等。但G1手机运行着由谷歌 主持开发的Android手机操作系统。除宏达电外,其他手机制造商也计划推出自家Android手机。 ...
  • 本篇竞品分析报告的分析目的是通过对核心用户高度重合,且使用逻辑习惯相似的竞品进行功能架构分析,深入了解物联网智能家居行业的现状和市场情况,主要通过剖析米家App,了解模式、功能的特色,发现产品的亮点...
  • 《领风》观后感

    千次阅读 2019-07-26 21:55:04
    有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学...
  • WebGL的3D家居创意设计踩坑手记

    千次阅读 2018-12-12 15:40:00
    自顶向下看3D场景就是一个平面图,当需要切换到3D效果时,将相机的类型换为THREE.PerspectiveCamera并调整为合适的位置即可,所以整个绘制区域是一个3D场景,使用正交相机使看起来是一个平面图。 添加墙壁:这个...
  • 的功能要求更是趋向多元化和综合化,不过也有很大一部分的开发商只是在炒作这么一个概念,增加卖点,以吸引消费的目光。 相比较东南沿海较好的市场状况,北方和西部的智能家居市场就要显得冷清许多。北京费尔...
  • 有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学...
  • 家居风水大发现(1)序言- 家居风水大发现[都市峦头学初阶]中国古代堪与学分[峦头]与[理气],前者为形相风水学,后为飞星时空学,前者较易,后较难,此书乃[峦头学]之入门必看之经典。[我信赖风水,但不依赖风水。...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 24,484
精华内容 9,793
关键字:

居其右者