可自升级物联网设计略谈

我没参考圈内人士怎么设计的,完全依照自己的想法,所以只能叫略谈,等我有时间参照别人设计方案时,再做比较。

物联网即把物连接到网络,故物品和网络之间必须有交换信息的控制设备,这种设备可以是微型电脑(例如:Raspberry pi)也可以是单片机(arm c51系列),但必须能接入网络。

接入网络方式有:局域网 、移动网、电信/联通 等骨干网络。局域网需要铺设线路、控制距离有限,小范围尚可,大范围就不行了,但是可以让局域网接入互联网,这就靠自己的本事了。

移动网不受地域限制,但是传输数据成本高、速度慢,根据应用场景去选择。

控制设备直接接GPS或继电器等控制设备运行状态。

下面谈整个系统设计:

把每个控制设备看成子节点,在外网或局域网建立控制服务器,子节点与控制服务器通信,读取或下达命令。

如果不好获取子节点设备IP可采取从属模式,即子节点读取控制服务器命令库,从而进行相应控制,这样消耗流量时效稍差。

采取主动模式,控制服务器直接与子节点进行socket通信,下达命令。

命令格式采取json模式,里面包括软件版本号,这样子节点可与自身软件版本号比较,进行升级。所以只要把环境搭建好,其它的就不用管了,想修改程序只要在控制服务器修改版本号就行,子节点自动下载最新程序进行更新。

具体实现过程不详述,有兴趣联系我。

 

 

exim配置

服务器是debian,用apt-get安装exim4,exim4-config,exim4-daemon-light
之后配置/etc/exim4/update-exim4.conf.conf,配置文件如下:

dc_eximconfig_configtype=’smarthost’ #用smarthost发信;通过SMTP或fetchmail接收信件
dc_other_hostnames=”
dc_local_interfaces=’127.0.0.1′ #只接收本机的SMTP请求,只在本机使用Exim4
dc_readhost=”
dc_relay_domains=”
dc_minimaldns=’false’
dc_relay_nets=”
dc_smarthost=’smtp.gmail.com’ #gmail的smtp主机
CFILEMODE=’644′
dc_use_split_config=’false’ #不使用分散方式的配置文件
dc_hide_mailname=’false’
dc_mailname_in_oh=’true’
dc_localdelivery=’mail_spool

然后编辑/etc/mailname

修改/etc/exim4/passwd.client,按照举例添加smtp地址和用户名密码,google的smtp真实地址为:gmail-smtp-msa.l.google.com。
修改/etc/exim4/email-addresses,添加用户对应的外部地址。

utf-8编码时统计字数

写该程序的目的是因为utf-8编码时,中文和数字、英文字母所占字节数不同,在进行截取时不方便处理。

[php]
function utf8_array($msg){
$result=array();
$strlen = strlen($msg);
for($i=0; $i<$strlen; $i++) {
$str=substr($msg, $i, 1);
if(ord($str)>0xA0 ){
$result[]=substr($msg, $i, 3);
$i =$i+2;
}else{
$result[]=substr($msg, $i,1);
}
}
return $result;

}
//下面为示例
function sendSms($tele_num,$msg){
header("Content-type:text/html;charset=utf-8");
$sms=D("sms");
$msg_data=utf8_array($msg);
$msg_count=count($msg_data);//字数
$msg_num=1;//短信条数
if($msg_count>65){
$msg_num=ceil($msg_count/62);
}

if($msg_num==1){
$insert_data=array("is_sent"=>0,"tele_num"=>$tele_num,"add_time"=>time(),"send_time"=>0,"send_content"=>$msg);
$sms->add($insert_data);
}else{
for($i=0;$i<$msg_num;$i++){
$msg_send="";
for($j=$i*62;$j<($i+1)*62;$j++){
if($j<$msg_count)
$msg_send.=$msg_data[$j];

}
$msg_send.="(".($i+1).")";
$insert_data=array("is_sent"=>0,"tele_num"=>$tele_num,"add_time"=>time(),"send_time"=>0,"send_content"=>$msg_send);
$sms->add($insert_data);
}
}

}
[/php]

短信发送队列设计

有个应用场景,发送短信限制为相同手机号发送短信时间间隔必须是15s,且长度限制为65字,而一些订单必须拆成几条短信,故设计此发送方案、

短信队列设计方案

 设计方案:

              短信拆分方案:

(1) 少于66字,一条发送

(2) 多于65字,拆成62字一条,后面加上(x) x表示页码

      短信发送方案:

(1) 所有短信存入数据库存档,并赋予发送状态标志位is_sent =0,加上时间,发送人卡号,内容,ID自增长

(2) 每隔20s,扫描数据库提取未发送的短信,并保证每个号码发送条数为1,装入taskqueue发送

(3) Taskqueue发送成功后,置is_sent=1

(4) 不成功滚入下一次发送队列

     数据库设计:

ID
cardn
Send_time
Add_time
Tele_num
Send_content
Is_sent

CREATE TABLE `think_sms` (

`id` int(100) NOT NULL,

`cardn` int(20) NOT NULL,

`send_time` int(20) NOT NULL,

`add_time` int(20) NOT NULL,

`tele_num` bigint(30) NOT NULL,

`send_content` varchar(80) NOT NULL,

`is_sent` int(2) NOT NULL DEFAULT ‘0’,

PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;