流程:
1>连接:单片机/手机发第一条消息给服务器
服务器接收消息并解包数据。用数组装起来(如果解包成功,会打印一次数据)
如果数组长度不是指定长度,为无效指令,这次通信失败
如果是指定长度的命令,取出第一个元素作为控制命令,进入switch
依照约定,此时第一条消息为连接消息:1.记录时间戳 2.更新map连接池。3.如果是手机:
判断是不是新手机
如果不是,直接更新上线状态。
否则,加入新手机并更新数据库。
是单片机,直接更新数据,并向单片机发消息,然后向所有在线手机更新状态
至此第一次通信完毕,这次通信的目的是建立连接,更新map连接池。
2>数据更新(看门狗):在单片机上线后,发送一条消息给服务器,此消息包含状态信息,并启动看门狗,从此每十秒发一个状态消息喂看门狗,超时则视作断联,此时要单片机发现自己断联并重新发送连接消息才会重连。每十个状态包更新一下数据库,
减少数据库操作。(额外1:如果此时正在使用的手机在线, 也向手机更新电量)。
3>手机开锁:手机向服务器发送一条信息
判断单片机是不是正在使用
如果是,服务器向手机发送反馈
如果不是,将目标单片机和此手机暂时绑定。调出目标单片机与服务的socket,(注意:可能出现空指针异常的原因,测试数据不当,单片机不在线但是状态却为在线,然后将id发给了手机。)向目标单片机发送开锁指令。
如果单片机开锁成功,向服务器发送已开锁消息,先更新数据库,然后调出手机的socket,(后台打印手机id)向手机发送解锁反馈
如果失败,向手机返回GG思密达
至此,开锁成功
4>手机关锁:手机向服务器发送一条信息,调出与目标单片机的socket,向目标单片机发送关锁指令。
如果单片机关锁成功,向服务器发送已关锁消息,先更新数据库,然后调出手机的socket,(后台打印手机id)向手机发送关锁反馈,最后在map删除此连接记录
如果失败,向手机返回GG思密达
至此,关锁成功。
数据格式:
单片机:(不需要目标id,其他数据最好都从传感器采集)
连接指令:01(连接指令头)- 000000(目标id,这里不需要)-sc01(单片机的id)- 电量 - 故障 - Gps - 锁开关 - 1(在线状态)- 0(单片机标志)- 时间 - 光照阈值 - 温度
数据更新(看门狗):02(连接指令头)- 000000(目标id,这里不需要)-sc01(单片机的id)- 电量 - 故障 - Gps - 锁开关 - 1(在线状态)- 0(单片机标志)- 时间 - 光照阈值 - 温度
开锁成功:as(连接指令头)- 000000(目标id,这里不需要)-sc01(单片机的id)- 电量 - 故障 - 000000(Gps) - 1(锁开关) - 1(在线状态)- 0(单片机标志)- 时间 - 光照阈值 - 温度
关锁成功:bs(连接指令头)- 000000(目标id,这里不需要)-sc01(单片机的id)- 电量 - 故障 - 000000(Gps) - 1(锁开关) - 1(在线状态)- 0(单片机标志)- 时间 - 光照阈值 - 温度
设置故障成功:cs(连接指令头)- 000000(目标id,这里不需要)-sc01(单片机的id)- 电量 - 故障 - 000000(Gps) - 1(锁开关) - 1(在线状态)- 0(单片机标志)- 时间 - 光照阈值 - 温度
手机:(只需要两个id、在线状态和手机标志,其余可以全部设零)
连接指令:01(连接指令头)- 000000(目标id,这里不需要)-phone01(手机的id)- 0 - 0 - 0 - 0- 1(在线状态)- 1(手机标志)- 0 - 0 - 0
开锁指令:03(连接指令头)-目标id -phone01(手机的id)- 0 - 0 - 0 - 0- 1(在线状态)- 1(手机标志)- 0 - 0 - 0
关锁指令:04(连接指令头)-目标id -phone01(手机的id)- 0 - 0 - 0 - 0- 1(在线状态)- 1(手机标志)- 0 - 0 - 0
关锁指令:05(连接指令头)-目标id -phone01(手机的id)- 0 - 0 - 0 - 0- 1(在线状态)- 1(手机标志)- 0 - 0 - 0