* WinCE下的远程控制系统 设计思想(欢迎指点) *

WvW 2011-09-14 09:50:20
项目情况:
运行在WINCE 5.0下, 对485总线的多台设备的环境数据进行采集. 如果数据到达一定值, 进行报警; 如果设备离线, 进行故障报警; 操作有:清除故障 和 报警; 禁止警报喇叭; 联动继电器端口; 电子地图; 然后可以查询报警记录.

-- 环境数据用了 一个结构体表达一台设备的数据. 然后一次性分配了n台设备的内存数据. (方便网络发送).


以太网客户端:
目标: 将 环境数据采集过来; 继电器端口信息(名称 和 状态); 报警状态; 故障状态; 喇叭状态; 电子地图(配置坐标+图片); 和 查询记录.

要求: 环境数据每500ms更新一次.
客户端采用: windows PC平台.


设计方案:

通讯协议: 采用: 帧头|开始标志|session|命令|数据长度|数据|效验码|结束标志|;
数据区: 因为是VC++, 考虑到 WINCE服务器的性能问题, 不使用xml(服务器生成xml 耗时, 容易产生内存碎片), 直接使用结构体; 结构体发生变化时, 需要使用匹配的软件. (根据程序的修改日期判断, 或者定义一个版本号).
网络模型: 客户端不会太多, CE的CPU只有400MHZ, 限定最大<32个; 一个客户端一个线程;

登录部分: 使用用户名+密码结构体; 服务器返回: {结果 | session};
运作流程:
0. 根据服务器IP, 生成一个文件夹, 保存电子地图等等信息.
1. 读取 环境数据 的结构体长度, 客户端分配这个内存区, 以后收到数据, 直接填充;
2. 读取 继电器数据 的结构体长度, 客户端分配这个内存区, 以后收到数据, 直接填充;
3. 读取电子地图配置, 更新设备坐标map; 根据里面的每张地图的图片crc32码, 决定是否要更新本地地图.
4. 读取状态 (报警;故障;蜂鸣器);
5. 开始循环发送查询命令(查询环境 和 继电器数据). 收到后, 通知UI, 进行更新.


数据查询部分:
采用的是(SQLite), 每秒保存一次, 一天一个文件, 大约50M. (所以不适合将数据库下载到客户端, 然后直接使用服务器的查询软件打开, 囧~; 不过这是却一个很好的方案).
1. 客户端生成要查询的设备, 和 日期范围, 提交给服务器;
2. 服务器根据提供的信息, 生成SQL查询;
3. 将结果导出成 html, 然后将这个文件的字节数据发送给客户端.
4. 客户端将收到的内容, 放到这个服务器的ip下.
-- 注意事项: 日期范围要限定(否则数据量太大).
如果不做限定, 应当不要一次查询出所有的数据, 而是分批; 那最好保存这个客户端的最后一次查询结果集.


响应应答:
因为CE没有好的网络线程池. 所以我的想法比较笨拙.
非阻塞: 客户端发送一个命令; 不等待返回; 当收到一个返回, 解析处理;
优点: 这样有利于服务器主动推一些数据过来, 比如设备报警状态;
缺点: 需要控制好socket的互斥;

阻塞: 那就一问一答了; 虽然服务器不能主动推数据, 但是因为数据是每0.5采集一次, 也能看到设备状态.



我准备采用非阻塞模型;


-----------
好, 说完了, 欢迎大家提出建议!







...全文
58 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
alexmayer 2011-09-15
  • 打赏
  • 举报
回复
我加你好友了,有时间多多交流。
WvW 2011-09-15
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 alexmayer 的回复:]
数据库部分,我在ARM 2440+WinCE5上,也用了sqlite,insert的频率比兄弟的稍高,大概不到1s,insert四条记录。时间一长,发现检索就很难成功了。

期待楼主的后续文章。
[/Quote]
1. 一定要建立索引. (只建要用到查询的字段).
2. insert 要用事务!
alexmayer 2011-09-14
  • 打赏
  • 举报
回复
数据库部分,我在ARM 2440+WinCE5上,也用了sqlite,insert的频率比兄弟的稍高,大概不到1s,insert四条记录。时间一长,发现检索就很难成功了。

期待楼主的后续文章。

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧