|
作为一个孩子的父亲对于这种人贩子 天灾意外的情况总是不能实时的掌控,一直都在考虑如何才能让孩子发生危险的第一时间告诉我并能让我知道确切的位置,谢谢dfrobot给了我一个试用sim808的机会,做了一个类似的产品(初期)希望能给孩子多一些保险,因为sim808本身包含了拨打电话,gps定位和tcp连接还支持短信刚好满足我的基本功能构思,下面我来说说我构思的流程:
1、当孩子遇到危险时通过某一个激活装置来激活设备(初步考虑是拉环,因为还没有做外观设计只能用开关代替)
2、当设备激活后立刻给绑定的手机发送一条短信,通知家长孩子可能已经遇到危险。
3、发送短信完毕后开启gps和网络模块给指定的服务器发送指定的数据包里面包含有gps的信息。
4、家长收到短信后立刻打开app即可看到孩子的运动轨迹,立刻前往处理。
开发模块:
1、硬件sim808
2、app(因为嫌跨平台麻烦用unity3d+高通sdk接入的方式来做这样就一次做了两个版本)
3、阿里云linux服务器使用Go语言来编写服务器部分(为什么要用go 1、炫耀我自己写的GO服务器架构 2、跨平台 3、处理并发大)
硬件源码:
[mw_shl_code=c,true] #include <DFRobot_sim808.h>
#include<stdio.h>
#define PHONE_NUMBER "********"
#define MESSAGE "Help Help SOS"
#define MESSAGE_LENGTH 160
char message[MESSAGE_LENGTH];
int messageIndex = 0;
char phone[16];
char datetime[24];
char newdata[45];
//char buffer[512];
#define MESSAGE_LENGTH 20
char gprsBuffer[64];
char *s = NULL;
DFRobot_SIM808 sim808(&Serial);
void setup() {
// put your setup code here, to run once:
//激活后发送求救信息至指定的手机号码
myCooksetup();
}
void loop() {
// put your main code here, to run repeatedly:
myCookLoop();
}
void myCooksetup(){
Serial.begin(9600);
//******** Initialize sim808 module *************
while (!sim808.init()) {
delay(1000);
Serial.print("Sim808 init error\r\n");
}
//发送求救短信至手机 不能发送中文 可能因为编码问题发送中文会乱码
sim808.sendSMS(PHONE_NUMBER, MESSAGE);
//打开GPS电源
//************* Turn on the GPS power************
if (sim808.attachGPS())
Serial.println("Open the GPS power success");
else
Serial.println("Open the GPS power failure");
}
void myCookLoop(){
GpsLoop();
TcpLoop();
}
//组合经纬度消息
void JoiningTogether(float lon,float lat){
char longitude[12];
dtostrf(lon,3,6,longitude);
Serial.println(longitude);
char latitude[12];
dtostrf(lat,3,6,latitude);
Serial.println(latitude);
//设定初始值用于服务器校验tcp连接的有效性
strcat(newdata,"8001SOS808SHEBEIHAO");
strcat(newdata,"@");
strcat(newdata,longitude);
strcat(newdata,"@");
strcat(newdata,latitude);
Serial.println(newdata);
}
void GpsLoop(){
///GPS定位循环2
if (sim808.getGPS()) {
Serial.print("latitude :");
Serial.println(sim808.GPSdata.lat);
Serial.print("longitude :");
Serial.println(sim808.GPSdata.lon);
Serial.print("speed_kph :");
Serial.println(sim808.GPSdata.speed_kph);
Serial.print("heading :");
Serial.println(sim808.GPSdata.heading);
Serial.println();
float longitude = sim808.GPSdata.lon;
float latitude = sim808.GPSdata.lat;
JoiningTogether(longitude ,latitude);
//************* Turn off the GPS power ************
//sim808.detachGPS();
}
else{
Serial.print("GPS To locate failure");
}
}
}
//至于为什么要发一次断一次 主要是不想处理粘包 你打我呀 你打我呀
void TcpLoop(){
//*********** Establish a TCP connection ************
if(!sim808.connect(TCP,"192.168.0.122", 3589)) {
Serial.println("Connect error");
}else{
Serial.println("Connect mbed.org success");
}
//*********** Send a GET request *****************
Serial.println("waiting to fetch...");
if(sizeof(newdata) > 0){
sim808.send(newdata, sizeof(newdata)-1);
}
//************* Close TCP or UDP connections **********
sim808.close(); //TCP链接
}[/mw_shl_code]
服务器代码:(因为代码太多 这里只发main的其他的有需要可以私信我)
[mw_shl_code=c,true]package main
import (
"errors"
"flag"
"fmt"
_ "github.com/go-sql-driver/mysql"
"github.com/larspensjo/config"
"message"
"os"
)
var (
server = flag.String("server", "./config/server.ini", "Server Config file")
)
func main() {
_, portstr, err := loadConfig()
fmt.Println("err = ", err)
if err != nil {
fmt.Println(os.Stderr, " server ini read error\n")
os.Exit(1)
}
// port, err := strconv.Atoi(portstr)
// if err != nil {
// fmt.Println(os.Stderr, " server ini portstr error\n")
// os.Exit(1)
// }
portstr = ":" + portstr
fmt.Println("port = ", portstr)
message.Start(portstr)
}
func loadConfig() (string, string, error) {
var TOPIC = make(map[string]string)
cfg, err := config.ReadDefault(*server)
if err != nil {
fmt.Println("config.ReadDefault error")
}
if cfg.HasSection("server") {
section, err := cfg.SectionOptions("server")
if err == nil {
for _, v := range section {
options, err := cfg.String("server", v)
if err == nil {
TOPIC[v] = options
}
}
}
}
if len(TOPIC) != 2 {
return "", "", errors.New("par wrong")
}
fmt.Println("len(TOPIC) = ", len(TOPIC))
return TOPIC["ip"], TOPIC["port"], nil
}
[/mw_shl_code]
app的就不发了 跟服务器一样需要的私信我
|
|