1,本设计版权归本人所有;2、本博客禁止转载或者用本博客技术用于商业用途。
还有个重要原因我不喜欢写博客,因为linux下编辑太痛苦了。所有 的这些图纸都是我用一个叫“DIA”的软件画的,然后导出成图片,这个软件不支持中文输入。所以待会看到,原来我是个英语爱好者。
废话不多说了。一下东西都是摘自我的记录性文档。
顺便说下我们的网站:http://115.28.80.200/
立马我们的域名就会备案成功了,到时候用域名访问更合适:www.threesoft.net
谢谢大家。有UI设计高手,单片机高手,诚信邀请这两方面的人才入伙,我们一起打土豪去。
Sanliao智能家居平台软件设计
项目 |
Sanliao智能家居平台软件设计 |
作者 |
曾金龙 |
时间 |
2014-08-17 |
服务器采用openfire
家庭控制端需要一个android设备,例如闲置的android手机,作为homedevice controller。它通过wifi家庭网关(路由器)连接到服务器,同时通过蓝牙,wifi等其他无线方式连接到受控设备。
控制端是一台android手机(或者其他),用于发送控制命令。
家庭控制器,作为家庭内部设备的控制中心。内置Asmack,并定义智能家居的描述语言。和外设的连接通过插件apk来通信。
插件式管理有利于我们的sdk推广,成为真正的通用型平台。
通过无线来通信的家电设备
包的依赖关系
我们的 SmartHome依赖Eim,而Eim又依赖asmack。
1)IActivitySupport接口
/**
* 获取EimApplication.
*/
public abstract EimApplication getEimApplication();
/**
* 开启服务.
*/
public abstract void startService();
/**
* 终止服务.
*/
public abstract void stopService();
/**
* 校验网络-如果没有网络就弹出设置,并返回true.
*/
public abstract booleanvalidateInternet();
/**
* 校验网络-如果没有网络就返回true.
*/
public abstract booleanhasInternetConnected();
/**
* 退出应用.
*/
public abstract void isExit();
/**
* 判断GPS是否已经开启.
*/
public abstract booleanhasLocationGPS();
/**
* 判断基站是否已经开启.
*/
public abstract booleanhasLocationNetWork();
/**
* 检查内存卡.
*/
public abstract voidcheckMemoryCard();
/**
* 显示toast.
*/
public abstract voidshowToast(String text,int longint);
/**
* 短时间显示toast.
*/
public abstract voidshowToast(String text);
/**
* 获取进度条.
*/
public abstract ProgressDialog getProgressDialog();
/**
* 返回当前Activity上下文.
*/
public abstract Context getContext();
/**
* 获取当前登录用户的SharedPreferences配置.
*/
publicSharedPreferences getLoginUserSharedPre();
/**
* 保存用户配置.
*/
public void saveLoginConfig(LoginConfig loginConfig);
/**
* 获取用户配置.
*/
public LoginConfiggetLoginConfig();
/**
* 用户是否在线(当前网络是否重连成功)
*/
public boolean getUserOnlineState();
/**
* 设置用户在线状态 true在线 false不在线
*/
public void setUserOnlineState(boolean isOnline);
/**
* 发出Notification的method.
*/
public void setNotiType(int iconId, StringcontentTitle,
StringcontentText, Class activity, String from);
2) ActivitySupport
主要是检查网络,sdcard以及用户配置等基本环境,然后通过startService来开启四个服务。
3)AContactorSupport
它主要是包含一个广播接收器成员,该接收器类是它的内部类。它监听着那些它感兴趣的action。
4)IMContactservice
联系人服务类,它主要是维护用户的花名册(联系人),它是一个服务,对外传送数据是通过广播的形式。
该服务主要是监听用户联系人的变化,asmack提供了几组对数据包的回调函数,即linstener。IMContactService是监听了(packet listener)Presence.Type.subscribe,别人加它为好友的时候回调;还有一个RosterListener,监听整个花名册的变化。
这个类是设计的最失败的类,因为太复杂了。应该解耦。例如花名册的消息就应该和chat的分来来。揉在一起,很痛苦的。
RosterListener是一个接口,它包含了的方法有:
增加/更新/删除/改变,具体含义去看相应代码,在此不列出。
/**
* Called when rosterentries are added.
*/
public voidentriesAdded(Collection<String> addresses);
/**
* Called when a rosterentries are updated.
*/
public void entriesUpdated(Collection<String> addresses);
/**
* Called when a rosterentries are removed.
*/
public voidentriesDeleted(Collection<String> addresses);
/**
* Called when thepresence of a roster entry is changed. Care should be taken
*/
public voidpresenceChanged(Presence presence);
5)IMChatService
聊天服务
该服务,只是向XMPPConnection注册了个chat类型的数据包监听器,当connect收到chat类型的数据包之后会调用这里的processPacket函数。
6)IMSystemMsgService
系统消息服务类,监听系统消息,就是那种系统广播,如QQ的弹框消息。
7)ReConnectService
重连服务类,主要是通过一个广播监听器来监听系统网络的变化CONNECTIVITY_ACTION,如果网络改变,则对xmppconnection连接进行重连。
从上面的类图关系我们可以看出,这个设计其实并不合理的。服务不应该在ActivitySupport里面启动,这种设计的扩展性是非常的差,不过,startService在EIM中也只调用了一次,在LoginTask类里面。我个人觉得这个服务开启应该单独开来,和activity无关。先凑合用吧。哎,懒惰是一剂毒药,它会让你慢慢死去,勤奋也是一剂毒药,它会让你撕心裂肺。
8)AchatActivity
抽象对话类关系
总结下,可以得出EIM的组件图如下:
XMPPConnection对象是连接对象,负责和服务器的连接。整个就一个连接。
各种服务Service通过对XMPPConnection注册回调的方式来监听它们想要的包。当监测的包到来的时候,出了保存到本地,同时也广播出去。Activity会有个广播接收器,接收Service广播的消息,如果是感兴趣的,则处理,更新相应的UI。
这就是整个EIM的结构。