classic bluetooth chat 四
来源:互联网 发布:网络批发平台 编辑:程序博客网 时间:2024/06/15 15:56
第4节 蓝牙连接模块
蓝牙连接的管理模块需要为ChatActivity
提供于连接相关的所有功能,要设计的方便使用,并尽量隐藏连接的细节。
4.1 对外接口
我们首先来看看ConnectionManager
需要向Chat Activity
提供哪些接口。
监听。当应用运行起来后,聊天应用需要启动对其它蓝牙设备的监听,迎接随时可能到来的连接请求。所以
ConnectionManager
需要提供启动监听-startListen()
和停止监听-stopListen()
的两个接口;主动连接。应用搜索到可连接到设备后,可以主动的连接对方设备。假如正在连接,用户可能会取消连接;假如已经连接上,用户可能会想断开这个连接。所以
ConnectionManager
需要提供连接-connect()
、断开连接-disconnect()
(包含取消连接的功能)两个接口;主动查询当前连接状态。应用在采取某些操作的时候,可能需要知道当前的连接状态。所以需要提供主动查询当前连接状态的接口。
连接的状态,我们可以把它分成两类,一个是监听的状态,一个是连接的状态。监听的状态表示当前是否在监听;连接的状态应该包括没有连接,正在连接和已经连接。
所以接口应该有
getCurrentListenState()
和getCurrentConnectState()
。获取连接状态变化通知。应用界面需要根据连接的状态做出相应的变化,需要
ConnectionManager
能在连接状态发生变化的时候,主动把信息通知给ChatActivity
。所以还要提供一个通知状态变化的接口。接收数据。
ConnectionManager
收到数据以后,需要一个机制将数据通知给ChatActivity
,这样ChatActivity
才能显示接收到的内容。发送数据。用户要发送数据给被连接的设备,所以
ConnectionManager
要提供一个发送数据的接口-sendData()
。
4
与5
都需要ConnectionManager
主动向ChatActivity
传递信息(收到的数据、状态改变),可以通过设计监听器来实现。因此需要设计安装监听器的方法:定义一个回调的接口-ConnectionListener
;把监听器设置到ConnectioManager
中。
综上所述,ConnectionManager
大概应该是这个样子,
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
4.2 ConnectionManager的结构
我们已经明确了ConnectionManager
对外的接口。接下来就需要来实现功能了。
由Android SDK提供的蓝牙连接接口函数,很多都是阻塞的(wifi连接也是如此),例如accept()
、connect()
等等,所以就需要将这些操作放到单独的工作线程中进行。
因此,我们将会在ConnectionManager
中设计两个工作线程,
AcceptThread
:负责监听别的蓝牙设备发起的连接;ConnectThread
:用来维持与其它设备的连接。
主线程首先创建一个监听线程,用来接收其它设备可能发出的连接请求,当监听线程监听到了连接请求,就会得到一个Socket
;然后我们再创建一个连接线程,将Socket
交给连接线程,两个设备就可以通过这个Socket
,在连接线程中进行消息的发送和接收了。
![](http://res.anddle.com/image/android/%E4%B8%BB%E7%BA%BF%E7%A8%8B%E7%9B%91%E5%90%AC%E7%BA%BF%E7%A8%8B%E8%BF%9E%E6%8E%A5%E7%BA%BF%E7%A8%8B%E5%85%B3%E7%B3%BB.png)
4.2.1 ConnectionManager
AcceptThread
线程的工作状态,反应的就是监听状态。它包括
LISTEN_STATE_IDLE
和LISTEN_STATE_LISTENING
。这个状态保存在mListenState
变量中;当监听状态发生改变的时候,通过
setListenState()
设置状态的改变,并利用回调的方式,将改变的状态通知给关注者。- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
ConnectedThread
线程的工作状态,反应的就是连接状态。它包括
CONNECT_STATE_IDLE
CONNECT_STATE_CONNECTING
和CONNECT_STATE_CONNECTED
;
这个状态保存在mConnectState
变量中;当连接状态发生改变的时候,通过
setConnectState()
设置状态的改变,并利用回调的方式,将改变的状态通知给关注者。- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
ConnectionManager
对外提供的接口,实际上就是对这两个工作线程的控制;
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
通过这里,我们可以看出,为了能够取消正在运行的工作线程,在设计AcceptThread
和ConnectedThread
的时候,我们需要给它们添加上取消的方法-cancel()
;为了在连接后能够发送数据,需要给ConnectedThread
添加发送数据的方法-sendData()
。
4.2.2 监听线程
监听线程进行的工作有,
等待其它蓝牙设备发起的连接;
如果接收到连接的请求,就创建出一个
Socket
;之后继续等待其它设备可能发起的连接;
假如已经处于正在连接或者已经连接的状态,就断开最新收到的连接,因为我们假定了每次只能连接一个设备;
监听线程可以被取消,退出运行;
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
4.2.3 连接线程
连接线程的工作是,
假如是主动连接,连接线程要主动调用
connect()
方法;该方法是一个阻塞调用,在调用前,应该把ConnectionManager
的连接状态,设置成CONNECT_STATE_CONNECTING
;如果连接成功,就把状态设置成CONNECT_STATE_CONNECTED
;假如是被动连接,那么从监听线程获取的
Socket
就已经是被连接上了的Socket
,不需要进行connect()
的操作了;从已经连接的
Socket
当中,获取输入、输出的流接口,以后这个连接上的数据读取和写入,就是通过它们对应的流接口进行的;连接线程进入循环,不断的尝试通过
InputStream
的read()
方法,读取数据;连接线程可以被取消,退出连接;
- classic bluetooth chat 四
- Classic bluetooth chat 一
- Classic bluetooth chat 二
- classic bluetooth chat 三
- classic bluetooth chat 五
- classic Bluetooth chat 六
- Android Classic Bluetooth Guide(上篇)
- Android Classic Bluetooth Guide(下篇)
- 在Ubuntu手机上的Bluetooth Chat应用实例
- classic
- CHAT
- CHAT
- chat
- chat
- chat
- chat
- chat
- Smack文档四:使用Chat通信
- Resource is out of sync with the file system
- Spring 组件扫描
- LevelSet小结
- 苹果审核被拒,返回. txt 的崩溃日志转换格式化
- 查看APK的签名的方法
- classic bluetooth chat 四
- mysql sql语句的执行过程
- linux中history命令显示操作执行的时间配置
- 手机UDP穿透问题
- 内存泄漏改善方针
- Maven入门指南(二)
- ubuntu启动tftp服务cannot open IPv6 socket, disable IPv6: Address family not supported by protocol
- 深度学习物体检测(五)——对象检测RCNN系列总结
- Java输入输出流