Notes for FIT5046: Mobile and distributed computing systems
这门课说的是Mobile,但是实际上在开发时就完全是Android,至少到w5期中都没见iOS的影子。
另外这门也不纯粹是开发(虽然占大头),也有读paper的ass
W1 理论介绍
最后考试部分为part2与REST
(不考的part1是课程介绍)
分布式的定义
一系列自制系统实体组成计算上的范式,实体在地理上分散,之间能够通过网络交流与交换信息以达成特定任务
垂直(V)分布:不同业务逻辑分层到不同机器上
水平(H)分布: 单个层、组件分布到众多机器来扩容(分布式数据库)
新兴概念
- 节点不固定的移动计算
- 无处不在的计算,其中节点嵌入我们的环境中
- 上下文感知计算
- IoT(物联网)
- 云计算
- 边缘或雾计算
模型
-
C/S
-
P2P
SOA (Service-Oriented Architecture)
应用程序功能作为松散耦合的服务提供
使用标准接口(Web 服务)来调用、发布和发现服务
通过接口进行基于消息的交互
重用公共服务、服务组合和互操作性以支持不同平台
Web Services
Web 服务是一段软件/代码,旨在支持通过网络 (W3C) 进行可互操作的机器对机器交互
Web 服务提供了一个接口,使一组操作可供公众使用
它们支持访问业务逻辑、数据和流程或其他服务
它们可以被人类、机器或其他 WS 访问
使用如此多的支持工具进行开发既简单又便宜
SOAP 和 RESTful Web 服务(RESTful Web API)
SOAP (Simple Object Access Protocol)
XML, WSDL and UDDI
WSDL 用于定义和描述 SOAP Web 服务
UDDI(通用描述、发现和集成)用于使用目录注册和发现 SOAP Web 服务(就route)
SOAP 涵盖以下主要领域:
- 消息结构:提供一种消息格式,描述消息如何打包到 XML 文档中
- 处理模型:处理 SOAP 消息的规则和涉及处理 SOAP 消息的实体的简单分类。 消息的哪些部分应该由谁阅读以及如何在内容不被理解的情况下做出反应
- 可扩展性模型:如何使用特定于应用程序的构造来扩展基本消息构造
- 协议绑定框架:允许使用不同的协议(HTTP、SMTP、TCP 等)传输 SOAP 消息
- HTTP 的具体绑定
SOAP Message
1 |
|
Header:
- 可选的
- SOAP Header 元素包含特定于应用程序的信息: 身份验证(PIN,密码)、加密、缓冲/缓存等
- 如果Header 元素存在,它必须是Envelope 元素的第一个子元素。
- SOAP Header 中定义的属性(mustUnderstand)定义了接收者应该如何处理 SOAP 消息。如果 mustUnderstand 的值为 1,则中间节点必须对header中间内容进行处理,否则会发生错误
Body:
- m:XXX 命名空间限定 namespace-qualified
http binding
Content-Type: application/soap+xml;
WSDL 的作用
由 URI 标识的软件应用程序,其接口和绑定能够被定义、描述和发现为 XML 工件.
即为类A与处理B之间的绑定,让接收到A之后能开始运行B(routeMap)
REST
CS
约束:Client-Server:
分离关注点
- 将用户界面问题(例如客户端)与数据存储问题(例如服务器)分开
- 允许组件独立进化
- 提高用户界面跨多个平台的可移植性
- 通过简化服务器组件提高可扩展性
Stateless
从客户端到服务器的每个请求都必须包含理解请求所需的所有信息
不能利用服务器上任何存储的上下文
提高可扩展性和可靠性
Cache
对请求的响应中的数据被隐式或显式标记为可缓存或不可缓存
如果响应是可缓存的,则该响应可以在以后重复用于等效请求
- 提高网络效率和性能
- 降低可靠性(陈旧数据的可能性)
Uniform Interface
所有资源都使用通用接口访问(例如, HTTP GET、POST、PUT、DELETE)
Layered System
允许架构由分层层组成
- 每个组件都不能“看到”超出它们与之交互的直接层
- 客户端不知道他们调用的服务也可能调用其他服务
- 这可用于通过启用跨多个网络和处理器的服务负载平衡来提高可扩展性
[Code-On-Demand]
“允许通过下载和执行小程序或脚本形式的代码来扩展客户端功能。”
W2 安卓开发基础
最基础的EventListener和Spinner(相当于下拉选择器)
考点:
- 3种 mobile applications
- Views, ViewGroupsand Layouts (what they are and their purpose)
- All the important files in Android, what they are and their purpose
Spinner不考
mobile app分类
-
Native App:略
-
Web Apps:说的不是Cordova这种哦,是纯网页的,没任何线下的,比如bitcointalk网站
-
Progressive Web App (PWA):React Native居然算PWA。。。(flutter应该也算了
基础布局 Layout
模拟考题内容
作为APP组件,定义app界面(how the app will look like)
Layout,View & ViewGroup关系
- Layout定义了活动/片段中 UI 的结构
- Layout的元素由 View 和 ViewGroup 对象的层次结构组成
- ViewGroup 就像一个不可见的容器,可以包含其他View
- ViewGroup 是 Layout 和 View 容器的 基类 (ViewGroup是View的子类
- View 表示 UI 组件的基本构建块
- 基类是类似按钮和文本字段等小部件
常见Layout
ConstraintLayout, RelativeLayout, Linear layouts (Vertical or Horizontal), FrameLayout, GridLayout
ConstraintLayout
Android Studio 中的默认布局
它支持创建复杂的布局
它只能使用布局编辑器的可视化工具构建(?我明明盲着编辑的
类似于相对布局,它创建了一个平面视图层次结构
它需要添加约束constraints来定义视图的位置
每个View需要至少一个水平和一个垂直约束
重要文件
- manifests
- manifests/AndroidManifest.xml
- 包括有关应用程序的重要信息:应用程序组件的描述,例如Activity和Service;声明所需的权限
- GradleScripts: Android build gradle提供了一个自定义构建工具来管理和配置构建apk文件,有助于导入、下载和添加本地和远程依赖项
- build.gradle(Project: APPLICATION_NAME) 作用域为整个项目
- 使您能够轻松导入和使用远程存储库
- 存储库Repositories 是指存储所有库和jar文件的位置/目录,Repositories 包括 google() 和 jcenter() maven 存储库
- 所有 Jetpack 组件都可以通过谷歌 Maven 存储库 google() 获得,您可以添加项目中所有模块使用的仓库 例如
maven { url"https://jitpack.io" }
- build.gradle(Module: app) 作用域为单个Module
- 包含有关 compileSDKversion, minSdkVersion, targetSdkVersion、版本代码version code和名称name 等信息
- 您可以在此处添加和配置应用程序依赖项,但请确保它们的存储库包含在 build.gradle(Project) 中
- build.gradle(Project: APPLICATION_NAME) 作用域为整个项目
- java
- java/PACKAGE_NAME/MainActivity.java 定义应用程序的行为方式以及与用户的交互方式
- res
- res/drawable
- res/layout/activity_main.xml(and any other layout files)
- res/menu:目录的Layout文件
- res/values/strings.xml
- 可以在此文件中包含字符串常量
- 能够在一个位置管理所有 UI 文本,更容易在应用中查找和更新文本
- 在Java代码中引用方式:
String message = getString(R.string.edit_message);
Activity
在构建和运行应用程序时,在 MainActivity 类中,setContentView()
方法加载并扩充作为参数传递给它的 XML 布局文件并创建视图层次树
Activity 生命周期
- onCreate() 初始化活动组件,例如 创建视图或用数据填充列表(这里必须调用 setContentView() 方法
- OnStart() Activity变得可见
- onResume() 已准备好接受用户输入,在活动堆栈的顶部(即,在前台)
- onPause() 失去焦点,将进入停止或恢复状态
- onStop() 不再可见
- onDestroy() 即将终止
Kotlin
简洁明了
安全的(避免 NullPointerException 问题)
工具友好
可以在JVM上工作,可以与 Java 和 Android 完全互操作
Kotlin 类中的属性被声明为 var或者 val
用于可变属性的变量,例如 var message: String=“你好”
valis 用于只读属性,例如 val message: String=“你好”
必须初始化属性或必须提供自定义访问器
lateinit 修饰符 可用于声明为非空的属性,以便稍后对其进行初始化 private lateinit var binding: ActivityMainBinding
空值安全 Null Safe
Kotlin 的 null 安全旨在消除 Java 的 NullPointerException(NPE)
在 Kotlin 中,常规属性不能为空(非空类型)
1 | var message: String="Hello" |
要允许空值并将属性声明为可空值,请使用“?”
1 | var message:String? = "Hello" |
使用可空引用时:
- 选项 1:检查条件是否为空,例如
if (message != null)
- 选项 2:通过使用此符号 ? 来使用安全调用。例如
println(message?.length)
- 选项 3:使用!!运算符将任何值转换为非空类型并在值为空时抛出异常(行为与 Java 相同)
val = b!!.length
面向对象
类的主要构造函数可以是类头类的一部分
class Person(varvalue: Double) { /*...*/ }
主构造函数不能包含任何代码,因此初始化代码放置在初始化程序块中,例如 init{ if(value<1) value=1.0 }
默认情况下,Kotlin类是final(不能继承)。
要使类可继承,请使用 open 关键字,例如 open class Person
使用单个冒号字符 (😃 继承,而不是 Java的extends 关键字
不需要 new 关键字,并且要创建对匿名内部类的引用,它使用“对象”
在 Kotlin 中,所有方法都是函数(fun)
冒号 (😃 在函数中用于返回类型,例如 fundoubleIt(x: Int): Int{ …}
Protected 具有私有的可见性和子类的可见性(类似于 Java 的私有和公共可见性)
Backing fields & properties
-
Backing fields 支持字段:在访问器中使用字段标识符
-
‘field’ 关键字只能在属性被初始化时使用
-
varname:String="default" get() = field.capitalize() set(value){ if(value.isEmpty()) { field = "blank" } } <!--code3-->
-
W3 多Activity项目开发
Multiple Activities结构的APP 以及用于在Activities直接传输消息的Intent
- Views 和 Event Handling(例如按钮onClick)
- Views 和 Adapters ( Spinner )
- View binding
- Intent和Multi-Activity
- Bundle
- Parcelable
Events & Event Listeners
View Binding
优势:
- 减少样板代码
- 空值安全 - 视图绑定创建对视图的直接引用,因此它消除了空指针异常的风险
- 类型安全:每个绑定类中的字段都具有与视图匹配的类型,因此它避免了类转换异常
Intent
- 启动Activity
- 启动Service
- 启动广播Broadcast (让其他App可接受到
- Activity之间传递信息
1 | Intent intent = new Intent(MainActivity.this,SecondActivity.class); |
类似于建立一个通道,然后往通道塞东西,在通道另一端主动收取(go chan?
而且还是个双向的,对方也可以取这个来返回消息
Use Intent to Receive Results
- startActivity() 方法启动另一个活动(单向)
- 开始另一个Activity并接收结果:
- 第一个Activity:
- 唤起
startActivityForResult(Intent intent, int requestCode)
, 你提供一个像 1 (requestCode>= 0) 这样的值,这样你就可以得到结果. - 实现
onActivityResult()
方法接收结果
- 唤起
- 第二个Activity:
- 调用 setResult() 方法设置将返回到第一个活动的结果。
void setResult(int resultCode, Intent intent)
,result code可以是标准结果RESULT_CANCELED,或者RESULT_OK
您不创建新的 Intent,而是使用第一个Activity给的Intent returnIntent= getIntent();
- 将结果发送给调用者后,调用
finish()
方法关闭并销毁Activity
- 调用 setResult() 方法设置将返回到第一个活动的结果。
Bundle
有了Intent,要发送一组数据项,您可以使用 Bundle
您将所有数据项添加到一个包对象,然后通过调用 putExtras() 将包添加到 Intent,例如
1 | Bundle bundle=new Bundle(); |
在第二个Activity中从bundle中检索数据:
1 | Bundle bundle=getIntent(). getExtras(); |
Parcelable
Bundle传的都是KV的,如果要传的是Object就需要实现个Parcelable
与 Java 的序列化相比,Android Parcelable 是一个用于序列化对象并更快地(具有更好的性能)传输对象及其状态和属性的接口
- 添加一个parcelable
1 | bundle.putParcelable("student1", student); |
- 在其他Activity检索parcelable
1 | Bundle bundle= getIntent().getExtras(); |
但这只有在学生类是 Parcelable 时才有效
实现Parcelable
- implements Parcelable
- 加个
1
2
3
4
5public void writeToParcel(Parcel parcel, int flags) {
parcel.writeInt(id);
parcel.writeString(name);
...
} - 写个无脑赋值constructor
- 加个public int describeContents()
- 加个
1
public static final Creator<T> CREATOR = new Creator<T>() {/**/}
- 加getter、setter
- = = 让IDE教自己吧
W4 基于Fragment的开发
Fragments 结构的APP,先学的是用SharedPref来通信(其实就是个本地db
以及用于在Fragments直接传输消息的LiveData
Fragment
- 用于构建应用程序用户界面的一部分
- 有自己的布局和生命周期
- 必须托管在Activity中
- 具有附加到宿主的视图层次结构的视图层次结构
- 提供可重用性和模块化
- 使用fragment,更容易动态修改activity的外观
Fragment的生命周期
Lifecycle:
onCreate()→onCreateView()→onViewCreated()→onStart()→onResume()
→onPause()→onStop()→onSaveInstanceState()→onDestoryView()→onDestoy()
在fragment类中必须实现onCreateView()方法并调用inflate()方法返回View为fragment绘制UI
inflate() 方法从指定的 XML 节点inflate(膨胀)一个新的视图层次结构,将其转换为相应的View和ViewGroup
Callback Methods:
- onAttach(): 当附加到其宿主Activity时调用
- onDetach(): 当与其宿主Activity分离时调用
SharedPreferences
- 能够以key-vaule的形式保存和检索简单的值
- SharedPreferences 对象指向包含键值对的 XML 文件,并提供简单的方法来读取和写入它们
- 如果不需要存储大量数据,也不需要结构,这是一种合适的存储和访问数据的方式
这是一种在Fragment之间传递数据的简单方法
LiveData
- LiveData 是 Android Jetpack 中的架构组件之一
- LiveData是一个可以被观察的数据持有者类(一个抽象类),使用observer(观察者)模式
- LiveData 允许observer订阅更新,当 LiveData 对象持有的数据发生变化时,observer会收到通知
- 当一个类(一个活动或一个片段)想要被通知可观察对象的变化时,它可以实现Observer接口
- LiveDatais 具有生命周期感知能力
- LiveData 更新处于活动生命周期状态下的App组件observer
- LiveData 的实例通常在 ViewModel 类中创建
- LiveData 对象(保存数据)存储在 ViewModel 对象中,并通过 getter 方法访问
- LiveData 允许应用程序组件(例如 Activity 或 Fragment)中的观察者观察更新,并获得更改通知
MutableLiveData extends LiveData
ViewModel
- ViewModel 也是 Jetpack 中的架构组件之一
- ViewModel 为片段或活动准备和管理数据
- 当 Activity 处于其任何生命周期状态,ViewModel 都处于活动状态且正在运行,
- ViewModel 保留数据——它不会在配置更改期间被破坏,例如旋转设备破坏并重新创建其所有者(Activity或Fragment)
W5 导航栏 Navigation
导航栏(侧边
大作业这部分要求用侧边的,用底部的不给分
- Material Design 中的导航
- 导航抽屉
- Jetpack 导航组件
- NavigationUI
- NavHost
- NavController
- Navigation Graph
导航的类别
- Lateral 横向导航:Navigation Drawer, Bottom Nav Bar, Tabs
- Forward 前向导航:Container(Card), Button, Link
- Reverse (Upward) 反向导航: 回退按键
Drawer
侧边叫Modal drawer。底部身上来的叫Bottom drawer
Principle
- 可识别
- 确保用户可以清楚地识别导航
- 基于位置和列表样式内容的抽屉
- 有组织的
- 确保按重要性或使用频率对导航抽屉中的菜单选项(目的地)进行排序,并将相关的组合在一起
- 上下文相关
- 导航抽屉可以显示或隐藏以适应不同的应用程序布局
W6 基于 Room 的安卓存储
关系型数据库
Android 单线程模型的两条规则:
- 规则 1:不要阻塞 UI 线程
- 规则 2:不要从 UI 线程之外(从worker thread)访问 Android UI 工具包
解决方案:
runOnUiThread(Runnable)
View.post(Runnable)
View.postDelayed(Runnable, long) // long: the delay (in milliseconds)
Tasks
Immediate:
需要用户活跃
- Java: ExecutorService and a thread pool
- Kotlin: Kotlin coroutines
Exact:
AlarmManager
Deferred:
WorkManager
Room Persistence Library
- Room Persistence 库是 Android Jetpack 的一部分
- Room 在 SQLite 上提供了一个抽象层,可以实现更强大的数据库访问
- SQLite 提供了一个关系数据库管理系统,用于永久存储结构化数据
- 存储在 SQLite 中的数据可以被应用程序中的任何类访问,但不能被应用程序外部访问
- 直接使用 SQLite API 需要编写复杂的代码,并使用 Helper 和 Cursor 来访问和管理数据
- 为了减少创建和管理 SQLite 数据库的工作量,引入了 Room
Room Persistent Library 包括:
- 数据库Database:包含数据库持有者并有权访问底层持久化的关系数据(SQLite 数据库)
- 实体Entity:代表数据库中的表
- DAO(数据访问对象Data Access Object)类
- 包含提供对数据库的抽象访问的查询方法
- 提供 SQL 查询到插入或删除等方法的映射
Entity Class
- @Entity 将类标记为实体
- 对于每个实体,在关联数据库中创建一个表
- 实体类提供了到数据库中 SQLite 表的映射
- Room 默认使用数据库表名作为类名
- 要更改表名,请使用@Entity 注解的tableName 属性
- Room 使用字段/属性名称作为数据库中的列名称
- 要更改列名,请在字段中添加@ColumnInfo 注释
- 每个实体必须有一个主键,注释为 @PrimaryKey
- 如果您希望 Room 为实体分配自动 ID,请设置 @PrimaryKey 的 autoGenerate 属性
- 为了使该字段持久化,Room 必须有权访问它,或者将它们设为公开(不需要 getter 和 setter)或私有,但为包括 id 在内的所有字段添加 getter 和 setter
在两个实体之间创建一对多关系
- 子实体(Playlist))必须包含一个引用主键的变量
- 父实体(User)的
- 使用子实体实例列表(Playlists)创建一个新的表示关系的类(UserWithPlayLists)
- 给子实体(用户)的实例添加**@Relation**注解
- 设置 parentColumn 为父实体的主键
- 将 entityColumn 设置为引用父实体 PK 的子实体的列
DAO (Data Access Object)
- DAO 包括提供对数据库的抽象访问的方法
- 通过使用 DAO 类而不是直接查询来访问数据库,我们可以将数据库的不同组件分开
- DAO 方法示例:
- @Insert
- @Update
- @Delete
- @Query
Dao下也能用LiveData的返回值来实现observer订阅
如果需要ViewModel则需要继承AndroidViewModel,需要将Application 作为上下文传入来实现全局注册
RoomDatabase
数据库类满足以下条件:
成为扩展 RoomDatabase 的抽象类
public abstract class CustomerDatabase extends RoomDatabase {
在@Database 注释中包含数据库的实体列表
@Database(entities = {Customer.class}, version = 1, exportSchema =false)
包含一个没有参数的抽象方法,返回 DAO
public abstract CustomerDAO customerDao();
创建基于单例模式的 Database 实例,以防止同时打开多个数据库实例
1 | private static CustomerDatabase INSTANCE; |
为了在工作线程/后台线程上运行数据库操作,我们使用了一个带有固定线程池的 ExecutorService(允许重用以前创建的线程来执行多个数据请求)
public static final ExecutorService databaseWriteExecutor = Executors.newFixedThreadPool(NUMBER_OF_THREADS);
如果数据库架构更改,则处理迁移(略
Repository
Repository 就像是 DAO 和 ViewModel 之间的中间层,提供了一个“干净的 API”
- 它还负责管理查询线程(ExecutorService 和我们在 Database 类中添加的线程池)
- Repository 类中的 DAO 实例提供通过它访问数据库的所有读/写方法
相当于就是中间一层专门用db.databaseWriteExecutor.execute(()->{dao.insert(customer);});
Kotlin
Dao,Room这种差不多,但是异步上因为Kotlin有自家Coroutines,因此与Java的操作有大不同
协程是一种并发设计模式,用于在不阻塞主线程的情况下管理长时间运行的作业(用于异步编程)
- 协程使用“暂停”技术,使它们“轻量级”
- 多个协程可以在一个线程上运行而不阻塞线程
- 提高资源消耗和并发操作
- Suspend:一个正在运行的协程可以被挂起,其相应的计算将被暂停,但它的局部变量将存储在内存中,使线程可以自由执行其他作业
- Resume:当计算准备好继续时,它返回到一个线程,并从它挂起的地方继续执行挂起的协程
- 我们使用 suspend 关键字来强制从协程中调用一个函数(挂起函数)
挂起函数只返回一个值,但为了支持 LiveData,我们需要接收多个值(更新),因此我们使用 Kotlin 的 Flow
- 一个 Flow 可以依次产生多个值
- 在 Room 中,可以使用 Flow 接收来自数据库的实时更新
- 在 Kotlin 中,我们通过使用 Dao 中的 Flow 来实现 LiveData,使 UI 在底层数据发生变化时自动更新
- 然后在 ViewModel 类中,我们可以通过调用 asLiveData() 将 Flow 转换为 LiveData
要创建协程,我们需要在某些 CoroutineScope 的上下文中使用诸如 launch 或 async 之类的协程构建器
- launch 创建一个新的协程,它不携带任何结果值
- async 是另一个协程构建器,用于创建一个协程,稍后将结果作为延迟值返回
- 为了得到结果,我们对延迟值使用 .await()
协程是在某些 CoroutineScope 的上下文中创建的
- viewModelScope 是一个预定义的 CoroutineScope,因此我们访问
ViewModel 通过其 viewModelScope 属性的 CoroutineScope: ViewModel.viewModelScope - 在主activity中,我们可以访问LifecycleOwner.lifecycleScope
Kotlin 协程使用调度器来确定哪些线程用于协程执行
常见的调度员有以下三种类型:
- Dispatchers.Default - 该调度器经过优化,可以在主线程之外执行 CPU 密集型工作,例如 对列表进行排序并解析 JSON
- Dispatchers.IO – 它用于在主线程之外执行磁盘或网络 I/O,例如使用 Room 组件、读取或写入文件以及运行任何网络操作**(安卓里取数据基本用这个)**
- Dispatchers.Main(和 Dispatchers.Main.immediate)——在与 UI 交互时使用,例如调用挂起函数、处理 Android UI 对象或更新 LiveData 对象
W6 RecyclerView
考前才发现这个没看(全算考试内容的),考试考到了挺简单的
实际考试出题在ViewHolder(就是单个item的layout)上,以及onBindViewHolder()作用(用list内容填充各个layout)。比较简单就不加上去了
W7 UI
主要还是讲G家的UI规范:MD
设计风格与范式
- 拟物
- Flat平面
- Material Design
Material Design
原则
Material(材料)是个隐喻
- Material design 试图根据现实世界的物体创造数字世界,捕捉它们的光影
粗体、图形、刻意
- Material Design 使用排版、空间、比例、颜色和图像来创建层次结构、意义和焦点
- 用于强调操作并使它们对用户可见
- 旨在创造一种身临其境的体验
运动提供意义
- 用户执行动作和动作创建动作,通过微妙的反馈和连贯的过渡
- 动作应该是有意义和适当的
- 反馈应该清晰可见,但不能太明显和分散注意力
环境Environment
材料设计支持使用光、阴影,和具有 x、y 和 z 3维度的Material对象的 3D 环境
- 每个Sheet都有标准的 1dp 厚度
颜色
定义
- 颜色系统用于创建反映您的品牌或风格的颜色主题
- 主色primary colour是屏幕上最常用的颜色
- 主要颜色的浅色或深色变体可用于创建对比度以区分 UI 元素
- 副色secondary colour是可选的,可用于强调 UI 中的选定部分
- 常用于浮动动作按钮文本选择、进度条、滑块、开关和链接
- 对比色Contrast:基于可访问性标准的原色和副色之间
规则
- 分层:使用颜色来显示它们的重要性级别以及它们之间的关系
- 品牌:使用颜色来强调品牌存在感
- 状态:使用颜色来显示元素或组件的当前状态,或应用程序、组件或元素的状态变化
- 含义:使用颜色来传达 UI 元素的含义
图像
- 原则:
- 信息性:发送明确的信息
- 令人愉快的:带来快乐和愉悦
- 有意:必须有目的和故事
- 使用适当的分辨率大小
- 使排版在图像之上清晰易读
- 使用用户生成的摄影、专业摄影或不同类型的插图
图标,字体,菜单
略
Tabs
使用滚动Tabs:
- 当一组选项卡无法显示在屏幕上时
- 选项的数量约为5到7
- 当items密切相关或属于一个类别时
- 某些项目将不可见(被挤出去了),因此用户无法一次看到所有项目
滚动标签不用于主要导航
表单
- 创建流畅自然的对话流程
- 字段的逻辑分组和排序
- 区分分组项目
- 有意义且熟悉的字段标签
- 一致的术语和缩写
- 如果需要,提供提示和示例
- 视觉上吸引人的布局(对齐)
- 可选和必填字段明确标记(*)
- 如果可能,使用列表来减少错误
- 最小化输入的数量:
- 合并相似的输入字段
- 消除多余的和不太重要的条目
- 错误预防和错误消息
- 使用有意义且清晰的错误消息
- 纠错:重新关注包含错误的字段
- 即时反馈和完成反馈
- 为用户提供当前状态和进度的反馈
- 尽早验证,但不要中断对话流程
- 适当的内联反馈
纵向排列Label和input优于横向
WCAG 2.0 and Other W3C/WAI Guidelines
原则 1:可感知
1.1. 小屏幕尺寸
- 最小化信息量(例如更少的内容模块或图像)
- 提供合理的默认尺寸以最小化放大和缩小的需要
- 将表单字段置于其标签下方
- 使链接文本的长度适应视口宽度
- 视口指的是网页的可见区域,在手机上较小
1.2 缩放/放大
- 允许用户在移动设备上控制内容/文本大小的方法
- 例如。 在用户手指下使用放大镜视图
- 文本的大小最多可调整为 200%
1.3 对比度
- 移动设备在不同照明环境中使用
- 为小屏幕考虑正确的大/小文本对比度
原则 2:可操作
2.1 触摸屏设备的键盘控制
当前的移动设备显示屏幕键盘以接受文本输入
- 键盘可访问性非常重要,一些移动操作系统包含键盘接口以支持外部键盘或其他替代品
2.2 触摸目标尺寸和间距
- 交互元素必须足够大,彼此之间有足够的距离
- 为触摸目标使用正确的大小和间距
2.3 触摸屏手势
可以通过触摸屏上的手势操作移动设备
手势包括简单的敲击或使用多个手指的复杂操作
- 手势应该尽可能简单
- 对于复杂的手势,设计替代方案以支持简单的点击或滑动手势
- 通过 mouseup或者 touchend event 激活元素
- 使用 mouseup或者 touchend event 触发操作有助于防止在触摸和鼠标交互过程中出现意外操作
2.4 设备操作手势
- 设备的物理操作,例如摇晃或倾斜
- 确保提供触摸和键盘可操作的替代控制选项
2.5 将按钮放置在易于访问的位置
- 请将按钮放置在用户可以轻松够到的地方,即使用户不同姿势摆放设备
原则 3:可理解
3.1 更改屏幕方向(纵向/横向)
支持两种方向模式,不要期望用户旋转(例如当移动设备安装在轮椅的固定臂上时)
3.2 一致的布局
“跨多个页面重复的组件应该以一致的布局呈现。”
3.3 在页面滚动前定位重要的页面元素
小屏幕限制了无需滚动即可显示的内容量
- 定位重要的页面信息,使其无需滚动即可看到,以帮助弱视用户和有认知障碍的用户
3.4 对执行相同动作的可操作元素进行分组
“当多个元素执行相同的操作或前往相同的目的地时(例如带有链接文本的链接图标),这些应该包含在同一个可操作的元素中”。
3.5 明确说明要素是可操作的
使用视觉特征来表示可操作的元素(例如斜角按钮)
3.6 提供自定义触摸屏和设备操作手势的说明
提供可见且易于访问的说明,例如工具提示和教程
原则 4:Robust
4.1将虚拟键盘设置为所需的数据输入类型
4.2 提供简单的数据录入方法
- 通过提供菜单、单选按钮或自动输入减少文本输入量
4.3 支持平台特性
移动设备提供帮助残障用户的功能,例如缩放、字幕或更大的字体,但这些功能因设备类型和操作系统而异
W7 Retrofit 网络库
网络请求库 https://square.github.io/retrofit/
权限声明 <uses-permission android:name="android.permission.INTERNET" />
写进AndroidManifest.xml
Model Classes
其实就是Entity
创建Model类以提供到响应正文及其元素的结构的映射,作为 JSON模型
通常,对公共 API 的 http GET 调用会返回非常长且复杂的 JSON 响应。 使用 Retrofit 的 Model 类,您可以仅包含映射所需的 JSON 响应中的字段/对象
例如。 Google 搜索响应 (JSON) 包含许多对象,但我们只想访问“items”下的“snippet”,因此我们创建了一个 Retrofit Model 类来仅映射这两个对象并忽略其他对象
Model 类应该匹配 Retrofit Interface 中返回的类型
GET
只讲了GET…
1 | public interface UserService{ |
或者
1 | public interface UserService{ |
Client
-
Retrofit 客户端类负责创建 Retrofit 实例
-
Retrofit 有一个 Retrofit.Builder 可以通过提供以下配置使用配置的值调用 build() 轻松创建 Retrofit 实例:
- baseUrl() 设置 API 基本 URL
- 转换器通过调用 addConverterFactory() 并将 GsonConverterFactoryforencoding 传递给 JSON 并从 JSON 解码
-
我们在 Retrofit 实例上调用 create() 方法并传递我们创建的 Retrofit 接口,以便 Retrofit 可以生成接口定义的 API 端点(即 URL)的实现
1 | public class RetrofitClient{ |
Call(back)
InterfaceCall<T>
Call 发送请求并返回响应
Call 提供了两种发出 HTTP 请求的方法:
Response<T> execute()
– 用于发送同步请求void enqueue(Callback<T>)
– 用于发送异步请求并在收到响应时调用回调方法
InterfaceCallback<T>
回调需要实现两个方法:
-
void onResponse(Call<T> call, Response<T> response)
- 为收到的 HTTP 响应调用
Response.isSuccessful()
可以调用来判断响应是否成功
-
void onFailure(Call<T> call, Throwable t)
- 发生网络异常或意外异常时调用
Kotlin
协程写法
1 | interface RetrofitInterface{ |
这里给fun加了个suspend
1 | val retrofitInterface: RetrofitInterface= RetrofitClient.getRetrofitService() |
在CoroutineScope作用域里干活
W8 普适计算 Ubiquitous Computing
普适计算,也叫pervasive computing(无孔不入计算),由 Mark Weiser 于 1988 年左右创造的一种计算范式,其中计算机变得如此普遍和“隐形”,以至于我们根本看不到计算机
- “隐形”传感和处理设备嵌入我们的环境中,如此自然、如此友好,以至于我们在使用它们时甚至没有注意到
- 这是关于“随时随地”的计算
人机交互(HCI
- 从命令行交互开始,然后转向直接操作
- 在普适计算中,设备无处不在并嵌入我们的环境中
- 沉浸式系统
- 多模式交互
输入设备
- 间接指向设备
- 鼠标、轨迹球、操纵杆
- 直接指向设备
- 触摸屏、触控笔
- 语音/语音
- 动作和手势
- 生物识别输入数据:
- 面部、手指、虹膜或视网膜,或行走方式/步态
- 生理信号(例如心率、血压、脑电图信号)
- 基于脑信号的脑机接口(BCI)
输出设备
- 语音/语音
- 小尺寸到壁挂式屏幕
- 3D打印机
- 3D可视化
- 全息图
- 虚拟现实和增强现实
上下文/情境感知计算 Context/Situation-Aware Computing
相关领域
Context: 任何可用于表征实体情况的信息
上下文感知
“根据其使用位置、附近人和物体的集合以及这些物体随时间的变化进行调整的应用程序”
“应用程序感知和响应有关环境、位置、时间或用户的上下文信息的能力”
- 上下文感知被认为是无处不在的计算系统的关键组成部分
- 上下文感知系统了解当前上下文,例如位置和物理环境,并使用此信息相应地调整其行为或操作
- 它使应用程序能够:
- 适应动态变化
- 个性化
- 聪明主动
- 成本效益
- 聪明伶俐
首个上下文感知系统:Active Badge system at Cambridge AT&T Lab,使用红外信号检测建筑物内人员的位置
情景:高级上下文
- 情境指的是高层次的上下文
- 情境代表感兴趣的现实生活情境
- 情境提供了对周围环境的更广阔视野
- 示例:忙碌、迟到、开会、健康、火灾威胁或开车
- 通过使用推理/推理方法推断情况
- 从多条上下文的聚合(融合)中推断出情况
上下文/情境推理方法通过对低级上下文进行推理(建模)来产生高级上下文信息
上下文建模
能够以标准和一致的方式表示上下文
支持应用程序之间的上下文共享
可以在上下文中进行推理
上下文/情境推理
- 简单的逻辑法
- 模糊逻辑法
- 基于本体的推理
- 机器学习
- 朴素贝叶斯
- 贝叶斯网络
- 隐马尔可夫模型
- 决策树
- 神经网络
- …
移动感知 Mobile Sensing
也是相关领域
移动感知是指从移动设备收集传感数据
移动感知通常涉及在手机后台运行的移动应用程序,从内部或外部传感器收集传感数据并将收集到的数据传输到云端或远程来源
感知和收集的关键上下文信息是位置
隐私是移动感知的主要挑战
移动人群感知 Mobile CrowdSensing
术语“人群感应”是指利用人群的力量,使用移动和可穿戴设备中的可用传感器收集有关某些感兴趣现象的信息
移动人群感知从大量用户远程收集有关环境和物理世界的数据,并将其提供给 MCS 应用程序
实现方式
-
参与式感知 Participatory sensing:
- 用户直接参与数据收集过程
-
机会式感知 Opportunistic sensing:
- 用户不直接参与数据收集过程(最少参与)
- 感知任务在后台发生
- 移动设备决定何时以及如何参与传感任务
也有个别的移动传感应用,移动传感只在一部手机上单独进行,不与其他用户合作
IoT
也是相关领域
由麻省理工学院的 Kevin Ashton 创造
开启了普适(计算)的新时代
日常物品网络(智能物品)
移动设备、汽车、智能电器等所有对象都连接到互联网,可以进行通信和交换数据
Cloud and edge computing
云计算
“云计算是通过互联网通过云服务平台按需交付计算能力、数据库存储、应用程序和其他 IT 资源,并采用即用即付定价。” (AWS)
“云计算,通常简称为“云”,是通过互联网以按使用付费的方式交付按需计算资源——从应用程序到数据中心的一切。”(IBM)
- 由计算机、服务器、数据中心和资源组成的大型网络
- 基于互联网的计算
- 分布式计算
- 节省硬件、软件和维护成本
- 基础设施、平台、软件、硬件和应用即服务
- 按需和基于效用的计算(按使用付费)
公有云
- 所有硬件、软件或支持基础设施均由第三方服务提供商拥有和管理,并由客户通过 Internet 访问
- 低成本、免维护和无限资源
私有云
- 由类似政府机构的组织在专用网络上运营
- 资源部署在本地
- 更高的安全性和更灵活
混合云
- 公共和私有云网络的组合
边缘计算
“雾计算是定义边缘计算应该如何工作的标准”(Cisco)
- 随着物联网的不断发展,传感器和智能事物产生了大量数据,但将所有物联网数据传输到云端非常昂贵
- 边缘计算允许在边缘处理数据,更靠近生成位置,而不是将其发送到云
- 边缘可以是路由器、汽车、笔记本电脑、服务器或无人机
好处
-
解决大数据问题
-
仅将大数据摘要发送到云端
-
通过在本地聚合和处理数据并将数据摘要发送到云来降低网络带宽和数据传输的成本
-
通过在边缘执行不太复杂的数据分析来缩短响应时间
-
-
安全性:敏感数据可以在边缘进行分析,而不是将其发送到云端
-
互联网不可用情况下仍可用:数据可以在边缘缓存,然后上传到云端
W9 无线传感器 Wireless Sensors
无线传感器是一种感知物理现象(如噪声、运动、光、压力或温度)并将这些物理参数转换为可由设备处理的电子信号的设备
无线传感器然后将感测到的数据无线传输到另一个设备
电源Power
负责提供能量
- 电池供电
- 最终需要更换电池但基本上用不完
- 需要能源管理以减少电池消耗
- 能量收集
- 从环境和其他来源中提取能量
- 太阳能
- 机械能:风力、水流或振动
- 热能
- 从环境和其他来源中提取能量
传感器网络 Wireless Sensor Networks (WSNs)
无线传感器网络由大量传感器节点组成,这些节点密集部署在一个区域内,以实现对物理世界的监控
对许多应用领域都很重要
传感器节点 Sensor Nodes
在 WSN 中,节点感知和观察物理现象
- 节点通过无线链路(无线电)将收集到的信息传送到通常的接收器/基站
- 每个传感器都有能力收集和路由数据
- 通常传感器管理协议确定哪些节点感知以及哪些节点路由数据以确保能源效率
- 节点具有最少的 CPU、内存和极低的功耗
接收器 Sink
传感器收集的数据通常转发到接收器
与传感器不同,接收器拥有大量资源(内存、CPU、存储、电源)
一个接收器可以在本地使用数据,执行简单的数据处理,或者它可以作为连接到互联网的网关(遥感)
接收器可以向节点发送查询或命令以收集数据
传感器操作模式 Sensor Operation Modes
传感器的处理器、收发器和传感部件可以处于不同的操作模式
- 例如。 主动、睡眠或深度睡眠
- 通过根据当前情况和上下文控制传感器的占空比参数,可以减少电池消耗
Sleep States | Sensing | Radio/Transceiver |
---|---|---|
S0 | On | Both transmitter and receiver ON |
S1 | On | Receiver On (Transmitter off) |
S2 | On | Both Off |
S3 | Off | Both Off |
节点拓扑
- Point to Point Topology
- Star Topology
- Mesh Topology
- Tree Topology
分类
静态接收器和移动接收器网络
静态接受器网络:
靠近感应区域的固定位置的水槽
它可能会导致瓶颈情况
靠近sink的节点很快就会消亡
移动接收器网络
在mobile-sink网络中,sink在区域内移动
它可以解决上述问题
确定性或非确定性网络
在确定性网络中,传感器的位置是预先计划好的。反之不然
同构或异构网络
同构网络包括具有相同功能(能量、计算和存储)的传感器
单汇或多汇网络
在网络中有多个接收器的多个接收器中,传感器可以将数据发送到最近的接收器
它会增加复杂性和成本,但会提高性能
单跳或多跳无线传感器网络
(例题考点,估计考边上的其他几种)
单跳网络
长距离,因此在能源消耗方面更昂贵
适用于短覆盖和节点有限的网络
更易于控制和管理
多跳网络
传感器节点通过一个或多个中间节点将其数据传输到接收器
它涉及短距离传输,因此更节能
管理可能很复杂
适用于更大的网络
架构
多跳传感器网络可以分为两种类型:
-
平面传感器网络
-
基于集群的传感器网络
平面多跳架构
所有传感器节点具有相同的角色并充当对等体
在这样的网络中,sink 通常向所有节点发送查询,只有数据满足查询的节点才会响应
传感器节点也可以充当路由器,通过多跳路由将数据传输到接收器,使用它们的对等节点来中继数据
基于集群的多跳架构
传感器节点被分组到集群中
每个簇有一个簇头(CH)
每个集群中的传感器节点向其 CH 发送数据
CH进行简单的处理,将处理后的数据发送给sink
减少通信方面的能源消耗
提高大型网络的可扩展性并平衡流量负载
路由协议
“最佳”路线可以是特定于应用程序的
就能源消耗而言,它可以是延长网络寿命的最有效途径
它可以是最短路径和最小跳数
Flooding and Gossiping
Flooding是最简单的路由技术
节点将数据广播给它的邻居,然后再将数据转发给邻居,直到它到达接收器
- Flooding导致内爆和重叠,因为节点可以接收相同数据消息的多个副本
- 网络内浪费能源和带宽
Gossiping:接收节点只向随机选择的邻居广播数据
- 它减少了内爆,但仍有一些节点可能会收到相同的数据副本
路由
-
基于集群的路由(已经讨论过)
-
基于属性的路由
-
基于位置的路由
-
以数据为中心的路由
-
定向扩散
-
基于能量的路由
-
服务质量 (QoS) 路由
这些路由方法有时会重叠
路由选择
基于属性值的路由
- 感知数据包括属性值对
- 接收器可以发送一个查询来表达它的“兴趣”
- 匹配“兴趣”的数据将被检索并发送回接收器
基于位置的路由
- 位置被视为查询的一个属性
- 使用位置信息来选择路线
- 根据节点的位置限制路由
- 节点可以维护一个路由表来识别下一跳
以数据为中心的路由和网络内处理
以数据为中心的路由:中间节点执行网络内处理
- 网络内处理可能涉及:
- 数据聚合或平均
- 过滤掉冗余/重复数据
- 基于处理比通信更耗能的事实
网络内处理好处
- 可以防止瓶颈问题
- 解决了内爆问题(和重复)
- 通过最小化传输的数据量来降低能耗,从而延长网络寿命
定向传播:广播兴趣
它是一个基于属性值的协议
由三个主要步骤组成:
- 兴趣传播
- 梯度建立
- 沿加强路径传输数据
扩散:接收器将通过网络扩散(广播)它的“兴趣”
-
使用属性值对将兴趣转换为查询
-
一个例子:
利息 = 温度 > 40
采样周期 = 10s
定向扩散:梯度建立
任何收到兴趣的节点都会将兴趣进一步传播给邻居
梯度建立:节点向收到兴趣的邻居建立梯度(即回复链接)
源节点是与兴趣匹配的节点
传感器检测到的数据示例
- 事件 = 温度 41
- 位置 = 矩形 = [-100, 100, 200, 400]
定向扩散:强化
从源到接收器可能有几条路径
传感器网络加强了一个梯度路径
例如。 加强路径可以基于最短路径
能源集约型路由
基于能量的路由方案侧重于确定最有效的路径
可以考虑节点的能源等级
目的是延长网络生命周期
多路径路由和能源效率
将查询从 Sink 路由到 T
-
PA 是可用功率
-
α是通过相关路由传输数据包所需的能量
最低能量路线:Route 1 (α最小)
最小跳数路由:Route 3
服务质量 (QoS) 路由
在 WSN 中,应用程序可能有不同的要求
除了讨论的路由选项之外,QoS routing 还可以关注其他标准
QoS routing旨在平衡数据质量和能耗以实现路由优化
网络质量可以包括 QoS metrics,例如:
- 能源(节能路由),
- 成功交付率(丢包)
- 延迟
- 网络带宽
遥感-通信
传感器节点和接收器之间通信的无线技术:
- ZigBee (IEEE 802.15.4)
- 蓝牙 (IEEE 802.15.1)
- WiFi(IEEE 802.11x)
接收器和远程计算机之间通信的其他通信选项:
- 4G 和 5G 等蜂窝网络
- 卫星通讯
- 无线网络 WiMAX
W10 位置感知计算 Location Aware Computing
全考
- Location-aware Computing
- GPS
- 室内定位系统 Indoor Positioning Systems (IPS)
- Applications
定义
- 室内外定位系统用于确定物体或人的精确物理位置
- 位置感知应用程序从定位系统获取位置信息
- 位置感知应用程序用于许多领域:
- 运输、军事、营销和广告、快递服务、旅游、跟踪和监控应用
纬度和经度可以表示为:
-
十进制度
-
一度等于大约 70 英里
-
例如。 莫纳什考菲尔德校区:
-37.876823, 145.045837
37.876823°S, 145.045837°E
-
-
度、分和秒 (DMS)
Latitude | -37.876823 |
Longitude | 145.045837 |
DMS Lat | 37°52’ 36.5628’’ S |
DMS Lon | 145°2’ 45.0132’’ E |
三边测量和三角测量
- Lateration 边(三边测量 Trilateration):通过测量物体与多个参考位置的距离来计算物体的位置
- Angulation 角度(三角测量 Triangulation):):使用距离和角度(三角形的几何特性)来确定对象的位置
(就是画圆和画线求交点,如果有误差那就是交区
GPS架构
- GPS卫星
- GPS接收器
- 地面站:跟踪和监控 GPS 卫星及其传输、执行分析以及更新时钟和卫星轨道
第一颗可操作的 GPS 卫星于 1978 年发射
GPS卫星(Navstar)由美国政府维护
GNSS - 全球导航卫星系统
其他卫星导航系统,如俄罗斯的 GLONASS、欧洲的伽利略和中国的北斗
排列
定位在 MEO(中地球轨道)中的 GPS 卫星
每颗卫星每天绕地球运行两次
卫星排列成 6 个等距环绕地球的轨道平面
最初的 24 槽排列确保几乎从任何角度都能看到至少四颗卫星
目前共有31颗可运行的GPS卫星(2021年1月9日)
GPS的三边测量
和两个卫星的距离已知,可以画出俩球,俩球交面和地球切出一条线就是可能的位置,这时候再得到个第三个卫星距离(第三个球),该球和线的位置就是实际位置
为了确定位置,GPS 接收器需要知道:
- 四颗或更多卫星的轨道信息和位置
- 来自需要时钟同步的卫星发射器的无线电信号的到达时间:将使用此信息来计算您与每颗卫星之间的距离
计算卫星距离
- 速度:无线电波以光速传播(真空中每秒约 299,792 公里)
- 时间:GPS卫星广播信号的传输时间及其当时的位置
- 卫星使用原子钟
距离:接收器可以通过以下方式计算信号传播的距离:
$ 距离= (接收器接收信号的时间-卫星发射信号的时间)\times 光速$
为了确定物体的位置,GPS 接收器需要:
- 定位四颗或更多卫星
- 通过测量卫星和接收器之间信号的传输时间并乘以光速来计算到每个卫星的距离
- 使用此信息执行三边测量以确定位置
- 还要考虑并解决接收器的时钟偏差(时间同步)
室内定位系统 Indoor Positioning Systems (IPS)
- 虽然 GPS 和户外导航对于许多应用至关重要,但室内定位系统 (IPS) 也可以提供许多用途和好处
- 此类应用的示例:
- 紧急服务(例如在建筑物内定位消防员)
- 基于位置的广告,例如 在购物中心或机场
- 寻找博物馆的兴趣点
- 事件或库存管理
- 医院室内导航
- 手推车跟踪
使用无线通信技术的IPS:
- 无线上网
- 蓝牙
- 红外线 (IR)
- 射频识别 (RFID)
- 超声波脉冲
- 蜂窝网络
- LiFi
IPS 可以使用从以下位置收集的其他数据:
- 罗盘
- 陀螺仪(测量方向)
- 加速度计
- 里程表
- 气压计(测量大气压力)
RSS
RSS(接收信号强度)是对接收到的无线信号强度的测量
RSS 和 TOA(到达时间)广泛用于室内定位,例如 WiFi 三边测量和 WiFi 指纹识别
WiFi 三边测量使用 WiFi 信号强度 (RSS) 信息、WiFi 接入点 (AP) 的位置和 MAC 地址来计算移动设备与 AP 的距离,然后执行三边测量来计算设备的室内位置
位置指纹识别 Location Fingerprinting
指纹识别使用RSS,由在线和离线阶段组成
- 离线阶段:在该区域选择一组参考点,并在每个点测量来自 AP 的 RSS 并存储在数据库中以表示该区域的无线电地图
- 在线阶段:测量移动站的 RSS 并与数据库中的测量值进行比较,以找到最相似的指纹以估计设备的位置
例: Microsoft RADAR
用于室内定位的 LiFi
Li-Fi 是一种可见光通信 (VLC) 技术,使用 LED 以光的形式传输高速数据。 使用可见光的光通信的 IEEE 802.15.7 标准,可以比 WiFi 更快更便宜
数据通过 LiFi 发送,通过调制 LED 发出的光(速度太快以至于人类无法注意到)
-
LED 部署在预定的固定位置
-
传输的数据包括:i) 确定发射器坐标的发送方 ID 和 ii) 确定距离的时间戳
-
发送方和接收方的时钟必须同步
-
使用三边测量或三角测量计算位置
主动蝙蝠系统
主动蝙蝠向天花板上的接收器发送超声波脉冲
距离是根据飞行时间(ToF)确定的
信号发射与反射后返回发送端的时间差
然后根据三边测量原理,通过计算主动蝙蝠到 3 个或更多接收器的距离来确定位置
板球系统,MIT
安装在天花板上的信标发射超声波脉冲和射频信号
移动设备上的听众接收射频信号,然后接收超声波脉冲
听者估计对应信标的距离,然后进行三边测量
位置感知钟
论文:行踪钟 Whereabouts Clock(Brown,2007)
- 钟面显示家庭成员的当前位置
- 它使用手机上可用的手机 ID 来提供位置数据
地理围栏
将有关用户当前位置的信息与用户与感兴趣位置的接近程度相结合
地理围栏 = 位置(纬度和经度)+ 接近度(半径)
地理围栏可以使用您移动设备的定位服务来获取您进入或退出时(或您在地理围栏区域内停留的时间)的信息
它可以向用户的移动设备发送广告,例如 特别优惠信息、提醒、优惠券或其他信息
W12 移动传输技术 Mobile Communication Technologies
全考
- 无线电radio基础
- IEEE 802.11 标准和 WiFi
- 无线个域网 Wireless Personal Area Networks (WPAN) (IEEE 802.15)
- 蓝牙 (IEEE 802.15.1)
- ZigBee (IEEE 802.15.4)
- 射频识别 RFID
- WiMAX (IEEE 802.16)
- 蜂窝网络 Cellular Networks
无线电radio基础
- 无线电波radio wave使无线通信和网络成为可能
- 无需电缆,信号通过空气传输
- 无线电波是一种电磁辐射
- 电磁辐射具有三个重要特性:
- 频率:每秒周期数(Hz)
- 波长:峰间距离
- 能量:在光子中发现的能量
工业、科学和医疗 (ISM) 包括国际保留的无线电频段,无需许可即可使用
FCC(联邦通信委员会)在 5 GHz 范围内引入了新频段(UNII-1、UNII-2、UNII-3
【UNII =(未经许可的国家信息基础设施)
IEEE 802.11
IEEE 802.11 是一组用于定义和实现无线局域网 (WLAN) 通信的标准
操作模式
- 基础设施网络:无线客户端通过无线接入点 (AP) 相互通信
- Ad Hoc Network:临时建立的去中心化点对点网络。例如。 在自然灾害等紧急情况下或在员工之间的会议室中
Wi-Fi Direct:让 Wi-Fi 设备在没有互联网连接的情况下以简单方便的方式相互连接
架构
- 基站 Station (STA):无线/移动客户端,例如笔记本电脑或智能手机
- 接入点 Access Point (AP):使 STA 与骨干网之间的通信成为可能
- 基本服务集 Basic Service Set(BSS):是由支持多个STA的单个无线AP组成的无线网络
- 客户端站之间不直接通信
- 分布式系统 Distribution System(DS):连接两个或多个 AP 并扩展 BSS。
- 扩展服务集 Extended Service Set (ESS):由多个互连的基本服务集 (BSS) 组成,连接到同一有线网络骨干网
- 独立基本服务集 Independent basic service set(IBSS):ad hoc模式下的STA形成IBSS,无法接入无线AP
https://technet.microsoft.com/pt-pt/library/cc757419(v=ws.10).aspx
无线分配系统 Wireless Distribution System (WDS)
WDS 是指两个或多个相互连接的无线 AP
- 无线桥接 Wireless Bridging,其中无线 AP 相互通信,并作为路由器与其他移动客户端通信
- 无线中继 Wireless Repeating,其中无线 AP 仅相互通信(作为中继器),扩展现有 AP 的无线覆盖范围
Wi-Fi
Wi-Fi 是 WiFiAlliance 的商标
“……基于电气和电子工程师协会 (IEEE) 802.11 标准的无线局域网 (WLAN) 产品”(Wi-Fi 联盟)
WiFiAlliance 是一个贸易协会,致力于推广和认证符合特定互操作性标准的产品
- 802.11a:由于在高频 5GHz 频段上运行,数据速率更高,但墙壁和其他物理障碍物对信号的吸收更多
- 802.11b:在 2.4 GHz 频段运行以解决衰减问题
- 802.11g:在 2.4 GHz 频段运行,但数据速率更高
- 802.11n (WiFi4):在 2.4GHz 和 5GHz 频段上运行,数据速率更高
- 802.11ac (WiFi5):在 5GHz 频段上运行,数据速率更高
- 802.11ad (WiGig):在 60GHz 频段上运行,速度非常快,距离短
- 802.11ah:工作在900MHz频段,支持物联网
- 802.11ax (WiFi6):在 2.4GHz 或 5GHz 以及 6 GHz 频段上运行
无线个域网 Wireless Personal Area Networks (WPAN) (IEEE 802.15)
IEEE 802.15
由 IEEE 802.15 Task Group 管理的无线个人区域网络 (WPAN) 的一系列通信规范
- 任务组 1:IEEE 802.15.1(蓝牙)
- 任务组 2:IEEE 802.15.2-2003: 提供互操作性并解决 WPAN 和 WLAN 共存的问题
- 任务组 3:IEEE 802.15.3(高速 WPAN): 支持实时视频和音乐,更好的电源管理
- 任务组 4:IEEE 802.15.4(低速率 WPAN):
- 非常低带宽、低能耗的家庭通信(例如遥控器、警报)、WSN
- ZigBee 的基础
- 任务组 5:IEEE 802.15.5(网状网络)
- 任务组 6:IEEE 802.15.6:人体内外的短距离、低功耗和高度可靠的无线通信
- 支持无线体域网 (BAN) 中的通信
- 任务组 7:IEEE 802.15.7 使用可见光的光通信标准:
- Li-Fi 是一种可见光通信 (VLC) 技术,使用 LED 以光的形式传输高速数据
蓝牙
一种短距离无线通信技术和标准,2002 年标准化为 IEEE 802.15**.1**
短程、低功耗、高效
在 2.4 GHz ISM 频段 (2402-2480 MHz) 上运行
最初旨在成为 RS-232 的无线替代品
广泛的应用
ZigBee
基于 IEEE 802.15**.4** 的低速率 WPAN(无线个人区域网络)标准
在 868 MHz 和 915 (900-928) MHz 频段上运行
ZigBee 的好处:
-
易于设置和维护(网格、自组织)
-
可靠性(自我恢复)
-
能够扩展到数千个设备(节点)
-
电池寿命长
-
低成本
RFID
RFID(射频识别)是一种电子标签/识别技术,便于自动识别
它的工作原理是在阅读器和标签之间交换电磁信号
[125 KHz, 5.8 GHz]
RFID 系统也可能不受 125 KHz 和 5.8 GHz 的限制。 系统
也正在为这个范围之外的频率开发
应答器/标签的类型
- 被动:无内部电源
- 半被动:他们有自己的电源(一个小电池),只为微芯片供电
- 主动:它们有发射器和内部电源(板载电池)来为微芯片供电并将信号传输到阅读器
基本形式的 RFID 系统包含以下内容:
Reader: 阅读器发送用于为标签供电/唤醒的微弱信号(一种能量形式)。 然后标签将其微芯片上的信息传输回阅读器。
Tag/transponder: 带有硅芯片的设备,盘绕天线(Coiled Antenna)
-
近距离访问控制(卡和钥匙扣)
-
护照
-
收费
-
运输和物流
-
医院和医疗保健
-
牲畜和野生动物追踪
-
零售
-
供应链
-
资产追踪
-
库存系统
(本科时候图书馆里的书籍管理、借阅
IEEE 802.16 and WiMAX
IEEE 802.16 是用于大型城市无线网络的无线 MAN(城域网)标准系列
WiMAX(微波接入全球互操作性)是 IEEE 802.16 标准的商业名称
WiMAX 在不同国家的不同频段上运行; 通常在2.3 GHz、2.5 GHz、3.5 GHz、5.8 GHz频段
IEEE 802.16 标准最初针对固定无线宽带接入技术(Fixed WiMAX)
后来在移动 WiMAX 中考虑了移动性支持,这是一种广域无线网络技术
移动 WiMAX,一种用于 4G 的竞争技术
Fixed WiMAX 架构
WiMAX 基站 (BS):连接到公共网络
用户站(SS):通常为建筑物提供服务
覆盖“最后一公里”区域:为普通有线技术无法覆盖的区域提供高速互联网接入
Cellular Networks
蜂窝网络,贝尔实验室(1957 -1960)
在蜂窝网络中,地理覆盖区域通常被划分为小区,用六边形表示
多个用户如何可以同时共享同一个链接而不受干扰?
- 频分多址 Frequency-Division Multiple Access (FDMA)
- 时分多址 Time-Division Multiple Access (TDMA)
- 码分多址 Code Division Multiple Access (CDMA)
- 直接序列扩频 Direct-sequence spread spectrum (DSSS)
- 跳频扩频 Frequency-hopping spread spectrum (FHSS)
- 正交频分复用 Orthogonal Frequency Division Multiplexing (OFDM)
错题集
Question 1. Which of the following statements is NOT true about a multi-hop sensor network?
A. It makes it easy to control and manage the network.
B. It involves transmission over short distances.
C. It involves one or more intermediate nodes along the path that receive and forward packets.
D. It can quickly drain the battery of the nodes close to the sink.
答案A,错选BD。
A是单跳的
多跳网络描述:
-
传感器节点通过一个或多个中间节点将其数据传输到接收器(C对)
-
它涉及短距离传输,因此更节能(B对)
-
管理可能很复杂(和A相反)
-
适用于更大的网络
D需要理解。
如图,多跳下,不管怎么跳肯定要跳到最上面的三个上面。
单跳就不用。
所以多跳时候上面三个更closer的就更费电
Question 2. Which of the following statements is NOT true about a ViewGroup?
A. A ViewGroup is a special view that can contain other views.
B. A ViewGroup is the base class for widgets, which are used to create interactive UI components.
C. A ViewGroup is the base class for layouts and views containers.
D. The ViewGroup is a subclass of View.
答案B,错选CD。
W2内容
ViewGroup是结构上的底层概念,本质上是没有UI的一个概念体。具体形状由View负责。因此B里面作为UI组件的基类是明显不对的,C说法正确。D搜出来的确对的,ViewGroup extends View
ViewGroup 是 View 类的特殊子类,用作多个 View 的容器。 有几个有用的小部件可以扩展 ViewGroup 类。 大多数实际上是另一个称为Layout(的 ViewGroup) 的子类。
Question 4. Which of the following Kotlin code examples is CORRECT?
A. var num:Int
B. var Int:num = 1
C. var num:Int = null
D. var num = 1
答案D,错选AD。
因为在playground测试了A是可以的(只要后面有用值初始化
1 | fun main() { |
精C玩家震怒。这里就只能当是错的吧
错误原因见[空值](#空值安全 Null Safe)和前面那个lateinit。因为没?也没lateinit声明所以A就不正确
考试又考了一遍,正确答案就在空值部分例子里