[Feature phone系列]电话本模块设计和实现

      电话本模块是手机中不可或缺的一个功能模块.主要用到一下几个内容:

1.算法

    查找算法[快速检索一个联系人]

    排序算法[按中英文排序,保存联系人]

2.存储

   联系人信息保存到SIM卡

   联系人信息保存到Nor flash上

3.AT指令

    联系人的查找\保存都是通过AT指令访问SIM卡来实现;

模块、SIM、Flash之间的关系如下图:

                               

从上图我们可以看到:

电话本模块通过AT指令访问SIM卡上的联系人信息;

电话本模块通过AT指令和文件系统接口访问Flash;


下面我们看看电话本模块是如何开始工作的:

1>开机搜网完成后,系统设置当前需要查询的联系人的存储位置:

     #AT+CPBS="SM" //设置查询的存储是SIM卡

   *OK                    //返回OK
2>然后查询SIM卡上联系人的存储状态:
   #AT+CPBS?            //查询之前设置的存储上的联系人
   *+CPBS: "SM",3,10  //,,
   *OK
3>读取SIM卡上的联系人
    从上面AT指令返回的信息可以知道,当前SIM卡上总共有3个联系人信息,SIM卡的存储容量为10.
    然后从SIM卡读取所有的联系人出来并且显示到联系人列表:
    #AT+CPBR=1,10        //查询从序号1~10的所有联系人
    *+CPBR: 1,"0223708699",129,"6120"  //SIM卡的第一个存储位置上有一个联系人
    *+CPBR: 7,"12341234",129,"6d20"     //SIM卡的第7个存储位置有一个联系人
    *+CPBR: 10,"77882233",129,"373435"   //SIM卡的第10个存储位置有一个联系人
     *OK
     从上面AT指令的返回信息,我们可以发现,SIM卡上的数据存储是不经过排序的.曾经有个Bug分享一下:
    常规的SIM卡可以存储250个联系人信息,加入我们的电话本联系人只显示200条联系人:
    AT+CPBR=1,200 //该命令只会返回SIM卡1~200存储位置上的联系人信息.但是1~200之间的存储位置上有可能有若干个存储位置为空,而201-250的存储位置空可能是包含联系人信息的.那么用户插入SIM卡到手机上的时候就会发现SIM卡上本来有200个联系人的,但是在手机上只看到了不到两百个联系人信息.
4>联系人的保存
    一般来说我们是会分批的从SIM卡上读取联系人,读到一条联系人信息,就立刻把该联系人信息重新保存到Flash上.同时在往Flash上保存之前需要进行排序操作.至于排序算法和联系人存储实现使用链表还是数组方式这个仁者见仁智者见智,这里就不多讲了.
    经过这个步骤之后,排好序的联系人信息就保存到Flash上了,当用户进入联系人模块,就能看到排序后的联系人信息.

5>新增联系人

      新增联系人要么保存到SIM卡,要么保存到Flash上.

      我们看看保存到SIM卡上的操作:

       AT+CPBW=7,〃12341234〃,129,〃John〃 //发送AT指令把需要保存的联系人信息写入SIM卡

      然后再把该信息写入本地Flash,再对联系人的数据结构[链表或数组]进行一次排序.

     

     整个电话本的实现原理大概就是这样了,关于联系人的修改、删除操作,也就只是重新调用排序保存数据结构而已.


PS:

    1.为什么要多此一举的从SIM卡上把联系人读出来又保存到本地Flash上?而不是让用户直接操作SIM卡上的联系人数据?

    2.关于英文排序是非常简单的,那么中文联系人排序是如何实现的?

        -----这里一个解决办法:把百家姓按照显示规则做一个映射表出来,排序的时候根据这个映射表来排序.[需要额外的存储百家姓的存储空间]



你可能感兴趣的:(手机软件开发笔记)